文章目录
- 简介
- 分析
简介
分发协议主要用于维护网络共享配置的一致性,这里的共享配置可以是节点传感器采样的周期、节点LPL醒睡的周期或者节点运行程序的映像等。每个节点都会维护一份这样的配置,分发协议负责通知每个节点这些配置的改变,并通过数据包的交换保证最终的网络配置一致性。即使考虑到网络丢包和链路动态性的影响,网络的一致性也必须得到保障。因此分发协议需要保证网络在不出现孤岛的情况下会尽可能迅速的收敛一致。
根据分发数据的大小,分发十几Kbytes的程序映像与分发2bytes的常量参数,分发协议的设计有很大的区别。但是对于大数据分发和小数据分发,我们都可以将分发协议分为两部分:控制流和数据流。数据流很大程度上取决于分发数据大小,但是控制流对于不同数据大小则是相同的。程序影响分发协议Deluge会在控制流中附加当前影响的版本号信息,当节点发现分发的版本号信息与本地的程序版本号不同时,它会进入数据接收阶段去更新程序映像。
Drip和Deluge分发协议都使用了Trickle来维护网络的版本一致性。在Trickle的工作模式下,节点周期性的广播自己拥有的数据版本号。当收到一个更新的版本号时,节点就获知自己的数据已经过时,需要从拥有新数据的节点索取数据。通过这样的方式,网络的一致性得到了保证。为了避免过多的版本号声明消息拥塞网络,Trickle使用的是指数的后退周期。即当广播完版本号后,在一段时间没有收到更新请求,则下次广播的间隔时间调长一倍。
Drip分发协议是一种针对小数据量的数据分发协议,主要用于系统参数的配置和更新。对于每一个变量,Drip都维护了一个版本号。因此,Drip可以细粒度地控制变量的更新时间和频率。
- 结果现象
选择0号、1号、2号三个节点同时烧录EasyDissemination代码,烧录提示信息如下:
节点0 2会随着节点1同步亮灯,如果节点1撤走或烧录空程序 0 、2节点停止亮灯
分析
首先我们需要在应用程序中使用一个接口StdControl(在例程中被重命名为DisseminationControl)来控制Dissemination模块的工作,该接口连接到DisseminationC模块上。定义好DisseminatorC后,需要把应用程序中使用到的两个接口DisseminationValue和DisseminationUpdate连接到相应的DisseminatorC,
Dissemination提供了两个接口:DisseminationValue和DisseminationUpdate,分别如下图所示。
interface DisseminationValue< t> {
command const t* get();
command void set( const t* );
event void changed();
}
当节点收到一个更新的数据版本号时,会触发changed事件。在changed时间的处理中,会调用get()和set()命令来更新相应的数据。
interface DisseminationUpdate< t> {
command void change(t* ONE newVal);
}
当节点更新了一个数据时,change(t* ONE newVal)都会被调用,以触发一次新的Dissemination来把更新的数据发送到全网络。