// Sample Arduino Json Web Client // Downloads and parse http://jsonplaceholder.typicode.com/users/1 // // Copyright Benoit Blanchon 2014-2017 // MIT License // // Arduino JSON library // https://github.com/bblanchon/ArduinoJson // If you like this project, please add a star! #include #include #include 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()) { UserData userData; if (readReponseContent(&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.0"); client.print("Host: "); client.println(host); 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; } // 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 readReponseContent(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 + MAX_CONTENT_SIZE; // additional space for strings // Allocate a temporary memory pool DynamicJsonBuffer jsonBuffer(BUFFER_SIZE); JsonObject& root = jsonBuffer.parseObject(client); 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); }