本帖最后由 水哥小白 于 2018-12-18 23:48 编辑
1. 引言 最近需要做和物联网相关的小项目,需要将数据传到Onenet,并能够回传Onenet端发送的信号。上网搜索了相关的信息,发现有较简单的ESP8266模块,支持Arduino IDE进行编程,因为之前接触过Arduino,就果断上某宝购买一块小板进行测试,花费15.8块大洋。搜索了几天,发现网上关于ESP8266和Onenet的教程还是挺多的,但是大部分写得不太详细,对于新手只需要做一个小项目来说或许有些困难,所以我特意做了些整理,能够让新手直接上手实现基于Onenet平台和ESP8266的物联网创意。
2. 器材和方法
2.1 器材
控制器:ESP8266模块*1
传感器:DHT11温度湿度传感器*1 ESP8266自带LED*1
ESP8266
DHT11
2.2 编程前的配置
2.2.1 ESP8266配置
接线很简单,LED采用ESP8266模块自带的LED(D2),传感器DHT11的连接方式如下:
接线完成后我们需要给Arduino IDE配置相应的开发环境,如下:
第一步 启动Arduino IDE,然后选择 文件-->首选项,将以下网址填入后点击好。
http://arduino.esp8266.com/stable/package_esp8266com_index.json
第二步 点击 工具-->开发板-->开发板管理器, 下载ESP8266对应的开发板配置
第三步 下载完成后重启Arduino IDE 选择对应的控制板 WeMos D1 R1
至此,整个硬件部分的接线和配置就完成了,接下来,需要到Onenet平台进行配置。
2.2.2 Onenet平台配置
进入Onenet网站,注册账号,登录到开发者中心。网址 https://open.iot.10086.cn/
进入开发者中心界面后,点击 产品开发-->添加产品
填写相关的产品信息,根据实际情况填写,我这里给出的例子是用HTTP协议上传
产品添加好后进入设备列表,点击右边的添加设备。
输入设备的名称和编号
点击添加后,会显示出刚才添加的设备
记下我们的设备ID,一会会用到。点击右边的数据流,点击添加数据流模板
创建一个数据流名叫LIGHT,用来存放一会控制LED的数据。至于要上传的温度和湿度数据流TEMP和HUMI,我们一会通过设备端直接向云端创建,这里暂时不创建。
回到产品概括中,记下我们的APIkey
至此,Onenet配置完成,我们一会需要用到的东西有设备ID,APIkey和数据流LIGHT。
3. 编程
接下来就开始我们的ESP8266程序编写。在编程前我们需要了解一些简单的基础知识。设备通过HTTP与服务器通信,需要向服务器发送请求,服务器才能响应该请求,所以我们只需要用设备以HTTP对应的格式向Onenet服务器发送指令,发送后再解析我们收到的数据就可以了。对于上传和创建新的数据我们采用POST方式,对于读取数据流我们采用GET方式。具体更深的技术知识可以查看Onenet的技术文档,这里我们只需要知道我们所需要向服务器端发送指令的格式即可。
3.1上传温度和湿度数据 对于POST创建数据流并上传数据的格式如下:
[mw_shl_code=arduino,true]POST /devices/你的设备ID/datapoints?type=3 HTTP/1.1\r\n
api-key:你的APIKEY\r\n
Host:api.heclouds.com\r\n
Content-Length: 你发送的数据长度\r\n
Connection: close\r\n\r\n
{"JASON"}
[/mw_shl_code] 其中需要填写的信息有设备ID,APIkey,发送的数据长度和JASON数据。其中我们要创建的包含温度和湿度的数据流以及他们的数值就写在JASON数据里。JASON数据的相关知识可以参考网上,而这里对于我们所需要上传的温度和湿度来说,JASON数据写法如下(示例为将温度数据19和湿度数据49上传):
[mw_shl_code=arduino,true]{"TEMP":19,"HUMI":49}[/mw_shl_code]
至此我们就可以向服务器发送我们的温度和湿度数据了,Onenet会自己创建两个名为TEMP和HUMI的数据流,并显示该数据流的具体数值。
3.2读取服务器数据
因为我们采用了HTTP模式,需要服务器向设备发送的指令只能通过设备不断向服务器发送读取请求,然后才能不断地接收到服务器发来的数据流信息。 对于GET请求读取数据流信息需要上传的格式如下:
[mw_shl_code=arduino,true]GET /devices/你的设备ID/datapoints?datastream_id=LIGHT HTTP/1.1\r\n
api-key:你的APIKEY\r\n
Host:api.heclouds.com\r\n
Connection: close\r\n\r\n[/mw_shl_code] 其中需要填写的信息有设备ID,APIkey。注意我这里已经填好了需要读取的数据流为LIGHT。
向服务器发送信息后,服务器会以JASON数据回复一段信息,我们只需要读取出里面我们需要的数据即可,下面是一个服务器发送回来信息的示例:
我们可以看到,此时LIGHT的值为1023。
3.3总体代码
为了方便使用ESP8266和直接获取JASON数据回中我们需要信息,我们需要向代码中添加ESP8266WiFi.h和ArduinoJson.h两个库。为了方便使用DHT11传感器,我们需要向代码中添加DHT.h的库。 代码中需要修改的部分如下,将xxxxxxxx修改为你自己的参数: [mw_shl_code=arduino,true]#define LED 2
#define DHTPIN 3 // 传感器连接到D3 -- Sensor to D3
#define DHTTYPE DHT11 // DHT 11
const char ssid[] = "xxxxxxxx"; // 使用时请修改为当前你的 wifi 名称 -- Please use your own wifi ssid
const char password[] = "xxxxxxxx"; // 使用时请修改为当前你的 wifi 密码 -- Please use your own wifi password
const char OneNetServer[] = "api.heclouds.com";
const char APIKEY[] = "xxxxxxxx"; // 使用时请修改为你的API KEY -- Please use your own API KEY
int32_t DeviceId = xxxxxxxx; // 使用时请修改为你的设备ID -- Please use your own device ID[/mw_shl_code]
其它代码在附件里,注释都已经写好了,具体的可以参考附件里的信息。数据的上传和读取采用postData()和readData()两个函数来实现。 4.效果
代码上传完成后,打开串口,我们发现我们会向服务器发送POST信息和GET信息,并返回GET的结果。
登录Onenet平台,我们的数据流就会发送到服务器了。
我们可以选择左边的应用管理,创建一个UI界面来显示和控制相应地数据流信息。
最终在服务器上就可以通过UI界面来显示温度和湿度并且控制我们的LED灯了。
|