• 401-STM32+Air724UG基本控制篇(阿里云物联网平台)-Android扫码绑定Air724UG并通过阿里云物联网平台实现远程通信控制


    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/aly.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

    说明

    这一节实现Android扫码绑定模组并通过阿里云物联网平台实现远程通信控制.

    概要:

    APP和单片机设备分别作为设备以动态注册方式连接阿里云物联网平台,然后通过规则引擎实现APP和设备之间通信.

    此节教程是前面所有知识点的整合,希望用户按部就班的学习了前面的内容,然后再学习此节.

    APP页面展示

    云平台显示温湿度数据

    测试准备

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

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

    3.打开动态注册按钮

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

     

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

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

    配置规则引擎

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

    2.选择编写 SQL

    3.添加操作

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

    5.启动规则

    确认单片机工作正常

    1.修改完成以后编译下载单片机程序,安装好手机卡和天线

    2.如果日志看到订阅主题成功,说明已经自动注册并接入了平台

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

    注:设备名字使用的是模组的IMEI号

    确认Android工作正常

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

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

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

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

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

    开始整体测试

    1.点击APP右上方的菜单栏,选择 扫一扫

    2.扫描模组上面的二维码

     

    3.扫描成功以后将会在主页面添加一个设备

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

     

    5.点击右上角的开关控制继电器

    6.用手拖动,可以看到板子上的灯随着拖动颜色的变化而变化

    用手拖动,可以看到板子上的灯随着拖动颜色的变化而变化

     

    整体通信流程说明

    1,APP和设备通信协议(APP和设备通过自定义主题通信)

    /*APP发送数据控制继电器*/
    {"data":"switch","bit":"1","status":"-1"} //查询继电器状态
    {"data":"switch","bit":"1","status":"1"}  //控制继电器吸合
    {"data":"switch","bit":"1","status":"0"}  //控制继电器断开
    //设备回复(根据继电器状态返回)
    {"data":"switch","bit":"1","status":"1"}  //控制继电器吸合
    {"data":"switch","bit":"1","status":"0"}  //控制继电器断开


    /*APP发送数据控制RGB灯*/
    {"data":"rgb","red":20,"green":30,"blue":100} //控制RGB颜色


    //APP查询所有数据(定时查询,直至查询到回复)
    {"data":"all"}
    //设备返回
    {"data":"all","switch":{"bit":"1","status":"1"},"sensor":{"temperature":25,"humidity":75,"light":20000},"rgb":{"red":20,"green":30,"blue":100}}

     

    2.通信流程详细说明

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

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

    单片机接入的名字为模组的IMEI号;

    APP 添加设备的时候添加的模组的IMEI号.

     

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

    假设模组的IMEI为: 868591050594364

     

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

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

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

    APP发布的主题为 /a1m7er1nJbQ/111111/user/update  所以,符合条件.便会提取这个主题里面的消息.

     

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

    {"TargetDevice":"868591050594364","DeviceName":"111111","data":"switch","bit":"1","status":"1"}

    注:

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

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

     

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

     

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

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

    咱的消息是 {"TargetDevice":"868591050594364","DeviceName":"111111","data":"switch","bit":"1","status":"1"}

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

    /a1kalhdMH2Z/868591050594364/user/get 

    然后单片机就收到了消息 {"TargetDevice":"868591050594364","DeviceName":"111111","data":"switch","bit":"1","status":"1"}

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

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

    发布的主题: /a1kalhdMH2Z/868591050594364/user/update

    发布的消息: {"TargetDevice":"111111","DeviceName":"868591050594364","data":"switch","bit":"1","status":"1"}

     

    TargetDevice 字段的值改为了 111111

    DeviceName 字段的值为单片机设备的名字  868591050594364

     

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

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

    单片机程序说明

    1.注册,连接服务器

    2.连接成功之后订阅主题

    3.在MQTT回调函数里面接收处理和返回消息

     

     4.如果继电器状态改变,上报继电器状态

    5.定时上报温湿度数据(通过物模型主题上报到网页端)

    单片机程序细节说明

    1.为使设备可以同时和与其绑定的APP实现通信控制,代码中使用了 BufferRankOrder 记录APP设备名称

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

     

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

    因为如果多个用户同时在控制,设备必须把数据返回给每一个控制的APP.

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

    这对于产品而言就让用户难以接受.所以需要把数据返回给所有的APP.

     

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

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

     

    关于 BufferRankOrder  https://www.cnblogs.com/yangfengwu/p/14164215.html

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

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

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

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

    Android程序详细说明

    1.基本目录说明

    1.控制页面

    2.注册页面

    3.sha计算mqtt密码

    4.使用Litepal存储绑定的设备信息

    5.正常运行时使用的MQTT程序

    6.注册设备时使用的MQTT程序

    7.存储注册的信息

    2.如果APP没有注册,跳转到注册设备页面

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

    4.获取注册的数据,组合MQTT参数,并执行连接

     

    5.点击扫描二维码,进入扫描页面

    7.扫码成功,携带着数据跳转到主页

    8.MainActivity在onNewIntent中接收返回的数据

     

     9.把数据存储到数据库,并刷新页面

    10.点击设备,携带着提取点击的设备名字跳转到控制页面

    10.获取APP设备的productKey和deviceName,并拼接其自定义的主题

    11.获取传递进来的所点击的设备的名字,组合开关控制数据

    13.APP订阅自身的自定义主题

    14.定时请求设备数据

    15.每隔300ms检测RGB是否需要调整

    16.点击按钮发送控制继电器指令

    17.接收数据

     

     

     

  • 相关阅读:
    Java知识之运算符篇
    对List取交集、联集及差集
    SQL in与exists的执行效率比较
    SQLServer数据集合的交、并、差三种集合运算
    获取外网IP
    SQL语句优化技术分析
    高并发下的获取ID解决方案
    获取数据库里面所有自增类型的最大值
    锁的概述
    项目管理心得:一个项目经理的个人体会、经验总结(转)
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/14662571.html
Copyright © 2020-2023  润新知