JsonHttpClient
来自YFRobotwiki
// 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); }
更多建议和问题欢迎反馈至 YFRobot论坛