Arduino_OneNET物联网三部曲(2)远程数据监控

一.准备工作

1.1硬件

Arduino Mega2560*1

ESP8266-01*1

       ESP8266-01模块的工作模式,固件烧录等都太麻烦。我们直接使用默认的固件和配置,使用透传(透明传输)来发送数据。

       ESP8266-01的CH-PD,GPIO0,VCC三个引脚连接Arduino的3.3V;GND引脚连接Arduino的GND;UTXD,URXD分别连接Arduino mega2560的RX3,TX3(也就是数字口15,14)。

1.2软件

       Arduino通过ESP8266-01发送数据给OneNET平台的数据是Json格式,所以需要TimerOne.h,HttpPacket.h, ArduinoJson.h这三个库,三个库的下载在附件里面,具体程序在后面会给出。

1.3平台

       OneNET服务器里有很多项目很多设备,具体把数据发到拿呢?实际上OneNET平台对于发送过来的Json数据是有一定格式要求的,其中除了要传输的数据,还包含了设备ID,密匙,这样就可以保证数据发送到正确的设备。在正式开始前,我们需要记录设备的ID和密匙。设备ID可通过单击“设备列表”可在设备前面看到设备ID,密匙则只要单击“权限管理”,在APIKey这一列的就是密匙。

二.Arduino数据发送

       这里是一个母版,只要WiFi名称,密码,设备ID,密匙替换即可发送数据。发送数据的时候,如果OneNET项目里没有这个名称的数据流,那么就会自动在OneNET平台上新建一个数据流。

#include <TimerOne.h>
#include <HttpPacket.h>
#include <ArduinoJson.h>

#define ESP8266Serail Serial3
#define Success 1U
#define Failure 0U

HttpPacketHead packet;
unsigned long Time_Cont = 0;
const unsigned int esp8266RxBufferLength = 600;
char esp8266RxBuffer[esp8266RxBufferLength];
unsigned int ii = 0;
char OneNetServer[] = "api.heclouds.com";

const char ssid[] = "Rico_IOT";//这个地方替换为自己的wifi名称
const char password[] = "Rico666";//这个地方替换为自己的wifi密码
char device_id[] = "511234953";//这个地方替换为自己的设备ID
char API_KEY[] = "A2ORAeLeP2P=dc=";//这个地方要替换为自己的密匙

void setup() {
    ESP8266Serail.begin(115200);
    Timer1.initialize(1000);
    Timer1.attachInterrupt(Timer1_handler);
    initEsp8266();
}
void loop() {
/*下面这一行新建了一给名为arduino_test的数据流,并把它的值设置为3
 * 这个值是给整数,可以用其他变量替换掉如果要把模拟口A0的值每隔1秒
 * 发给arduino_test,那么可以按照如下来写
 * data1=analogRead(A0);
 * postDataToOneNet(API_KEY, device_id, "arduino_test", data1);
 * delay(1000);
 */
    postDataToOneNet(API_KEY, device_id, "arduino_test", 3);
    delay(1000);
}

//下面的程序全部不用改变
void initEsp8266() {
    if (sendCommand("AT\r\n", "OK", 1000, 10) == Success);
    else ESP8266_ERROR(5);
    clrEsp8266RxBuffer();
    if (sendCommand("AT+CWMODE=1\r\n", "OK", 3000, 10) == Success);
    else ESP8266_ERROR(7);
    clrEsp8266RxBuffer();
    char cmd[50];
    strcpy(cmd, "AT+CWJAP=\"");
    strcat(cmd, ssid);
    strcat(cmd, "\",\"");
    strcat(cmd, password);
    strcat(cmd, "\"\r\n");
    if (sendCommand(cmd, "OK", 20000, 10) == Success);
    else ESP8266_ERROR(8);
    clrEsp8266RxBuffer();

    if (sendCommand("AT+CIPMUX=0\r\n", "OK", 3000, 10) == Success);
    else ESP8266_ERROR(9);
    clrEsp8266RxBuffer();

    if (sendCommand("AT+CIFSR\r\n", "OK", 20000, 10) == Success);
    else ESP8266_ERROR(10);
    clrEsp8266RxBuffer();
}
void( * resetFunc)(void) = 0;
void ESP8266_ERROR(int num) {
    while (1) {
        if (sendCommand("AT\r\n", "OK", 100, 10) == Success) {
            resetFunc();
        }
    }
}
unsigned int sendCommand(char * Command, char * Response, unsigned long Timeout, unsigned char Retry) {
    clrEsp8266RxBuffer();
    for (unsigned char n = 0; n < Retry; n++) {
        ESP8266Serail.write(Command);

        Time_Cont = 0;
        while (Time_Cont < Timeout) {
            esp8266ReadBuffer();
            if (strstr(esp8266RxBuffer, Response) != NULL) {
                return Success;
            }
        }
        Time_Cont = 0;
    }
    return Failure;
}
void Timer1_handler(void) {
    Time_Cont++;
}
void esp8266ReadBuffer() {
    while (ESP8266Serail.available()) {
        esp8266RxBuffer[ii++] = ESP8266Serail.read();
        if (ii == esp8266RxBufferLength) clrEsp8266RxBuffer();
    }
}
void clrEsp8266RxBuffer(void) {
    memset(esp8266RxBuffer, 0, esp8266RxBufferLength);
    ii = 0;
}
void postDataToOneNet(char * API_VALUE_temp, char * device_id_temp, char * sensor_id_temp, double thisData) {
    StaticJsonBuffer < 200 > jsonBuffer;
    JsonObject & value = jsonBuffer.createObject();
    value["value"] = thisData;

    JsonObject & id_datapoints = jsonBuffer.createObject();
    id_datapoints["id"] = sensor_id_temp;
    JsonArray & datapoints = id_datapoints.createNestedArray("datapoints");
    datapoints.add(value);

    JsonObject & myJson = jsonBuffer.createObject();
    JsonArray & datastreams = myJson.createNestedArray("datastreams");
    datastreams.add(id_datapoints);

    char p[200];
    int num = myJson.printTo(p, sizeof(p));


    packet.setHostAddress(OneNetServer);
    packet.setDevId(device_id_temp);
    packet.setAccessKey(API_VALUE_temp);

    packet.createCmdPacket(POST, TYPE_DATAPOINT, p);

    int httpLength = strlen(packet.content) + num;

    char cmd[400];
    memset(cmd, 0, 400);
    strcpy(cmd, "AT+CIPSTART=\"TCP\",\"");
    strcat(cmd, OneNetServer);
    strcat(cmd, "\",80\r\n");
    if (sendCommand(cmd, "CONNECT", 10000, 5) == Success);
    else ESP8266_ERROR(1);
    clrEsp8266RxBuffer();

    memset(cmd, 0, 400);
    sprintf(cmd, "AT+CIPSEND=%d\r\n", httpLength);
    if (sendCommand(cmd, ">", 3000, 1) == Success);
    else ESP8266_ERROR(2);
    clrEsp8266RxBuffer();

    memset(cmd, 0, 400);
    strcpy(cmd, packet.content);
    strcat(cmd, p);
    if (sendCommand(cmd, "\"succ\"}", 3000, 1) == Success);
    else ESP8266_ERROR(3);
    clrEsp8266RxBuffer();

    if (sendCommand("AT+CIPCLOSE\r\n", "CLOSED", 3000, 1) == Success);
    else ESP8266_ERROR(4);
    clrEsp8266RxBuffer();
}

三.OneNET平台数据处理

       对于接收到的数据流,只要按照上一篇教程中的步骤与应用关联即可通过电脑或手机APP远程监控数据。

猜你喜欢

转载自blog.csdn.net/WALRE_HUNTER_RICO/article/details/88255053