华为云
一、华为云概述
华为云物联网平台设备接入云服务(IoTDA)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助您快速构筑物联网解决方案。
官网地址:设备接入-控制台 (huaweicloud.com)
注意:华为的账号分为华为账号,华为云账号,IAM 账号,注意区别
产品文档:成长地图_设备接入 IoTDA_华为云
二、演示功能概述
文章使用 Air724UG-NFM 开发板结合 demo\huaWeiYun 这个 DEMO 为例做演示,连接华为云,实现自定义主题订阅和发布。
三、准备硬件环境
3.1 Air724UG-NFM 开发板
使用 Air724UG-NFM 开发板,如下图所示:
淘宝购买链接:Air724UG-NFM 开发板淘宝购买链接 ;
此开发板的详细使用说明参考:Air724UG 产品手册 中的 《EVB_Air724UG_AXX开发板使用说明》,写这篇文章时最新版本的使用说明为:《EVB_Air724UG_A14开发板使用说明》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明文档。
3.2 SIM 卡
中国大陆环境下,可以上网的 sim 卡,一般来说,使用移动,电信,联通的物联网卡或者手机卡都行。
3.3 PC 电脑
WINDOWS 系统,WIN7 以上。
3.4 数据通信线
安卓接口的 USB 数据线。
四、准备软件环境
4.1 Luatools 工具
要想烧录 LuatOS 固件到 4G 模组中,需要用到合宙的强大的调试工具:Luatools
详细使用说明参考:Luatools 工具使用说明 。
Luatools 工具集具备以下几大核心功能:
- 一键获取最新固件:自动连接合宙服务器,轻松下载最新的合宙模组固件。
- 固件与脚本烧录:便捷地将固件及脚本文件烧录至目标模组中。
- 串口日志管理:实时查看模组通过串口输出的日志信息,并支持保存功能。
- 串口调试助手:提供简洁的串口调试界面,满足基本的串口通信测试需求。
Luatools 下载之后,新建一个命名为 "Luatools" 的文件夹,将下载的 Luatools_v3.exe 拷贝或移动到新建的 Luatools 文件夹内,点击 Luatools_v3.exe 即可运行。
4.2 准备需要烧录的代码
LuatOS 软件由两部分组成:内核固件和应用脚本。点击此处下载 LuatOS 软件包,如图:
4.2.1 烧录的底层固件文件
下载底层 “CORE_V4030” 解压后,里面有一个 readme.txt 文件,详细介绍了不同的底层固件功能,本教程用的底层固件是:LuatOS-Air_V4030_RDA8910_TTS_NOLVGL_FLOAT.pac,如图:
本教程选择这个底层固件:LuatOS-Air_V4030_RDA8910_TTS_NOLVGL_FLOAT.pac
4.2.2 烧录的脚本代码
下载 “上层软件 LuaTask_V2.4.4(demo+lib)”解压后,在 demo 文件夹有各种功能例程可以参考:
本文中使用 "huaWeiYun" 的 demo,如图:
4.3 华为云
1.设备接入前需创建产品(可通过控制台创建或者使用应用侧 API 创建产品)
2.产品创建完毕后,需注册设备(可通过控制台注册单个设备或者使用应用侧 API 注册设备创建)。生成的设备 ID(DeviceId)和密钥(DeviceSecret)需要记录下来供后续步骤使用。
3.设备注册完毕后,可以按照图中流程实现消息/属性上报、接收命令/属性/消息、OTA 升级、自定义 Topic 等功能。关于平台预置 topic 可参考 Topic 定义
4.获取设备接入信息,访问设备接入服务,单击“立即使用”进入设备接入控制台。 单击“立即使用”进入控制台,单击左侧导航栏的“总览”,查看设备接入信息,记录域名和端口。
五、API 接口介绍
模块功能:MQTT 客户端
5.1 mqtt.client(clientId, keepAlive, username, password, cleanSession, will, version)
创建一个 mqtt client 实例
- 参数
名称 | 传入值类型 | 释义 |
---|---|---|
clientId | string | 确保设备唯一性 |
keepAlive | number | 可选参数,默认为 300 心跳间隔(单位为秒),默认 300 秒 |
username | string | 可选参数,默认为"" 用户名,用户名为空配置为""或者 nil |
password | string | 可选参数,默认为"" 密码,密码为空配置为""或者 nil |
cleanSession | number | 可选参数,默认为 1 1/0 |
will | table | 可选参数,默认为 nil 遗嘱参数,格式为{qos=,retain=,topic=,payload=} |
version | string | 可选参数,默认为"3.1.1" MQTT 版本号,仅支持"3.1"和"3.1.1" |
- 返回值
table mqttc client 实例
- 例子
mqttc = mqtt.client("clientid-123")
mqttc = mqtt.client("clientid-123",200)
mqttc = mqtt.client("clientid-123",nil,"user","password")
mqttc = mqtt.client("clientid-123",nil,"user","password",nil,{qos=0,retain=0,topic="willTopic",payload="willTopic"},"3.1")
5.2 mqttc:connect(host, port, transport, cert, timeout)
连接 mqtt 服务器
- 参数
名称 | 传入值类型 | 释义 |
---|---|---|
host | string | 服务器地址 |
port | param | string 或者 number 类型,服务器端口 |
transport | string | 可选参数,默认为"tcp" “tcp"或者"tcp_ssl” |
cert | table | 可选参数,默认为 nil table 或者 nil 类型,ssl 证书,当 transport 为"tcp_ssl"时,此参数才有意义。cert 格式如下:{caCert = “ca.crt”, --CA 证书文件(Base64 编码 X.509 格式),如果存在此参数,则表示客户端会对服务器的证书进行校验;不存在则不校验 clientCert = “client.crt”, --客户端证书文件(Base64 编码 X.509 格式),服务器对客户端的证书进行校验时会用到此参数 clientKey = “client.key”, --客户端私钥文件(Base64 编码 X.509 格式)clientPassword = “123456”, --客户端证书文件密码[可选]} |
timeout | number | 可选参数,默认为 120 可选参数,socket 连接超时时间,单位秒 |
- 返回值
result true 表示成功,false 或者 nil 表示失败
- 例子
mqttc = mqtt.client("clientid-123", nil, nil, false); mqttc:connect("mqttserver.com", 1883, "tcp", 5)
5.3 mqttc:subscribe(topic, qos)
订阅主题
- 参数
名称 | 传入值类型 | 释义 |
---|---|---|
topic | param | string 或者 table 类型,一个主题时为 string 类型,多个主题时为 table 类型,主题内容为 UTF8 编码 |
qos | param | 可选参数,默认为 0 number 或者 nil,topic 为一个主题时,qos 为 number 类型(0/1/2,默认 0);topic 为多个主题时,qos 为 nil |
- 返回值
bool true 表示成功,false 或者 nil 表示失败
- 例子
mqttc:subscribe("/abc", 0) _-- subscribe topic "/abc" with qos = 0_
mqttc:subscribe({["/topic1"] = 0, ["/topic2"] = 1, ["/topic3"] = 2}) _-- subscribe multi topic_
5.4 mqttc:unsubscribe(topic)
取消订阅主题
- 参数
名称 | 传入值类型 | 释义 |
---|---|---|
topic | param | string 或者 table 类型,一个主题时为 string 类型,多个主题时为 table 类型,主题内容为 UTF8 编码 |
- 返回值
bool true 表示成功,false 或者 nil 表示失败
- 例子
mqttc:unsubscribe("/abc") _-- unsubscribe topic "/abc"_
mqttc:unsubscribe({"/topic1", "/topic2", "/topic3"}) _-- unsubscribe multi topic_
5.5 mqttc:publish(topic, payload, qos, retain)
发布一条消息
- 参数
名称 | 传入值类型 | 释义 |
---|---|---|
topic | string | UTF8 编码的字符串 |
payload | string | 用户自己控制 payload 的编码,mqtt.lua 不会对 payload 做任何编码转换 |
qos 0/1/2, default | number | 可选参数,默认为 00 |
retain | number | 可选参数,默认为 0 0 或者 1 |
- 返回值
bool 发布成功返回 true,失败返回 false
- 例子
mqttc = mqtt.client("clientid-123", nil, nil, false)
mqttc:connect("mqttserver.com", 1883, "tcp")
mqttc:publish("/topic", "publish from luat mqtt client", 0)
5.6 mqttc:receive(timeout, msg)
接收消息
- 参数
名称 | 传入值类型 | 释义 |
---|---|---|
timeout | number | 接收超时时间,单位毫秒 |
msg | string | 可选参数,默认为 nil 可选参数,控制 socket 所在的线程退出 recv 阻塞状态 |
- 返回值
result:
数据接收结果,true 表示成功,false 表示失败
data:
如果 result 为 true,表示服务器发过来的 mqtt 包
如果 result 为 false,超时失败,data 为"timeout"
如果 result 为 false,msg 控制退出,data 为 msg 的字符串
如果 result 为 false,socket 连接被动断开控制退出,data 为"CLOSED"
如果 result 为 false,PDP 断开连接控制退出,data 为"IP_ERROR_IND"
如果 result 为 false,mqtt 不处于连接状态,data 为 nil
如果 result 为 false,收到了 PUBLISH 报文,发送 PUBACK 或者 PUBREC 报文失败,data 为 nil
如果 result 为 false,收到了 PUBREC 报文,发送 PUBREL 报文失败,data 为 nil
如果 result 为 false,收到了 PUBREL 报文,发送 PUBCOMP 报文失败,data 为 nil
如果 result 为 false,发送 PINGREQ 报文失败,data 为 nil
param:
如果是 msg 控制退出,param 的值是 msg 的参数;其余情况无意义,为 nil
- 例子
true, packet = mqttc:receive(2000)
false, error_message = mqttc:receive(2000)
false, msg, para = mqttc:receive(2000,"APP_SEND_DATA")
5.7 mqttc:disconnect()
断开与服务器的连接
- 参数
无
- 返回值
nil
- 例子
mqttc = mqtt.client("clientid-123", nil, nil, false)
mqttc:connect("mqttserver.com", 1883, "tcp")
process data
mqttc:disconnect()
六、 华为云操作实例
6.1 登录并开通 IoTDA 实例
登录官网设备接入-控制台 (huaweicloud.com)注册华为云账号开通物联网平台,填写实例名称,标签、实例描述可根据需要选填,完成之后点击立即创建。
注:华为云首页若找不到该入口,在搜索框输入 "设备接入 IoTDA” 关键字进入
点击上面链接,并按照提示完成认证操作(如果已经认证过,则跳过这一步骤)
完成认证后,进入 IoTDA 控制台,点击购买实例,如下图
这里我们为了测试,实例版本选择“标准版”、计费模式选择“按需计费”,实例名称填入“air724ug”,收费结算为 0 元,点击立即购买,在弹出页面后点击“提交”。
开通实例后点击“详情”,如下图所示:
接入地址中.iotda 前的数据为 endpoint,即下图中红框处,此信息需要记录下来,供后续使用,如果忘了记录也没有关系,后续可以再重新点开实例详情查看
我们将链接信息整理如下
----接入地址:
6c8a32f1ff.st1.iotda-device.cn-north-4.myhuaweicloud.com
----端口号:
MQTT (1883)
MQTTS (8883)
MQTT over WebSocket (443)
6.2 创建产品
如图所示,进入创建产品页面:
操作步骤为:产品---> 创建产品---> 填写信息---> 确定
创建产品后的产品 ID 要记录下来,后面会用到
ID:**672acd71fc8d5a4ea7221baf**
到此为止,创建产品工作已经完成,同时需要注意将 endpoint 和产品 ID 记录下来,后续会根据不同注册方式来进行实例讲解。
6.3 设备注册
华为云动态注册即自动注册相当于管理员操作 API 强制注册,华为云本身并没有直接的自动注册 API,故不建议此方式,本文也不再介绍该注册方式,仅介绍密钥校验(手动注册)方式。
首先创建设备并获取参数。
此注册方式采用一机一密,需要手动创建设备预注册。
点击所有设备---> 注册设备---> 填写信息(设备标识码可以填开发板的 IMEI 号)---> 设备认证类型选择密钥
设备创建成功后将密钥复制并记录下来,后面会用到
设备密钥:d88dc8de8836a9db4f707f9873f1d54d
设备ID:672acd71fc8d5a4ea7221baf_863482063029199
进入设备详情-> 查看 MQTT 链接参数-> 一键复制后会自动下载一个 TXT 文件,内容包含连接参数
下载的 TXT 文档内容如下:
{
"username": "672acd71fc8d5a4ea7221baf_863482063029199",
"password": "2152b1c17fae8e5a0600ca544bcfe54f6068f3c857112396978cf690b5a2e714",
"clientId": "672acd71fc8d5a4ea7221baf_863482063029199_0_0_2024110602",
"hostname": "6c8a32f1ff.st1.iotda-device.cn-north-4.myhuaweicloud.com",
"port": 8883,
"protocol": "MQTTS"
}
6.4 自定义主题
进入创建自定义主题界面:
自定义订阅主题:
自定义发布主题:
结果会创建以下两个主题:
$oc/devices/672acd71fc8d5a4ea7221baf_863482063029199/user/publish
$oc/devices/672acd71fc8d5a4ea7221baf_863482063029199/user/subscribe
七、修改例程验证
本文以 demo\huaWeiYun 这个 DEMO 为例做演示。
7.1 修改 mqttTask.lua
将 host 改为自己的设备接入域名。
将 device,secret,clientId 改为上述步骤中记录的设备 ID,秘钥及 clientId。
将 MQTT 的任务代码修改成连接华为云后,订阅“$oc/devices/672acd71fc8d5a4ea7221baf_863482063029199/user/subscribe”主题,收到华为云服务器消息后再把消息通过“$oc/devices/672acd71fc8d5a4ea7221baf_863482063029199/user/publish”主题发送到华为云。
以下修改的例程:
--这里用的MQTT方式接入,port是1883
local host, port ="6c8a32f1ff.st1.iotda-device.cn-north-4.myhuaweicloud.com", 1883
local device = "672acd71fc8d5a4ea7221baf_863482063029199"
local secret = "2152b1c17fae8e5a0600ca544bcfe54f6068f3c857112396978cf690b5a2e714"
local clientId = "672acd71fc8d5a4ea7221baf_863482063029199_0_0_2024110602"
-- 测试MQTT的任务代码
sys.taskInit(function()
while true do
while not socket.isReady() do sys.wait(1000) end
--创建一个mqtt client实例
local mqttc = mqtt.client(
clientId,
300,
device,
secret)
while not mqttc:connect(host, port) do sys.wait(2000) end
--topic订阅主题
if mqttc:subscribe("$oc/devices/"..device.."/user/subscribe") then
while true do
--接收华为云的数据
local r, data, param = mqttc:receive(120000, "pub_msg")
if r then
log.info("这是收到了服务器下发的消息:", data.payload or "nil")
--把收到的数据再发送到华为云
mqttc:publish("$oc/devices/"..device.."/user/publish", data.payload)
elseif data == "pub_msg" then
log.info("这是收到了订阅的消息和参数显示:", param)
elseif data == "timeout" then
--等待超时,进行下一轮等待
else
break
end
end
end
mqttc:disconnect()
end
end)
7.2 使用 Luatools下载脚本
- 正确连接电脑和 4G 模组电路板
开发板的接线方式
首先将开发板放置好,接上 USB 并连接到电脑,同时,记得将天线也连接好,保证信号环境比较良好,比如可以看看手机信号来判断一下所在环境的信号状况。USB 的连接如上图所示。
在上图中,连接 USB 的插口旁边有一个 USB 字样,在进行脚本下载时,须连接此端口。
- 识别 4G 模组的 BOOT 引脚
在下载之前,要用模组的 BOOT 引脚触发下载, 也就是说,要把 4G 模组的 BOOT 引脚拉到 1.8v,或者直接把 BOOT 引脚和 VDD_EXT 引脚相连。我们要在按下 “下载模式” 按键时让模块开机,就可以进入下载模式了。
具体到 Air724UG-NFM 开发板:
1、当我们模块没开机时,按着 “下载模式” 键然后长按 “开机” 开机。
2、当我们模块开机时,按着“下载模式”键然后点按 “重启” 键即可。
- 识别电脑的正确端口
判断是否进入 BOOT 模式:模块上电,此时在电脑的设备管理器中,查看串口设备, 会出现一个端口表示进入了 BOOT 下载模式,如下图所示:
- 用 Luatools 工具烧录
1.新建项目
首先,确保你的 Luatools 的版本,大于等于 3.0.6 版本的。
在 Luatools 的左上角上有版本显示的,如图所示:
Luatools 版本没问题的话, 就点击 Luatools 右上角的“项目管理测试”按钮,如下图所示:
这时会弹出项目管理和烧录管理的对话框,可以新建一个项目,如下图:
2.开始烧录
选择开发板对应的底层 core 和脚本文件。下载到板子中。
点击下载后,我们需要进入 BOOT 模式才能正常下载。
7.3 查看打印效果,也可在华为云上查看设备状态。
烧录代码后运行,设备会在线显示:
点击上图设备标识码进入下发消息页面:
命令下发完成后显示,如下图:
如果启用消息跟踪,可以在消息跟踪看到平台下发到设备,设备发送到平台的记录:
对应 log:
[2024-11-06 11:48:02.147] [I]-[socket:connect-coreid,prot,addr,port,cert,timeout] 0 TCP 6c8a32f1ff.st1.iotda-device.cn-north-4.myhuaweicloud.com 1883 nil
[2024-11-06 11:48:02.147] 120
[2024-11-06 11:48:02.458] [I]-[socket:on_response:] 0 SOCKET_CONNECT 0
[2024-11-06 11:48:02.458] [I]-[socket:connect: connect ok]
[2024-11-06 11:48:02.458] [D]-[mqtt.client:write] 10AF0100044D51545404C2012C00373637326163643731666338643561346561373232316261665F38363334383230363330 50
[2024-11-06 11:48:02.458] [D]-[socket.send] total 178 bytes first 30 bytes
[2024-11-06 11:48:02.596] [I]-[socket:on_response:] 0 SOCKET_SEND 0
[2024-11-06 11:48:02.690] [D]-[socket.recv] 4 nil
[2024-11-06 11:48:02.690] [D]-[mqtt.unpack] 4 20020000 4
[2024-11-06 11:48:02.690] [D]-[mqtt.client:write] 824800020043246F632F646576696365732F3637326163643731666338643561346561373232316261665F38363334383230 50
30490043246F632F646576696365732F3637326163643731666338643561346561373232316261665F383633343832303633 50
[2024-11-06 11:53:09.791] [I]-[这是收到了服务器下发的消息:] test
[2024-11-06 11:53:09.791] [D]-[mqtt.client:write] 30470041246F632F646576696365732F3637326163643731666338643561346561373232316261665F383633343832303633 50
[2024-11-06 11:53:09.791] [D]-[socket.send] total 73 bytes first 30 bytes 0G
[2024-11-06 11:53:10.101] [I]-[socket:on_response:] 0 SOCKET_SEND 0
常见问题
连接被拒
确认 CA 证书是否正确 资源获取_设备接入 IoTDA_开发指南_华为云 (huaweicloud.com)
心跳时常建议
心跳时间限定为 30 至 1200 秒,推荐设置为 120 秒
华为云接入失败,怎么排查?
先检查设备配置,确保设备的 ID,名称,密钥等配置信息正确无误;同时也要检查下网络连接,确保 SIM 卡是正常入网状态,若还是不行,请再仔细看下教程,看是否有哪个步骤有疏漏。
给读者的话
本篇文章由公帅开发;
本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;
请登录合宙技术交流论坛,点击文档找错赢奖金-Air724UG-LuatOS-软件指南-公有云对接-华为云;
用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;
我们会迅速核实并且修改文档;
同时也会为您累计找错积分,您还可能赢取月度找错奖金!