查看: 3273|回复: 32

初次尝试ESP8266+Onenet实现数据上传和读取

[复制链接]

该用户从未签到

发表于 2018-12-18 23:48 | 显示全部楼层 |阅读模式
本帖最后由 水哥小白 于 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.PNG     ESP8266         
dht.PNG DHT11





2.2 编程前的配置
2.2.1 ESP8266配置
      
       接线很简单,LED采用ESP8266模块自带的LED(D2),传感器DHT11的连接方式如下:
ESP8266
DHT11
5V
+
G
-
D3
out
       接线完成后我们需要给Arduino IDE配置相应的开发环境,如下:
              第一步 启动Arduino IDE,然后选择 文件-->首选项,将以下网址填入后点击好。
                         http://arduino.esp8266.com/stable/package_esp8266com_index.json
配置1.png


               第二步 点击 工具-->开发板-->开发板管理器, 下载ESP8266对应的开发板配置


配置2.png


               第三步 下载完成后重启Arduino IDE 选择对应的控制板 WeMos D1 R1
配置3.png


       至此,整个硬件部分的接线和配置就完成了,接下来,需要到Onenet平台进行配置。

2.2.2 Onenet平台配置

       进入Onenet网站,注册账号,登录到开发者中心。网址 https://open.iot.10086.cn/

       进入开发者中心界面后,点击 产品开发-->添加产品

onenet1.PNG

       填写相关的产品信息,根据实际情况填写,我这里给出的例子是用HTTP协议上传

onenet2.PNG           onenet3.PNG


        产品添加好后进入设备列表,点击右边的添加设备。

4.png

        输入设备的名称和编号

5.PNG

        点击添加后,会显示出刚才添加的设备

6.png

        记下我们的设备ID,一会会用到。点击右边的数据流,点击添加数据流模板

7.png

        创建一个数据流名叫LIGHT,用来存放一会控制LED的数据。至于要上传的温度和湿度数据流TEMPHUMI,我们一会通过设备端直接向云端创建,这里暂时不创建。
8.png

        回到产品概括中,记下我们的APIkey

9.png

        至此,Onenet配置完成,我们一会需要用到的东西有设备IDAPIkey和数据流LIGHT

3. 编程

      接下来就开始我们的ESP8266程序编写。在编程前我们需要了解一些简单的基础知识。设备通过HTTP与服务器通信,需要向服务器发送请求,服务器才能响应该请求,所以我们只需要用设备以HTTP对应的格式向Onenet服务器发送指令,发送后再解析我们收到的数据就可以了。对于上传和创建新的数据我们采用POST方式,对于读取数据流我们采用GET方式。具体更深的技术知识可以查看Onenet的技术文档,这里我们只需要知道我们所需要向服务器端发送指令的格式即可。

3.1上传温度和湿度数据
      对于POST创建数据流并上传数据的格式如下:

kittenblock中小学创客名师推荐的图形化编程软件

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"} 
      
      其中需要填写的信息有设备IDAPIkey发送的数据长度JASON数据。其中我们要创建的包含温度湿度的数据流以及他们的数值就写在JASON数据里。JASON数据的相关知识可以参考网上,而这里对于我们所需要上传的温度湿度来说,JASON数据写法如下(示例为将温度数据19和湿度数据49上传):


至此我们就可以向服务器发送我们的温度和湿度数据了,Onenet会自己创建两个名为TEMPHUMI的数据流,并显示该数据流的具体数值。

3.2读取服务器数据

      因为我们采用了HTTP模式,需要服务器向设备发送的指令只能通过设备不断向服务器发送读取请求,然后才能不断地接收到服务器发来的数据流信息。
      对于GET请求读取数据流信息需要上传的格式如下:

kittenblock中小学创客名师推荐的图形化编程软件

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
      
      其中需要填写的信息有设备IDAPIkey。注意我这里已经填好了需要读取的数据流为LIGHT

      向服务器发送信息后,服务器会以JASON数据回复一段信息,我们只需要读取出里面我们需要的数据即可,下面是一个服务器发送回来信息的示例:
get.PNG

      我们可以看到,此时LIGHT的值为1023。

3.3总体代码

      为了方便使用ESP8266和直接获取JASON数据回中我们需要信息,我们需要向代码中添加ESP8266WiFi.hArduinoJson.h两个库。为了方便使用DHT11传感器,我们需要向代码中添加DHT.h的库。
      代码中需要修改的部分如下,将xxxxxxxx修改为你自己的参数:

kittenblock中小学创客名师推荐的图形化编程软件

#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


       其它代码在附件里,注释都已经写好了,具体的可以参考附件里的信息。数据的上传和读取采用postData()readData()两个函数来实现。
代码.zip (3.93 KB, 下载次数: 268)
4.效果
      
      代码上传完成后,打开串口,我们发现我们会向服务器发送POST信息和GET信息,并返回GET的结果
POST.PNG get2.png get.PNG


      登录Onenet平台,我们的数据流就会发送到服务器了。
ssl.png


      我们可以选择左边的应用管理,创建一个UI界面来显示和控制相应地数据流信息。

yy1.png

      最终在服务器上就可以通过UI界面来显示温度和湿度并且控制我们的LED灯了。
yy2.png









  • TA的每日心情
    无聊
    2019-2-19 15:40
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-1-5 19:03 | 显示全部楼层
    有没有APP可以显示与控制呢

    该用户从未签到

    发表于 2019-1-7 22:10 | 显示全部楼层
    POST和GET的接口都有了,要APP干嘛?
  • TA的每日心情
    开心
    2019-1-8 09:03
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    发表于 2019-1-8 09:38 | 显示全部楼层
    怎么老是容易掉线呢?  有点纠结。
    图片1.png

    该用户从未签到

    发表于 2019-1-11 13:49 | 显示全部楼层
    请问有app吗

    该用户从未签到

    发表于 2019-1-11 14:49 来自手机 | 显示全部楼层
    DHT的库在哪哇

    该用户从未签到

    发表于 2019-1-11 16:48 | 显示全部楼层
    是用arduino编写的吗
  • TA的每日心情
    无聊
    2019-2-19 15:40
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-1-11 17:04 | 显示全部楼层
    本帖最后由 chensr 于 2019-1-14 22:21 编辑

    奇怪了我碰上灵异事件了,老是提示DHT传感器无法读取
  • TA的每日心情
    无聊
    2019-2-19 15:40
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-1-15 09:54 | 显示全部楼层
    Failed to read from DHT sensor!
    Failed to read from DHT sensor!
    一直都是这样提示

    该用户从未签到

     楼主| 发表于 2019-1-19 13:32 | 显示全部楼层
    chensr 发表于 2019-1-5 19:03
    有没有APP可以显示与控制呢

    你可以通过手机浏览器,登录onenet平台的网站,和电脑进入方式一样到你编写的可视界面那里,就可以控制啦。
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    一文教你选择Arduino开发板,小白进
    一文教你选择Arduino开发
    笔者在2016年接触了Arduino,跳了万条坑,行了千里弯,到今天也算是Arduino的一
    继电器控制电磁锁
    继电器控制电磁锁
    本人小白 想用继电器控制电磁锁,继电器能亮 ,电磁锁接电源也能工作,就是继电器对电
    新人求助 啃萝卜代码上传失败
    新人求助 啃萝卜代码上传
    写了一个L298N的代码 但是上传失败 在IDE里的错误信息是 Arduino:1.8.8 (Windows 10
    求助DS1307的set函数
    求助DS1307的set函数
    使用RTC. set函数为什么不行呢?大概是这个格式RTC.set(RTC_MONTH, 6)大小写都不行
    Arduino UNO能否和NB-IOT(移远BC95/BC35)通信?
    Arduino UNO能否和NB-IOT
    能否用Arduino UNO和移远的NB-IOT (BC95/BC35)实现通信?哪位大神有没有具体的通信方
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表