物联网一方面可以提高经济效益,大大节约成本;另一方面可以为全球经济的复苏提供技术动力。美国、欧盟等都在投入巨资深入研究探索物联网。
前段时间梳理了command设计及框架,其实狭义上即设备控制、管理,即可以家庭局域网内进行管理,也可以远程管理(通过开源的sip server: opensips),当然也包含了设备联动规则的原型实现(即物联网的ITTT).
command包含两部分:即client和server(eg. 手机上的client app,gateway上的server)
流程如下图所示:
client主要功能:
sever主要功能:
目前command的实现是基于sip来实现的,对sip的方法进行扩展,即增加一个定制的方法sip-command,并在其基础上实现
设备控制层,command在pjsip开源库基础上实现,而远程管理借助开源的opensips服务器,达到快速原型目的; 另外一个原因是项目中流媒体传输播放需求是基于sip/rtp来实现,统一在sip下,减少学习投入成本,尽快出原型。
下图是一个command框架图,底层是sip层,在pjsip基础上增加了command方法;cmd_mng定义了两个主要接口(cmd_send_inf, cmd_recv_inf)来和sip层进行通信, 考虑将来方便替换或兼容不同的协议,达到模块间松耦合。cmd_mng上层分别是dev_mng和iot_cmd_proc两个模块,dev_mng包含了
command server端的管理、加载设备插件,即设备的function功能和设备元数据文件解析导入(通过定义plugin_interface接口,提供给第三方开发为gateway接入新设备类型),以及供client查询设备元信息的内部接口。iot_cmd_proc模块则包含了client, server的收发command消息的处理框架,和提供给第三方开发client端的接口(即开头讲到的client API设计)。
1. 下面介绍server端的供第三方接入新设备类型开发的接口定义(第三方实现,并以动态库的方式提供给gateway command-svr)
plugin_interface接口:
typedef struct dev_func { const char * funcname; int (* dev_method)(cmd_arg * param_list[], uint8_t plist_size); }dev_func; typedef struct dev_plugin { char dev_pluginname[NAME_MAXSIZE]; //设备类型名称,具有唯一性 const dev_func * pt_func_array; //函数列表,设备实际执行函数,供command-svr回调。 char dev_metafile[NAME_MAXSIZE]; //设备元数据文件 }dev_plugin; typedef int (* init_devplugin)(dev_plugin * pt_plugin, dev_cmd_interface * pt_inf);
command-svr通过init_devplugin函数,会读取到该设备插件的上面信息, gateway便知晓该设备类型具有的属性和功能。
(后续还需要有设备插件的热更新,删除,运行时加载等功能)
2. 下面介绍iot_cmd_proc模块,它是command的逻辑处理核心
以client端为例,
采用内存消息队列形式(使用mini_mq)来解耦业务层(cli_proxy),command层(cmdhandler_proc),承载msg的协议层(sip_proxy)原型开发完后,总结了下开发,使用时碰到的各种问题:
1. command的设备控制设计,是以设备的动作为目标,如下test设备类型的元数据定义
如果加入设备propery属性,可以很好的契合下个阶段command的协议采用http的restful风格,以设备资源属性为目标,简单通过
set, get来实现对设备的操作(当然正如不是所有的web服务都能完美的采用restful, 设备控制操作可以采用属性,动作均定义的方式)。
2. 正如上面描述到的,我考虑command的协议采用http,在gateway使用web服务方式,client端就采用hybrid方式,即避免command
的client, server更新问题,又使用原生来避免web的不足,目前已经在调研中。
3. 设计一个的iot_cloud原型,暂定功能主要为方便用户远程管理设备,以及存储用户设备数据,及简单的数据分析。
我对物联网的看法就是,物联网现在的前景还很大,物联网的应用在与移动互联相结合后,发挥了巨大的作用。