原创 ZigBee精简协议栈学习

2009-9-5 09:32 2204 4 4 分类: MCU/ 嵌入式

 

美国密西西比州立大学的Robert Reese教授出于教学、科研目的开发出一套精简版(subset)ZigBee协议栈。

 

APS的状态:

typedef enum _APS_STATE_ENUM


{


  APS_STATE_IDLE,


  APS_STATE_COMMAND_START,


  APS_STATE_GENERIC_TX_WAIT,


  APS_STATE_NWK_PASSTHRU_WAIT,


  APS_STATE_INDIRECT_GETDST,


  APS_STATE_INDIRECT_TX,


#ifdef LRWPAN_COORDINATOR


  APS_STATE_INJECT_INDIRECT,


#endif


  APS_STATE_ACK_SEND_START,


  APS_STATE_INDIRECT_TX_WAIT,


  APS_STATE_INJECT_LOOPBACK,


  APS_STATE_INDIRECT_LOOPBACK


 } APS_STATE_ENUM;


从程序可以看出,除了APS_STATE_IDLE其余都是busy状态。

 


APL层的服务调用【对外功能函数】:



函数

功能

aplSendMSG

发送消息

aplSendEndDeviceAnnounce (saddr)

发送终端设备宣告

aplSendNodeInfo (saddr)

发送节点信息

aplSendAlarm (saddr,mde)

发送警告

aplPingParent ()

查询父节点连接状态

aplPingNode (saddr)

查询某个节点的连接状态

aplFormNetwork()

协调器形成网络

aplJoinNetwork()

尝试接入网络

aplRejoinNetwork()

尝试再次接入网络

这里的函数(或者宏)都要先循环调用apsBusy()检查aps是否为idle状态,如果不是就调用apsFSM。直到apsidle状态才进行数据业务填充,并调用apsDoService处理


#define apsDoService() \


   a_aps_service.status = LRWPAN_STATUS_APS_INPROGRESS;\


   apsState = APS_STATE_COMMAND_START;\


   apsFSM();


 


APL层的访问及设置调用【对内功能函数】:



                  函数


                  功能


aplInit()


初始化协议栈


aplShutdown


关闭协议栈


aplWarmstart


唤醒协议栈


apsGenTSN()


产生事务对列号


aplGetMyShortAddress()


获取节点的短地址


aplGetParentLongAddress()


获取父节点的长地址


aplGetParentShortAddress()


获取父节点的短地址


aplSetMacMaxFrameRetries(x)


设置MAC层帧重传的最大次数


aplSetApsMaxFrameRetries(x)


设置APS层帧重传的最大次数


aplIsUsrBufferFree()


最后一个消息是否被拷贝


aplMacTicksToUs


MAC滴答为微秒


 


对于APS(应用支持子层)这一层来说,apsFSM函数是整个的主角,在asp.c文件中定义的函数几乎都为这个函数所调用。协议栈的每一层都有自己的有限状态机(FSM)以追踪要进行的操作


 


如果节点作为协调器(coordinator),那么需要定义LRWPAN_COORDINATOR;而如果节点作为路由器(router)则需要定义LRWPAN_ROUTER;如果两者都没有定义,将作为RFD节点。协调器节点形成网络,然后进入一个无限循环并调用apsFSM()运行协议栈。调用aplFormNetwork()服务后调用函数aplGetStatus(),如果返回了LRWPAN_SUCCESS则表示服务调用成功。路由器节点通过调用aplJoinNetwork()运行协议栈。


 


协议栈使用以下APL访问函数接收数据包。


aplGetRxDstEp()返回目的端点
aplGetRxCluster()
返回簇号
aplGetRxSrcEp()
返回源端点
aplGetRxSADDR()
返回源端点的短地址
aplGetRxMsgLen()
返回消息长度
aplGetRxMsgData()
返回消息数据的指针
aplGetRxRSSI()
返回收到消息的信号强度

 

  而后用户回调函数usrRxPacketCallback()将被调用。这个函数将使用用户数据结构保存数据,设置已收到数据的标志位。此函数结束后消息数据的指针将会被释放,所以在函数结束之前要将数据保存以防止下一个包将数据覆盖掉。

本文出自 “bluefish” 博客,请务必保留此出处http://bluefish.blog.51cto.com/214870/163424

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条