查看: 15346|回复: 7

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

[复制链接]

该用户从未签到

发表于 2016-1-19 12:00 | 显示全部楼层 |阅读模式
本帖最后由 OneNET 于 2016-1-22 08:52 编辑

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


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


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

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


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

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

实物连接图如下所示:
其中USB转TTL用于连接电脑,作为调试打印输出口,ESP8266连接arduino的串口
代码部分

1、初始化,setup函数

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


// 串口初始化相关
#define _baudrate   115200
#define _rxpin      3
#define _txpin      2
#define WIFI_UART   Serial
#define DBG_UART    dbgSerial

#define SSID "360"              //wifi热点
#define PASS "12345678"         //wifi热点密码
#define HOST "183.230.40.39"     //EDP服务器IP地址
#define PORT "876"               //EDP端口号
#define KEY  "60ejo9FrV2328GndsKbQvPURzfYA"  //APIkey
#define ID   "634057"                           //设备ID

edp_pkt *pkt;
bool wifiExist = false;
SoftwareSerial dbgSerial( _rxpin, _txpin ); //新建软串口

void setup()
{
// put your setup code here, to run once:
  char buf[100] = {0};
  int tmp;

  pinMode(8, OUTPUT);    //控制LED灯

  WIFI_UART.begin( _baudrate );    //初始化WIFI串口
  DBG_UART.begin( _baudrate );    //初始化调试串口
  delay(300);
  DBG_UART.println("hello world!");

  /* 光照传感器初始化(代码省略) */

  while (!wifiExist)
  {
    sendDebug("AT");
    delay(2000);
    if ((tmp = WIFI_UART.readBytes(buf, sizeof(buf))) > 0 )
    {
      DBG_UART.println("ESP8266 exist!");
      wifiExist = true;
      DBG_UART.print(buf);
      connectWiFi();        //通过串口,操作WIFI模块连接热点
    }
  }
  pkt = packetCreate();       //发送edp包缓存
}

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

AT+CWMODE=3 //设置WIFI应用模式
AT+CWJAP="*SSID*","*PASSWORD*" //连接无线路由器 SSID和PASSWORD需替换为可用WIFI热点的热点名和密码
AT+CIPSTART="TCP","183.230.40.33",80  //和服务器建立TCP连接
AT+CIPMODE=1    //进入透明传输模式
AT+CIPSEND  //开始传输
2、主函数,loop() 首先进行EDP连接

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


if (!edp_connect)
{
      //EDP连接
      packetConnect(pkt, ID, KEY);
      DBG_UART.print("connect length: ");
      DBG_UART.println(pkt->len, DEC);
      packetSend(pkt);
      packetClear(pkt);

      delay(1000);
      if ((tmp = WIFI_UART.readBytes(rcv_pkt.data, sizeof(rcv_pkt.data))) > 0 )
      {
        rcvDebug(rcv_pkt.data, tmp);

        //通过返回的命令判断连接是否成功,若返回20 02 00 00 则表示成功
        if (rcv_pkt.data[0] == 0x20 && rcv_pkt.data[2] == 0x00 && rcv_pkt.data[3] == 0x00)
        {
          edp_connect = 1;
          DBG_UART.println("EDP connected.");
        }
        else
          DBG_UART.println("EDP connect error.");
      }
      packetClear(&rcv_pkt);
    }
//解析平台下发是数据,这里只关心edp控制命令 while (WIFI_UART.available()) {     readEdpPkt(&rcv_pkt);     if (isEdpPkt(&rcv_pkt))          //判断是否为完整edp包     {         pkt_type = rcv_pkt.data[0];         switch (pkt_type)         {             case CMDREQ:             memset(edp_command, 0, sizeof(edp_command));    //EDP命令接收缓存数组             memset(edp_cmd_id, 0, sizeof(edp_cmd_id));    //EDP命令ID接收缓存数组             edpCommandReqParse(&rcv_pkt, edp_cmd_id, edp_command, &rm_len, &id_len, &cmd_len);  //解析edp命令             DBG_UART.print("rm_len: ");             DBG_UART.println(rm_len, DEC);             DBG_UART.print("id_len: ");             DBG_UART.println(id_len, DEC);             DBG_UART.print("cmd_len: ");             DBG_UART.println(cmd_len, DEC);             DBG_UART.print("id: ");             DBG_UART.println(edp_cmd_id);             DBG_UART.print("cmd: ");             DBG_UART.println(edp_command);             //命令内容为用户自定义格式,在本例中使用通过‘:’隔开数据流名和值的格式             //其中val默认为‘1’或者‘0’,可以在应用编辑器中修改             sscanf(edp_command, "%[^:]:%s", datastr, val);             if (atoi(val) == 1)                 digitalWrite(8, HIGH);   // 使Led亮             else                 digitalWrite(8, LOW);   // 使Led灭             packetDataSaveTrans(pkt, NULL, datastr, val);   //将新数据点保存至数据流,使应用中开关同步显示             packetSend(pkt);             packetClear(pkt);             break;             default:             DBG_UART.print("unknown type: ");             DBG_UART.println(pkt_type, HEX);             break;         }     } } packetClear(&rcv_pkt);


这里需要注意的是,在收到EDP命令之后,需要将新数据存储到数据流中
读光照传感器的值上传到平台(代码略)


编辑应用
1、为开关添加一条数据流switch0;

2、新建应用

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

4、完成编辑之后保存应用


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

比对EDP协议的命令下发部分,可以看出,最后的“命令内容”字段,内容为“switch0:1” 说明应用编辑器中EDP命令内容中的{v}被替换成了1(即开关开值)
代码中,当收到了该数据之后,会将1作为新的数据上传到switch0数据流中,可以在数据流中看到新上传的数据点:

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

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

  • TA的每日心情
    慵懒
    2019-1-14 10:28
  • 签到天数: 299 天

    [LV.8]以坛为家I

    发表于 2016-1-19 15:23 | 显示全部楼层
    这个很棒,这个对于物联网应用的原型开发很有帮助!
    打赏作者鼓励一下!
  • TA的每日心情
    慵懒
    2016-3-18 16:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2016-3-20 15:06 | 显示全部楼层
    Mark------------------------------

    该用户从未签到

    发表于 2016-5-25 23:19 | 显示全部楼层
    请问,怎样把模拟口读取的值打包上传?代码可不可以给出来?
  • TA的每日心情
    无聊
    2019-1-7 08:29
  • 签到天数: 63 天

    [LV.6]常住居民II

    发表于 2016-10-10 10:25 | 显示全部楼层
    你好,可以给一个源代码吗?
  • TA的每日心情
    郁闷
    2017-12-1 17:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2017-12-11 21:35 | 显示全部楼层
    请问楼主为什么我的老是掉线呢???求解答,万分感谢

    该用户从未签到

    发表于 2019-1-11 16:48 | 显示全部楼层
    有没有不用AT指令开发的例子
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    关于arduino编译问题
    关于arduino编译问题
    编译示例程序老是这个问题,换了电脑都不行
    莫名乱码 —— Arduino+RFID-RC522 读写实验
    莫名乱码 —— Arduino+RF
    目标:想把自己房间门改成感应门锁 器材:Arduino Uno (淘宝七星虫LY-F2)、RFID-RC
    [blinker开发实战2]数据反馈
    [blinker开发实战2]数据反
    [md] ### 添加DIY组件 在编辑模式下,点击按键进入编辑组件页面,可以看到 **按键
    用Arduino控制PS2无线手柄为什么一直连接不上
    用Arduino控制PS2无线手柄
    用Arduino UNO板 连接PS2手柄接收器,为什么指示灯已经显示对接上了,但是打开串口监
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表