【分享】自制环境参数检测装置接入 oneNet 平台(三)-Arduino中文社区 - Powered by Discuz! Archiver

xiebinqiang 发表于 2016-1-27 10:05

【分享】自制环境参数检测装置接入 oneNet 平台(三)

本帖最后由 xiebinqiang 于 2016-1-27 10:07 编辑

第三部分 传感器数据上传至oneNet平台

有了数据和通信,下一步就是将我们采集到的数据通过WIFI模块上传至oneNet云平台,在设备端,需要将采集到的数据安照规定协议进行封装,然后进行发送,比如,对以上采集到的四个参数数据进行封装,需要在第二部分的代码中添加如下操作函数:
//封装http包并发送到oneNet平台
void SendDataToYun(float temp, float hum, int niose, uint16_t light)
{

static int cnt = 0;   //JSON格式数据包长度

SendCmd("AT+CIPMODE=1\r");//开启透传模式
Serial.println("AT+CIPSEND\r");//开始透传数据
delay(2000);

//http报头字符串
String cmd("POST /devices/70290/datapoints HTTP/1.1\r\n"
            "User-Agent: curl/7.35.0\r\n"
            "Host: api.heclouds.com\r\n"
            "Accept: */*\r\n"
            "api-key:B4ZGKmtaL5eJw6NIpjEEI+kULqQ=\r\n"//API key,从oneNet获取
            "Content-Length:" + String(cnt) + "\r\n"   //JSON格式数据长度
            "Content-Type: application/x-www-form-urlencoded\r\n"
            "\r\n");

Serial.print(cmd);

//JSON格式数据封装
cnt = Serial.print("{\"datastreams\":["
                      "{\"id\":\"temp\",\"datapoints\":[{\"value\":" + String(temp) + "}]},"
                      "{\"id\":\"hum\",\"datapoints\":[{\"value\":" + String(hum) + "}]},"
                      "{\"id\":\"light\",\"datapoints\":[{\"value\":" + String(light) + "}]},"
                      "{\"id\":\"noise\",\"datapoints\":[{\"value\":" + String(niose) + "}]}"
//Serial.print("{\"id\":\"distance\",\"datapoints\":[{\"value\":" + String(h) + "}]}");               
                      "]}" );
Serial.println();//向服务器发送数据

while (1)//等待服务器返回结果
{
      if (Serial.available()> 0 && Serial.find("error") == true)//判断返回结果
      {
          //LedFlash();
          Serial.println("+++" ); //结束数据透传
          break;
      }
}

delay(1000);
while (1)
{
      Serial.println("AT+CIPSTATUS\r"); //查看与服务器连接状态
      if (Serial.available()> 0 && Serial.find("TCP") == true)//TCP连接未中断转入下一次传输
      {
          //LedFlash();
          break;
      }
      else //TCP连接中断,重新与服务器建立TCP连接
      {
          SendCmd("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r");
      }
}
}

需要修改如下两个函数:
void WifiInit(void)
{
SendCmd("AT+CWMODE=3\r");//
SendCmd("AT+RST\r");
SendCmd("AT+CWJAP=\"hello-simon-30\",\"guajiguajiSIMONSEN2048\"\r");
SendCmd("AT+CIFSR\r");
SendCmd("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r"); //和oneNet平台建立TCP连接
//SendCmd("AT+CIPMODE=1\r");
//Serial.println("AT+CIPSEND\r");
}

void loop() {
float temp, hum;
int noise;
uint16_t light;

// put your main code here, to run repeatedly:
ReadTempHum(&hum, &temp);
noise = ReadVoice();
light = LightStrength();
SendDataToYun(temp, hum, noise, light);//调用数据打包和发送的函数

//屏蔽以下代码段
/*
Serial.print("temp:");
Serial.print(temp);
Serial.print("\thum:");
Serial.print(hum);
Serial.print("\tnoise:");
Serial.print(noise);
Serial.print("\tlight:");
Serial.println(light);
*/
delay(2000);
//LedFlash();
}

修改以上代码时需要注意: 1) API Key需要从oneNet平台获取 2) 报头数据Content-Length字段会岁采集的数据变化,要实时进行统计,该字段必须准确,否则,服务器无法正确解析数据。 3) 在WifiInit(void)中只需建立连接,透传模式在发送数据之前实时设置,每发送一帧数据进行一次透传设置,发送完毕后结束透传模式,这是查询TCP连接状态的需要。不结束透传模式,无法查询连接状态。

以上代码修改完毕,重新更新ardiuno板中代码,设备端的准备工作完成。

设备端准备工作完成后,接下来讲在服务器端的操作,首先登陆一下网站:http://open.iot.10086.cn/ ,显示如下画面:


点击云平台入口:


注册账号并登陆:


进入“设备管理”入口,点击“添加一个设备”进行设备创建:


输入创建信息:


添加完成,进入如下页面:


添加数据流:


此处,我们添加四路数据流,分别为:光照、温度、湿度、噪音强度。如下图:


点击“添加应用”,进入下面的界面添加相关应用来展示设备数据:


添加完成后保存并发布,发布后会产生一个网址,可以通过浏览器直接访问该网址,观测以上界面,而无需登录账户。回到先前页面,点击右上角“设置”进入如下界面:


此处的MasterKey可以作为程序中的API key字段的值。

到此,服务器中的设备的基本设置完成。可以进行数据上传了。

将先前准备好的自制设备接上电源,等待LED等闪烁6次后,设备启动成功,开始上传数据,在oneNet上可以查看数据上传情况:


通过“设备应用”,可以更直观的观测数据的变化情况:


除此之外我们还可以通过发布的网址观测到以上界面,发布网址为: http://open.iot.10086.cn/deviceview/p/1009107914a5cb0acbf7fe2483ee9d2e



以上就是本人制作环境参数检测装置并接入oneNet平台的全部流程,如有错误,请多多指正。谢谢!

望京小妖 发表于 2016-3-2 15:52

你好,请问183.230.40.33:80是oneNet的ip吗?

学而不止 发表于 2016-9-24 08:30

感谢老师分享!学习了!
页: [1]
查看完整版本: 【分享】自制环境参数检测装置接入 oneNet 平台(三)