Library for Firebase, PUT, PATCH, POST, GET, DELETE operations supported, (others are available, todo). Based on Mbed's https-example. Tested on STM32F767 using ETHERNET and ESP8266 WIFI interfaces and STM32F446 using ESP8266 WIFI interface.

Dependents:   Firebase-Example

Committer:
star297
Date:
Sun May 10 08:08:23 2020 +0000
Revision:
3:4d7c08734a91
Parent:
2:cde6181a8320
added PATCH function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
star297 0:768ae9838086 1 #ifndef _FIREBASE_H_
star297 0:768ae9838086 2 #define _FIREBASE_H_
star297 0:768ae9838086 3
star297 0:768ae9838086 4 #include "mbed.h"
star297 0:768ae9838086 5 #include "NetworkInterface.h"
star297 0:768ae9838086 6 #include "https_request.h"
star297 0:768ae9838086 7
star297 0:768ae9838086 8 /* List of trusted root CA certificates
star297 0:768ae9838086 9 * currently two: Amazon, the CA for os.mbed.com and Let's Encrypt,
star297 0:768ae9838086 10 * the CA for httpbin.org
star297 0:768ae9838086 11 * To add more root certificates, just concatenate them.
star297 0:768ae9838086 12 */
star297 0:768ae9838086 13 const char SSL_CA_PEM[] =
star297 0:768ae9838086 14 "-----BEGIN CERTIFICATE-----\n"
star297 0:768ae9838086 15 "MIIESjCCAzKgAwIBAgINAeO0mqGNiqmBJWlQuDANBgkqhkiG9w0BAQsFADBMMSAw\n"
star297 0:768ae9838086 16 "HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFs\n"
star297 0:768ae9838086 17 "U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xNzA2MTUwMDAwNDJaFw0yMTEy\n"
star297 0:768ae9838086 18 "MTUwMDAwNDJaMEIxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVHb29nbGUgVHJ1c3Qg\n"
star297 0:768ae9838086 19 "U2VydmljZXMxEzARBgNVBAMTCkdUUyBDQSAxTzEwggEiMA0GCSqGSIb3DQEBAQUA\n"
star297 0:768ae9838086 20 "A4IBDwAwggEKAoIBAQDQGM9F1IvN05zkQO9+tN1pIRvJzzyOTHW5DzEZhD2ePCnv\n"
star297 0:768ae9838086 21 "UA0Qk28FgICfKqC9EksC4T2fWBYk/jCfC3R3VZMdS/dN4ZKCEPZRrAzDsiKUDzRr\n"
star297 0:768ae9838086 22 "mBBJ5wudgzndIMYcLe/RGGFl5yODIKgjEv/SJH/UL+dEaltN11BmsK+eQmMF++Ac\n"
star297 0:768ae9838086 23 "xGNhr59qM/9il71I2dN8FGfcddwuaej4bXhp0LcQBbjxMcI7JP0aM3T4I+DsaxmK\n"
star297 0:768ae9838086 24 "FsbjzaTNC9uzpFlgOIg7rR25xoynUxv8vNmkq7zdPGHXkxWY7oG9j+JkRyBABk7X\n"
star297 0:768ae9838086 25 "rJfoucBZEqFJJSPk7XA0LKW0Y3z5oz2D0c1tJKwHAgMBAAGjggEzMIIBLzAOBgNV\n"
star297 0:768ae9838086 26 "HQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1Ud\n"
star297 0:768ae9838086 27 "EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJjR+G4Q68+b7GCfGJAboOt9Cf0rMB8G\n"
star297 0:768ae9838086 28 "A1UdIwQYMBaAFJviB1dnHB7AagbeWbSaLd/cGYYuMDUGCCsGAQUFBwEBBCkwJzAl\n"
star297 0:768ae9838086 29 "BggrBgEFBQcwAYYZaHR0cDovL29jc3AucGtpLmdvb2cvZ3NyMjAyBgNVHR8EKzAp\n"
star297 0:768ae9838086 30 "MCegJaAjhiFodHRwOi8vY3JsLnBraS5nb29nL2dzcjIvZ3NyMi5jcmwwPwYDVR0g\n"
star297 0:768ae9838086 31 "BDgwNjA0BgZngQwBAgIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly9wa2kuZ29vZy9y\n"
star297 0:768ae9838086 32 "ZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAGoA+Nnn78y6pRjd9XlQWNa7H\n"
star297 0:768ae9838086 33 "TgiZ/r3RNGkmUmYHPQq6Scti9PEajvwRT2iWTHQr02fesqOqBY2ETUwgZQ+lltoN\n"
star297 0:768ae9838086 34 "FvhsO9tvBCOIazpswWC9aJ9xju4tWDQH8NVU6YZZ/XteDSGU9YzJqPjY8q3MDxrz\n"
star297 0:768ae9838086 35 "mqepBCf5o8mw/wJ4a2G6xzUr6Fb6T8McDO22PLRL6u3M4Tzs3A2M1j6bykJYi8wW\n"
star297 0:768ae9838086 36 "IRdAvKLWZu/axBVbzYmqmwkm5zLSDW5nIAJbELCQCZwMH56t2Dvqofxs6BBcCFIZ\n"
star297 0:768ae9838086 37 "USpxu6x6td0V7SvJCCosirSmIatj/9dSSVDQibet8q/7UK4v4ZUN80atnZz1yg==\n"
star297 0:768ae9838086 38 "-----END CERTIFICATE-----\n";
star297 0:768ae9838086 39
star297 0:768ae9838086 40 /*
star297 0:768ae9838086 41 // how to build the Firebase connection FirebaseUrl string for 'method overide'
star297 0:768ae9838086 42
star297 0:768ae9838086 43 strcpy(FirebaseUrl, FirebaseID); // Firebase account ID
star297 0:768ae9838086 44
star297 0:768ae9838086 45 // this bit in the middle to send .json data structure and authority
star297 0:768ae9838086 46 // for any REST api functions e.g. GET, PUT, POST, PATCH, DELETE
star297 0:768ae9838086 47 // replace the PUT with required function
star297 0:768ae9838086 48
star297 0:768ae9838086 49 strcat(FirebaseUrl, "/Parent/Child/.json?x-http-method-override=PUT&auth=");
star297 0:768ae9838086 50 strcat(FirebaseUrl, FirebaseAuth); // Firebase account authorisation key
star297 0:768ae9838086 51 */
star297 0:768ae9838086 52
star297 3:4d7c08734a91 53
star297 0:768ae9838086 54 // set Firebase project information..
star297 0:768ae9838086 55 char FirebaseUrl[300]; // dimension to suit required character space
star297 0:768ae9838086 56 const char FirebaseID[100] = "https://projectID.firebaseio.com"; // project ID
star297 0:768ae9838086 57 const char FirebaseAuth[100]= "Web API key"; // web API key
star297 3:4d7c08734a91 58
star297 3:4d7c08734a91 59
star297 0:768ae9838086 60
star297 1:4f2c1fcc6fb6 61 char* getData;
star297 1:4f2c1fcc6fb6 62 int TLSfailText,httpfail;
star297 1:4f2c1fcc6fb6 63 /* Port number used to connect to the server */
star297 1:4f2c1fcc6fb6 64 const int server_port = 443;
star297 1:4f2c1fcc6fb6 65
star297 1:4f2c1fcc6fb6 66 #define IP "192.168.1.180"
star297 1:4f2c1fcc6fb6 67 #define GATEWAY "192.168.1.1"
star297 1:4f2c1fcc6fb6 68 #define NETMASK "255.255.255.0"
star297 0:768ae9838086 69
star297 0:768ae9838086 70 /*
star297 0:768ae9838086 71 Connects to the network using the mbed_app.json ESP8266 WIFI networking interface,
star297 0:768ae9838086 72 you can also swap this out with a driver for a different networking interface or
star297 0:768ae9838086 73 if you use ETHERNET: change mbed_app.json "target.network-default-interface-type" : "ETHERNET",
star297 0:768ae9838086 74 */
star297 0:768ae9838086 75
star297 1:4f2c1fcc6fb6 76 NetworkInterface* net;
star297 0:768ae9838086 77 TLSSocket* socket = new TLSSocket();
star297 1:4f2c1fcc6fb6 78 SocketAddress Fbase;
star297 1:4f2c1fcc6fb6 79 nsapi_error_t result;
star297 0:768ae9838086 80
star297 0:768ae9838086 81 NetworkInterface *connect_to_default_network_interface() {
star297 0:768ae9838086 82 printf("Connecting to network...\n\n");
star297 0:768ae9838086 83
star297 1:4f2c1fcc6fb6 84 NetworkInterface* net = NetworkInterface::get_default_instance();
star297 1:4f2c1fcc6fb6 85
star297 1:4f2c1fcc6fb6 86 // set static IP, not working on WIFI at the moment
star297 1:4f2c1fcc6fb6 87 //net->set_network((SocketAddress)IP,(SocketAddress)NETMASK,(SocketAddress)GATEWAY);
star297 1:4f2c1fcc6fb6 88
star297 1:4f2c1fcc6fb6 89 if (!net) {
star297 0:768ae9838086 90 printf("No network interface found, select an interface in 'mbed_app.json'\n");
star297 0:768ae9838086 91 return NULL;
star297 0:768ae9838086 92 }
star297 1:4f2c1fcc6fb6 93 nsapi_error_t connect_status = net->connect();
star297 0:768ae9838086 94 if (connect_status != NSAPI_ERROR_OK) {
star297 0:768ae9838086 95 printf("Failed to connect to network (%d)\n", connect_status);
star297 0:768ae9838086 96 return NULL;
star297 0:768ae9838086 97 }
star297 1:4f2c1fcc6fb6 98 SocketAddress net_addr;
star297 1:4f2c1fcc6fb6 99 net->get_ip_address(&net_addr);
star297 1:4f2c1fcc6fb6 100 printf("IP address: %s\n", net_addr.get_ip_address() ? net_addr.get_ip_address() : "None");
star297 1:4f2c1fcc6fb6 101 net->get_netmask(&net_addr);
star297 1:4f2c1fcc6fb6 102 printf("Netmask: %s\n", net_addr.get_ip_address() ? net_addr.get_ip_address() : "None");
star297 1:4f2c1fcc6fb6 103 net->get_gateway(&net_addr);
star297 1:4f2c1fcc6fb6 104 printf("Gateway: %s\n", net_addr.get_ip_address() ? net_addr.get_ip_address() : "None");
star297 1:4f2c1fcc6fb6 105 printf("MAC: %s\n", net->get_mac_address());
star297 1:4f2c1fcc6fb6 106 return net;
star297 0:768ae9838086 107 }
star297 0:768ae9838086 108
star297 0:768ae9838086 109 void startTLSreusesocket(char *FirebaseID) {
star297 0:768ae9838086 110
star297 1:4f2c1fcc6fb6 111 if ((result = socket->open(net)) != NSAPI_ERROR_OK) {
star297 1:4f2c1fcc6fb6 112 printf("TLS socket open failed (%d)\n", result);
star297 0:768ae9838086 113 }
star297 1:4f2c1fcc6fb6 114 if ((result = socket->set_root_ca_cert(SSL_CA_PEM)) != NSAPI_ERROR_OK) {
star297 1:4f2c1fcc6fb6 115 printf("TLS socket set_root_ca_cert failed (%d)\n", result);
star297 1:4f2c1fcc6fb6 116 }
star297 1:4f2c1fcc6fb6 117 net->gethostbyname(FirebaseID, &Fbase);
star297 1:4f2c1fcc6fb6 118 Fbase.set_port(server_port);
star297 1:4f2c1fcc6fb6 119 if ((result = socket->connect(Fbase)) != NSAPI_ERROR_OK) {
star297 1:4f2c1fcc6fb6 120 printf("Connect failure:\n%d\n", result);
star297 1:4f2c1fcc6fb6 121 return;
star297 0:768ae9838086 122 }
star297 1:4f2c1fcc6fb6 123 printf("Successfully connected to:\n%s \nat port: %u\n",
star297 1:4f2c1fcc6fb6 124 FirebaseID, server_port);
star297 0:768ae9838086 125 }
star297 0:768ae9838086 126
star297 0:768ae9838086 127 void dump_response(HttpResponse* res) {
star297 0:768ae9838086 128 mbedtls_printf("Status: %d - %s\n", res->get_status_code(), res->get_status_message().c_str());
star297 0:768ae9838086 129 mbedtls_printf("Headers:\n");
star297 0:768ae9838086 130 for (size_t ix = 0; ix < res->get_headers_length(); ix++) {
star297 0:768ae9838086 131 mbedtls_printf("\t%s: %s\n", res->get_headers_fields()[ix]->c_str(), res->get_headers_values()[ix]->c_str());
star297 0:768ae9838086 132 }
star297 0:768ae9838086 133 mbedtls_printf("\nBody (%d bytes):\n\n%s\n", res->get_body_length(), res->get_body_as_string().c_str());
star297 0:768ae9838086 134 }
star297 0:768ae9838086 135
star297 0:768ae9838086 136 char *getFirebase(char* FirebaseUrl)
star297 0:768ae9838086 137 {
star297 1:4f2c1fcc6fb6 138 //HttpsRequest* get_req = new HttpsRequest(net, SSL_CA_PEM, HTTP_GET, FirebaseUrl); // non socket reuse function
star297 0:768ae9838086 139 HttpsRequest* get_req = new HttpsRequest(socket, HTTP_GET, FirebaseUrl); // socket reuse function
star297 0:768ae9838086 140 HttpResponse* get_res = get_req->send();
star297 0:768ae9838086 141 if (!get_res) {
star297 0:768ae9838086 142 time_t seconds = time(NULL);
star297 0:768ae9838086 143 printf("Https GET failed (error code %d), %s", get_req->get_error(), ctime(&seconds));
star297 0:768ae9838086 144 socket->close();
star297 0:768ae9838086 145 delete socket;
star297 0:768ae9838086 146 delete get_req;
star297 0:768ae9838086 147 TLSSocket* socket = new TLSSocket();
star297 0:768ae9838086 148 startTLSreusesocket((char*)FirebaseID); // restart TLS reuse socket if failure
star297 0:768ae9838086 149 return 0;}
star297 0:768ae9838086 150 else{
star297 0:768ae9838086 151 //dump_response(get_res);
star297 0:768ae9838086 152 delete get_req;
star297 0:768ae9838086 153 getData = (char*)get_res->get_body_as_string().c_str();
star297 0:768ae9838086 154 return getData;
star297 0:768ae9838086 155 }
star297 0:768ae9838086 156 }
star297 0:768ae9838086 157
star297 3:4d7c08734a91 158 bool patchFirebase(char* FirebaseUrl, char *stringToProcess)
star297 3:4d7c08734a91 159 {
star297 3:4d7c08734a91 160 //HttpsRequest* patch_req = new HttpsRequest(net, SSL_CA_PEM, HTTP_PATCH, FirebaseUrl); // non socket reuse function
star297 3:4d7c08734a91 161 HttpsRequest* patch_req = new HttpsRequest(socket, HTTP_PATCH, FirebaseUrl); // socket reuse function
star297 3:4d7c08734a91 162 patch_req->set_header("Content-Type", "application/json");
star297 3:4d7c08734a91 163 HttpResponse* patch_res = patch_req->send(stringToProcess, strlen(stringToProcess));
star297 3:4d7c08734a91 164 if (!patch_res) {
star297 3:4d7c08734a91 165 time_t seconds = time(NULL);
star297 3:4d7c08734a91 166 printf("Https PATCH failed (error code %d), %s", patch_req->get_error(), ctime(&seconds));
star297 3:4d7c08734a91 167 socket->close();
star297 3:4d7c08734a91 168 delete socket;
star297 3:4d7c08734a91 169 delete patch_req;
star297 3:4d7c08734a91 170 TLSSocket* socket = new TLSSocket();
star297 3:4d7c08734a91 171 startTLSreusesocket((char*)FirebaseID); // restart TLS reuse socket if failure
star297 3:4d7c08734a91 172 TLSfailText++;
star297 3:4d7c08734a91 173 httpfail=1;
star297 3:4d7c08734a91 174 return 0;
star297 3:4d7c08734a91 175 }
star297 3:4d7c08734a91 176 else{
star297 3:4d7c08734a91 177 // dump_response(put_res);
star297 3:4d7c08734a91 178 delete patch_req;
star297 3:4d7c08734a91 179 return patch_res;
star297 3:4d7c08734a91 180 }
star297 3:4d7c08734a91 181 }
star297 3:4d7c08734a91 182
star297 0:768ae9838086 183 bool putFirebase(char* FirebaseUrl, char *stringToProcess)
star297 0:768ae9838086 184 {
star297 1:4f2c1fcc6fb6 185 //HttpsRequest* put_req = new HttpsRequest(net, SSL_CA_PEM, HTTP_PUT, FirebaseUrl); // non socket reuse function
star297 0:768ae9838086 186 HttpsRequest* put_req = new HttpsRequest(socket, HTTP_PUT, FirebaseUrl); // socket reuse function
star297 0:768ae9838086 187 put_req->set_header("Content-Type", "application/json");
star297 0:768ae9838086 188 HttpResponse* put_res = put_req->send(stringToProcess, strlen(stringToProcess));
star297 0:768ae9838086 189 if (!put_res) {
star297 0:768ae9838086 190 time_t seconds = time(NULL);
star297 0:768ae9838086 191 printf("Https PUT failed (error code %d), %s", put_req->get_error(), ctime(&seconds));
star297 0:768ae9838086 192 socket->close();
star297 0:768ae9838086 193 delete socket;
star297 0:768ae9838086 194 delete put_req;
star297 0:768ae9838086 195 TLSSocket* socket = new TLSSocket();
star297 0:768ae9838086 196 startTLSreusesocket((char*)FirebaseID); // restart TLS reuse socket if failure
star297 0:768ae9838086 197 return 0;
star297 0:768ae9838086 198 }
star297 0:768ae9838086 199 else{
star297 1:4f2c1fcc6fb6 200 //dump_response(put_res);
star297 0:768ae9838086 201 delete put_req;
star297 0:768ae9838086 202 return put_res;
star297 0:768ae9838086 203 }
star297 0:768ae9838086 204 }
star297 0:768ae9838086 205
star297 0:768ae9838086 206 bool postFirebase(char* FirebaseUrl, char *stringToProcess)
star297 0:768ae9838086 207 {
star297 1:4f2c1fcc6fb6 208 // HttpsRequest* post_req = new HttpsRequest(net, SSL_CA_PEM, HTTP_POST, FirebaseUrl); // non socket reuse function
star297 0:768ae9838086 209 HttpsRequest* post_req = new HttpsRequest(socket, HTTP_POST, FirebaseUrl); // socket reuse function
star297 0:768ae9838086 210 post_req->set_header("Content-Type", "application/json");
star297 0:768ae9838086 211 HttpResponse* post_res = post_req->send(stringToProcess, strlen(stringToProcess));
star297 0:768ae9838086 212 if (!post_res) {
star297 0:768ae9838086 213 time_t seconds = time(NULL);
star297 0:768ae9838086 214 printf("Https POST failed (error code %d), %s", post_req->get_error(), ctime(&seconds));
star297 0:768ae9838086 215 socket->close();
star297 0:768ae9838086 216 delete socket;
star297 0:768ae9838086 217 delete post_req;
star297 0:768ae9838086 218 TLSSocket* socket = new TLSSocket();
star297 0:768ae9838086 219 startTLSreusesocket((char*)FirebaseID); // restart TLS reuse socket if failure
star297 0:768ae9838086 220 return 0;
star297 0:768ae9838086 221 }
star297 0:768ae9838086 222 else{
star297 0:768ae9838086 223 //dump_response(post_res);
star297 0:768ae9838086 224 delete post_req;
star297 0:768ae9838086 225 return post_res;
star297 0:768ae9838086 226 }
star297 0:768ae9838086 227 }
star297 0:768ae9838086 228
star297 0:768ae9838086 229 bool deleteFirebase(char* FirebaseUrl, char *stringToProcess)
star297 0:768ae9838086 230 {
star297 1:4f2c1fcc6fb6 231 // HttpsRequest* delete_req = new HttpsRequest(net, SSL_CA_PEM, HTTP_DELETE, FirebaseUrl); // non socket reuse function
star297 0:768ae9838086 232 HttpsRequest* delete_req = new HttpsRequest(socket, HTTP_DELETE, FirebaseUrl); // socket reuse function
star297 0:768ae9838086 233 delete_req->set_header("Content-Type", "application/json");
star297 0:768ae9838086 234 HttpResponse* delete_res = delete_req->send(stringToProcess, strlen(stringToProcess));
star297 0:768ae9838086 235 if (!delete_res) {
star297 0:768ae9838086 236 time_t seconds = time(NULL);
star297 0:768ae9838086 237 printf("Https DELETE failed (error code %d), %s", delete_req->get_error(), ctime(&seconds));
star297 0:768ae9838086 238 socket->close();
star297 0:768ae9838086 239 delete socket;
star297 0:768ae9838086 240 delete delete_req;
star297 0:768ae9838086 241 TLSSocket* socket = new TLSSocket();
star297 0:768ae9838086 242 startTLSreusesocket((char*)FirebaseID); // restart TLS socket reuse if failure
star297 0:768ae9838086 243 return 0;
star297 0:768ae9838086 244 }
star297 0:768ae9838086 245 else{
star297 0:768ae9838086 246 //dump_response(delete_res);
star297 0:768ae9838086 247 delete delete_req;
star297 0:768ae9838086 248 return delete_res;
star297 0:768ae9838086 249 }
star297 0:768ae9838086 250 }
star297 0:768ae9838086 251
star297 0:768ae9838086 252 #endif // _FIREBASE_H_