“JsonHttpClient”的版本间的差异
来自YFRobotwiki
(以“ Json库 <pre> // Copyright Benoit Blanchon 2014-2016 // MIT License // // Arduino JSON library // https://github.com/bblanchon/ArduinoJson // If you like thi...”为内容创建页面) |
|||
第5行: | 第5行: | ||
<pre> | <pre> | ||
+ | // Sample Arduino Json Web Client | ||
+ | // Downloads and parse http://jsonplaceholder.typicode.com/users/1 | ||
+ | // | ||
// Copyright Benoit Blanchon 2014-2016 | // Copyright Benoit Blanchon 2014-2016 | ||
// MIT License | // MIT License | ||
第13行: | 第16行: | ||
#include <ArduinoJson.h> | #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() { | void setup() { | ||
− | Serial.begin( | + | 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) { | while (!Serial) { | ||
− | // wait serial port | + | ; // 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); | ||
+ | } | ||
+ | |||
2016年8月22日 (一) 15:40的最后版本
// 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论坛