APP下载

基于智能家居物联网产品的通信设计与实现

2023-03-24

日用电器 2023年2期
关键词:数组字节名称

王 臻 成 瀚 桂 林

(公牛集团股份有限公司 慈溪 315314)

引言

随着电子技术的发展,通信技术的进步,产品的定义发生了较大的变化,特别是与生活息息相关的生活电器。人们开始不满足于简单的手动操作,厌倦繁琐的控制,定制简便、界面友好的手机应用逐渐成为主流。与它的通信协议也由开始的私有协议逐步被通用性更好、安全性更高的物联网通信所替代。因此,在智能家居产品的开发中,物联网的接入成为我们避不开的思考。

例如电饭煲,随着需求的提升功能越来越多,最终布满产品甚至导致选择困扰,通过接入物联网平台将设置简洁化,并实现了一键定制;又例如空调,一般采用距离较近的红外控制,开启后需要较长时间等待,通过接入物联网平台实现了远程控制,并可根据习惯设置任务,省去了开启后等待的问题;再例如家里的灯具和窗帘,睡前需要一个个去关闭,通过接入物联网平台可以设置睡眠模式实现整体调整灯光亮度、关闭窗帘的一系列操作。可见接入物联网不仅能方便控制,还能提升生活的舒适感受,满足我们对电器使用的更高要求。

1 物联网产品的通信

物联网通信是一种通用的开发方式,它不同于私有协议,具有协议规范、内容可读性高的特点,这也是为什么接入物联网能实现互联互通的原因,而实现它得益于MQTT和JSON的应用。

1.1 MQTT协议

MQTT是一个轻巧、开放、简单、规范、易于实现的通用协议,是一种标准消息队列。有别于动辄几十上百条的私有协议,MQTT定义规范、分类明确,有效内容仅十四条,不仅使用方便,解读也很容易。而且基础通信仅需完成连接、订阅和发布消息三条即可,入手开发比较方便。

它使用发布、订阅的消息模式,特别适用于对代码封装要求严格、网络带宽非常昂贵的环境,正如我们需要接入的物联网环境以及机器之间的通信环境。消息具有一对多的分发特点,通信可以根据应用场景选择三种不同的通信质量,协议数据交互及传输消耗均较少确保了较少的流量消耗。

交互时我们比较关系的是通信质量,有最多一次、至少一次、仅一次三种方式。它们在应用中有着各自的特点和适用的场景:

最多一次,应用与对数据要求不高的情况,类似于UDP通信,是允许数据丢失的,例如非故障传感器返回的信息;

至少一次,应用于对数据要求较高的情况,类似于TCP通信,数据通信一定要达成,例如需要立即执行的故障传感器;

仅一次,应用于需要较准确的场景,避免因多次通信请求导致错误的发生,例如收费和校时功能。

1.1.1 连接CONNECT

通信的前置操作,就像是钥匙,开启后才能搭建设备与服务器的通信,由固定包头、可变包头、消息体三部分组成。

1.1.1.1 固定包头

固定包头含首字节和可变长度两部分。

首字节的高4位用于表示报文类型,bit4置1表示CONNECT,即CONNECT的首字节为0×10;可变长度表示后面所有数据的长度,可通过1~4字节表示,其中每字节的bit7有特殊意义,置1下个字节会继续表示数据长度,并将内容衔接到上一字节的bit7处,例如长度为128字节表示为0×80,但是因为bit7置1了,因此需要表示为0×80 0×01。

1.1.1.2 可变包头

可变包头含固定长度标识、MQTT标识、协议级别、链接标志、保活时间五部分。

固定长度:

固定的值,表示后面MQTT标识的长度,为0×00 0×04。

MQTT标识:

MQTT大写的ASCII码对应值,为0×4D 0×51 0×54 0×54。

协议级别:

协议的等级,此处遵循的是MQTT3.1.1版本,对应为等级4。

链接标志:

连接标记,由具有特定意义的位组合而成,组成方式如表1所示。Clean Session置1表示需清除Session;Will Flag置1表示需要在设备掉线后提醒订阅方掉线;QoS为0表示进行最多一次的服务质量通信,为1表示进行最少一次的服务质量通信,为2表示进行仅一次的服务质量通信;Will Retain置1表示新订阅者也能收到离线消息;Password置1表示消息体包含Password,UserName置1表示消息体包含User Name。此处链接标志我们假设消息体带有User Name和Password,且需要清除Session,那么链接标志即为0×C2。

表1 链接标志字节内容组成

保活时间:

最大不发送数据的时间间隔,单位为秒,用以服务器确认设备是否在线的时间当量,一般在1.5倍的该时间内收到客户端的报文即认为设备离线。此处我们假定需要的保活时间为100 s,则此位为0×00 0×64。

1.1.1.3 消息体

消息体的基础内容有clientId、安全模式、算法类型,还有做为补充的timestamp,然后是由链接标志确定的User Name和 Password。

消息体的每一项都分为长度和内容两部分,前两个字节表示当前消息体的字节长度,后面的字节即为消息体的实际内容。

clientId是用户设置的长度最大64字节的设备唯一码,假设此处为ALSJ-00000001;安全模式有TLS直连模式的2和TCP直连模式的3,此处我们选择TCP直连模式;算法类型可以选择hmacmd5和hmacsha1,这里我们选择hmacsha1;补充部分此处暂不做讨论。

根据上述设定及连接规则“clientId|securemode,sig nmethod|”,可以得到消息体的基础内容一为“ALSJ-00000001|securemode=3,signmethod=hmacsha1|”;

在链接标志置位User Name的情况下,假设此时clientId对 应 的Device Name为ALSJ-00000001,Product Key为a1SwMLEkaCz,根据上述设定及连接规则“DeviceName&ProductKey”,可以得到消息体的基础内容二为“ALSJ-00000001&a1SwMLEkaCz”;

在链接标志置位Password的情况下,又假设此 时Device Secret为fzcxQhVRSwCDk6Z0XH9AeCy qZ0sjGxtA,根据上述设定及连接内容“clientId$de viceName$productKey$”,可以得到消息体的源码内 容 为“clientIdALSJ-00000001deviceNameALSJ-00000001productKeya1SwMLEkaCz”, 再 使 用 Device Secret对此进行hmacsha1加密后即可得到消息体的基础内容三为“8a4b0b81a63016946c7f0ce19473f6de7546fe6d”;

通过组合基础内容一、二、三后进行消息推送,即可与云端Device Name为ALSJ-00000001、ClientID为ALSJ-00000001、Product Key为 a1SwMLEkaCz、Device Secret为fzcxQhVRSwCDk6Z0XH9AeCyqZ0sjGxtA的数字设备构成连接。

1.1.2 订阅SUBSCRIBE

订阅的数据结构与连接CONNECT相同,也由固定包头、可变包头、消息体三部分组成,为想要接收到的内容。

固定包头:

与连接有区别的是此处的首字节为0×82。

可变包头:

此处与连接有较大区别,仅有报文标识符。报文标识符为自己定义,服务器应答时会回复该值,用于确认回复与发送的关系,假定此处为0×00 0×0A。

消息体:

与订阅内容相关,保持长度加内容的方式。需要订阅的内容有属性、事件、服务等,几种内容的格式是完全相同的,仅Topic有差异。这里假定需要订阅的属性为/sys/a1SwMLEkaCz/ALSJ-00000001/thing/service/property/set,报文等级为0x00的等级1。

针对例子对内容进行组合即可完成属性的订阅操作,订阅后我们就可以收到属性的内容了,也可以进行发布消息来改变属性。

1.1.3 发布消息PUBLISH

发布消息的数据结构与连接CONNECT相同,不过数据内容与订阅更相近些。

固定包头:首字节为0×30。

可变包头:与订阅相同采用报文标识符的形式,值得注意的是具有可变包头的情况是QoS为1、2时才具备的,QoS为0时是没有可变包头字节的。假定此处QoS为0×

消息体:

为Topic与物模型内容组合的方式,这里涉及物模型的JSON格式推送详见下节。首先需要关联推送的Topic,它可以是属性、事件、服务中的一种,但格式完全相同。假定此时需要推送的方式为属性,属性Topic为“/sys/a1SwMLEkaCz/ALSJ-00000001/thing/event/property/post”,属性物模型PowerSwitch为关闭状态0,则推送的 JSON 内容为 {“method”:”thing.service.property.set”,”id”:”1061986371”,”params”:{“PowerSwitch”:0},”version”:”1.0.1_0001”},将Topic与JSON内容组合进行消息的推送即可实现关灯的操作。需要注意的是通信一问一答的方式需要通过id进行对应,params中的内容可直接读取,阅读非常方便。

1.2 JSON通信

JSON则是一种格式化的文本数据交换格式,有很好的可读性,同时其结构化的报文也非常方便设备解析。JSON数据对比私有协议的数据就像C语言相对于汇编,可更直观地解读,获取内容、排查问题。

JSON的语法结构是以JavaScript对象表示语法的子集。数据在名称/值对中成对出现,数据由逗号分隔,使用斜杆来转义字符,大括号保存对象,中括号保存数组,且数组可以包含多个对象。表示的内容有两种,分别是对象和数组,并根据使用的灵活性value是可以嵌套的。

JSON对象:

大括号内指定的内容称为对象,是由名称/值对组成的集合,每个名称/值对之间使用逗号分隔。一个对象以左括号开始右括号结束,每个名称后跟一个冒号并接上具体的值,值的类型有字符串、数值等。具体形式如图1所示。

图1 JSON对象的内容格式

例如 {“LedNumber”:1,“PowerSwitch”:0,“Description”:”LeftLight”},这个对象就表示了三个名称/值对,其名称分别为“LedNumber”、“PowerSwitch”、“Description”,定义值分别为数量1、状态0、名称LeftLight。

JSON数组:

中括号内指定的内容为数组,一般中间为多个对象,且多个对象格式相近,每个对象以逗号隔开。具体形式如图2所示。

图2 JSON数组的内容格式

例如

表征的是一个数组,里面有4个对象,分别对应LedNumber 号码为1、2、3、4的对象内容,并在每个对象内定义了PowerSwitch的状态及Description的字符描述。

JSON 值的嵌套:

是指名称/值对中的值进行了重定义,嵌套入了新的对象或是数组,用于定义更多的信息。具体形式如图3所示。

图3 名称/值对中值的类型展示

这里我们例举个嵌套例子便于理解。

例子是个对象,里面包含了两个名称/值对,其名称分别为“params”和“temp”,其中params也是一个对象,内部包含一个名称/值对,其名称为“state”,值由一个嵌套的数组替代,而数组又包含了4个对象,分别对应了号码为LedNumber1、2、3、4的PowerSwitch状态和Description字符描述。

可以看出,状态的给出是非常工整的,也易于查看,不需像私有协议一样频繁查看协议进行解读。使用中,我们只需要将名称/值对通过固定的方式进行组合、嵌套就可以很容易的与云端进行数据的交互了,其中交互信息里的名称/值对在平台上一般称为物模型,对其进行定义和替换即可完成内容的传递。

2 技术特点/优势

在产品的设计中,我们比较关心的是数据的交互,而数据的交互最关键的是属性、事件与服务,分别对应三种不同的数据交互方式。

属性的交互可通过对物模型的读写实现状态的获取或控制,但时效性一般,例如对灯具开关属性的获取或控制;事件的交互为产品发起,具有较高的时效性,一般为紧急状况的特别推送,例如灯具发生的过温故障;属性交互为服务端发起,具有较高的时效性,需要产品立即执行,例如灯具定时任务的下发。

根据产品的功能特性对属性、事件、服务进行合理定义,应用中设定好它们的实现逻辑,再结合产品本身的成熟方案,那么一个好的物联网产品也就呼之欲出了。

3 结语

从标准的MQTT协议、格式化的JSON通信,不难看出物联网极力想做的是统一,根本目的是互联互通,从而实现智能家居产品的联动,并最终构建智慧社区。

我们身边也不乏这种例子,例如小米的小爱同学,通过与它的交互,可以实现对接入的电视进行开启、关闭等操作,对接入的窗帘进行打开和关上的控制,对接入的空调进行温度的调控,以及对接入的灯具进行统一的管理等等。

因此掌握好这项技术,并将它应用到智能家居的产品中,给用户带来更便捷、更具新意、更有科技感的产品,势必具有深远的意义。

猜你喜欢

数组字节名称
JAVA稀疏矩阵算法
No.8 字节跳动将推出独立出口电商APP
JAVA玩转数学之二维数组排序
No.10 “字节跳动手机”要来了?
简谈MC7字节码
Excel数组公式在林业多条件求和中的应用
沪港通一周成交概况
沪港通一周成交概况
沪港通一周成交概况
沪港通一周成交概况