什么叫做zigbee开源协议栈栈,是不是很多函数都是公开的

喝水不忘挖井人转:
/module/forum/thread--1.htmlZstack协议栈是由TI公司在2007年4月推出的Zigbee无线通讯协议,是一种半开源式的协议栈,历经多年发展,功能不断完善,当前最新版本为2.5.1-a。网上资料有的说zstack协议栈是开源的,但是实际上zstack中的很多关键代码都是以库文件的形式给出的,我们并不能知道这些代码的真实内容,这也给学习这个协议栈带来了一定的困难。现在也有几个真正开源的Zigbee协议栈,如msstatePAN协议栈、freakz协议栈,但是同这些协议栈相比zstack的真正优势则是其搭载的硬件平台:TI的Zigbee无线通讯芯片:CC2520、CC2530等。
笔者最早接触Zigbee也是从学习TI的开发套件开始的,经过几年的沉积,对于CC2530和ZStack协议栈的掌握也可以算是细致入微了,现在打算把自己对协议栈的理解和认识拿出来和大家一起分享。
首先我们从Zigbee的特性说起。在网上搜索zigbee,紧跟在它后面的多半都是近距离、低功耗、自组织这些名词,这也是Zigbee最重要的特点。说它近距离是硬件模块的载波频率是2.4GHz,波长短,穿透性差,另外它和蓝牙、wifi是工作在同一频段的,容易受到干扰,因此传输距离不远。室内的话笔者做过的模块一般只能传输40到50米,网上那些不加PA的透传模块声称室内能传百米的,笔者认识都是在扯淡。低功耗是Zigbee非常重要的特点,CC2530的发射电流为29mA,在低功耗休眠模式下,只消耗不到1uA的电流,这个还是非常给力的。当然,随着蓝牙4.0的推出,Zigbee的这一优势将大打折扣。自组织以及与之相关的自愈合、自动路由等等技术则是Zigbee的真正核心竞争力所在,笔者也是在学习和使用Zigbee的过程中逐渐体会到这些功能的强大之处,也是接下来笔者所要阐述的主要内容。
当你第一次打开Zstack协议栈,查看程序代码,第一感觉也许会是:我靠,这该不是唐僧取来的梵文真经吧。然后转念一想,飞盘扔的再远,最后总会回到手中;风筝飞的再高,总是逃脱不了牵引它的线and so on(此处省略1万字)。眼前的一切都是虚妄,只有main才是你永远的家。搜索main,果然,熟悉的面孔让当年的笔者有了一丝的宽慰。
int main( void )
// Turn off interrupts
osal_int_disable( INTS_ALL );
// Initialization for board related stuff such as LEDs
HAL_BOARD_INIT();
disable_2401();
// Initialze HAL drivers
HalDriverInit();
// Initialize NV System
osal_nv_init( NULL );
// Initialize the MAC
ZMacInit();
// Determine the extended address
zmain_ext_addr();
// Initialize basic NV items
// Initialize the operating system
osal_init_system();
// Allow interrupts
osal_int_enable( INTS_ALL );
#ifdef WDT_IN_PM1
/* If WDT is used, this is a good place to enable it. */
WatchDogEnable( WDTIMX );
osal_start_system(); // No Return from here
return <span style="color: #;
笔者就是从这个入口函数开始,一步步的走入了Zstack的那缤纷复杂的世界不能自拔。方法只有2个:看文档和单步跟踪调试检验,废话少说,这里笔者就对这些函数来进行粗略的解释。
上次我们粗略描述了ZStack协议栈main()函数调用的一些函数,在main()函数的最后,调用的是osal_start_system(),从字面意思我们不难理解,这个函数是要启动“系统”的意思。启动系统??也许你要问了,这个系统难不成是操作系统的意思么?好吧,其实,你也可以理解成就是一个“操作系统”了。这时候可能你可能就来兴致了:ZStack运行的是哪门子操作系统?它是如何工作的?
查看osal_start_system()如下:
void osal_start_system( void )
osal_run_system();
void osal_run_system( void )
if (tasksEvents[idx])
// Task is highest priority that is ready.
}while (++idx & tasksCnt);
if (idx & tasksCnt)
halIntState_t intS
HAL_ENTER_CRITICAL_SECTION(intState);
events = tasksEvents[idx];
tasksEvents[idx] = <span style="color: #;
// Clear the Events for this task.
HAL_EXIT_CRITICAL_SECTION(intState);
activeTaskID =
events = (tasksArr[idx])( idx, events );
activeTaskID = TASK_NO_TASK;
HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |=
// Add back unprocessed events to the current task.
HAL_EXIT_CRITICAL_SECTION(intState);
查看osal_init_system()如下:
uint8 osal_init_system( void )
// Initialize the message queue
osal_qHead = NULL;
// Initialize the timers
osalTimerInit();
// Initialize the Power Management System
osal_pwrmgr_init();
// Initialize the system tasks.
osalInitTasks();
return ( SUCCESS );
void osalInitTasks( void )
uint8 taskID = <span style="color: #;
tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
osal_memset( tasksEvents, <span style="color: #, (sizeof( uint16 ) * tasksCnt));
macTaskInit( taskID++ );
nwk_init( taskID++ );
Hal_Init( taskID++ );
APS_Init( taskID++ );
ZDNwkMgr_Init( taskID++ );
zcl_Init( taskID++ );
zclZHome_Init( taskID++ );
#if defined (USE_SMART_GATEWAY_MODE)
utpTaskInit(taskID++); //<span style="color: #/ 1. register zigbee process func. 2. process uart:(1, check status.2 let deice leave.3, check_pan_resp)
ArpComm_Init(taskID++); //<span style="color: #.annuce: update arp table(send (mac,ip) to uart),
2.check_pan:farward to uart.
Gateway_Init(taskID); //reset assoc table,
send startup to uart.
zhomeDevMgr_Init(taskID++);
DevNwkMgr_Init(taskID++);
const pTaskEventHandlerFn tasksArr[] =
macEventLoop,
nwk_event_loop,
Hal_ProcessEvent,
APS_event_loop,
ZDApp_event_loop,
zcl_event_loop,
zclZHome_ProcessEvent,
#if defined (USE_SMART_GATEWAY_MODE)
utpProcessEvent,
ArpComm_ProcessEvent,
Gateway_ProcessEvent,
zhomeDevMgr_ProcessEvent,
DevNwkMgr_ProcessEvent,
聪明的朋友也许已经看出来了,任务数组各成员的名称和刚才初始化过程中各个初始化函数的名称有某些契合。呵呵,不契合就怪了(好吧,这里有点废话了)。
上面的图示列出的是某一时刻tasksEvents各成员的数值。可以看到tasksEvents成员值可以有多个非0值,即有多个任务需要进行处理。优先级较高的nwk_event_loop将首先被执行,然后是级别较低的Hal_ProcessEvent。
协调器的组网过程详解
这一讲我要详细说一下协调器的组网过程。在Zstack中,网络组网是从ZDApp_Init函数开始的。具体的执行流程为:Main()-&osal_init_system()-&osalInitTasks()-&ZDApp_Init()。进入到ZDApp_Init中:{...}我们在以前的文章里曾提到过,设备在复位之后,之前的网络信息就会丢失,那么设备将以全新的状态组建或者加入到网络中,这在实际使用过程中非常不方便。很多的应用场景中都要求设备能够在复位后仍旧按照上次入网的状态重新连接到网络中,Zstack也提供了实现该机制的方法。在工程的Options-&C/C++ Complier-&reprocessor的Defined symbols中我们填入:NV_RESTORE。再回到刚才说到的代码中,程序会调用HalKeyRead(),来判断SW5的状态。如果SW5没有被按下,程序会调用ZDApp_RestoreNetworkState,取出上一次保存在flash中的网络状态信息,设备将根据这些信息重新连接到网络中;如果SW5被按下,那么即便我们使用了NV_RESTORE,程序将调用NLME_InitNV()和NLME_SetDefaultNV(),清除之前保存的网络信息,然后以全新的状态加入网络中。在完成以上操作之后,程序会调用ZDApp_NetworkInit函数,触发ZDO_NETWORK_INIT事件。
ZStack协调器网络组建过程怎样实现?ZDApp_NetworkInit函数触发了ZDO_NETWORK_INIT任务,这个任务是由ZDApp_event_loop来处理的:{...}可以看到,这个函数的主要作用是调用了ZDO_StartDevice函数,参数ZDO_Config_Node_Descriptor.LogicalType在之前已经被设置为NODETYPE_COORDINATOR,表明这个设备的类型为协调器。ZDO_StartDevice函数的内容非常多,也特别的重要,第一次看的话有点吃力,但是其中最为重要的部分是调用了NLME_NetworkFormationRequest函数,发出网络创建请求。NLME_NetworkFormationRequest函数的详细部分是放在库文件中的,这里我们没有办法列出它的具体代码。在ZStack中大量使用了回调函数来处理各种任务请求,网络创建请求的回调函数为:void ZDO_NetworkFormationConfirmCB( ZStatus_t Status ){...}
阅读(...) 评论()什么叫做开源协议栈,是不是很多函数都是公开的??通俗点哦xyq2-6-28下载知道客户端,10分钟内,什么叫做开源协议栈,是不是很多函数都是公开的??通俗点哦-爱问知识网
什么叫做开源协议栈,是不是很多函数都是公开的??通俗点哦
IP其次,如果你想深入学习TCP&#47;IP的话;OS且TCP&#47;IP开源协议栈,亦可移植到其它操作系统,是一套完全免费的,并提供了可选择的Berkeley接口API,支持IP&#47;TCP&#47;UDP协议,可实现的网络功能较为强大;IP协议栈,但是协议栈所需调用的系统函数大多参照uC&#47;OS内核函数原型设计.LwIP的含义是Light Weight(轻型)IP协议,相对于uip、LwIPLwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP&#47,在系统函数构造方面有优势.当然你选择其他操作系统的话,可参照OS_NULL文件夹下的文件修改. 以上的这些开源协议栈也并非免费,那么下面我们就讲解了几个常用的开源协议栈,来为大家详细讲解和对比一下。具体内容;IP栈)是BSD栈派生的.这是因为BSD栈在BSD许可协议下提供了这些专业栈的雏形.uIP中还包括一个HTTP服务器作为服务内容.许可,BSD许用证允许BSD栈以修改或未修改的形式结合这些专业栈的代码而无须向创建者付版税.同时;IP协议最初是针对uC&#47;OS-TCP&#47;IP花了6人*2年的工作量,国内某公司使用LWIP作为移植的参照、TinyTcpTinyTcp 栈是TCP&#47;IP的一个非常小和简单的实现,以上的几种开源协议栈都提供了测试的例子,BSD 栈可完整实现TCP&#47,UC&#47;OS的母公司推出UC&#47,还请大家从下文来了解吧:BSD许用证5,一般它只需要几十K的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端嵌入式系统中使用,如果选用UC&#47;OS作为软件基础的话.完全用C编写,因此可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行,包括实验性扩展的的UDP(用户数据报协议).LwIP的特性如下,其不足在于该协议栈对网络应用支持不足.根据以上分析;IP栈的高费用就不足为奇了;IP大部分源码是从公开源码BSD发布站点和KA9Q(一个基于DOS单任务环境运行的TCP&#47;IP协议栈)移植过来.协议栈需要调用的系统函数接口是否容易构造,另一个对于应用支持程度.最关键的是占用的系统资源是否在可接受范围内,有裁减优化的空间否?其中、uIPuIP是专门为8位和16位控制器设计的一个非常小的TCP&#47,实现功能精简,限制了在一些较高要求场合下的应用;OS设计,为方便用户移植实现,同样也抽象了协议栈与平台相关代码,并提供了协议栈的测试函数,方便用户参考;IP栈.3,包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议),提供专门的内部回调接口(Raw API)用于提高应用程序性能.4,即与硬件平台的无关性;一个是与操作系统的内核API,首先让我们看看BSD TCP&#47;IP协议栈。1、BSD TCP&#47;IP协议栈BSD栈历史上是其他商业栈的起点,大多数专业TCP&#47. 作为广大的爱好者学习而言;IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用,应该是不错的选择.个人的看法:LWIP可优先考虑,至少网上有很多的人一块研究,参考的资料较多;UC&#47;IPuC&#47;IP是由Guy Lancaster编写的一套基于uC&#47;IP栈(VxWorks内嵌的TCP&#47,uIP和TinyT......&&(604)&&(112)&&(401)&&(64)&&(36)&&(510)&&(147)&&(291)&&(146)&&(20)
(132) (87) (82) (64) (64) (64) (61) (49) (44) (42) (33) (32) (30) (27) (27) (26) (26) (26) (24) (23) (23) (23) (22) (22) (21) (21) (20) (19) (19) (18) (18) (17) (15) (15) (15) (15) (15) (14) (14) (14) (13) (12) (12) (12) (12) (12) (11) (11) (11)
&Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有&备案号:

我要回帖

更多关于 开源sip协议栈 的文章

 

随机推荐