窄带物联网可以应用于燃气表、电子牌、交通灯等各类项目,这些窄带物联网项目的传输方式都是相同的,因此这些项目中的网络通信层也应当是通用的。HCICom 类就是按照这种思想设计的。它被抽象出来,与各类项目的繁琐细节脱离,只留下与数据传输相关的内容,具有项目间易复用、易移植的特点。
HCICom 类对外的接口与传输方式无关。对于侦听程序乃至于人机交互系统的开发者而言,HCICom 类的存在使得开发者不再需要与信息邮局打交道,而只需要学会 HCICom类的使用方法就可以完成数据的上行与下行传输。当把项目更改为非窄带物联网项目,即更改传输方式时,只需要编写一个与现有HCICom类对外接口一致的类替换它,便可以在上层的程序中屏蔽掉这种更改,使上层程序具有跨传输方式通用的特点。
HCICom 类是人机交互系统(HCI)和信息邮局(MPO)间的一个通信接口类,是人机交互系统(HCI)对外沟通的桥梁。HCICom类与底层UECom构件配合,实现了终端(UE)的数据与上层HCI之间的数据交互。设计HCICom类时,应当综合考虑其易用性、可移植性和可复用性,屏蔽通信协议(如 TCP、UDP、HTTP 等)的差异,对外提供最简单、最直接的接口参数。
HCICom类应用于人机交互系统(HCI)的相关应用程序,主要应用包括用户服务器侦听程序 US-Monitor、云服务器端的侦听程序 CS-Monitor 以及客户端程序 CS-Client。作为通信接口类,其主要功能是建立连接、完成数据的发送和接收。
HCICom 类的设计主要围绕 使用方便性、数据完整性、安全性、交互性、多通道 五个方面。
1.使用方便性
HCICom类可工作在服务器端的侦听程序和客户端程序。在服务器端时的主要工作为:侦听来自客户端的连接请求;为每一个连接请求开启一个新的数据通道;对每一个数据通道的数据进行接收、解析以及相关数据发送等操作。在客户端时的主要工作为:向服务器端(IP地址和端口已知)发起连接请求;成功建立连接之后,在建立的数据通道上进行数据的发送、解析以及接收等操作。
因此,设计时要考虑这两个工作场景、为屏蔽两者之间差异、封装中间的过程、对外提供连接的目标地址和接收到的数据帧数两个属性,以及初始化、接收与发送数据的方法。
2.数据完整性
与UECom构件相对应,在人机交互系统的HCICom类中同样使用了帧结构,对数据进行自封自解,与用户编程无关。同时为了配合 UECom 构件,保证数据传输的正确性和完整性,在该类中同样采用了CRC16检验。
3.安全性
在安全性方面,HCICom 类与 UECom 构件相配合,形成了应用层的“自我加密、自我解密”:上行时,UECom 构件将传入的用户数据加密,HCICom类在收到密文并解密后交给应用层;下行时则相反,通过构件层及应用层两层加密机制,再加上信息邮局(MPO)的加密,进一步增强了数据传输的安全性。
4.交互性
由于不知道连接请求或数据什么时候会从外部传输过来,若循环等待,将导致大量时间的浪费,会大大降低程序的交互性,因此需要采用异步通信方式。
异步接收:开启异步接收之后,当接收到指定字节的数据后,接收回调操作(ReceiveCallBack)将被执行。在接收回调操作中,将结束本次接收,解析接收到的数据,并将解析得到的数据帧和IMSI放到数据缓冲区,更新或添加通信列表,然后继续开始异步接收。
异步监(侦)听:服务器端开启侦听之后,当接收到连接请求时,侦听回调操作(AcceptCallBack)将被执行。侦听回调操作将会结束本次侦听,并在获得客户端的连接,然后开启对新客户端连接的异步接收,并且重新开始侦听。
5.多通道
在NB-IoT系统中,国际移动用户识别码(IMSI)是区别终端(UE)的唯一标识,其总长度不超过15 位。使用者只需知道设备的IMSI,就可以将数据发送到对应的设备上。而多个客户端监听同一个终端(UE)时,会出现一个IMSI与多个数据通道相对应的情况,因此采用了一个IMSI与Socket相对应的结构体,结构体中包含1个IMSI和一个Socket的列表。当有侦听同一个IMSI的客户端加入时,相应结构体中的Socket列表便会更新,并在发送数据时,会根据IMSI把数据发给所有对应的Socket接口。
通过4.4.1节对HCICom类设计要点的分析可知,HCICom类可提供一定的对外属性、方法和事件,利用这些方法可以实现PC的数据接收与发送。
1.HCICom类的对外属性
在面向对象的编程中,属性用于提供对对象或类的特性的访问权限。在HCICom类中,对外属性有两个:HCIComTarget(连接方式和连接目标地址)和recvCount(接收到的数据帧数,只读属性)。对于不同的连接方式,HCIComTarget 对应的字符串不一致,如果用于侦听本地端口,则对应的字符串为“local:端口号”;若用于侦听服务器端口,则对应的字符串为“ip地址:端口号”。
2.HCICom类的对外方法
在面向对象的编程中,方法是指可以由对象或类执行的计算或操作的成员。HCICom类的对外方法有三个:init(HCICom类的初始化)、Read(读取缓冲区的一帧数据)、Send (发送数据)。借助这些方法可以建立通信连接、读取数据和发送数据。
3.HCICom类的对外事件
事件是使对象或类能够提供通知的成员。HCICom 类设置了一个对外事件,即DataReceivedEvent(数据接收事件)。类通过提供事件声明来定义事件,类似于字段声明,但类增加了 event 关键字和一组可选的事件访问器,并且此声明的类型必须先定义为委托类型。此处定义的事件用于接收数据,使用时与具体方法绑定,即可在触发事件时执行对应的函数方法。
1.HCICom类的基本使用步骤
云服务器侦听程序、云服务器转发程序与用户服务器侦听程序的对外通信都需要依赖HCICom类的方法。下面介绍HCICom类的基本使用步骤。
(1)初始化HCICom类。载入属性值,设置侦听的IP地址和端口,并根据传入的IMSI建立通信连接。
(2)读出缓冲区数据。在数据接收事件中,读出缓冲区中的一帧数据,并通过传入参数传出。
(3)发送数据。根据侦听方式,将组帧好的数据,发送给用户服务器侦听程序、终端设备或客户端。
2.HCICom类的基本使用步骤样例
下面给出HCICom类的一个使用样例,此样例用于实现基于HCICom类的发送与接收过程。
(1)初始化HCICom类的对象。创建一个HCICom类的对象,设置目标地址及端口,并初始化该对象。
(2)读取缓冲区数据。调用注册接收处理函数 IoT_recv,在该事件处理函数中可读出接收到的数据。
(3)发送数据。若本样例的侦听方式为本地侦听方式,则表示云服务器转发程序或云服务器侦听程序在调用该方法,程序需要查找所有侦听该IMSI对应设备的用户服务器侦听程序或终端设备,并向它们发送数据帧。
3.HCICom类的基本使用例程代码
基于上述HCICom类的对外属性方法和事件,下面给出HCICom类的一个使用样例。此样例可对目标地址进行侦听,实现对数据的接收和原样返回。