Arduino+ESP8266通过EDP协议连接onenet平台

Arduino是许多智能硬件爱好者的首选,使用简单快捷,而ESP8266模块也是当前最为热门的WIFI模块。本项目完成了Arduino使用EDP协议通过ESP8266 WIFI模块接入OneNET服务器,并通过在接入设备中创建的应用来实现远程控制LED灯。

【1】硬件连接:

准备元件:

Arduino UNO

ESP8266 WIFI模块

USB转TTL连接线

硬件连线:

Arduino UNO USB转TTL

D2-----------------RX

D3-----------------TX

GND---------------GND

Arduino UNO ESP8266

RX-----------------TX

TX-----------------RX

GND---------------GND

其中USB转TTL连接电脑用于调试打印输出,然后Arduino的串口连接ESP8266的串口。

【2】ESP8266配置和EDP上传数据介绍:

选用ESP8266串口WIFI模块,通过AT指令控制WIFI模块接入互联网,依次完成与接入互联网、与OneNet服务器建立TCP连接、传输数据等操作。

1)配置WIFI模块;

模块配置接入OneNet,依次发送如下几个命令到WIFI模块:

AT+CWMODE=3

AT+RST

AT+CIFSR

AT+CWJAP="your ssid","password"

2)和OneNet服务器建立TCP连接,依次发送命令:

AT+CIPSTART="TCP","183.230.40.39",876 //和服务器建立TCP连接

AT+CIPMODE=1 //进入透明传输模式

AT+CIPSEND //开始传输

命令执行结果如下图所示:

关于如何使用WIFI方式接入可以详细查看:http://open.iot.10086.cn/doc/art76.html#29

3)创建设备和应用:

添加产品并创建接入设备,详细创建步骤请查看:http://open.iot.10086.cn/doc/art243.html#66。其中数据传输协议选择EDP。

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

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

/*

采用外接电源单独供电,2 3口作为软串口接PC机作为调试端

1 0为串口,连接WIFI模块

*/

#include

#include "edp.c"

#include

dht11 DHT11;

#define KEY "VJqJAM2F3ztuzFGv0TIS78W5gGY=" //APIkey

//#define PUSH_ID "680788"

#define PUSH_ID NULL

// 串口

#define _baudrate 115200

#define _rxpin 3

#define _txpin 2

#define WIFI_UART Serial

#define DBG_UART dbgSerial //调试打印串口

#define DHT11PIN A0 //温湿度传感器的pin

#define MQ2 A1 //MQ-2传感器的pin

#define FMQ 9 //蜂鸣器pin

SoftwareSerial dbgSerial( _rxpin, _txpin ); // 软串口,调试打印

edp_pkt *pkt;

/*

* doCmdOk

* 发送命令至模块,从回复中获取期待的关键字

* keyword: 所期待的关键字

* 成功找到关键字返回true,否则返回false

*/

bool doCmdOk(String data, char *keyword)

{

bool result = false;

if (data != "") //对于tcp连接命令,直接等待第二次回复

{

WIFI_UART.println(data); //发送AT指令

DBG_UART.print("SEND: ");

DBG_UART.println(data);

}

if (data == "AT") //检查模块存在

delay(2000);

else

while (!WIFI_UART.available()); // 等待模块回复

delay(200);

if (WIFI_UART.find(keyword)) //返回值判断

{

DBG_UART.println("do cmd OK");

result = true;

}

else

{

DBG_UART.println("do cmd ERROR");

result = false;

}

while (WIFI_UART.available()) WIFI_UART.read(); //清空串口接收缓存

delay(500); //指令时间间隔

return result;

}

void setup()

{

char buf[100] = ;

int tmp;

pinMode(13, OUTPUT); //WIFI模块指示灯

pinMode(8, OUTPUT); //用于连接EDP控制的发光二极管

WIFI_UART.begin( _baudrate );

DBG_UART.begin( _baudrate );

WIFI_UART.setTimeout(3000); //设置find超时时间

delay(3000);

DBG_UART.println("hello world!");

delay(2000);

while (!doCmdOk("AT", "OK"));

digitalWrite(13, HIGH); // 使Led亮

while (!doCmdOk("AT+CWMODE=3", "OK")); //工作模式

while (!doCmdOk("AT+CWJAP="360","987654321"", "OK"));

while (!doCmdOk("AT+CIPSTART="TCP","183.230.40.39",876", "CONNECT"));

while (!doCmdOk("AT+CIPMODE=1", "OK")); //透传模式

while (!doCmdOk("AT+CIPSEND", ">")); //开始发送

}

void loop()

{

static int edp_connect = 0;

bool trigger = false;

edp_pkt rcv_pkt;

unsigned char pkt_type;

int i, tmp;

char num[10];

int wd; //温度

int sd; //湿度

int mq; //气体

char wd1[10]; //字符串格式温度

char sd1[10]; //字符串格式湿度

char mq1[10]; //字符串格式气体

int chk = DHT11.read(DHT11PIN);//读DHT11

mq = analogRead(MQ2);

if(mq>=200)

digitalWrite(FMQ, HIGH); //蜂鸣器响

/* EDP 连接 */

if (!edp_connect)

{

while (WIFI_UART.available()) WIFI_UART.read(); //清空串口接收缓存

packetSend(packetConnect(ID, KEY)); //发送EPD连接包

while (!WIFI_UART.available()); //等待EDP连接应答

if ((tmp = WIFI_UART.readBytes(rcv_pkt.data, sizeof(rcv_pkt.data))) > 0 )

{

rcvDebug(rcv_pkt.data, tmp);

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);

}

wd = (float)DHT11.temperature;//获取温度

sd = (float)DHT11.humidity;//获取湿度

trigger = wd; //传感器是否工作

if (edp_connect && trigger)

{

DBG_UART.print("temperature: ");

DBG_UART.println((float)DHT11.temperature, 2);

DBG_UART.print("humidity: ");

DBG_UART.println((float)DHT11.humidity, 2);

DBG_UART.print("MQ-2: ");

DBG_UART.println(analogRead(MQ2));

sprintf(wd1,"%d",wd); //int型转换char型

sprintf(sd1,"%d",sd); //int型转换char型

sprintf(mq1,"%d",mq); //int型转换char型

packetSend(packetDataSaveTrans(PUSH_ID, "WD", wd1)); //发送数据存储包 当PUSH_ID不为NULL时转发至PUSH_ID

delay(100);

packetSend(packetDataSaveTrans(NULL, "SD", sd1)); //发送的数据必须为字符串 ""

delay(100);

packetSend(packetDataSaveTrans(NULL, "MQ", mq1));

delay(2000);

}

while (WIFI_UART.available())

{

readEdpPkt(&rcv_pkt);

if (isEdpPkt(&rcv_pkt))

{

pkt_type = rcv_pkt.data[0];

switch (pkt_type)

{

case CMDREQ:

char edp_command[50];

char edp_cmd_id[40];

long id_len, cmd_len, rm_len;

char datastr[20];

char val[10];

memset(edp_command, 0, sizeof(edp_command));

memset(edp_cmd_id, 0, sizeof(edp_cmd_id));

edpCommandReqParse(&rcv_pkt, edp_cmd_id, edp_command, &rm_len, &id_len, &cmd_len);

DBG_UART.print("rm_len: ");

DBG_UART.println(rm_len, DEC);

delay(10);

DBG_UART.print("id_len: ");

DBG_UART.println(id_len, DEC);

delay(10);

DBG_UART.print("cmd_len: ");

DBG_UART.println(cmd_len, DEC);

delay(10);

DBG_UART.print("id: ");

DBG_UART.println(edp_cmd_id);

delay(10);

DBG_UART.print("cmd: ");

DBG_UART.println(edp_command);

//数据处理与应用中EDP命令内容对应

//本例中格式为 datastream:[1/0]

sscanf(edp_command, "%[^:]:%s", datastr, val);//datastr为数据流名

if (atoi(val) == 1)

digitalWrite(8, HIGH); // 使Led亮

else

digitalWrite(8, LOW); // 使Led灭

packetSend(packetDataSaveTrans(NULL, datastr,val)); //将新数据值上传至数据流

break;

default:

DBG_UART.print("unknown type: ");

DBG_UART.println(pkt_type, HEX);

break;

}

}

//delay(4);

}

if (rcv_pkt.len > 0)

packetClear(&rcv_pkt);

delay(150);

//packetSend(packetDataSaveTrans(NULL, "text", 5)); //将新数据值上传至数据流

}

/*

* readEdpPkt

* 从串口缓存中读数据到接收缓存

*/

bool readEdpPkt(edp_pkt *p)

{

int tmp;

if ((tmp = WIFI_UART.readBytes(p->data + p->len, sizeof(p->data))) > 0 )

{

rcvDebug(p->data + p->len, tmp);

p->len += tmp;

}

return true;

}

/*

* packetSend

* 将待发数据发送至串口,并释放到动态分配的内存

*/

void packetSend(edp_pkt* pkt)

{

if (pkt != NULL)

{

WIFI_UART.write(pkt->data, pkt->len); //串口发送

WIFI_UART.flush();

free(pkt); //回收内存

}

}

void rcvDebug(unsigned char *rcv, int len)

{

int i;

DBG_UART.print("rcv len: ");

DBG_UART.println(len, DEC);

for (i = 0; i

{

DBG_UART.print(rcv[i], HEX);

DBG_UART.print(" ");

}

DBG_UART.println("");

}

4)源码:

Arduino_EDP.zip

其中Arduino开发板的D13作为被控制的LED灯,在程序中添加设备ID和APIKey。

调试串口显示:

onenet云平台应用:

玩得趣科技教育携手趣讨教,感谢趣讨教网的分享,感谢趣讨教的技术支持!趣讨教-一群大牛分享技术交流的平台!

edp协议 netty_大牛轻松带你玩转Arduino智能硬件:EDP协议连接onenet平台相关推荐

  1. 一文带你了解 MQTT 协议(连接 ONE-NET平台)

    MQTT 协议连接 ONE-NET 详解 写在前面 ​  本文采用 网络调试助手 发送MQTT协议报文(16进制) 连接 ONE-NET 平台,采用的 为 MQTT v3.1.1 标准协议.带你直接 ...

  2. CC3200使用MQTT协议连接Onenet平台实践

    代码仓库地址:https://github.com/idrey/CC3200_Onenet 0x01 介绍 CC3200是TI公司推出的一款WIFI MCU,支持多种网络协议.信息物理系统课程中使用的 ...

  3. 酷玩部落:智能硬件的游戏化

    酷玩部落这个名字听起来像个俱乐部.宅客君(letshome)初到公司拜访的时候,这里乍看又像个健身房.酷玩的团队在日进斗金的游戏业淌过,如今又在智能硬件的前沿弄潮. 健身的游戏化 酷玩的产品有着强烈的 ...

  4. SIM800C连接OneNet平台HTTP协议上传GPS数据

    1. 前言 科技进步不断推动新产品的出现,越来越多的电子产品开始着力解决社会焦点问题,随着城市发展以及人口流动性的增加,儿童户外被拐,老人外出走丢,交通工具被盗和大型物件丢失等问题变样严重起来,因此, ...

  5. 轻松DIY智能硬件,开源电子原型平台Hippo-ADK

    摘要:Hippo-ADK是个基于Android的电子原型平台,通过USB或蓝牙将它与Android设备相连接,即使不会硬件编码,也可以通过Hippo-ADK提供的图形化编程平台和API,直接调用And ...

  6. Android小Demo——通过MQTT协议连接OneNet平台(旧版)

    先看效果图: onenet OneNet: 第一步:创建产品 1.多协议接入 2.添加产品 3.填写产品信息 4.我已经创建过了,就不重新创了,我的相关填写如下图 5.创建成功界面 第二步:创建设备 ...

  7. Android小Demo——通过MQTT协议连接OneNet平台(新版)

    详细的过程可参考:https://blog.csdn.net/weixin_51080921/article/details/124150694?spm=1001.2014.3001.5501 这里只 ...

  8. 老宇哥带你玩转 ESP32:09 EEPROM的使用演示

    今天我们来玩儿EEPROM. EEPROM概述 ESP32内部没有专门的EEPROM,但是我们可以通过FLASH模拟EEPROM,FLASH与EEPROM也是非常相似的,都是非易失性存储器,使用EEP ...

  9. 江涛带你玩STM-CubeMx之OLED使用3线SPI和4线SPI驱动详解

    系列文章 江涛带你玩STM-CubeMx之实战硬件SPI和硬件IIC驱动OLED 江涛带你玩STM-CubeMx之实战驱动温湿度模块--DTH11 江涛带你玩0.96-OLED之实战stm32的RTC ...

  10. 硬件通讯协议的数据传输方式

    硬件协议数据传输的包含要素主要为:物理介质,编码方式,通讯协议,传输特点. 下面就对常见的硬件通讯协议进行简单总结. 1. UART LSB First  2. USB LSB First,小端传输 ...

最新文章

  1. MapReduce编程初体验
  2. 微信浏览器下拉黑边的终极解决方案---wScroollFix
  3. windows charles response 乱码解决办法
  4. DBA(四):数据读写分离,MySQL多实例操作
  5. php网页微信登录验证失败,php 微信添加分账接收方-验证签名失败
  6. linux svn 撤销del,svn delete-删除文件和目录的实例
  7. 64位jdk连接32位的mysql_在64位客户端使用32位的ODBC配置
  8. input失去焦点验证格式_input获取、失去焦点对输入内容做验证
  9. 无法将成员变量添加到ID为 的控件中
  10. php有哪些高级扩展,php扩展有哪些
  11. Arduino笔记-Arduino UNO与WeMos D1串口通信(数据交互)
  12. Java中list操作
  13. 基于Netty自己动手实现Web框架
  14. 9月第2周网络安全报告:境内87.8万主机感染病毒
  15. 双随机软件java_随机抽检|双随机一公开 1.0 正式版下载_太平洋下载中心
  16. 姿态角与方向余弦矩阵 matlab,方向余弦矩阵和姿态角提取算法(矩阵)要点.ppt
  17. 机械制图比例GB/T14690-93
  18. 中继器制作联动下拉列表
  19. html日期函数,YEAR 函数 (时间日期函数)
  20. proposal中文翻译_proposal是什么意思_ proposal的翻译_音标_读音_用法_例句_爱词霸在线词典...

热门文章

  1. Opengl ES之FBO
  2. [交互问题]XML 解析错误:格式不佳
  3. 论文-《Conversational Recommender System》
  4. 我是路人甲,请你为我祝福
  5. html里hr标签,HTML hr 标签
  6. 设置hr标签的粗细及颜色
  7. 显示本q不用了 加新q服务器,魔兽TBC设计师访谈:前夕版本开放新种族 持续关注玩家反馈...
  8. SuperMap iClient3D for WebGL教程(特效)- 平行光源
  9. ODL中的Karaf命令使用
  10. SpringMVC入门案例【三层架构和MVC、SpringMVC的概述和入门程序】(超详细)