【分享】onenet+arduino+esp8266 (Wi-Fi 模块)+EDP 命令控制 发光....
本帖最后由 OneNET 于 2016-1-22 08:52 编辑使用arduino的人越来越多了,最近我做了一个使用arduino+esp8266(WIFI模块)+gy-30+EDP连接ONENET的例子,希望能对这方面的开发者有些帮助,同时也希望通过这个例子让大家了解EDP的命令下发功能以及注意事项。
写在前面的话:在此例中,我们将要使用平台应用编辑器中的开关控件:http://upfiles.heclouds.com/forum-app/2016/01/11/0d428e2f4e55a585fab3e4694533a961.pnghttp://upfiles.heclouds.com/forum-app/2016/01/11/d3a791a47f92e7de1acee07d71c341af.png
应用编辑器中的开关和旋钮控件有着两种身份,它们既是下发命令的控件,同时又显示数据流的当前状态,如下图所示: http://upfiles.heclouds.com/forum-app/2016/01/11/a95ab82811b2db983d4a064367970281.png
1、应用会周期性的从设备运的对应数据流读取数据用于更新当前展示;2、对于EDP设备,当用户操作开关和旋钮之后,应用会告知设备云发送EDP命令到设备端,但是并不会去改变数据流的值,需要设备将新的状态通过数据上传到数据流中,这样才能使应用中显示同步。
----------------------------进入正题--------------------------------
用到的物品以及连接框图如下所示: http://upfiles.heclouds.com/forum-app/2016/01/11/f609c6fcdfbb3f4650e3c7721c442351.png
实物连接图如下所示:http://upfiles.heclouds.com/forum-app/2016/01/11/86276afe7d4dfa8c00269d618548f428.png其中USB转TTL用于连接电脑,作为调试打印输出口,ESP8266连接arduino的串口代码部分
1、初始化,setup函数
// 串口初始化相关
#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 = {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连接
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 == 0x20 && rcv_pkt.data == 0x00 && rcv_pkt.data == 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;
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、新建应用http://upfiles.heclouds.com/forum-app/2016/01/11/d9d5f0568bdc7e871fcc6489d86f23f9.png
3、创建一个开关控件,在右侧的属性中选择对应设备的switch0数据流 ·注意到属性中有开关开值和开关关值两个属性,分别默认为1,0,这里不做修改(因为代码中1为开,非1则为关) ·修改EDP命令内容为switch0:{v}(与代码对应,代码中会将冒号前的部分作为上传的数据流ID,而将冒号之后的部分作为上传是数据值) 这里的{v}是通配符当下发命令的时候,他将会被开关的开/关值取代,稍后我们将看到命令的内容。 如下图所示:http://upfiles.heclouds.com/forum-app/2016/01/11/fe4bd20a5e7797bbf584617fd6852f62.png
4、完成编辑之后保存应用
点灯实验 ·点击开关 ·在电脑串口调试助手上可以看到一下信息:http://upfiles.heclouds.com/forum-app/2016/01/11/fa4260577f84bcfbdf9c2c171a188322.png
比对EDP协议的命令下发部分,可以看出,最后的“命令内容”字段,内容为“switch0:1” 说明应用编辑器中EDP命令内容中的{v}被替换成了1(即开关开值)代码中,当收到了该数据之后,会将1作为新的数据上传到switch0数据流中,可以在数据流中看到新上传的数据点: http://upfiles.heclouds.com/forum-app/2016/01/11/af0015d7c44171320bfebae12296e9c1.png
而开关则一直处于“开”的状态
板子上的发光二极管也被点亮了:http://upfiles.heclouds.com/forum-app/2016/01/11/b8f1cf19a1d539e3e4478a686867b1de.png
这个很棒,这个对于物联网应用的原型开发很有帮助!:) Mark------------------------------ 请问,怎样把模拟口读取的值打包上传?代码可不可以给出来? 感谢分享 你好,可以给一个源代码吗?
请问楼主为什么我的老是掉线呢???求解答,万分感谢 有没有不用AT指令开发的例子 请问edp_pkt *pkt;这句一直报错会是什么原因?(已经配置了8266的环境) 请问下中间那段AT指令是直接在串口助手输入吗?如果在arduino程序里已经写入了但是串口任然没有显示,这是怎么回事呢
页:
[1]
2