如何修复错误“ Response code 0”以获取“ Response code 202”以批量更新ThingSpeak频道?

时间:2018-06-21 13:44:07

标签: c++ http arduino esp8266 arduino-esp8266

我正在使用以下示例:(https://www.mathworks.com/help/thingspeak/continuously-collect-data-and-bulk-update-a-thingspeak-channel-using-an-arduino-mkr1000-board-or-an-esp8266-board.html)。

根据该示例,我应该得到“响应代码202”。但是,我收到“响应代码0”。因此,我在ThingSpeak频道上什么都没得到。我的开发板是ESP8266开发人员。

我的串行监视器显示以下输出:

Attempting to connect to SSID: Xperia Z_a769
Connected to wifi
SSID: Xperia Z_a769
IP Address: **********
signal strength (RSSI):-47 dBm
Response code:0

为什么我收到响应码0?我该如何解决此问题,以便在Thingspeak.com上获取数据。

我在下面附加了我的代码:

/* This example shows how to bulk update a ThingSpeak channel using an 
   Arduino MKR1000 or an ESP8266*/

  #include <EthernetClient.h> //Uncomment this library to work with ESP8266
  #include <ESP8266WiFi.h> //Uncomment this library to work with ESP8266

  //#include<SPI.h> // Comment this to work with ESP8266 board
  //#include<WiFi101.h> // Comment this to work with ESP8266 board

char jsonBuffer[500] = "["; // Initialize the jsonBuffer to hold data

char ssid[] = "Xperia Z_a769"; // Your network SSID (name)
char pass[] = "7c6761b56ed2"; // Your network password
WiFiClient client; // Initialize the WiFi client library

char server[] = "api.thingspeak.com"; // ThingSpeak Server

/* Collect data once every 15 seconds and post data to ThingSpeak channel 
once every 2 minutes */
unsigned long lastConnectionTime = 0; // Track the last connection time
unsigned long lastUpdateTime = 0; // Track the last update time
const unsigned long postingInterval = 120L * 1000L; // Post data every 2 minutes
const unsigned long updateInterval = 15L * 1000L; // Update once every 15 seconds

void setup() {
    Serial.begin(9600);
    // Attempt to connect to WiFi network
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print("Attempting to connect to SSID: ");
        Serial.println(ssid);
        WiFi.begin(ssid, pass); // Connect to WPA/WPA2 network. Change this 
                               // line if using open or WEP network
        delay(10000); // Wait 10 seconds to connect
    }
    Serial.println("Connected to wifi");
    printWiFiStatus(); // Print WiFi connection information
}

void loop() {
    // If update time has reached 15 seconds, then update the jsonBuffer
    if (millis() - lastUpdateTime >= updateInterval) {
        updatesJson(jsonBuffer);
    }

}

// Updates the jsonBuffer with data
void updatesJson(char* jsonBuffer){
        /* JSON format for updates paramter in the API
          * This example uses the relative timestamp as it uses the 
     "delta_t". If your device has a real-time clock, you can provide the 
      absolute timestamp using the "created_at" parameter
     * instead of "delta_t".
     * "[{\"delta_t\":0,\"field1\":-70},{\"delta_t\":15,\"field1\":-66}]"
     */
     // Format the jsonBuffer as noted above 
    strcat(jsonBuffer,"{\"delta_t\":");
    unsigned long deltaT = (millis() - lastUpdateTime)/1000;
    size_t lengthT = String(deltaT).length();
    char temp[4];
    String(deltaT).toCharArray(temp,lengthT+1);
    strcat(jsonBuffer,temp);
    strcat(jsonBuffer,",");
    long rssi = WiFi.RSSI();
    strcat(jsonBuffer, "\"field1\":");
    lengthT = String(rssi).length();
    String(rssi).toCharArray(temp,lengthT+1);
    strcat(jsonBuffer,temp);
    strcat(jsonBuffer,"},");
    // If posting interval time has reached 2 minutes, then update the 
    // ThingSpeak channel with your data
    if (millis() - lastConnectionTime >= postingInterval) {
        size_t len = strlen(jsonBuffer);
        jsonBuffer[len-1] = ']';
        httpRequest(jsonBuffer);
    }
    lastUpdateTime = millis(); // Update the last update time
}

// Updates the ThingSpeakchannel with data
void httpRequest(char* jsonBuffer) {
   /* JSON format for data buffer in the API
    * This example uses the relative timestamp as it uses the "delta_t". If 
      your device has a real-time clock, you can also provide the absolute 
      timestamp using the "created_at" parameter
   * instead of "delta_t".
   * "{\"write_api_key\":\"YOUR-CHANNEL-WRITEAPIKEY\",\"updates\": 
      [{\"delta_t\":0,\"field1\":-60},{\"delta_t\":15,\"field1\":200}, 
       {\"delta_t\":15,\"field1\":-66}]
   */
    // Format the data buffer as noted above
    char data[500] = "{\"write_api_key\":\"6OF022OLH2QM50TP\",\"updates\":"; 
    //Replace YOUR-CHANNEL-WRITEAPIKEY with your ThingSpeak channel write API key
    strcat(data,jsonBuffer);
    strcat(data,"}");
    // Close any connection before sending a new request
    client.stop();
    String data_length = String(strlen(data)+1); //Compute the data buffer length
    // POST data to ThingSpeak
    if (client.connect(server, 80)) {
        client.println("POST /channels/522490/bulk_update.json HTTP/1.1"); 
        //Replace YOUR-CHANNEL-ID with your ThingSpeak channel ID
        client.println("Host: api.thingspeak.com");
        client.println("User-Agent: mw.doc.bulk-update (Arduino ESP8266)");
        client.println("Connection: close");
        client.println("Content-Type: application/json");
        client.println("Content-Length: "+data_length);
        client.println();
        client.println(data);
    }
    else {
        Serial.println("Failure: Failed to connect to ThingSpeak");
    }
    delay(15000); //Wait to receive the response
    client.parseFloat();
    String resp = String(client.parseInt());
    Serial.println("Response code:"+resp); // Print the response code. 202 
                        // indicates that the server has accepted the response
    jsonBuffer[0] = '['; // Reinitialize the jsonBuffer for next batch of data
    jsonBuffer[1] = '\0';
    lastConnectionTime = millis(); // Update the last connection time
}

void printWiFiStatus() {
    // Print the SSID of the network you're attached to: 
    Serial.print("SSID: ");
    Serial.println(WiFi.SSID());

    // Print your device IP address:
    IPAddress ip = WiFi.localIP();
    Serial.print("IP Address: ");
    Serial.println(ip);

    // Print the received signal strength:
    long rssi = WiFi.RSSI();
    Serial.print("signal strength (RSSI):");
    Serial.print(rssi);
    Serial.println(" dBm");
}

0 个答案:

没有答案