介绍
TinyOS是一款嵌入式操作系统,相信做无线传感器网络开发的同志们都不陌生。同类型的系统有不少,但是TinyOS的应用较之其他系统更为广泛。TinyOS 1.x版本和2.x版本是目前主要的两个分支。两个版本之间存在着一些无法兼容的特性,使得开发者的学习成本增大,在版本选择之间也陷入难以取舍的境地。
到底TinyOS 1.x和2.x的区别如何呢?这里根据我的初步理解稍微罗列一些:
(1)TinyOS 1.x较为容易上手,架构上更为简单明了。TinyOS 2.x在1.x的架构基础上做了一定的改进,功能上要强大不少,架构上也要复杂不少。
(2)TinyOS 1.x 中的一些组件(Component)在2.x中被删除或者被新的组件取代。要从TinyOS 1.x过渡到2.x,需要一定的经验和魄力。
(3)TInyOS 1.x 中的工具链采用Java编写,需要JDK支持。TinyOS 2.x中的工具链采用Python编写。
(4)TinyOS 1.x中有一个图形化模拟工具TinyViz,该工具采用Java 编写,能够对模拟结果进行可视化展示。TinyOS 2.x中去掉了这个工具,实验参数和控制流程需要开发者编写Python脚本进行控制。
(5)其他的一些命令发生了变化,这一部分在手册中有说明。
学习的窘境
学习TinyOS是一个痛苦的过程,不是说它有多难。毕竟再难的东西,要搞懂它也只不过是时间上的问题。TinyOS难学的根本在于资料少,太少了。国内有一个专门讨论TinyOS的论坛(www.tinyosstudy.com),这个论坛上分门别类还挺全的。但是,当点开一个个帖子的时候,很少有看到回答的人。即便有,也不怎么靠谱。
学习TinyOS的第一个方法,也是自然而然的想法,看官方文档。可是,官方文档也不是想象中的那样浅显易懂、雅俗共赏的。很多地方(一般都是关键点)一笔带过,也不管你是不是适用。国内有个叫潘浩的学者出了一本书《无线传感器网络操作系统tinyos》,讲的内容是以2.x为基础的。而且,大部分内容都是对官方文档的翻译,相关章节仅仅是浅尝则止,作用也不算大。找学习资料的第二个方法就是FQ(goagent)。国外有一些资料网站打不开,必须FQ了才能正常浏览。能找到的资料也很少,基本上都是一些PPT,Introduction之类的资料,权威的资料很少。
另一个靠谱的方法就是:加入到开发者的帮助邮件列表(TinyOS help mailing list)。这里面会有很多人提问,也有开发者积极参与回答。邮件列表存档(mailing list archive)是个不错的东西,可以作为搜索目标。最后也是最无奈的方法便是,找一些写过WSN相关论文的作者,向他们发邮件请教……这个方法还不错,毕竟都曾苦逼过,知道苦逼的感觉。
版本的选择
使用TinyOS要面对的第一个问题便是:到底该选择哪个版本?TinyOS 1.x的历史比较悠久了,很多依赖工具的版本比较老,要下载这些老版本的工具包不是一件简单的事情。目前TinyOS官方网站上维护的最新版本是TinyOS 2.1.2。尽管这两个版本或许会存在很多差异,但是二者有一个最大的共同点:安装起来非常麻烦!一个简单的建议是:初学者从1.x下手。相比于2.x,1.x更容易理解,在资料上面相对于2.x上面稍微多点。
安装TinyOS 1.x和2.x是一个浩大的工程。本人成功安装过这两个版本,具备一点小小的经验。这些经验会在后面提及。现在先介绍一下本人涉及到的研究目标:Deluge分发协议。
Deluge协议
Deluge是一个镜像分发协议。那么它应用在什么样的场景下呢?我们知道一般情况下,传感器网络由若干个传感器组成,各自运行着自己的任务程序(这里的任务程序指的就是镜像image),并相互通信。这个通信过程一般会分成两类:分发和汇聚。TinyOS中自带了一些分发和汇聚协议。如前所述,Deluge就是一个典型的数据分发协议。
在某一时刻,我们需要改变传感器的工作任务时,我们要给传感器烧录新的任务程序。这样的工作量在规模较小的传感器网络中还能从容处理。当面对由大量传感器组成的大规模传感器网络时,显然已经不可能手动去更新任务程序了。
Deluge协议在这种情况下诞生了。相比于其他的如CTP协议,Deluge的优势在于能够自动分发大数据量,并且具备较好的性能。Deluge协议运行之后,自动更新传感器网络中所有节点的镜像。传感器节点在更新后重启运行新的镜像,这就是所谓的“无线传感器网络重编程”过程。
协议版本
Deluge协议在TinyOS 1.x上面有两个版本:1.0和2.0。目前用的基本上都是2.0,在网上也可以找到一本编程手册:《Deluge 2.0 Manual》。这本手册里介绍了一些编程接口,使用方法。可以看到,里面很多命令都是Java编写的。
注意,值得一提的是:在1.x系列中是从TinyOS 1.1.14及以上的版本才自带Deluge协议的。如1.1.10中是不存在这个协议的。如果硬是将TestDeluge文件夹拷贝进1.1.14以下的系统中进行编译,是不可能通过的。这是个大坑:前面在装TinyOS 1.x的时候,选择了1.1.10这个版本,等装好了之后才发现没有Deluge这个协议。于是只好删掉系统重装。
在TinyOS 2.x中的Deluge协议,移植自TinyOS 1.x平台Deluge 2.0。为什么说是“移植”呢?前面说过,TinyOS 1.x和2.x的架构是有很大差异的。移植到2.x的平台后的Deluge命名为Deluge 2T。在安装好的 TinyOS 1.x之后,在apps目录下面可以找到TestDeluge这个文件夹。下面是一些Deluge协议相关的测试程序。
怎么学习
网上关于这个协议的资料很少,还有个更致命的干扰因素:有个torrent协议也叫Deluge!所以最好不要单独搜Deluge这个关键字,否则出来的页面都是和这个torrent协议相关的。文档不多,我们剩下来的选择只有两个:(1)放弃课题,转移方向(2)阅读Deluge源代码。万不得已的情况,我们肯定是不要轻易放弃。毕竟,被这么个东西就弄得转移研究方向实在让人无法释怀。Deluge协议是使用nesc编写的,这门奇葩的语言改编自C语言。因此,在某些语法方面和C语言具备一定的相似度。因此,要阅读源代码的话,首先得对nesc这门语言有所了解。
TinyOS本身自带的组件、程序结构、组织方式等,这些东西都是必不可少的基础知识。万里长征路,这或许仅仅只是第一步。后续的文章讲述TinyOS系统的安装及Deluge协议的仿真。