Dissemination实验
一、实验目的
- 学习少量数据在传感网中可靠传递的方法
- 掌握 TinyOS 中 DisseminationValue、DisseminationUpdate 接口和组件的使用
- 理解 Dissemination 的机制
二、实验设备
- 装有 VMware Ubuntu 虚拟机的宿主 PC 机一台;
- 下载器一个;
- 物联网实验综合箱一套(两个以上节点)
三、实验要求
- 实现功能:网络中 root 节点和 node 节点通信并分发数据;
- 实验现象:node 节点接收网络 root 节点数据并分发数据。
四、实验原理
分发协议中的小数据分发是系统提供的一种服务,主要用于实现基于共享变量的网络一致性 (eventual consistency)。网络中的每一次节点都有该变量的一个备份(copy),这种小数据分发服务会通 知节点该变量值更改的时间,同时交换数据包以达到整个网络的一致性。在任意给定时刻,可能会存 在两个不同节点因为数据时间的不一致性而导致不同意交换数据包,但是随着时间的流逝,不同意交 换数据包的节点数会越来越少,以至于最终整个网络完全依赖于一个共享变量值。网络的高度一致性 能有效避免临时性的链接失效以及高丢包率等网络传输问题。
分发协议与泛洪协议(flooding protocol)不同,泛洪协议主要是离散性网络传输(节点与节点之间不 受某一变量值约束),它能够终止并且不再达成网络的一致性,小数据分发机制确保网络内部在有可 靠连接的情况下能够达到基于单个变量值的一致性。
分发协议会因为数据项(data item)大小的不同而不同。分发协议可分成两个部分:控制流部分 (control traffic)和数据流部分(data traffic)。其中数据流(data traffic)协议完全依赖于数据项的大小,而 控制流(control traffic)协议大致相同。例如,Deluge 协议是一种重编程协议,以二进制形式分发元数 据(metadata),当网络中的节点发现收到的 metadata 与自身的 metadata 不同时,他们就会意识到自 身原来的二进制信息已经失效了,需要一个新的二进制信息。而 Noverlty 协议在小数据分发一致性模 型上做了很周到的考虑:(an explicit consideration),该协议致力于让网络中的每一个节点都接纳分发 到网络中的变量值的最新版本。按照这种方式,节点可以通过告诉网络变量值被更新从而促进网络达 成一致。如果有好几个节点决定更新变量值,小数据分发协议就可以确保网络只需要一次更新便可以 确保达成一致。
网络的这种一致性并不意味着每一个节点都能够接收到变量值,这种一致性仅仅表示网络最终 会在哪个变量值最新这个问题上达成一致。如果有一个节点从网络中断开并且此后网络经过多次更 新才得到共享变量,则当该节点重新加入网络后,它所接收到的变量值只会是最后一个更新所得到的 变量值。
能够将小数据分发到整个网络中,这对于无线传感器网应用而言是重要的组成部分。它允许管理 员向网络中插入小段程序,命令以及配置字。
五、实验步骤
1、完成硬件连接;
2、、打开虚拟机,进入到 VScode 显示 opt/tinyos-2.x/apps/cc2530_app/net-dissmission 目录下创建项目 目录,并新建应用程序文件,包括配置文件 Makefile,配线组件 TestDisseminationAppC.nc 和模块组 件 TestDisseminationC.nc
3、修改Makefile文件一个root节点和两个node分别如下:
Root的address改为,group改为学号17,channel按要求计算得到0B:
Node1的address改为abcd:
Node2的address改为1234:
4、编译程序并烧录:
在终端输入make cc2530zn和make cc2530zn install:
5.通过利用串口通过root节点发送信息,观察节点现象:
- 串口输出和抓包
Node节点串口输出:
抓包:
六、思考、测试、回答
- Dissemination 协议是怎么回事?简要回答原理;
答:DisseminationValue接口使节点接受分发来的数据,DisseminationUpdate产生分发的数据。网络中的每一次节点都有该变量的一个备份(copy),这种小数据分发服务会通 知节点该变量值更改的时间,同时交换数据包以达到整个网络的一致性。在任意给定时刻,可能会存 在两个不同节点因为数据时间的不一致性而导致不同意交换数据包,但是随着时间的流逝,不同意交 换数据包的节点数会越来越少,以至于最终整个网络完全依赖于一个共享变量值。
- LED 什么情况下点亮和熄灭?
答:root发送一次数据led灯翻转,node接收一次数据led翻转。
- 尝试将自己的学号后四位的 16 进制值(例如 7233,则发送 0x48、0x21)传给 node,再串口传给 PC。
答:学号为7217,发送48 11
根据计算CRC码:F7 AF
实验结果:
- 将 msg_head.tab0 的值改为其他值(比如 52),再修改其他地方,让整个协议能够正常运行?
答:
改动如下:
if(byte == 0x52 && dlen == 0){
tab = 0;
buf[0] = 0x52;
}
- 尝试:root 下发命令控制 node 节点的 LED 闪烁次数(比如下发数据 0x03,node 节点闪烁 3 次后 熄灭)
答:这个我们只需要将3中填班级的数据改为闪烁次数即可,在在代码中利用循环延长闪烁时间:
七、实验总结
通过这次实验我了解了少量数据在传感网中可靠传递的方法 ,也学习掌握了TinyOS 中 DisseminationValue、DisseminationUpdate 接口和组件的使用,整体实验不算很难,但是需要仔细去思考去理解才能做好思考题。同时代码间缺少注释这导致代码看懂有点困难,还是请教其他同学才进一步弄懂了代码。