ZigBee精简协议栈学习

参考自: http://blog.21ic.com/user1/1600/archives/2009/58767.html
 
美国密西西比州立大学的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 。直到 aps idle 状态才进行数据业务填充,并调用 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() 将被调用。这个函数将使用用户数据结构保存数据,设置已收到数据的标志位。此函数结束后消息数据的指针将会被释放,所以在函数结束之前要将数据保存以防止下一个包将数据覆盖掉。

你可能感兴趣的:(职场,休闲,zigbee,精简协议栈)