该项目是课余时间,按照自己认为的理想的IOT系统架构,实现的一套智能家居系统。目前部署在自己的卧室,实现用小度音箱对室内灯的控制。
在物联网产品接入层方面,对比过阿里云物联网、联通物联网、某消防iot公司、某电动车等公司的架构,但是发现很难达到自己认为理想的架构。发现这些架构设计中,要么是忽略解耦性,要么是忽略开发效率,要么单纯云端**设计整个iot。相比于前后端,在iot产品开发中需要考虑的问题要更加复杂。
iot开发中,最重要的一点是"高内聚,低耦合",而实现这一**的关键是解析器,解析器是要由嵌入式人员编写的,对上下行数据的一个解包和封包。
【问题】
iot产品开发中常见问题:w
- 缺乏上下行解析器层,导致开发中高度耦合,云端人员需要知道嵌入式人员上传的协议,日后协议的更新、bug的修复、判断逻辑的修改、分包合包逻辑等都需要两份人力去维护这个协议。
- 现在解析器实现方案中,多数是用脚本引擎实现,由一段简单的脚本语言实现,可是嵌入式人员技术栈是c/c++,而且这样导致解析器调试困难无法打印log,难以存储历史数据,开发中,自由度不高,常常需要云端参与支持等。而且嵌入式人员编写的时候不清楚上下文有哪些,不清楚能调用哪些库等。
- 通信协议选型方面,不考虑内存、flash占用,弱网通信,窄带通信,低功耗等问题,依然按照前后端**开发。如使用msgpack序列化压缩传输数据,在后端差别不大,但是在arm嵌入式平台上,空间占用较大,可能导致栈溢出。
- 云端人员不知道常见硬件潜在风险。如下行修改终端配置信息后,立刻重启导致保存flash失败
- 报警类信息由云端来做逻辑判断,导致不及时。
- 随着不断新增硬件产品,需要不断修改云端代码以适配。
- 软硬人员两地办公,沟通效率低
- ...
【解决思路】
在linux驱动开发中,有一种抽象的**是“分层,分离”,使得操作系统能做到支持多种硬件接入,而不需要重新编译系统,有着很好的解耦性。
- 分离使得硬件相关的和非硬件相关的代码分开独立修改和发布。
- 设备链表实现了设备的动态接入和拔出,设备之间通过name动态匹配。
- 分层使得操作系统提供了driver层,即统一接口层,如register、read、write。一款新设备的接入,只需要厂商自己提供device设备和驱动程序driver, 而不需要修改操作系统任何内容即可。
与操作系统类似,iot系统也需要动态支持丰富的硬件类型,同样不能因为硬件的修改导致iot系统重新编译。 这也体现了现在流行的微服务**,如独立发布、跨语言等。
设备指的就是终端产品,云端可以根据终端上传的设备类型去服务链表中找到对应的解析器。
grpc提供了通用函数:marshal 、unmarshal。而且grpc序列化和反序列化速度较快,支持c++等丰富语言,第三方包支持c语言。
解析器相当于windows下安装的驱动,完全由设备厂商编写。云端人员不关心与设备的通信协议,协议只有嵌入式人员自己维护,iot_gateway最终得到的就是一份明文的、完全解析完毕的数据包。解析器也可以根据实际不同类型设备使用量,来部署节点数量
其他选型参考
protobuf:终端通信中选用protobuf,相比去其他序列化协议如msgpack,更加灵活通用。尤其在终端上的表现protobuf更加节省内存和flash。可使用第三方c语言的nanopb插件来支持嵌入式更优性能。
协议方面共有两层protobuf,一层是和终端通信,一层是grpc协议
EMQ:mqtt协议,在高并发中支持较好,文档详细,功能丰富。
需要依赖环境包括EMQ,consul,cmake。测试环境是ubuntu64
iot_gateway是图中的iot_gateway.
编译:
make target=linux
运行:
./gateway
xiaodu_parser是go实现的解析器。
编译:
make target=linux
运行:
make run
xiaodu_parser_c是c语言实现的解析器,嵌入式人员更习惯c/c++。
编译:
./build.sh
运行:
./parser_c
iot产品种类复杂,有的是移动,有的是静止,有的是宽带,有的是窄带,有的要低功耗,有的要低延迟等。针对不同产品,需要考虑的问题也常常有较大的不同,iot_gateway还需要做更多兼容性。
- iot_gateway_v1工程只是网关的实现demo,应用层代码应该在网关层之上实现。
- 嵌入式应该把一些可以转移的逻辑放在解析器层实现,这样日后有bug容易修复,减少OTA升级设备。
- 安全方面,如果是第三方提供网关服务,应该考虑是双层加密。如lora方式
- iot产品有时会处于弱网通信,此时应考虑弱网优化,如udp在弱网下消耗更小。弱网应控制传输包的大小在1400字节以下。
- 针对不同网络类型不同对待。如wifi链路超时一般低于4G网。NAT网络下注意心跳周期不高于3分钟。
【参考】