快速实现 WIFI MQTT通信详解

2023-10-31

前言:MQTT是一种基于TCP的物联网通信协议,在物联网领域应用非常广泛,基本上所有的云平台都支持设备以MQTT协议接入,所以如果您的设备支持MQTT连接,就可以很容易的对接各云平台(比如ONE
NET、阿里云、腾讯云等)。CORE提供的MQTT库函数也十分简单,您只需根据各云平台的规则,在调用MQTT库函数时对传入的参数做相应的调整即可对接各家云平台。

一、本例程实现功能介绍

CORE向云端(ONE NET)上传温湿度数据,同时也接受云端下发的命令数据来控制CORE电路板上LED2灯的亮灭。

二、云平台操作流程

STEP 1: 注册并登录平台账号
在ONE NET云平台官网(https://open.iot.10086.cn)注册并登录开发者账号
注册账号方法: https://open.iot.10086.cn/doc/easy-manual/
STEP 2: 创建产品
产品相当于一个集合,该集合下面可以有成千上万的相同功能的设备。

产品创建方法: https://open.iot.10086.cn/doc/mqtt/book/get-start/product&device/createProduct.html

下图是我创建的产品的概况:
在这里插入图片描述
产品名称为: “mqtt_test”

产品ID:“353255”,该值在后面的代码解析中会提到,是设备和云端建立连接时的必要参数

access_key:该值这里我们用不到,但您以后开发客户端和云平台对接时就必须要了
STEP 3: 创建设备
设备相当于一个具体的硬件实物。

设备创建方法: https://open.iot.10086.cn/doc/mqtt/book/get-start/product&device/createDevice.html

注意:设备名称必须唯一,设备名称中可以包含产品的SN码,MAC地址,唯一ID等等来保证唯一性。
下图是我创建的设备的详情:
在这里插入图片描述
设备名称为: “TestDevice001”,该值在后面的代码解析中会提到,是设备和云端建立连接时的必要参数

设备key为: HNC7fq0yREOYs3uQoWREmZJjbwW8kiT6mxsDoh/dyW4= ,该值在后面的代码解析中会提到,是设备和云端建立连接时的必要参数
STEP 4: 完成
至此,我们已完成产品的创建,并在产品中创建了一例设备,在接下来的示例代码中,我们会用到已创建的产品和设备中的一些关键参数。

三、硬件接线图、材料清单

在这里插入图片描述

四、完整代码&代码解析

(1)完整代码
代码功能:CORE每隔9秒向云端(ONE NET)上传温湿度数据,同时也接受云端下发的数据来控制CORE电路板上LED2灯的亮灭。

--路由器连接参数
ap_ssid = "MyRouterName" --路由器账号
ap_passwd = "MyRouterPswd123" --路由器密码
--MQTT服务器地址(适用于ONE NET平台)
server_addr = "183.230.40.96" --OneNet服务器ip地址,也可以写成"mqtts.heclouds.com"(推荐)
server_port = 1883
--MQTT 连接参数(适用于ONE NET平台)
mqtt_con_clientID = "TestDevice001"
mqtt_con_username = "353255"
mqtt_con_password = "version=2018-10-31&res=products%2F353255%2Fdevices%2FTestDevice001&et=1893427200&method=md5&sign=%2F5RJwGwytPWvVDB04K7rnw%3D%3D"
--MQTT topic相关参数(适用于ONE NET平台)
mqtt_sub_topic = "$sys/353255/TestDevice001/cmd/request/+"--订阅用
mqtt_pub_topic = "$sys/353255/TestDevice001/dp/post/json" --发布用
--配置D9为普通输出,控制LED2
LIB_GpioOutputConfig("D9","STANDARD")
--使能系统10毫秒定时器开始工作
LIB_10msTimerConfig("ENABLE")
--初始化esp8266 Wifi模块,配置心跳包间隔时间为180秒,该值最好三倍于MQTT的KeepAlive时间
LIB_WifiTcpConfig("UART0","D5",ap_ssid,ap_passwd,server_addr,server_port,180) --180
--配置MQTT底层为WIFI传输(esp8266),并按照如下参数进行MQTT连接,KeepAlive时间=60LIB_MQTTConfig("WIFI",mqtt_con_clientID,mqtt_con_username,mqtt_con_password,"60",mqtt_sub_topic,"QOS0")
--设置sht3x传感器占用SCL0和SDA0引脚,以每秒出10个数据的频率工作,"HIGH"表示最高精度
LIB_Sht3xConfig("IIC0","10","HIGH")
--变量初始化
cnt_10ms = 0
pub_id = 0
temprature = 0.00
humidity = 0.00
--定义10ms中断回调函数
function LIB_10msTimerCallback()
    cnt_10ms = cnt_10ms + 1
end
--开始大循环
while(GC(1) == true)
do
    sht3x_flag,temp,humi = LIB_Sht3xGetResult()
    --如果传感器有新的温湿度数据产生
    if sht3x_flag == 1 then
        temprature = temp
        humidity = humi
    end
    --查询是否收到服务器下发的cmd数据(已订阅的"$sys/353255/TestDevice001/cmd/request/+")
    recv_flag,topic,data = LIB_MqttRecvSub()
    if recv_flag == 1 then
        --根据json路径"$.LED"解析服务器下发的json文本,并执行LED亮灭操作
        Json_Val = LIB_JsonParse(data, "$.LED")
        --服务器下发的是"{"LED":0}"
        if Json_Val == "0" then
            LIB_GpioWrite("D9",1) --LED2灭
        --服务器下发的是"{"LED":1}"
        elseif Json_Val == "1" then
            LIB_GpioWrite("D9",0) --LED2亮
        --服务器下发的是"{"LED":2}"
        elseif Json_Val == "2" then
            LIB_GpioToggle("D9") --LED2亮灭切换
        else 
            LIB_GpioWrite("D9",1) --LED2灭
        end
        --根据收到的topic中的cmdid应答服务器,
        --将收到的topic中"request"替换成"response"后作为应答topic发给服务器
        topic = string.gsub(topic,"request","response") 
        --应答内容可自定义,这里为"Got it!"
        LIB_MqttSendPub("QOS0", topic, "Got it!")
        --延时2秒是为了保证本次publish不被之后的publish覆盖,所以该延时太少可能导致LIB_MqttSendPub失败
        LIB_DelayMs(2000)
    end
    --9秒发送温湿度度数据给server
    if cnt_10ms >= 900 then
        cnt_10ms = 0
        pub_id = pub_id + 1
        json_str = string.format("{\"id\":%d, \"dp\":{\"temperatrue\":[{\"v\": %.2f,}], \"humidity\":[{\"v\":%.2f,}]}}", pub_id, temprature, humidity)
        --注意json_str的总长度不要超过250字节
        LIB_MqttSendPub("QOS0", mqtt_pub_topic, json_str) --publish
    end
end

(2)代码关键部分解析
PART 1 (路由器参数)

--路由器连接参数
ap_ssid = "MyRouterName" --路由器账号
ap_passwd = "MyRouterPswd123" --路由器密码

ap_ssid和ap_passwd请使用你自己的路由器账号密码。
PART 2(云平台地址)

--MQTT服务器地址(适用于ONE NET平台)
server_addr = "183.230.40.96" --OneNet服务器ip地址,也可以写成"mqtts.heclouds.com"(推荐)
server_port = 1883

server_addr和server_port是中国移动物联网(ONE NET)MQTT服务的固定IP地址和端口号,请不要改动它。
PART 3(MQTT连接参数)

--MQTT 连接参数(适用于ONE NET平台)
mqtt_con_clientID = "TestDevice001"
mqtt_con_username = "353255"
mqtt_con_password = "version=2018-10-31&res=products%2F353255%2Fdevices%2FTestDevice001&et=1893427200&method=md5&sign=%2F5RJwGwytPWvVDB04K7rnw%3D%3D"

mqtt_con_clientID、mqtt_con_username、mqtt_con_password 这三个参数是设备和服务端建立mqtt连接时所必须的三个参数,如果你曾接入过多个物联网云平台,你会发现它们的异同往往都在这三个参数上。这里我们介绍ONE NET云平台下关于这三个参数的定义规则:
① mqtt_con_clientID: 设备和服务端建立mqtt连接时,clientID用来标识设备的唯一性,我这里我们使用的是设备名称“TestDevice001”,设备名称应具有唯一性,比如可以用您定义的SN序列号等,这里是我在创建该设备时起的名字"TestDevice001"。
在这里插入图片描述
② mqtt_con_username:设备和服务端建立mqtt连接时,username用来认证连接的用户名,该值为产品ID
在这里插入图片描述
③ mqtt_con_password:设备和服务端建立mqtt连接时,password用来认证连接的密码。该密码的计算途径有两种:一种是通过电脑生成,一种是通过代码生成(python)。关于计算原理,请参考此处。当然您也可以不用花精力去看这些,直接看接下来的例子即可。这里的例子我们仅介绍通过电脑软件的生成方法,软件下载地址。

下图为我使用token.exe电脑软件生成password的方法:
在这里插入图片描述

下面介绍各个参数的来源,products、devices、md5这三个词汇固定不变

上图中的“353255”即是我们在创建产品时云平台自动赋予的产品ID。
上图中的“TestDevice001”即是我们在前面创建设备时我们给设备起的具有唯一性的设备名称。
上图中的“1893427200”表示将要生成的password的有效期,Unix时间戳,有效期截至为2030/1/1 0:0:0。
上图中的“HNC7fq0yREOYs3uQoWREmZJjbwW8kiT6mxsDoh/dyW4=”即是我们在前面创建设备时云平台自动赋予设备的设备key。
上图中的“version=2018-10-31&res=products%2F353255%2Fdevices%2FTestDevice001&et=1893427200&method=md5&sign=%2F5RJwGwytPWvVDB04K7rnw%3D%3D”
即是生成结果(设备和服务端建立连接所需要的password)。

PART 4(MQTT订阅、发布)
订阅和发布路径:

--MQTT topic相关参数(适用于ONE NET平台)
mqtt_sub_topic = "$sys/353255/TestDevice001/cmd/request/+"--订阅用
mqtt_pub_topic = "$sys/353255/TestDevice001/dp/post/json" --发布用

mqtt_sub_topic是用来给设备订阅服务器的命令消息(比如控制LED等)
mqtt_pub_topic是用来给设备向服务器发布消息(比如温湿度)

这两个字符串的中包含的”353255“和“TestDevice001”分别是产品ID和设备名称,其他部分保持固定不变即可

注意:这两个路径的结构由ONE NET云平台定义,其结构不可随意更改,如果感兴趣可以参考此处,设备命令Topic簇、数据点Topic簇。
回复云平台下发的命令:

--根据收到的topic中的cmdid应答服务器,
--将收到的topic中"request"替换成"response"后作为应答topic发给服务器
topic = string.gsub(topic,"request","response")
--应答内容可自定义,这里为"Got it!"
LIB_MqttSendPub("QOS0", topic, "Got it!")

ONE NET平台中的关于设备如何应答平台下发的cmd命令的格式已做了定义,可以参考设备命令Topic簇。

下面举个例子来说明:
如果服务器下发cmd的topic为: s y s / 353255 / T e s t D e v i c e 001 / c m d / r e q u e s t / 33 f f e a 0 a − e 5 f 1 − 49 d 6 − a 626 − f f e e 1 b b d 93 e f 那 么 我 们 应 答 的 t o p i c 应 该 为 : sys/353255/TestDevice001/cmd/request/33ffea0a-e5f1-49d6-a626-ffee1bbd93ef 那么我们应答的topic应该为: sys/353255/TestDevice001/cmd/request/33ffea0ae5f149d6a626ffee1bbd93eftopicsys/353255/TestDevice001/cmd/response/33ffea0a-e5f1-49d6-a626-ffee1bbd93ef

云平台会自动为每条下发的cmd分配一个cmd id, 例子中的33ffea0a-e5f1-49d6-a626-ffee1bbd93ef即为cmdid。
向云平台发布本地温湿度数

--9秒发送温湿度度数据给server
if cnt_10ms >= 900 then
    cnt_10ms = 0
    pub_id = pub_id + 1
    json_str = string.format("{\"id\":%d, \"dp\":{\"temperatrue\":[{\"v\": %.2f,}], \"humidity\":[{\"v\":%.2f,}]}}", pub_id, temprature, humidity)
    --注意json_str的总长度不要超过250字节
    LIB_MqttSendPub("QOS0", mqtt_pub_topic, json_str) --publish
end

每9秒向云平台pulish一次本地的温湿度数据,数据内容必须是json格式,
例如:{“id”:1, “dp”:{“temperatrue”:[{“v”: 32.50,}], “humidity”:[{“v”:56.00,}]}}
pub_id为pulish消息的标识符,每次发送时需递增加1
PART 5(其他)
其他部分代码已有详细注释,这里就不赘述了。

五、代码实验现象

STEP 1: 硬件准备工作
按照上面的接线方式将CORE和ESP8266无线模块、SHT30传感器连接就位,然后将上面的完整代码拷贝入Core的TF卡中的main.lua文件,完成Core的代码更新。
STEP 2: 在开发者控制台中找到设备
从ONE NET开发者控制台界面中进入对应的产品 ,然后在产品界面中鼠标点击进入“设备列表” 后可以看到我们刚刚创建的一个设备硬件实例“TestDevice001”,如下图:
在这里插入图片描述
在这里插入图片描述
STEP 3 查看设备的温湿度数据:
在这里插入图片描述
在这里插入图片描述
STEP 4 从云平台下发cmd指令控制CORE上的LED2灯的亮灭:

Ⅰ 鼠标点击进入在对应的设备的“更多操作”中的“下发命令” -->

Ⅱ 然后在弹出的界面中的命令内容中输入“{“LED”:2}”,超时时间5秒,返回结果中选择String格式

Ⅲ 最后点击发送,待设备成功收到命令并返回正确的应答后(应答消息中包含“Got it”),我们就可以看到Core电路板上的LED2灯珠由亮变灭或者由灭变亮了。
在这里插入图片描述
在这里插入图片描述
更多详情请参看 shineblink.com官网链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速实现 WIFI MQTT通信详解 的相关文章

  • pycharm如何找到python解释器,pycharm找不到解释器怎么办

    解决方法 1 打开磁盘 直接搜索python exe文件 获取该文件的路径 2 打开pycharm软件 依次点击 File Setting Project 点击右上角的设置图标 3 按照获取的路径找到python exe即可 IDi少儿编程
  • 谷粒学院SpringSecurity认证流程详解

    登录功能前端分析 前端会调用此接口去实现登录 登录 export function login username password return request url admin acl login method post data us
  • protobuf ubuntu 18.04环境下安装

    t20190518 luo luo All Series MyFile t20190518 luo luo All Series MyFile t20190518 luo luo All Series MyFile t20190518 lu
  • sharding-jdbc行分片策略默认不支持按分片键的范围查询

    目录 sharding jdbc行分片策略默认不支持按分片键的范围查询 原因 使用行分片策略 解决方案 使用标准分片策略 sharding jdbc 分片策略 sharding jdbc行分片策略默认不支持按分片键的范围查询 在开发时 对主
  • 网络空间安全概论 第八章 作业

    返回 本次得分为 12 00 16 00 本次测试的提交时间为 2020 02 15 如果你认为本次测试成绩不理想 你可以选择再做一次 1 判断 2分 在iOS的安全机制中 具有代表性的有权限分离 强制代码签名 地址空间随机分布和沙盒 由于
  • android AudioRecord

    AudioRecord是Android中用于音频录制的类 它的主要作用是捕获来自设备麦克风或其他音频源的音频数据 并将其保存为PCM格式的音频流 以供后续处理或存储 以下是关于AudioRecord的一些常见用途和基本使用方法 作用和用途
  • 国际化之表单校验

    国际化之表单校验 国际化整个项目的时候 表单校验的提示是个麻烦的事情 很多资料说用vee validate插件来实现这个功能 但是我觉得有点麻烦 不是很想用插件 然后就在validate js里面去捣鼓 然后发现在我们校验方法下是可以获取到
  • 数据库的事务

    以MySQL为视角 了解数据库的事务 目录 一 事务简介 1 概念 2 操作 3 例子 4 事务提交方式 二 事务的四大特征 ACID 1 原子性 atomicity 2 一致性 consistency 3 隔离性 isolation 4
  • Python: 用于计算txt文档的字数的小脚本

    在一次实践中 需要计算txt文档 英文和数字 的字数 并且还要统计路径下的所有txt文档的字数总数 本来以为很简单 但是在编写的过程中还是出现了一些问题 首先就是 字数和字符数是不一样的 不能简单的用len 根据英文的特性 每个单词都需要空

随机推荐

  • VUE iscroll

    https github com Dafrok vue iscroll view 基本使用方法 npm i vue iscroll view save dev npm i iscroll save dev import IScrollVie
  • uniapp scroll-view 隐藏滚动条

    如果是想全局隐藏的话 可以放在App vue中 如果是局部则在对应的页面中引入使用即可 ifdef MP WEIXIN APP PLUS webkit scrollbar display none width 0 important hei
  • C#贝塞尔曲线的应用-未读红点拖拽粘连效果

    前言 提示 仿照手机qq未读红点拖拽粘连效果 贝塞尔曲线的应用非常广泛 本篇文章将使用Winform贝塞尔曲线来实现QQ未读红点拖拽粘连的效果 手机QQ粘连效果 最终实现的效果 分析效果 1 可以看出随着拖拽的距离变大 固定点的圆会逐渐变小
  • 管理 Python 依赖项

    有几种不同的方法来管理 Python 依赖项 最常见的方法是使用 requirements txt 文件 其中列出了所有项目依赖项及其版本 然后 您可以通过运行 pip install r requirements txt 为您的项目安装所
  • 玩家传递信息

    小 A 和 ta 的小伙伴们玩传信息游戏 游戏规则如下 有 n 名玩家 所有玩家编号分别为 0 n 1 其中小朋友 A 的编号为 0 每个玩家都有固定的若干个可传信息的其他玩家 也可能没有 传信息的关系是单向的 比如 A 可以向 B 传信息
  • X210核心板、底板原理图、数据手册导读

    1 有用的资料 写代码时需要查阅和参考的资料有 核心板原理图 底板原理图 相应硬件的数据手册 S5PV210数据手册 2 原理图 PCB图 丝印图各自是什么 原理图是电路原理设计图 各个电路中的部件的逻辑连接图 原理图可能会影响软件编写 P
  • python 按文件名批量移动文件至指定文件夹

    做猫狗分类任务 要求数据集划分为训练集 training dataset 和验证集 validation dataset 均包含dogs和cats两个目录 且每个目录下包含与目录名类别相同的RGB图 数据集共25000张照片 其中训练集猫狗
  • k8s之工作负载控制器的应用

    k8s之工作负载控制器的应用 1 k8s工作负载控制器是什么 2 Deployment介绍 2 1 deployment的资源清单文件 2 2 Deployment 滚动升级 2 3 Deployment 水平扩容 2 4 Deployme
  • rsync 时提示 skipping non-regular file。。。。。 的问题

    在执行 rsync 时会提示 skipping non regular file 的内容 原因是原文件夹中包含软链接导致 可以忽略 rsync rvtO delete media u2 downloads media uu2 downloa
  • windows10+vscode+anaconda+python3.7配置LiDAR-MOS动态物体点云开源项目

    之前用c 开发较多 最近开始尝试深度学习方面的工作 用到python合pytorch 经过4天的探索 终于能把测试代码跑起来了 记录下遇到的坑 1安装anaconda 这个不是本文重点 网上教程很多 2创建python虚拟环境 2 1使用v
  • STM32F103 USB虚拟成U盘功能

    STM32F103 USB虚拟成U盘功能 还在学习 中
  • 蓝桥杯省赛模拟题-智能门锁

    本文是对 坊间流传的 蓝桥杯省赛模拟题 智能门锁 的一种解法和思路 用的是蚂蚁科技的底层代码 其中有一个BUG虽然解决 但仍然不清除原因 数码管显示6个数组字符就会出问题 最多4个稳定 但是加入超声波底层就会都正常 不清楚这是什么原因造成的
  • yolo5 训练无人人机识别系统

    环境搭建 安装驱动 点击鼠标右键 如果出现NVIDIA图标 点开 出现如下图片 我的显卡是1650 根据显卡的型号去官网找相应的驱动下载就好了 驱动官网 安装好之后 打开命令行cmd 输入如下指令 nvidia smi 显示出如下数据即为安
  • 电机驱动的三种脉冲模式

    电机驱动的三种脉冲模式 脉冲 方向 脉冲 脉冲 A B正交脉冲
  • TLS certificate verification has been disabled

    git push 推送仓库报错 缺少了安全认证 所以解决方法是重启安全认证 git config global http sslVerify true
  • 电机控制常用PID控制算法

    本文分享自己在电机控制仿真中的建模方法 敬请批评指正 同名B站链接 Timer sir 电机控制常用PID控制算法 PID控制原理 位置式PID 增量式PID 抗饱和PID PID控制仿真 仿真模型 仿真结果 PID控制原理 将偏差的比例
  • 记一次ThreadLocal的使用注意点(线程池)

    Threadlocal的作用就不用多讲了 主要是一个map用于线程间的数据隔离 正常情况下 线程回收 那么这个线程对应的map值也会被回收 是ThreadLocal中被移除并非值本身被移除 如果是对象并且任然被引用 它是不会被回收的 基于上
  • SpringBoot使用Nacos作为配置中心服务和服务注册中心

    简介 从spring开始 所有的配置文件都放在项目中 如果需要修改配置文件内容 则需要登陆服务器重启服务 想象一下如果你有一百台服务的需要修改 那是不可想象的工作量 目前已有的配置中心 携程开源的Apollo 数据保存在mysql中 支持命
  • 【航空和卫星图像中检测建筑物】使用gabor特征和概率的城市区域和建筑物检测研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 从甚高分辨率 VHR 航空和卫星
  • 快速实现 WIFI MQTT通信详解

    WIFI MQTT接入ONE NET云平台 一 本例程实现功能介绍 二 云平台操作流程 三 硬件接线图 材料清单 四 完整代码 代码解析 五 代码实验现象 前言 MQTT是一种基于TCP的物联网通信协议 在物联网领域应用非常广泛 基本上所有