OneNet使用起来要比lewei50复杂一些,它没有前台需要自己开发。命令下发也和之前介绍的lewei50有一些区别,这里着重介绍一下使用MQTT协议来进行通讯。

一、准备

1、Esp8266开发板(+烧写器或者直接用WeMos D1 Wifi之类的就不要烧写器了)

2、Arduino IDE for VS

3、OneNet注册

二、OneNet配置

OneNet整体结构上与lewei50不同,它从产品开始下面可以有若干按APIKEY组织的设备群组(实名认证与否决定了能用多少产品和设备),每个设备下面可以有若干传感器和控制器(测试过程未发现个数限制)。而其中控制器状态是和传感器一起上传的,服务器下发的命令以Qos0进行,即不接收回复。更多的内容就请参考开发文档吧。

1、进入开发者中心创建产品

接入方式选择公开协议,设备接入协议选择MQTT。创建完成后,会得到一个APIKEY,这个APIKEY可以用于访问产品下的任何一个设备。当然,也可以创建一个新的APIKEY,然后设置该APIKEY关联的设备。

2、创建设备

其中设备名称和鉴权信息都是自定义,鉴权信息与设备ID是通用的,如果想要用MAC进行绑定那这里鉴权信息就填写设备的MAC地址,我就随便填了一个。当然这是与前台相关的内容,不在此讨论。

3、创建数据流模板

数据流名称最好简明,因为需要ESP8266处理的字符很多,而其资源也不是十分充裕。需要主意的是,每一个数据流就是一个传感器或控制器。即控制器也在这里创建。创建完成之后就可以把数据流和产品关联起来,为了直观观察,我们再在“应用管理”里面创建一个简单的应用:

选择这个开关控件,然后在右面除了关联设备数据流之外,设置一下开关开值和开关关值:

其默认值开为1,关为0。这里说明一下该参数在服务器下发命令时如何被解释(以图中的01和00为例):

把每个数字解释为1字节进行下发,所以上面00被接收到的是{0,0}这样的,它与0完全不同。而右面的按钮我设置的开关之分别为11、10,所以在后面的代码中前一字节被作为分组标志,后一字节被作为开关值。

三、编码

1、IDE和配置

与前一篇一样,这里使用Arduino IDE(实际上我用的是for vs,操作差不多,有代码提示而已)来进行编写。开发板选择NodeMCU1.0(ESP-12E Module),而不论使用的是WeMos D1 Wifi还是其他8针、IO全引出啥的(估计魔改串口4针的是玩不了的)。其他配置如下:

2、层次逻辑

a、Esp8266wifi.h负责连接WIFI

b、pubsubclient.h负责MQTT通讯(可变头和载体需要自定义,该库只负责Fixed header)

c、ArduinoJson.h负责构建载体中数据部分,具体格式请参考OneNet MQTT开发文档

d、eeprom.h负责将配置写到esp8266模块中和读取,这个的写操作与arduino开发板是不同的

3、主要代码示例

这里主要说一下MQTT部分,其他部分不再赘述。

a、pubsubclient总述:

WiFiClient wClient;
PubSubClient mClient(mServerAddress,mServerPort, mCallback,wClient);

其中,mCallback是一个回调函数,该函数用于处理服务器发来的消息,其签名如下:

void mCallback(char* topic, byte* payload, unsigned int length)

其中topic是话题,包含了topicName,Payload是实际下发的内容,例如上面的水泵开关开则有2字节:0 1。length指payload字节数。要处理的服务器数据就在该函数处理就可以了,但是最好别太长,否则影响数据的响应速度。

b、连接MQTT服务器

bool ConnectServer() {
int waitConst = ;
if (!mClient.connected()) {
//id="设备id",user="产品id",pass="APIkey"
mClient.connect(DeviceID, ProductID, APIKey);
while (!mClient.connected() && waitConst<)
{
delay();
waitConst++;
}
Serial.println((String)"ConnectServer " + mClient.connected());
}
return mClient.connected();// mClient.state() == MQTT_CONNECTED;
}

在Onenet开发者页面的说明后面有一段问答,其中明确说明了上面的参数如何传递,上面注释写的非常清楚了;当然也可以用前面提到的设备鉴权信息代替APIKEY字段作为password传入。

c、发布话题

bool PubTopic(String TopicName,String Json) {
memset(msg_buf, , MQTT_MAX_PACKET_SIZE); //清理MQTT消息缓存
//设置可变头
msg_buf[] = char(0x03); //包数据格式标志
msg_buf[] = char(Json.length() >> ); //高位在后
msg_buf[] = char(Json.length() & 0xff); //低位在前
//设置数据
memcpy(msg_buf + , Json.c_str(), Json.length());
mClient.publish(TopicName.c_str(), (uint8_t*)msg_buf, Json.length() + ); //设置发送长度以免中间的00使得自动判定长度出错。
}

可变头部分指明了使用哪种数据包格式,设置了Json数据长度。这一部分有若干种数据格式,具体参考开发文档,上面代码中使用的type3格式在说明文档中的说明如下:

数据类型3(type == 3)格式说明:

Byte 1

数据点类型指示:type=3    // JSON格式2字符串

0

0

0

0

0

0

1

1

Byte 2

//指示后面字符串长度

固定两字节长度高位字节,值为0x00

Byte 3

固定两字节长度低位字节,值为0x46

Byte 4

通用格式:

{

“datastream_id1”:”value1”,

“datastream_id2”:”value2”,

}

示例:

{“temperature”:22.5,”humidity”:”95.2%”}

Byte n

看的时候无视这没头没尾的0x00、0x46吧。参考代码上面的代码就可以了。其中Json的构建在上一篇中已经说得非常清楚、十分深入了,完成这个代码构建是基础中的基础了,这里不再说明。

四、ESP8266的EEPROM

关于这个问题是看乐鑫的开发文档还是怎么的才能解决说起来没意义,上大家最喜欢的积木:

void SaveConfig(int cfgidx, String val) {
//esp8266的EEPROM与Areduino的使用不同
//1、申请操作缓存
EEPROM.begin(eBlockSize);
//2、写入数据
for (int i = ; i < eBlockSize; i++) {
EEPROM.write(cfgidx*eBlockSize + i, val[i]);
}
//3、保存数据更改
EEPROM.commit();
}

好了,这篇就介绍到这里,也不把OneNet上面创建的这个设备的应用嵌入到这里了,愿意做的自己做一下就可以看到效果了。我这现在就几块开发板,USB已经插了一堆堆各种东西,不可能长期保持这东西在线的。

五、网络调试工具

这个不像之前的一些WIFI应用调试起来那么简单,有时候代码看着貌似都没问题就是不过,而服务器端没有提供底层的数据调试功能,一般的SOCKET调试工具也不提供MQTT服务器,自己架设一个也需要大篇幅的工作。所以具体WIFI发送了什么还是要一些其他工具。首先,得让数据从电脑上过去我们才有机会在电脑上下个钩子把数据呈现出来,于是我安了一个随身WIFI,设置好之后,让ESP8266连接它,至于用什么WIFI软件无所谓,根本别指望他们提供底层数据,也没指望去勾它们,那太麻烦了。开发一个新的东西也得不偿失,还是用专业工具吧,祭出神器winpcap就解决一切了。使用winpcap的网络封包工具很多,其中做的好的也不少,Ethereal就是其中一个,现在可能叫Wireshark。

智能家居入门DIY——【六、使用OneNet后台处理数据】的更多相关文章

  1. 智能家居入门DIY——【一、ESP8266之软串口HTTP请求】

    前段时间做了一个激光雕刻,玩的不亦乐乎.对Arduino大感兴趣,于是又入手一块20大洋版,配上买学习套件时的诸多零件——红外发射管.一体化红外接收头.DHT11温湿度传感器.ESP8266等,以及某 ...

  2. 智能家居入门DIY——【五、执行命令】

    前面几篇介绍了ESP8266使用AT命令来连接WIFI实现一系列功能.这一篇介绍一下使用Wemos D1 Wifi来进行开发,当然也可以用常见的8针ESP8266来完成(只是需要按网上的方法将Ardu ...

  3. 智能家居入门DIY——【七、添加一个LCD12864吧】

    今天加了一个LCD12864,IC看说明上是ST7567,结果一顿U8g2,发现两个问题: 1.买的时候不知道是卖家写的我理解错了还是怎么了,反正是不出汉字的. 2.U8g2太大了…………占了uno的 ...

  4. 智能家居入门DIY——【四、组合】

    前面几篇介绍了一些传感器和代码,这篇介绍一下把它们组合起来.之所以单独列出这部分,原因在于组合更多功能的时候发现使用软串口库驱动ESP8266时由于内存过小导致发送失败甚至整个系统无法工作的情况.所以 ...

  5. 智能家居入门DIY——【三、GP2Y10之颗粒物传感器】

    这个传感器接线算比较简单的,程序也不麻烦.不过这东西是颗粒物传感器吧,不是神马PM2.5(总悬浮颗粒物),不是神马PM10(可吸入颗粒物).插个螺丝刀进去度数也是变的,不是说的很清楚原理是反光嘛……… ...

  6. 智能家居入门DIY——【二、LD3320之语音识别】

    前一篇说了一下只有RX,TX,VCC,GND的WIFI模块软串口通讯:在实现了远程观察数据,类似的就可以实现远程控制.接下来说一下近距离控制,很多情况下应用语音识别技术无疑比掏出手机操作要更人性化一些 ...

  7. springboot2.0入门(六)-- ymal语法、数据校验

    一.基本使用 1.ymal语法是一种更符合人类命名习惯的语法: # 1. 一个家庭有爸爸.妈妈.孩子. # 2. 这个家庭有一个名字(family-name)叫做“happy family” # 3. ...

  8. DIY智能家居——零基础入门篇

    概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...

  9. 入门智能家居,从 IFTTT 到 HomeKit 自动化(二)

    入门智能家居,从 IFTTT 到 HomeKit 自动化(二)   目录 0. HomeKit.HomeBridge.HomeAssistant 分别是什么?关系是什么? 1. 开始前的准备 2. 整 ...

随机推荐

  1. 在pom.xml中使用distributionManagement将项目打包上传到nexus私服

    本文介绍 如何在pom.xml中使用distributionManagement将项目打包上传到nexus私服 1.pom.xml文件添加distributionManagement节点 <!- ...

  2. SpringMVC小demo解析

    第一次实际接触SpringMVC,之前在教程网站上看得是概念性的. SpringMVC是属于Java框架SSM中的一环 在做了一个小demo后发现原来编程如此简单. 首先建立动态网页项目(Dynami ...

  3. Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms")

    从spring-boot开始,已经支持yml文件形式的配置,@ConfigurationProperties的大致作用就是通过它可以把properties或者yml配置直接转成对象 例如: 配置文件: ...

  4. java学习之浅谈多线程2--线程同步

    如果一个共享资源被多个线程同时访问,可能会遭到破坏.举个例子说明这个问题,假设创建并启动100个线程,每个线程都往同一个账户中添加一个便士,代码如下: import java.util.concurr ...

  5. a标签 在新页面打开

    <a href="https://www.baidu.com/" target="_blank">下载</a>

  6. CSS再学习 之背景色 背景图片

    背景色 p {background-color: gray;} 如果您希望背景色从元素中的文本向外少有延伸,只需增加一些内边距. p {background-color: gray; padding: ...

  7. JAVA技术分享:消失的线程

    很多小伙伴都问过我一个问题,就是任务线程跑着跑着消失了,而且没有任何异常日志.我都是条件反射式的回复,是不是用了线程池的submit提交任务.而且很大几率对方给予肯定答复. 解决方案,很多人都听过不少 ...

  8. JSP 文件上传

    JSP 文件上传 JSP可以通过HTML的form表单上传文件到服务器. 文件类型可以是文本文件.二进制文件.图像文件等其他任何文档. 创建文件上传表单 接下来我们使用HTML标签来创建文件上传表单, ...

  9. UVA-1343 The Rotation Game (IDA*)

    题目大意:数字1,2,3都有八个,求出最少的旋转次数使得图形中间八个数相同.旋转规则:对于每一长行或每一长列,每次旋转就是将数据向头的位置移动一位,头上的数放置到尾部.若次数相同,则找出字典序最小旋转 ...

  10. 使用Jenkins来实现内部的持续集成流程(上)

    前言 Jenkins和TeamCity都是大杀器,用于搭建内部持续集成环境都是妥妥的.本篇主要介绍Jenkins的安装,下篇将介绍相关配置和使用. 目录 安装和配置 第一次启动 插件安装,第一次进入时 ...