apache google 微软 java Android 程序员 wordpress Windows 编程 php shell nginx mysql linux Python 云计算 Ubuntu Firefox 开源 centos

从零开始搭建物联网系统

在一个平常的不能再平常的周末下午,几个小伙伴聚在了一起,一起畅想“万物互联”的物联网未来。小伙伴中有硬件开发者、嵌入式开发者、软件开发 者;有互联网公司的全栈工程师、也有传统核电厂的工控系统维护者、还有路由器厂商的wifi协议开发者。我们发现,世面上没有开源且可商用的物联网平台或 系统。这里的可商用,不是搭建几个demo把硬件连上网、app操作两下这么简单!

有以下几点都是必须着重考虑的:

  1. 必须 有完备的硬件、嵌入式、云端一体的协议及架构设计
  2. 能够 实现真正的硬件智能化,能够基于数据学习并自主工作
  3. 必须 有很高的性能、稳定性及扩展性
  4. 必须 能够适应成千上万种不同资源的硬件设备,从PC到手机、从计算资源及其有限的单片机到网络带宽及其有限的控制器
  5. 必须 能适应不同的网络场景,包括有线、wifi、3g/4g、gprs等
  6. 必须 有很可靠的安全性
  7. 需要 尽可能降低研发和生产成本

在媒体和科技工作者都抱着物联网是未来的观点并翘首观望时,我们决定做点什么,而不是当看客!这个平常的不能再平常的周末下午,也许对我们不太平凡。

我们决定启动全套可商用物联网系统的设计和研发,并且将在未来, 全部开源

从零开始搭建物联网系统

于是大家利用业余时间,开始了协议设计及系统设计,将项目慢慢启动了起来。几个月后,第一个商用版本的研发成功完成。这期间,好几个小伙伴辞去了 工作,全职进行研发。我们在没有融资、没有资源的情况下一路走到现在,其中辛酸就不多言了。谨以此文记录我们在系统设计和研发中的走过的路,以飨同样是物 联网爱好者的你。

整体设计

一个物联网系统涉及硬件、软件、云端、app各个环节,必须从整体进行顶层设计,只倚重某个单一的环节进行设计的系统都无法具有良好的适用性和扩 展性。我们在设计时为了避免这种情况,使系统能够适应最广泛的物联网场景(甚至包括工业场景),每次的架构设计讨论都是所有团队成员参与。大体的系统架构 如下:

从零开始搭建物联网系统

协议

在一个物联网系统中,协议是串通上下层的关键纽带。在物联网系统中,我们将协议分为两大层:通信层和业务层。

从零开始搭建物联网系统

  • 通信层 基本上是传统互联网的网络基础设施,负责将数据在物联网系统节点中的传输
  • 业务层 分为两层,底层是负责物联网场景下数据交换格式的规范,上层是物联网场景需要具体传输的业务数据规范。

通信层互联网基础架构(TCP/ip)目前已经非常成熟且通用,但是业务层协议目前还是种类繁多。可以确定的一点是,最终能在物联网应用中称霸的协议,一定也像互联网时代一样是 开放、免费 的。目前符合此特性并使用比较多的有XMPP、MQTT、COAP等。关于具体的对比,可以参考我之前的这篇文章。

我们最终选择基于mqtt来作为业务传输层主要协议。但是mqtt协议本身的设计是针对开放设备,对于可商用的物联网系统不得不考虑设备的安全性并具备完善的授权机制。所以我们在实现mqtt协议时进行了一些定制和限制。

在业务层的上层(business层),目前的物联网系统都是各自针对自己的业务场景设计协议规范。有没有可能根据物联网场景统一业务数据的规范 呢?我们认为是可行的,并且也是必要的。如果把通信协议比作声音,光有通信协议,任何人之间还是无法交流。只有统一语言,大家才能顺畅沟通。所以我们抽象 出物联网节点中传感和执行器的业务场景,并设计出含有物联网业务数据语义的业务层协议。目前已经将业务层协议开源,希望对广大爱好者和从业者带来一定参考 价值。

云端平台

互联网时代的用户上网终端主要是PC和手机等设备,可以想象,物联网时代,上网终端会呈多样化、海量化趋势。保守估计每人拥有数十套联网设备,数据规模必然也是几何倍增长。所以物联网云端平台注定是一个大规模的海量分布式系统。

目前很多爱好者或者厂商通过搭建简单的web系统(如PHP、nodejs、python实现的web接口)可以实现设备的联网,但是可以想象, 再真正的商用场景中,稳定性、性能、扩展性都必然遭受冲击,无法应对。我们在设计云端时采用microservice分布式架构,并使用docker降低 运维成本。大体的云端架构如下图

从零开始搭建物联网系统

对于海量物联网设备的场景,系统的可用性和扩展性将面临巨大的挑战。目前我们的系统基于go语言开发,已经发布到0.8.0版本,后续会在易于安装和运维上进行优化,并计划在1.0版本时开源发布。

嵌入式

物联网硬件的嵌入式软件除了传统部分,必须加入联网逻辑和传感、控制器的管理。为了提高开发效率、方便复用,我们设计并开发了轻量级的物联网嵌入 式开发框架,并对物联网业务进行了抽象,以方便移植到不同的硬件平台。我们希望做到的是,在不需要更改任何业务层代码的情况下,一个物联网嵌入式应用可以 在不同的硬件平台运行。

从零开始搭建物联网系统

当前很多大企业(华为、惠普、google)等都纷纷推出了物联网操作系统,后续物联网领域会出现多种操作系统共存的局面。不同的操作系统能运行 的最低系统资源以及具体应用场景都不尽相同,但我们相信,物联网的上层业务是通用的,这也是我们设计物联网嵌入式开发框架的原因。

安全

近些日子,各种厂商的物联网设备纷纷传出被黑的消息。从tcl到特斯拉,黑客都成功实现破解和随意操控。和互联网时代一样,安全在物联网目前的早期阶段注定是容易被忽略的问题。为此我们也再设计系统是也没有掉以轻心:

  1. 所有接入层通信都采用tls进行加密,包括对app、业务服务器的开放接口。
  2. 用户、设备关键信息进行加密保存
  3. 针对设备有完善的用户鉴权机制
  4. 等等

安全不是一朝一夕的事情,需要从系统开始构建时就考虑,并不断完善安全手段和规则。

开发板

为了降低物联网硬件的开发成本,我们基于esp8266设计了物联网开发板,并在开发板实现了我们的嵌入式开发框架及物联网协议。开发板相关的代码已经全部开源,并在淘宝进行 众筹从零开始搭建物联网系统 。

从零开始搭建物联网系统

为什么推出开发板?我们认为这是一种互相学习、交流及沉淀技术的工具,希望更多的爱好者能一起做出好产品。

以开源之名

光阴荏苒,白驹过隙。一路走来,我们执着地将所有设计慢慢付诸实现,为未来的物联网技术贡献自己的力量。物联网技术涉及的方向众多,我们的力量毕竟是有限的,这也是我们从一开始就以开源形式开发项目的原因。

Now,  we are calling for contributors!

如果你对物联网和开源技术有着和我们一样的执着和爱好,欢迎关注或加入我们的开源项目 。后续我们会逐渐开源发布所有的系统设计和项目。我们希望更多的小伙伴一起为项目做贡献,无论是提交issue,还是贡献代码。

延伸阅读

评论