文/王嘉宇
初识Contiki
Contiki是一个小型的开源物联网操作系统,从诞生起到现在已经有十余年的历史。十余年来,Contiki一直是物联网领域中极客、学者和各类公司的首选。它的开发者是是瑞典计算机科学研究所的网络内嵌系统小组的Adam Dunkels,此君还开发了各类用于受限设备的网络协议。不过近来为了推动Contiki的商业化,Dunkels辞去了教职,成立了Thingsquare,一家为Contiki设备提供基于云的后端服务的创业公司。公司的目的是让开发者的硬件设备更方便地与智能手机和网络相连,它管理服务器,并提供所有管理设备所必需的软件。
Contiki是什么?
Contiki是一款用于物联网的开源操作系统,其主要目标是将低功耗的设备连接入互联网,因此对于建立比较复杂的无线系统来说,Contiki是一个非常强大的工具。
对于普通物联网用户来讲,Contiki具有如下特征:
- 开源 - 对于所有的商业的或非商业的应用,Contiki的源代码是开放的,大家都可以获取其源代码。
- 标准网络协议 - Contiki支持了标准的IPv4和IPv6协议,同时也支持了上层的低功耗协议如:6lowpan, RPL, CoAP等。
- 快速开发 - Contiki平台的程序支持标准C语言开发,同时提供了Cooja模拟器以支持对于网络交互的模拟。另外Contiki还包括基于虚拟机的Ubuntu镜像,开发者下载之后甚至都不需要自己配置复杂的编译链工具即可直接使用虚拟机进行开发。
- 支持硬件 - Contiki支持TI的硬件比较多,这个很有意思。
- 开发团队 - Contiki的开发人员来自于很多业界精英企业如Atmel, Cisco, ETH, Redwire LLC, SAP, Thingsquare等。
- 社区支持 - 通过Contiki开发者社区提供支持服务。
Contiki源码级特征
Contiki
内存管理
- 代码位置 - contiki/core/lib/{memb,mmem}.[ch]。
- 代码功能 - 高效的内存管理系统如快内存管理memb,内存allocator模块mmem以及标准C语言内存allocator模块malloc。
全IP网络栈
- 代码位置 - contiki/core/net/。
- 代码功能 - 包含标准的UDP,TCP以及HTTP等IP网络协议栈,以及低功耗标准协议栈如6lowpan, RPL, 和CoAP等。这其中IPv6协议栈实现由Cisco贡献。
功耗预警
- 代码位置 - contiki/sys/energest.[ch]。
- 代码功能 - Contiki提供了功耗预估机制,可以协助开发者了解各部分功耗情况。
6lowpan, RPL, CoAP
- 代码位置 - contiki/core/net/rpl/、contiki/apps/erbium/。
- 代码功能 - 支持标准的低功耗IPv6协议栈以及用于资源受限设备的REST类型的应用层协议CoAP。
动态模块加载
- 代码位置 - contiki/core/loader/。
- 代码功能 - Contiki可在运行时加载链接模块,这样的好处是当程序部署之后,可以通过提供ELF模块来改变程序的行为。
Cooja
- 代码位置 - contiki/tools/cooja/。
- 代码功能 - 提供网络运行模拟器,可以在烧制上板之前,模拟网络运行情况。
休眠路由
- 代码位置 - contiki/core/net/mac/
- 代码功能 - 提供消息中继服务的设备可以进入休眠状态,以实现低功耗。
开放架构
- 代码位置 - contiki/platform/、 contiki/cpu/。
- 代码功能 - 适配不同架构的开发板。
协程库
- 代码位置 - contiki/core/sys/pt.h。
- 代码功能 - C语言实现的协程库,提供事件驱动与多线程编程机制的混合体。使用该协程库,事件处理器可以被挂起直到事件发生。
Coffee 闪存文件系统
- 代码位置 - contiki/core/cfs/cfs-coffee.[ch]
- 代码功能 - 显而易见,Contiki提供了一个轻量级的文件系统,该文件系统适用于开发板上外设的闪存芯片。
Contiki Shell
- 代码位置 - contiki/apps/shell/。
- 代码功能 - 类似Linux操作系统的shell,可以使用基本的命令。
回归测试
- 代码位置 - contiki/regression-tests/。
- 代码功能 - 集成每日测试,可以通过Cooja模拟器来实现测试目的。
Rime无线协议栈
- 代码位置 - contiki/core/net/rime/。
- 代码功能 - 该协议栈支持广播简单消息。
构建系统
- 代码位置 - contiki/Makefile.include
- 代码功能 - 使编译系统更加方便。
Contiki操作系统的优势
作为十多年前即发布并且开源的实时操作系统来讲,Contiki可以称作现在已经发布或即将发布的物联网操作系统的鼻祖。其标志性的6lowpan实现已被大多数的物联网操作系统所采用,Contiki本身也被很多物联网领域的极客和公司作为自己产品的操作系统。作为物联网操作系统的先行者,Contiki已经积聚了大量的人气。我个人分析其优势有如下几点:
- 极低的系统消耗 - 对于系统额内存要求可以低至KB级别,与Zephyr,Huawei LiteOS和谷歌刚公布的Fuchsia都属于同一级别。
- 完善的开发及模拟环境 - Contiki在提供了配置编译环境文档的同时,还提供了一套开箱即用的环境:配置好所有编译工具链和模拟器的虚拟机。用户只需下载该虚拟机镜像,在虚拟机软件中使用该虚拟机系统即可进行基于Contiki系统的开发和模拟运行等工作。
- 完善的网络协议栈支持 - Contiki操作系统的主创人员即是6lowpan的开发者,因此在该层次的网络协议栈的支持是毋庸置疑的。
Contiki操作系统的劣势
必须得承认,即使Contiki已经发展了这么多年,即使Contiki被称作是物联网操作系统的先驱,其开发者体验依旧做的不够好。我个人理解其劣势如下:
- 官方网站虽然清新,但是其内容分类并不清晰,很多内容杂糅其中,开发者不得不费很大力气去寻找某些内容。
- 开发文档不齐备,我在其开发者网站上找了很久,才在某个不起眼的角落找到了通往开发指南的链接。同时开发指南并没有以网页的形式提供,而是提供了pdf格式的文件下载。
- 基于代码的文档更新不及时,当前代码已经是3.0版本了,其文档依旧是2.6版本。
- demo有些凌乱,对于初学者不友好。
总结
分析了Contiki这么多,其实我们应该从其背景来看待以上罗列的优势与劣势。作为学院派物联网操作系统的代表,我们必须承认Contiki从技术上是优秀的,这也是学院派通常的优势。但是Contiki的开发者体验确实比较糟糕,开发指南的缺失,demo的不友好都可以说明这些。当然,我们并不是说Contiki的开发者体验就一无是处,我个人感觉Contiki有一点非常值得学习,对于我们自己构建良好的Huawei LiteOS开发者体验也极具借鉴意义。这一点就是,对外部开发者提供开箱即用的开发环境。具体的做法就是提供已经配置好编译工具链的虚拟机镜像供开发者下载,这样就免去了开发者配置开发环境的繁琐步骤。
下回预告
从物联网江湖系列文章开篇到现在,已经过去了三个月零五天,写到这里离该系列文章结尾也已不远了。物联网江湖系列文章最初预计也就规划了六到七篇的样子,现在看来基本上完成了计划。加上本篇,总共包括五回正传和一篇番外,目前总计六篇。下一回,也就轮到Huawei LiteOS出场了,敬请期待。O(∩_∩)O
(更多华为资讯请关注华为开发者社区,华为自己的对外开放门户:http://developer.huawei.com/cn/ict/ ,不要问我叫啥,别人都叫我雷锋)