以前使用过阿里云和华为云,对MQTT上云有一些经验。对很多没有使用过MQTT的同学,有可能会被几个知识点给卡住。
设备上云的数据流转形式
首先我们来看一下MQTT在上云时扮演的角色。请看下图:
从图片上不难看出,MQTT扮演的角色是设备和物联网平台之间的信息交互。也就说,MQTT只负责与物联网平台交换信息,并不负责对应的数据处理和指令执行。
举个例子,智能RGB灯的案例中,设备的状态是通过上报数据操作,将数据发送到物联网平台来完成的。物联网平台在接到上报的数据后,再根据配置流转到业务服务器上(大部分不需要存储数据记录的应用就没有这一步)。物联网平台上保存的内容只有最后一次的数据(也就是设备影子),这对不少智能家居应用来说已经足够。然后App如果要控制设备,也是通过物联网平台,物联网平台接到调用后,向设备下行指令,设备接到指令后执行操作并更新设备数据上报给物联网平台。大致的流程就是这样。
设备上云的第一个拦路虎:鉴权
设备鉴权,说白了就是物联网平台根据什么内容,识别到这个设备是什么设备,是否合法,同时设备是否有足够的权限进行对应的操作。我们看一下官方给的python脚本。
代码语言:javascript复制product_id = input("product id:")
dev_name = input("device name:")
passwd = input("password:")
sub = input("subscribe topic:[default:control]")
if sub == "":
sub = "control"
pub = input("publish topic:[default:event]")
if pub == "":
pub = "event"
client_id = product_id dev_name
# expire time: 2^32 - 1 = 4294967295
username = client_id ";21010406;12365;{}".format(4294967295)
def hmacsha1(content, passwd):
passwd_byte = base64.b64decode(passwd)
return hmac.new(passwd_byte, content, digestmod=hashlib.sha1).hexdigest()
username = username.encode("utf-8")
passwd = passwd.encode("utf-8")
sign = hmacsha1(username, passwd)
从上面的脚本可以看出,设备鉴权主要是用到client_id 、username 、passwd 这三个属性。
其中client_id 是物联网平台创建设备时直接产生的product_id和dev_name字符串连接,而后面两个是需要计算得出的。例如username就是由product_id加上;21010406;12365;然后加上超时时间的字符串组成。而passwd的计算就更复杂一些,需要先将设备秘钥进行base64编码,然后再用hmac.sha1加密方式对编码后的秘钥,以及前面得出的username进行加密后得到加密的秘钥,最后加上;hmacsha1字符串形成最终的passwd。
然后物联网服务器根据对应的client_id 、username 、passwd 这三个属性,来查找设备,并判断是否已过期超时(过期秘钥不允许操作)。
一般情况下MQTT连接失败,就是设备鉴权有问题。这时候需要检查三元组是否正确配置,以及秘钥时间是否超时。
腾讯连连H5开发
跟着官方文档做,很容易就能实现mqtt的数据上报,以及手机app端的数据显示。对于像少了DIY界面的客户来说,腾讯还提供了iot-panlel组件给大家使用,很容易实现以下的效果。
布尔模型开关,以及开关的DIY属性控制内容。
面板组件
滑动条组件。
可以看到官方其实在物联网的小程序开发上,提供了非常多的便利组件。使用标准组件可以实现常规的智能开关,智能家居设备,以及实现一些场景化功能。但是如果想制作PCB加热台,缺少了一个监控数据的组件(需要实现加热台的升温曲线记录功能),如下图的示例。
梳理了一下内容,我突然想到,官方没提供这样的组件是很正常的。因为物联网平台本身并不提供数据服务,数据存储需要物联网平台转发到应用服务器上,再由应用服务器存储相关数据。物联网平台只提供一个简单的设备影子功能,仅保存最新的设备属性数据。也就是说,在本次案例中,物联网平台仅保存最新的温度信息,如果要实现升温曲线,就必须做好应用服务器,并转发对应数据和存储,然后由app直接访问应用服务器获取曲线。