动态字段无法双向绑定_003-STM32+ESP8266+AIR202基本控制方案-功能测试-Android使用SmartConfig配网绑定ESP8266并通过阿里云物联网平台和ESP8266实现通...

<p><iframe name="ifd" src="" frameborder="0" scrolling="auto" ></iframe></p>

说明

这节演示一下基本控制篇中使用阿里云物联网平台实现远程控制的最终功能.

这一节实现Android使用SmartConfig配网绑定ESP8266并通过阿里云物联网平台实现远程通信控制(动态免预注册)

请用户按照此节的说明进行操作,然后完成测试.

测试准备

1.打开这节的APP工程和单片机工程

99a3dd5e06e324e4c7776c886429a2f6.png

2. 登录自己的云平台点击产品的查看

64d98f3d4526522149df10126ad0a260.png

3.打开动态注册按钮

ce7d2d84977a526bd137bfe0728e3bb6.png

4.查看自己产品的ProductSecret; ProductKey; 

 dbd27c947741f34491c79f855a475e0a.png

5.修改单片机程序里面的参数 ProductSecret; ProductKey;

ee633ddfd2b479cc8405d6d4fa8340ba.png

6.修改Android程序里面的参数 ProductSecret; ProductKey;

c744f9be30a25f5cd3d364a406bec199.png

配置规则引擎(如果前面章节配置过,不需要再配置)

1.规则引擎 ,云产品流转,创建规则

1441d82d145118ad7d44ed2cc7fab022.png

4e9b409eb53a0248d9948519cc508a8e.png

2.选择编写 SQL

d502eacaa64547d7d867e3fe7d22091d.png

664edec07c4162b9f2b6ab1a31f6c1ea.png

3.添加操作

edb9833a2d96264b11a433c830fafa2f.png

4.注意①自己填写   ${TargetDevice}

2b46a4e5591e6a31fa6b3110f62666fa.png

5.启动规则

c513931ee15cde15e8471cbcc76ef35e.png

42d44fb14f1c7829462ef6aa20e4bc19.png

bf6cb5882c656afcb39328a0157d8634.png

硬件准备工作

1.请使用杜邦线连接如下:(STM32)PA3 -- TX(WiFi)(STM32)PA2 -- RX(WiFi)

94dcf296fc0f80c5b5e68d55d0b497b5.png

2.当前拨动开关如下:(让单片机的串口1和电脑USB连接)

cdc6422d7b6571a533de8ca157e5e4c9.png

3.把修改完的单片机程序下载到单片机,并打开串口调试助手

串口1在程序里面作为了日志打印输出口
用户可以打开串口调试助手观察日志

31b3884016a4505084b75cccbcc60cf4.png

Android准备工作

1.重新安装APP,运行APP会弹出注册页面.

注:接入的设备的名字做成了需要用户去填写

3703dc050eb1147ab97aa8693743a803.png

2.填写 111111(随意哈) 后点击 注册设备

1e25a8ac6de1ee68f09d4f5d21a45b70.png

3.注册成功将会跳转到主页(允许权限)

ae2f6e78f09be6092c961b7985652c00.png

4.在平台上可以看到在相应的产品下面注册了设备

768cf1fa0e3ff9ed8d53faef2340e0dc.png

开始整体测试

1.打开APP,点击右上角菜单,选择添加设备 "SmartConfig"

4eff0e86f72eb0c130aa0d063b9f85fd.png

2.手机连接自家的路由器,输入自家路由器密码

ec626a1b4d1698c16615af1b1659fc9c.png

3.长按开发板上面的 PB5引脚大约3S直至图示上面的指示灯快闪

 1ad921a37c247179e237776a3d5dc6cc.png

4.点击 APP 绑定设备按钮开始绑定设备

7679a6875743eb14bd026fd9e0e15e30.png

5.绑定成功以后,自动跳转到主页面,并添加了一个设备

设备显示的信息为ESP8266的MAC地址信息

 d3307e8341ca6b59f458a88d9d65f4dd.png

4.点击显示的设备,进入设备控制页面

页面显示温湿度数据和继电器状态

4acaa5b5052dbfca3ae14058e2d63eee.png

5.控制继电器

ffa8186de2611a8aa981702005f95328.png

56eea209855a7ec0fe714563f3c92c69.png

整体通信流程说明

APP和单片机各自作为阿里云的设备接入阿里云服务器.

APP接入的名字为用户注册时填写的名字;

单片机接入的名字为模组的MAC地址;

APP 配网绑定的时候添加的模组的MAC地址.

假设APP注册的设备的名字为: 111111

假设模组的MAC地址为: 10:52:1c:f0:82:21

APP发布的主题: /a1m7er1nJbQ/111111/user/update

这个主题发给云平台以后,经过了转发规则里面的SQL语句

c60f45406e8147fdc9e4b0dcd1baacd1.png

注: /a1m7er1nJbQ/+/user/update  (里面的 + 代表任意)

APP发布的主题为 /a1m7er1nJbQ/111111/user/update  所以,符合条件.

然后就提取这个主题里面的消息.

APP发布的消息为:(以控制继电器为例子)

{"TargetDevice":"10:52:1c:f0:82:21","DeviceName":"111111","data":"switch","bit":"1","status":"1"}

注:

TargetDevice 字段的值是APP添加的设备的名字

DeviceName 字段的值是APP本身设备的名字.

然后下面的配置是对提取的消息进行操作

 083dba72efd8186137e8ec04f4eac98a.png

发布到另一个 Topic    /a1kalhdMH2Z/${TargetDevice}/user/get 

${TargetDevice}意思是提取消息里面字段为 TargetDevice 的字段值,然后替换上面的  ${TargetDevice}

咱的消息是 {"TargetDevice":"10:52:1c:f0:82:21","DeviceName":"111111","data":"switch","bit":"1","status":"1"}

所以最终消息转发给下面的主题(也就是单片机订阅的主题)

/a1kalhdMH2Z/10:52:1c:f0:82:21/user/get 

然后单片机就收到了消息 {"TargetDevice":"10:52:1c:f0:82:21","DeviceName":"111111","data":"switch","bit":"1","status":"1"}

单片机接收到消息以后,提取 "DeviceName":"111111"

然后用自己的发布主题发布消息  

发布的主题: /a1kalhdMH2Z/10:52:1c:f0:82:21/user/update

发布的消息: {"TargetDevice":"111111","DeviceName":"10:52:1c:f0:82:21","data":"switch","bit":"1","status":"1"}

TargetDevice 字段的值改为了 111111

DeviceName 字段的值为单片机设备的名字  10:52:1c:f0:82:21

消息发给了服务器,然后经过转发规则,同理 ,消息便会转发给了APP

最后APP 提取消息里面的数据,就完成了通信

一型一密(免预注册): 免预注册就是不用在云端自己注册设备,设备连接上网络以后设备自己去注册.

这样子的话,每个设备烧录同样的程序就可以,不用再配置什么三元组了!

不过每个设备程序里面的需要写上产品的ProductKey 和 ProductSecret  的值,这两个值是固定的.

主要是区分开你注册的时候注册到哪个产品下.

然后设备通过https或者mqtt接口注册设备,

注册的时候服务器会返回ClientID和DeviceToken 等参数

最后按照平台规定的组合MQTT参数

MQTT连接的方式注册设备:

9e5657797e2e39ca6788366ebedd161d.png

拼接注册返回的参数连接MQTT:

c8f095c5cda992e19448064c83f82efc.png

单片机程序详细说明

1.串口使用情况

程序使用串口2和ESP8266通信
串口1作为日志输出口

串口1接收数据采用缓存管理+空闲中断
串口1发送数据采用环形队列+中断发送

串口2接收数据采用缓存管理+空闲中断
串口2发送数据采用中断发送

2.串口2的空闲中断是使用定时器自定义的,为了兼容GSM模组程序

e1405263ad265c898eaeb1d6323e16cd.png

3.串口1打印串口2接收的数据

判断串口2接收的数据以后,直接把数据插入串口1环形队列

846eecb4118de8debda87cbe5f24d185.png

4.串口1打印串口2发送的数据

在串口2调用发送数据的地方,把发送的数据插入串口1环形队列

8b9656570a4404974bf7ad58ff71293f.png

5.串口2接收的数据,传递给配置函数和MQTT数据处理函数

b38fba43e00743022cf152d07eeab037.png

6.配网绑定(SmartConfig)

f04700dea0d36c255a6ab8fe84346941.png

b0276c47122847612f1a8cd8f5cc3e6d.png

7.正常运行配置函数 ConfigModuleNoBlock

3c49bf82d2f3a70abd3402ee1334f59b.png

8.获取模组的MAC地址,后面作为注册设备的名字

3bb1a84b6b8753f0af52ec3dcf700c0f.png

14b7ab60db6fd5b65b1921237107606e.png

9.如果没有注册设备,则执行注册,如果已经注册,则跳过注册步骤执行连接

070e8d593f0a092cfdd1cf29faea4c70.png

10. ① 打包注册协议,并发送, 发送数据指令给模组

ffc905d2bd0da8856704fd27362ae07a.png

11. ② 发送数据

a45523b2e1e6018528ba32c70a110b33.png

12. ③ 解析注册返回的应答数据

注:此函数组合拼接了mqtt的ClientID 和 mqtt的密码并存储到flash.

745dd84d73d59cc1d42b45f8537e6461.png

 500da8bc1c48d46eda494baa044af573.png

13.注册完成以后使用注册的信息接入MQTT

079f24eb4bf16072c9c35efbb95a265d.png

0aa4836aafccb06e53162c4cfbb0fd0d.png

14.执行连接成功回调函数,在里面订阅主题,并发送数据给已经绑定的APP设备

dcb9247ee18c8e083a832741ed2dfbe2.png

提示:为使设备可以同时发送数据给与其绑定的APP,代码中使用了 BufferRankOrder 记录APP设备名称

设备发送数据的时候轮训把数据发给和自己绑定的APP.

关于为啥要用数组记录APP设备的信息?

必须有数组去记录APP信息,因为如果多个人同时在控制,设备必须把数据返回给每一个控制的APP.

如果谁控制就返回给谁数据,就会出现谁控制谁的页面有变化,其他人的控制页面没有变化的尴尬局面.

所以需要把数据返回给所有的APP

但是也不能把所有的APP信息都记录下来,因为不合理.

需要把这些APP做个优先等级排序.经常控制的要靠前,不经常的靠后,基本上没影了的放到最后,直至丢弃

注:关于 BufferRankOrder  

假设有5个APP和单片机通信,APP设备的名字分别为: "111111","222222","333333","444444","555555"

假设这5个设备依次和单片机通信,1-5 (谁最后和单片机通信就把谁放到第一个位置.)

那么这些名字在BufferRankOrder内存里面的排序 "555555","444444","333333","222222","111111"

哪个APP不经常和设备通信,那么这个APP最终将会被挤掉.最终只留下经常和设备通信的.

15.接收处理消息

89d2c9f35d220aeffb3805fa2b1a800e.png

16.定时发送温湿度数据给APP

882d33b70d7a9466db25acdafd38a3a6.png

17.如果继电器状态改变,发送继电器状态数据给APP

923aae7dedcd1bbc3e5cff3162bdbe2f.png

Android程序详细说明

1.基本目录说明

ce079b6c0f6e9af123271a9dea15e963.png

ActivityDeviceControl: 设备控制

ActivityRegDevice: 设备注册

aly_hmac: 计算MQTT密码

SmartConfig: 配网绑定

DataBaseLitepal: Litepal数据库存储

MyMqttClient: 封装的正常使用的MQTT接口

RegisterDeviceForMqtt: 注册接口

SharedPreferenceHelper: 封装的 SharedPreferences ,用于存储记录注册信息

2.如果SharedPreferences  里面没有记录的注册信息,跳转到注册页面

09dea4cfef6598b87e95b46b6e2a453c.png

3.点击按钮注册设备,并把注册信息存储以后跳转到主页面

64fa98ef7a2b698ec7a2986958de0660.png

4.获取注册的数据,并执行连接

e1641c27bf28e8a2eac90371ae5c3288.png

5.组合参数连接MQTT服务器

0b87510f0b1cfd3219db81c5c8be2733.png

6.配网绑定,点击绑定设按钮的时候控制APP连接设备热点

0c859311cb3d6a850af948fce8f2e196.png

 

a04c9f140327c891635185bfa34aa358.png

8.接收到模块返回的MAC地址信息,携带着信息跳转到主页面

cb9bac3220ba5301d317e71190db3f55.png

9.在主页的 onNewIntent 接收并存储设备信息

b33985ddc4436c213cf53cd6136a91b1.png

10.点击相应的设备以后,把设备的信息传递给控制页面

f504ec36ab51f3b9c2b673ea0e684a30.png

11.控制页面组合APP这个设备本身发布和订阅的主题

06b54f0df922c10953c4b7c40e44e720.png

12.组合发布给设备的消息

cef0cbd8917dea0e287a7425f87ae9f4.png

40faaa28a6ffc30b92037e9f97a2ac26.png

13.在定时里面请求设备数据,和订阅主题

c149e28120087441590bd3b684531901.png

14.接收处理数据

5cb24dfa9e0ce8f72e615fa3ca8cb751.png

cbfab659c0ca68f9fe2da3d99bc1a0e5.png

 dae52857545dcfb6ed6f305e0fbbe13b.png

15.控制继电器

b70f75e273c548123b9b04a83b873d14.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值