mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 08:42:39 +01:00 
			
		
		
		
	Added example JsonHttpClient (issue #256)
				
					
				
			This commit is contained in:
		
							
								
								
									
										195
									
								
								examples/JsonHttpClient/JsonHttpClient.ino
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								examples/JsonHttpClient/JsonHttpClient.ino
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,195 @@ | ||||
| // Sample Arduino Json Web Client | ||||
| // Downloads and parse http://jsonplaceholder.typicode.com/users/1 | ||||
| // | ||||
| // Copyright Benoit Blanchon 2014-2016 | ||||
| // MIT License | ||||
| // | ||||
| // Arduino JSON library | ||||
| // https://github.com/bblanchon/ArduinoJson | ||||
| // If you like this project, please add a star! | ||||
|  | ||||
| #include <ArduinoJson.h> | ||||
| #include <SPI.h> | ||||
| #include <Ethernet.h> | ||||
|  | ||||
| EthernetClient client; | ||||
|  | ||||
| const char* server = "jsonplaceholder.typicode.com";  // server's address | ||||
| const char* resource = "/users/1";                    // http resource | ||||
| const unsigned long BAUD_RATE = 9600;                 // serial connection speed | ||||
| const unsigned long HTTP_TIMEOUT = 10000;  // max respone time from server | ||||
| const size_t MAX_CONTENT_SIZE = 512;       // max size of the HTTP response | ||||
|  | ||||
| // The type of data that we want to extract from the page | ||||
| struct UserData { | ||||
|   char name[32]; | ||||
|   char company[32]; | ||||
| }; | ||||
|  | ||||
| // ARDUINO entry point #1: runs once when you press reset or power the board | ||||
| void setup() { | ||||
|   initSerial(); | ||||
|   initEthernet(); | ||||
| } | ||||
|  | ||||
| // ARDUINO entry point #2: runs over and over again forever | ||||
| void loop() { | ||||
|   if (connect(server)) { | ||||
|     if (sendRequest(server, resource) && skipResponseHeaders()) { | ||||
|       char response[MAX_CONTENT_SIZE]; | ||||
|       readReponseContent(response, sizeof(response)); | ||||
|  | ||||
|       UserData userData; | ||||
|       if (parseUserData(response, &userData)) { | ||||
|         printUserData(&userData); | ||||
|       } | ||||
|     } | ||||
|     disconnect(); | ||||
|   } | ||||
|   wait(); | ||||
| } | ||||
|  | ||||
| // Initialize Serial port | ||||
| void initSerial() { | ||||
|   Serial.begin(BAUD_RATE); | ||||
|   while (!Serial) { | ||||
|     ;  // wait for serial port to initialize | ||||
|   } | ||||
|   Serial.println("Serial ready"); | ||||
| } | ||||
|  | ||||
| // Initialize Ethernet library | ||||
| void initEthernet() { | ||||
|   byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; | ||||
|   if (!Ethernet.begin(mac)) { | ||||
|     Serial.println("Failed to configure Ethernet"); | ||||
|     return; | ||||
|   } | ||||
|   Serial.println("Ethernet ready"); | ||||
|   delay(1000); | ||||
| } | ||||
|  | ||||
| // Open connection to the HTTP server | ||||
| bool connect(const char* hostName) { | ||||
|   Serial.print("Connect to "); | ||||
|   Serial.println(hostName); | ||||
|  | ||||
|   bool ok = client.connect(hostName, 80); | ||||
|  | ||||
|   Serial.println(ok ? "Connected" : "Connection Failed!"); | ||||
|   return ok; | ||||
| } | ||||
|  | ||||
| // Send the HTTP GET request to the server | ||||
| bool sendRequest(const char* host, const char* resource) { | ||||
|   Serial.print("GET "); | ||||
|   Serial.println(resource); | ||||
|  | ||||
|   client.print("GET "); | ||||
|   client.print(resource); | ||||
|   client.println(" HTTP/1.1"); | ||||
|   client.print("Host: "); | ||||
|   client.println(server); | ||||
|   client.println("Connection: close"); | ||||
|   client.println(); | ||||
|  | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| // Skip HTTP headers so that we are at the beginning of the response's body | ||||
| bool skipResponseHeaders() { | ||||
|   // HTTP headers end with an empty line | ||||
|   char endOfHeaders[] = "\r\n\r\n"; | ||||
|  | ||||
|   client.setTimeout(HTTP_TIMEOUT); | ||||
|   bool ok = client.find(endOfHeaders); | ||||
|  | ||||
|   if (!ok) { | ||||
|     Serial.println("No response or invalid response!"); | ||||
|   } | ||||
|  | ||||
|   return ok; | ||||
| } | ||||
|  | ||||
| // Read the body of the response from the HTTP server | ||||
| void readReponseContent(char* content, size_t maxSize) { | ||||
|   size_t length = client.readBytes(content, maxSize); | ||||
|   content[length] = 0; | ||||
|   Serial.println(content); | ||||
| } | ||||
|  | ||||
| // Parse the JSON from the input string and extract the interesting values | ||||
| // Here is the JSON we need to parse | ||||
| // { | ||||
| //   "id": 1, | ||||
| //   "name": "Leanne Graham", | ||||
| //   "username": "Bret", | ||||
| //   "email": "Sincere@april.biz", | ||||
| //   "address": { | ||||
| //     "street": "Kulas Light", | ||||
| //     "suite": "Apt. 556", | ||||
| //     "city": "Gwenborough", | ||||
| //     "zipcode": "92998-3874", | ||||
| //     "geo": { | ||||
| //       "lat": "-37.3159", | ||||
| //       "lng": "81.1496" | ||||
| //     } | ||||
| //   }, | ||||
| //   "phone": "1-770-736-8031 x56442", | ||||
| //   "website": "hildegard.org", | ||||
| //   "company": { | ||||
| //     "name": "Romaguera-Crona", | ||||
| //     "catchPhrase": "Multi-layered client-server neural-net", | ||||
| //     "bs": "harness real-time e-markets" | ||||
| //   } | ||||
| // } | ||||
| bool parseUserData(char* content, struct UserData* userData) { | ||||
|   // Compute optimal size of the JSON buffer according to what we need to parse. | ||||
|   // This is only required if you use StaticJsonBuffer. | ||||
|   const size_t BUFFER_SIZE = | ||||
|       JSON_OBJECT_SIZE(8)     // the root object has 8 elements | ||||
|       + JSON_OBJECT_SIZE(5)   // the "address" object has 5 elements | ||||
|       + JSON_OBJECT_SIZE(2)   // the "geo" object has 2 elements | ||||
|       + JSON_OBJECT_SIZE(3);  // the "company" object has 3 elements | ||||
|  | ||||
|   // Allocate a temporary memory pool on the stack | ||||
|   StaticJsonBuffer<BUFFER_SIZE> jsonBuffer; | ||||
|   // If the memory pool is too big for the stack, use this instead: | ||||
|   // DynamicJsonBuffer jsonBuffer; | ||||
|  | ||||
|   JsonObject& root = jsonBuffer.parseObject(content); | ||||
|  | ||||
|   if (!root.success()) { | ||||
|     Serial.println("JSON parsing failed!"); | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   // Here were copy the strings we're interested in | ||||
|   strcpy(userData->name, root["name"]); | ||||
|   strcpy(userData->company, root["company"]["name"]); | ||||
|   // It's not mandatory to make a copy, you could just use the pointers | ||||
|   // Since, they are pointing inside the "content" buffer, so you need to make | ||||
|   // sure it's still in memory when you read the string | ||||
|  | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| // Print the data extracted from the JSON | ||||
| void printUserData(const struct UserData* userData) { | ||||
|   Serial.print("Name = "); | ||||
|   Serial.println(userData->name); | ||||
|   Serial.print("Company = "); | ||||
|   Serial.println(userData->company); | ||||
| } | ||||
|  | ||||
| // Close the connection with the HTTP server | ||||
| void disconnect() { | ||||
|   Serial.println("Disconnect"); | ||||
|   client.stop(); | ||||
| } | ||||
|  | ||||
| // Pause for a 1 minute | ||||
| void wait() { | ||||
|   Serial.println("Wait 60 seconds"); | ||||
|   delay(60000); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user