IoT/HCIP实验-1/物联网开发平台实验Part1(快速入门,MQTT.fx对接IoTDA)

实验介绍

本文是《HCIP-IoT Developer V2.5 实验手册》实验1<物联网平台实验>先导篇。文中介绍了IoTDA的基础概念和基础使用方法。借助MQTT.fx模拟设备与华为云IoTDA连接和调试的步骤,包含服务开通、产品创建、设备注册、主题消息收发和调测等系列实验步骤。

@History
这是关于HCIP-IOT实验的一个次尝试。实验1的要求如下,
本实验通过在华为云物联网平台上创建产品,进行案例的功能定义和编解码插件开发,掌握物联网平台的操作流程,以及如何验证编解码插件是否正确。本实验完成后,你将掌握物联网平台的功能定义,掌握物联网平台编解码插件的开发,掌握物联网平台的调试。

刚开始,我想硬着头皮硬啃《HCIP-IoT Developer V2.5 实验手册》,但仅仅是尝试了没几页,我就头大了。第一是我态菜鸟了,连一些基础的概念也没搞明白,第二是该指导书并不保姆级,实验步骤有跳跃、缺失、老旧等问题。后来发现华为云针对IoTDA产品提供了更加详细的在线帮助文档(也有PDF版),于是先按照在线文档进行了部分实验学习,再倒回头来啃实验指导书。

设备接入IoTDA

我们进入并登陆华为云
在这里插入图片描述

进入IoTDA平台

按照上图,产品 -> IoT物联网 -> 设备接入 IoTDA,
在这里插入图片描述
点击上图控制台,进入真正的设备接入界面,控制台默认为 “华北-北京四”。在实验指导书中,上述步骤后,直接描述到了创建产品的环节,这中间是有步骤缺失的。缺失的这部分,我们可以从上图,产品文档中获得比实验指导书更详尽的支持。
在这里插入图片描述

什么是IoTDA

看到上图正中央的成长地图了木有,这是个不错的学习指引。不管你前边基础知识学习的怎么样,建议成长地图中的1和2部分还是要仔细的去读一下的。可重点关注,IoTDA服务介绍、基础概念等。也不用关注太深,因为没有一些基础积累,你也读不懂,别把自己读困了。如果你不想读文字,里头还贴心的提供了视频(部分为AI小姐姐主讲)介绍。一些较为基础的知识如下,

华为云物联网平台设备接入云服务(IoTDA,Internet of Things - Device Access)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助您快速构筑物联网解决方案。使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。

  • 物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。
  • 设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS等主流协议或行业协议将业务数据上报到平台,平台也可以将控制命令下发给设备。
  • 业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。
    在这里插入图片描述
    一个更加详细的IoTDA设备接入服务的框图(来自与视频),
    在这里插入图片描述

开通服务

这个过程的相关资料,在实验指导书中并没有涉及。相关资料的获取路径:
1、在线产品文档 -> 快速入门 -> 设备快速接入-属性上报与命令接收 -> 开通服务,来学习操作。
2、在线产品文档 -> 文档下载 -> 设备接入 IoTDA 快速入门.pdf。
3、在线产品文档 -> 搜索 开通服务

限于篇幅这里不再赘述。访问设备接入服务,单击“控制台”进入设备接入控制台。在左侧导航栏,选择“IoTDA实例”,单击“开通免费单元”。按需计费,实例名称 “实验1_1”,最终结果如下:
在这里插入图片描述
大约等待1分钟左右吧,实例状态将从创建中,变为运行中。然后我们点击我们的实例进入,
在这里插入图片描述
平台在这里很贴心的为初学者提供了3种不同的体验方式。第一种很简单,可以自己尝试下;第三种先不管。第二种 “使用虚拟设备体验”,这应该与我们实验指导书中的描述的实验过程几乎一致。我们点击该体验方式下的参考文档,会在同一网页右侧显示帮助内容。我们可以点击帮助页面右上角的图钉,将该Help窗口固定住(否则后续操作它将被隐藏),或者直接看下载的PDF文档。
本实验以“智慧路灯”为示例,通过MQTT.fx设备模拟器模拟智慧路灯,给您介绍基于IoTDA平台实现一款智慧路灯联接到平台、上报光照强度数据、以及平台下发开灯命令给智慧路灯三个场景。

创建产品和设备

在这里插入图片描述
整个创建过程,主要依赖于帮助文档,另外几乎每个标签都有帮助Tip信息,鼠标悬空在其上也可以获取帮助信息。我们也可以单独开一个Web页面显示IoTDA帮助文档,以方便在实验时翻看相关内容。

定义产品模型(Profile)

产品模型(也称Profile)用于描述设备具备的能力和特性。开发者通过定义Profile,在物联网平台构建一款设备的抽象模型,使平台理解该款设备支持的服务、属性、命令等信息。按照上述在线文档,创建产品并为产品模型添加服务、添加命令等。
在这里插入图片描述
注意,其中文档中提及的“新增输入参数”,现在叫做“新增下发参数”。另外,如果后期你想倒回头来检查或修改模型定义,也得是按照上图所示,从左侧菜单栏找到 “产品” 然后找到目标产品,并点击产品名称或详情,进入,
在这里插入图片描述
在 “基本信息” 这一选项卡下,就可以看到我们定义的产品模型,可以进行相应的修改。关于 “插件开发” 选项卡,将在Part2文章中讨论。

设备注册

按照文档中的说明,创建设备。一个设备的属性包含,
在这里插入图片描述
本实验中,创建成功的设备如下,
在这里插入图片描述
如上图,产品模型已经被定义,设备已经被注册。但是我的设备的状态是未激活?
在这里插入图片描述
开始的时候,我也不知道"未激活"是个啥状态,也不知道该怎么处理。在产品文档中大搜索,找到上述答案。进一步查看上述“设备初始化”操作的说明,可知,初始化过程包含创建设备、建立连接两个过程,而我们前边的工作只是进行了创建步骤。在后续操作完成后,也验证了这一想法是正确的。

简思(实例-产品-设备)

实验至此,实例-产品-设备这个三个概念的关系,成了一个问题。本问题后续展开,此处仅简单讨论。
在这里插入图片描述
如上图,总览是实例的总览,显示实例的基本信息。产品是实例的产品列表,设备是实例的设备列表。产品和设备之间的关联,与编解码插件是没有什么关系的,本实验就是个很好的例子,实验中没有涉及到编解码插件的开发,但是我们创建了产品和设备,建立产品模型,仿真了设备和云端的通信过程。那么关键来了,设备和产品是如何关联起来的 ?
我们在本实验中,创建了产品,开发了产品模型,新创建了设备,就干了这些活啊,这就自动关联了?当然不可能,产品和设备的交互关联分为两个重要环节,具体如下,

环节1- 在设备注册界面要指定其所属的产品
在这里插入图片描述
环节2- (设备的)Topic主题消息的数据体中,含有产品模型的服务ID和属性字段名称,
在这里插入图片描述

模拟.与平台通信

在线产品文档 -> 快速入门 -> 设备快速接入-属性上报与命令接收 -> MQTT.fx模拟智慧路灯与平台通信,来学习操作。

在这里插入图片描述

虚拟设备/MQTT.fx

在后边的实验中,我遇到了 “MQTT.fx 中无法订阅$oc开头的主题/Topic” 问题,随即添加此小节。
MQTT.fx是一个主流的MQTT桌面客户端,支持Windows、Mac和Linux操作系统。它主要用于快速验证设备是否可以与物联网开发平台进行连接,并支持发布或订阅消息。MQTT.fx并不是由华为开发的,也不是MQTT协议直接提供的工具‌,而是由第三方开发者开发的。
在这里插入图片描述

应用 Web 控制台

在这里插入图片描述
上述调试界面,可以通过左侧菜单进入。也可以通过设备列表中的 “调试” 连接进入。

QA用户或密码错误

按照上述文档下载MQTT.fx并安装和进行配置。进入设备详情页面,找到“MQTT连接参数”,单击“查看”,查看其中的clientId、username、password和hostname,或者点击一键复制后(以Txt存储到本地)。

后记:
需要注意的是,这里的密码是加密后的密码,就是直接用这个HMAC-SHA256 算法加密后的长字符串,不是什么原始密码。另外,我在同一天的下午进行测试时,中间我断开MQTT.fx连接,试图进行重连,结果LOG提示我用户名或密码错误,
在这里插入图片描述
折腾了半个小时,发现设备连接KEY竟然发生了变动。我能确定的是,单纯的断开并重连不会导致KEY中的clientId和password发生变动,可能是因为免费?我现在还不太确定,总之先记着有这个现象吧,别到时候摸不着头脑。在文末总结中,会重新探讨。

QA证书导致的连接失败

按照上述文档操作后,并没有预期的连接成功,查看Log如下,
在这里插入图片描述
这应该是证书的问题,
在这里插入图片描述
一开始我选择下载的是"北京四基础版",尝试了其中的C、Java、Android证书都无果,后来重新下载 “北京四-设备侧证书”,使用其中的…\c\GlobalSign-rootca.pem证书,连接成功。尝试其Java版证书,无法连接,错误如下,
在这里插入图片描述
如上,我们使用的MQTT.fx设备仿真程序解析不了java证书,只能解析C语言的证书,在联想文档中的初始化连接API接口的调用等说明,可以断定我们的程序是基于C/C++开发的。

设备与平台连接成功

解决遇到的问题后,重新Connect成功,仿真工具连接灯变绿,IoTDA平台的设备状态也从未激活变为在线。
在这里插入图片描述
至此,本实验我们已经成功完成了一半,接下来算是功能体验了。

上报数据和下发指令

继续参考在线产品文档 -> 快速入门 -> 设备快速接入-属性上报与命令接收 -> MQTT.fx模拟智慧路灯与平台通信,来学习操作。
在这里插入图片描述
通过设备仿真端的publish功能,我们可以上报任意字符串,它附着在一个topic上。执行上述操作的日志如下,
在这里插入图片描述
也就说,上述操作中的 Topic 是:home/garden/fountain (QoS 0, Retained: false)

什么是Topic

尝试在MQTT.fx设备端创建一个自己的新主题,进行新数据的发送,并在调试界面-应用模拟器端观察结果,
在这里插入图片描述
也是成功的,那么,什么是IoTDA架构下的Topic呢?
其实如果你有架构设计或软件设计的基础,就很容易的联想到,发布订阅架构中的主题、观察者模式中的主题,是的,这里Topic的含义,与上述两个概念中的 ‘主题’ 如出一辙。
在华为云IoTDA(IoT Device Access)中,Topic 是物联网通信中用于标识消息来源或目的地的字符串,类似于消息的“地址”或“标签”。这也不是华为独创的,主题/Topic 也是MQTT协议的核心概念之一,用于实现设备与平台、平台与应用之间的消息路由。
在这里插入图片描述
参考《HCIP-IoT Developer V2.5 培训教材》MQTT 协议栈技术原理相关章节,
在这里插入图片描述

主题的分类

前面我们说了,有3类Topic,系统Topic(即平台预设的Topic)、$oc开头自定义Topic、非$oc开头自定义Topic,其中前两种Topic都是以$oc开头。而且,我们在前文使用的Topic,即,
$oc/devices/{device_id}/sys/commands/#
这就是一个系统Topic,平台预置的topic列表可参考文档,Topic定义
在这里插入图片描述

设备端发布Topic测试

产品定义需要的Topic,也即以 $oc/devices/{device_id}/user/为前缀的主题。要注意的是,其Topic中包含user字样,系统Topic也是以$oc/devices/{device_id}开头的。这里,我们实验文档中使用的Topic是没有 user字样的,它们归属系统Topic,具体的系统Topic包含哪些,可以参考平台预置的topic列表可参考文档,Topic定义
在这里插入图片描述
上述用于上报产品定义中属性字段的Topic,其格式为 $oc/devices/{device_id}/sys/properties/report ,其中device_id要替换成自己的真实的设备ID,要注意的是这里的大括号一般不需要携带,但即使你带着它,平台也能识别。执行Pubish后,在应用模拟端查看结果,
在这里插入图片描述
设备详情界面,注意和调试界面区分。在这里插入图片描述
注意,前文提到的在线文档中的实验步骤,尤其是结果观察和命令下发,是基于如下设备详情界面的,而不是调试界面。我就在这小小的栽了下,写这篇笔记是在202503,帮助文档中提及的"云端下发"等字眼,我没有在调试界面下看到,我起初还以为是在线文档没有跟上实际系统的更新步伐,以为文档中的云端下发->命令下发操作,就是调试界面-应用模拟器-命令下发,直到遇到如下报错(已经正确开启了设备模拟器的订阅),我才回头。
在这里插入图片描述
实际上,结合前期基础知识的学习,认真思考,便可以想明白。文档中描述的云端下发,与调试器-应用模拟器-命令下发,是有本质区别的,从应用到云,之间至少还隔着一次叫做编解码插件的东西,这也是后边要继续实验的。

从云端下发指令(QA:MQTT.fx 订阅失败)

在这个环节上,我花费了好几个小时也没有实验成功。我已经知道如何从云端下发命令,也知道要在MQTT.fx仿真器上开启订阅。然而,在MQTT.fx仿真器中,我的Subscribe订阅操作怎么都不成功啦。一整个下午,零零散散试了好几次,到下班,也没有成功,现在是晚上十点,我在家里继续学习。

一段时间后,我总结出来的问题现象是:
MQTT.fx 可以成功订阅非$oc开头的自定义Topic,但是以$oc开头的自定义Topic无法订阅成功。
在这里插入图片描述
我将上述默认主题,更换为在线文档中描述的那样,

//{device_id} 替换为自己真实的设备ID
$oc/devices/{device_id}/sys/commands/#

不成功现象与下午操作结果一致,报错如下,Error subscribing to topic: de.jensd.mqttfx.entities.Topic@xxxx
在这里插入图片描述
这是为什么呢?以$oc开头的自定义Topic无法订阅成功。
我甚至开始怀疑是不是产品模型创建阶段存在了什么错误,为此,我返回到产品模型定义界面,仔细检查无误,头大。

我在华为论坛中看到一篇帖子,博主最后的结论似乎有点草鸡,而且这是将user主题的,我还没到那一步。我跳转到某热心网友给出的答案连接中,阅读到一句话:确保创建自定义Topic时,设备操作权限包含“订阅”功能,详细操作请参考自定义Topic。其中有提到,$oc开头自定义Topic通信使用说明。虽然这还是在讲user主题订阅,但我还是希望能从中受到启发,这至少让我知道了我该如何表述自己遇到的问题。

在IoTDA实例-产品-xx-Topic管理页面中,查看 " 关于MQTT消息使用",其中提到:

设备与平台建立连接后,需要订阅下行Topic(华为云平台中具有隐式订阅功能,若通信质量为Qos0,平台的系统topic无需订阅。),否则无法收到平台下发的指令或回复的响应。应用侧接口的调用,需要设备侧的配合,例如应用侧下发命令,设备侧需要先订阅“平台命令下发”的下行Topic,否则设备无法收到平台命令,应用下发命令的接口也会报超时。

我使用Deepseek-R1,分析全部上述订阅操作后的错误日志,
在这里插入图片描述
实在在烦的不行了,在社区和技术网站搜不到与我问题相似的帖子,这也可能说明,我的问题太过低级。我静下心来,先放放。使我遇到问题的这篇文档,MQTT.fx模拟智慧路灯与平台通信,其中的视频我还没有观看呢,看看呗,结果,发现问题所在了。原来,原来,
主题中应该填写的{device_id},不是MQTT参数中的Clientid,而应该是设备信息中的设备ID,
在这里插入图片描述
我原先一致以为它们是一样的。但有一点依然让人费解,我在MQTT.fx进行发布操作时,我使用的是MQTT参数中的Clientid,是能成功的,而且加上大花括弧都没有问题,在订阅操作这里来就不行啦!!!

修改订阅主题使用正确的device_id后,订阅成功,云端也能下发成功,效果如下图,
在这里插入图片描述

至此,我们第一个小实验算是磕磕绊绊的结束啦。

小结

本文涉及的实验过程,主要是基于在线文档 <设备接入 IoTDA/ 快速入门/ 设备快速接入—属性上报与命令接收>。通过其中的练习,使我们基本达到了《HCIP-IoT Developer V2.5 实验手册》物联网开发平台实验要求中的,物联网平台的功能定义、掌握物联网平台的调试这两项目标,只是基本哈,还不够彻底。

知识深化

1、Topic的含义和分类。
2、产品模型构建和注册。
3、设备与平台通信,Topic订阅和发布操作。
4、MQTT.fx 设备模拟器配置和基本使用方法。

QA:MQTT参数在变动

在 <QA用户和密码错误>章节,我们见到了ClientID、password会发生变化的问题。其中,ClientID其构造大约为:设备ID + 年-月-日-X?格式的日期。而且在后期的测试中我发现,只要ClientID、password是匹配的,任何一组都可以连接成功,即使你使用的是昨天的参数。
在这里插入图片描述
如上图所示,是我在不同时间段通过一键复制功能保存下来的MQTT参数,其中的客户端ID和密码是在随着时间动态更新的。我使用任何一组参数,都可以成功将MQTT.fx连接到IoTDA平台。
在物联网平台中,要求 ClientID 包含动态变化的字段(如日期或时间戳),通常是为了 增强安全性和防止会话冲突。
防止凭证泄露被复用:
若ClientID固定,攻击者截获ClientID和密码后,可长期伪装设备接入平台。动态ClientID(如设备ID+时间戳)使每次连接的凭证唯一,即使泄露也无法重复使用。
对抗重放攻击:
动态ClientID结合时间戳,可限制攻击窗口期(例如平台校验时间戳的有效性,超时即拒绝连接)。
避免会话冲突:
MQTT协议规定,同一ClientID同时只能有一个客户端连接。若设备意外断线后快速重连,固定ClientID可能导致 Broker 认为旧会话未清理而拒绝新连接。动态ClientID强制创建新会话,规避此问题。
无状态化设计:
动态ClientID使服务端无需维护持久会话(Clean Session=1),降低平台资源消耗。

之所以,我使用昨天的ClientID+password组合依然能进行连接平台。可能与鉴权类型有关,这里不再深究,具体参考设备连接鉴权

QA:认准 device_id/设备ID

从云端下发指令失败、MQTT.fx订阅$oc主题失败。现象和主要原因已经在前文描述。重新审视MQTT参数:
在这里插入图片描述
如上,MQTT参数中的UserName才是与设备ID(device_id)对应的那一个。华为云IoTDA的ClientID构造通常为 {deviceId}_{timestamp},例如 device123_1620000000。若你直接将ClientID填入Topic的 {deviceId} 位置。平台可能仅校验Topic格式合法性,而不会验证 device123_1620000000 是否为合法设备ID,导致发布成功。但是这种主题或认证方式可能是存在风险的,我现在理解不透,只能告诉自己不要那么使用。不然也不会在设备订阅主题实验时栽跟头。另外,还要多说一句,相对于文档,视频教学对于初学者可能有更好的指引效果。

关联文章

#<IoT/HCIP/实验指导笔记,物联网开发平台实验-Part2># 主要是对《HCIP-IoT Developer V2.5 实验手册》中实验过程的实践,主要去达成 “掌握物联网平台编解码插件的开发” 这个目标,并强化 “掌握物联网平台的功能定义”,“掌握物联网平台的调试” 这两个目标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值