[讨论] 这几天学习SimpliciTI协议栈的小总结合小纠结

qiwan   2014-3-31 22:39 楼主
SimpliciTI简介:
SimpliciTI是TI开发的专门针对其CCxxxx系列无线通信芯片的网络协议。
它支持两种网络拓扑结构:严格的点对点通信和基于星型的网络拓扑结构,在星型连接中Hub点在SimplciTI被称为Access Point,简称AP.(AP就是常说的网关,数据中心、路由、集线器的意思)
AP负责网络的构建和维护,它具备存储转发机制,因此可以对长期工作在休眠模式的低功耗设备提供较好的支持。同时,SimpliciTI还支持泛洪方式进行广播数据传输,这种数据通讯方式在各种报警器网络中使用尤为广泛,同时也显得非常必要。
SimpliciTI将其网络功能封装为几个API(application programming interface)函数,应用程序可以直接调用其API来实现点对点通信。
SimpliciTI对硬件资源要求非常低,除了程序空间所需要的flash和运行时随机变量所占用的RAM外,SimpliciTI不需要任何其他资源,它甚至不需要定时器,内部需要的定时器都是用软件模拟实现的。它在运行过程中不会进行动态分配,因此不会占用程序的堆空间(一开始我以为是前辈写错了,然后百度了一下,原来“堆”和“栈”是不一样的,C/C++编译时,“堆”是程序员自己分配的,速度比较慢,容易产生碎片,不过用起来方便。而“栈”是系统自动分配的,速度快,但程序员无法控制)。如果MCU资源富裕,我们可以配给SimpliciTI一个定时器以提供更好的服务。
总的来说,SimpliciTI的特色是:
低功耗通讯支持,存储转发机制,支持睡眠设备;
低成本,最大使用8k Byte flash以及1k Byte RAM;
网络结构灵活,支持点对点和星型两种网络拓扑结构;
使用方便,协议仅仅通过8个API接口和应用程序进行交互。
设备类型
SimpliciTI协议中规定了三种设备类型:
AP(Access Point):同一个网络中AP可以和终端设备共存,组成一个网络,挂
接多个传感器设备或者控制设备。同一个网络中也允许有2个AP。在特殊模式
,它可以接收所有能够接收到的数据,包括通过范围扩展得到的数据(该段
来源于无线龙公司《CC1110/CC2510无线单片机和无线自组织网络入门与实战》
)。
但在SimpliciTI-IAR-1.2.0的SimpliciTI Developers Notes中关于AP的描述
中有这么一句“only one Access Point per network is permitted”。
我在想,是不是因为SimpliciTI-IAR-1.2.0是最新版本而无线龙所使用的
SimpliciTI协议栈是旧版本???

在无线传感器网络中,一般我们需要确保AP电力,一般不采用干电池,不考虑
AP功耗。
ED(End Device):终端设备ED可以是传感器节点,也可以是控制节点,考虑
低功耗,一般用干电池供电。
RE(Range Extender):范围扩展器。有目的地对网络覆盖范围进行扩展,这是
一个常开设备。它主要的功能是重复发送来自发送设备的数据,有目的地让发
送设备的影响范围扩展。在一个网络中要使网络稳定,应将范围扩展器限制
在4个以内。范围扩展器运行在混杂模式,可以收到它能收到的所有数据。

SimpliciTI协议栈的结构:
协议栈主要包括三层:
HAL(Hardware Abstrtion Layer硬件抽象层)、NWK(Network网络层)和APP
(application应用层)。
应用层又分为:网络应用层(nwk application)和用户程序应用层(peer application)。
SimpliciTI没有物理层(PHY)和数据链路层(MAC/LLC),数据直接从射频层接收过来,射频层的作用就是直接将数据接收到。
协议内提供了一个射频层与网络层连接的应用板支持程序包BSP(Board support Package),BSP提供射频层与网络层通信的SPI接口。BSP并不是传统意义上的硬件网络逻辑层,它仅仅是射频层与网络层之间通信的服务支持。
BSP方便地提供了LEDS、KEYS以及GPIO引脚的定义,但是其他相关的定义并没有提供,比如:串口、LCD、定时器等。

回复评论 (6)

编程学习:
打开SimpliciTI-IAR-1.2.0中的Simple_Peer_to_Peer-CC1110-Linkto,
如图所示
仔细观察左边窗口,我们可以更好地理解SimpliciTI协议栈结构,
bsp、mfri、nwk、nwk.application,而我们的主程序就在用户程序应用层
peer.application中。
其中在bsp>bsp.c>bsp.macros.h中,出现了
#definest(x)  do {x} while{__LINK__==-1},上面的英文解释我没有看懂,
于是就按前辈说的,此语句功能和do{}while(0);去百度了。
有两个例子来说明:
第一:
假设有这么一个宏定义:
# define FOO(x)  print(“arg is %s/n”,x);do_something_useful(x)
现在使用这个宏:
If(blah==2)
       F00(blah);
看起来好像挺正确的,但是,当我们把这个宏展开的时候,就是这样了:
If(blah==2)
  print(“arg is %s/n”,blah);// 分号,表示if语句结束了
  do_something_useful(blah);
这时,if语句中只有print(“arg is %s/n”,blah),而do_something_useful
(blah)并没有包含在if语句中,而是当执行完if语句之后,接下来就是顺序执
行do_something_useful(blah);也就是说,并没有达到我们想要的效果。
但是,如果我们这样
If(blah==2)
do{
        print(“arg is %s/n”,blah);
        do_something_useful(blah);
}while(0);就可以了
第二:
假设有这样一个宏定义;
#defineexch(x,y)  {int temp; temp=x;x=y;y=temp;}
现在使用这个宏:
if (x>y)
      exch(x,y);
else  do_something();
看起来也好像是正确的,现在我们来展开:
if(x>y)
     {
        int temp;
        temp=x;
        x=y;
        y=temp;
};//这里出问题了
else do_something();
我们知道,在if和else后面可以只含一个内嵌的操作语句,也可以有多个操作语句,此时用花括号{}将这几个语句括起来成为一个复合语句。注意,花括号{}外面不需要加分号。因为{}内是一个完整复合语句,不需要另外附加分号。
这几天就是学了这么些了,很惭愧,进度很慢。明天从直接进入main函数吧,


  • 无标题.jpg
点赞  2014-3-31 22:45
引用: qiwan 发表于 2014-3-31 22:45
编程学习:打开SimpliciTI-IAR-1.2.0中的Simple_Peer_to_Peer-CC1110-Linkto,如图所示仔细观察左边窗口,我 ...

谢谢分享,总结的很不错,期待后续内容
点赞  2014-3-31 23:51
这个协议栈确实比较小,但是几个扩展api..比如解开链接什么的函数。
不知道是我用的不对还是怎么回事,测试时有点问题。
至少是资料这方面也没写清楚。

另外就是这个协议栈,过度使用条件编译什么的,导致很难维护,但bug却挺多。
还有功能不跟完善,比如15个通道,切换通道的函数却只支持4个,还是随意选的,做的很不让人放心,总之就是问题很多。不像话,太丢ti颜面了更像一个实验性质demo的小东西
强者为尊,弱者,死无葬身之地
点赞  2014-12-26 20:16

你好,我是一名刚刚出来工作的大学生,最近在做这个simpliciti无线组网的协议,看了你谢谢的几篇文章都得到很多收获,但是还是有一些问题还没有解决,可以加一下你的QQ问你吗?
点赞  2015-5-30 16:33
引用: 阳阳熊猫 发表于 2015-5-30 16:33
你好,我是一名刚刚出来工作的大学生,最近在做这个simpliciti无线组网的协议,看了你谢谢的几篇文章都得 ...

我最近也在做,交流交流?
点赞  2015-8-7 14:51
请问您有无线龙公司的《CC1110/CC2510无线单片机和无线自组织网络入门与实战》这本书吗?或者电子版?现在网上都没有找得到
点赞  2016-3-28 21:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复