专栏中心

EEPW首页 > 专栏 > ZigBee精简协议栈学习

ZigBee精简协议栈学习

发布人:mayer 时间:2009-09-05 来源:工程师 发布文章
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()将被调用。这个函数将使用用户数据结构保存数据,设置已收到数据的标志位。此函数结束后消息数据的指针将会被释放,所以在函数结束之前要将数据保存以防止下一个包将数据覆盖掉。

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

Apress.Hardening.Apache.eBook-LiB

硬道理

snowflake11 2005-09-10

腾辉电子:原材料供应紧张,CCL市场迎来涨价潮

[Android开发视频教学]say_hello_to_Android(03)

视频 2010-10-29

整合的魅力

stone1 2005-09-10

三星计划2026年扩产HBM后段制程,聚焦HCB技术

[Android开发视频教学]搭建Android开发环境(02)

视频 2010-10-29

Altium 在中国发布 Altium Develop —— 标志着其正式从传统许可证合规模式转型

[Android开发视频教学]Activity和Intent(05)

视频 2010-10-29

Keil C51语言使用技巧及实战

arm开发软件使用教程

资源下载 2007-02-28

[Android开发视频教学]Android当中的常见控件(06)

视频 2010-10-29

NVIDIA整合Groq技术,AI芯片初创企业出路何在?

智能计算 2026-03-18

ARM开发工具Embest IDE的Demo软件,包括Embest IDE详细手册和ARM芯片选型指导。2002

美光宣布 HBM4、SOCAMM2 内存模块及 PCIe 第六代固态硬盘实现大规模量产

AS1117 芯片手册

超高速非易失性存储器(UltraRAM):后硅时代存储器的可行解决方案?

[Android开发视频教学]Activity初步(04)

视频 2010-10-29

畅连无限,创新赋能:罗德与施瓦茨亮相MWC 2026

全球首款真正的RISC-V架构人工智能笔记本电脑

分子束外延(MBE)技术制备量子比特

英伟达称 AI芯片市场规模2027年或达1万亿美元,誓要拿下全部市场份额

更多 培训课堂
更多 焦点
更多 视频

技术专区