Z-stack关键结构体解析

  • OSAL的消息队列

每一个消息都包含一个消息头osal_msg_hdr_t和用户自定义的消息,osal_msg_hdr_t结构体定义如下:

  1. typedef struct
  2. {
  3. void *next;
  4. uint16 len;
  5. uint8 dest_id;
  6. } osal_msg_hdr_t;

在事件处理函数SampleApp_ProcessEvent()中,从消息队列中接收到一个消息,后才调用SampleApp_MessageMSGCB,接收到的消息中如何就包含了用户接收的数据消息呢?

是这样子的:每个消息都有一个用户自定义的消息部分,协调器收到数据后,将数据打包,存放在用户自定义消息部分,然后将其插入到消息队列,用户就可以从消息队列接收该消息

接收到数据后的消息格式如下图所示。

  • AF层的数据包结构体:afIncomingMSGPacket_t
  1. typedef struct
  2. {
  3. osal_event_hdr_t hdr; /* OSAL Message header */
  4. uint16 groupId; /* Message‘s group ID - 0 if not set */
  5. uint16 clusterId; /* Message‘s cluster ID */
  6. afAddrType_t srcAddr; /* Source Address, if endpoint is STUBAPS_INTER_PAN_EP,
  7. it‘s an InterPAN message */
  8. uint16 macDestAddr; /* MAC header destination short address */
  9. uint8 endPoint; /* destination endpoint */
  10. uint8 wasBroadcast; /* TRUE if network destination was a broadcast address */
  11. uint8 LinkQuality; /* The link quality of the received data frame */
  12. uint8 correlation; /* The raw correlation value of the received data frame */
  13. int8 rssi; /* The received RF power in units dBm */
  14. uint8 SecurityUse; /* deprecated */
  15. uint32 timestamp; /* receipt timestamp from MAC */
  16. afMSGCommandFormat_t cmd; /* Application Data */
  17. } afIncomingMSGPacket_t;
  • af地址类型
  1. typedef struct
  2. {
  3. union
  4. {
  5. uint16 shortAddr; //16位网络地址
  6. ZLongAddr_t extAddr; //设备IEEE64位物理地址
  7. } addr;
  8. afAddrMode_t addrMode;
  9. byte endPoint;
  10. uint16 panId;
  11. } afAddrType_t;
  • 数据传输模式
  1. typedef enum
  2. {
  3. afAddrNotPresent = AddrNotPresent,
  4. afAddr16Bit = Addr16Bit, //点播
  5. afAddr64Bit = Addr64Bit,
  6. afAddrGroup = AddrGroup, //组播
  7. afAddrBroadcast = AddrBroadcast //广播
  8. } afAddrMode_t;
  1. afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,
  2. uint16 cID, uint16 len, uint8 *buf, uint8 *transID,
  3. uint8 options, uint8 radius )

时间: 2024-08-05 19:30:07

Z-stack关键结构体解析的相关文章

FFMPEG关键结构体

// FFMPEG关键结构体:// 转载 http://blog.csdn.net/leixiaohua1020/article/details/14214577// 2016.2.26 AVFrame(位于avcodec.h)结构体一般用于存储原始数据.===============================================================================下面看几个主要变量的作用(在这里考虑解码的情况):uint8_t *data[AV_N

golang 兼容不同json结构体解析实践

线上服务器,同一个web接口有时需要兼容不同版本的结构体.这种情况思路是使用interface{}接收任意类型数据,结合reflect包处理. 如下,http接口调用者会传入不同的json结构数据(单体结构或切片结构): type ReqStu struct { XXX struct { //XXX结构为单体 AAA string `json:"aaa"` BBB string `json:"bbb"` CCC string `json:"ccc"

file_operations结构体解析 1

注:学了这么长时间了,还没有好好看看 file_operations机构体,这其中还有很多的东西,当你学着学着的时候,就会用到这里面的一些系统调用对应的函数了,我在网上搜索之后,记录如下,一边将来查看..... 前沿:这些东西估计对你有用 linux驱动程序中最重要的涉及3个重要的内核数据结构,分别为file_operations,file和inode. 在linux中inode结构用于表示文件,而file结构则表示打开的文件的描述,因为对于单个文件而言可能会有许多个表示打开的文件的描述符,因而

LR socket接收数据 标准函数,结构体解析

//接收 DWORD RecvBuf(char* cRecvBuf,char* cSocketName,char* cBufName){    int ret=0;    char * cRecvdata=0;    int iRecvdatalen=0;    DWORD begin=0,cur=0;    begin=clock();    while(1)    {        ret=lrs_receive(cSocketName,cBufName,LrsLastArg);      

Linux字符设备中的两个重要结构体(file、inode)

对于Linux系统中,一般字符设备和驱动之间的函数调用关系如下图所示 上图描述了用户空间应用程序通过系统调用来调用程序的过程.一般而言在驱动程序的设计中,会关系 struct file 和 struct inode 这两个结构体. 用户空间使用open()系统调用函数打开一个字符设备时( int fd = open("dev/demo", O_RDWR) )大致有以下过程: 在虚拟文件系统VFS中的查找对应与字符设备对应 struct inode节点 遍历字符设备列表(chardevs

【Go语言】【12】GO语言的结构体

当我第一次接触到C语言时,就对结构体投入了极大的兴趣,认为这个东西以后大有作为,后来接触Java.C++,面向对象编程中的对象进入我的视线,经过了这么多年的磨练,回过头来再看结构体依旧是那么亲切:同时从另一个角度上看结构体与面向对象中的成员对象是多么的相像 :) 一.结构体元素 结构体由关键字.结构体类型名称和具体成员构成,如下: 二.结构体初步认识 下面通过对比数组(复合类型)来了解一下结构体: 1.从存储类型来看 数组只能存储相同的类型: s := []string{"a", &q

Runtime的初步认识——结构体与类

Runtime的初步认识 Runtime的初步认识 Runtime介绍 类与结构体的关系 结构体解析 结构体的作用 Runtime介绍 学习一个东西至少要先知道它是个啥,你一定听说过"运行时是 Objective-C 的一个特色",这里的"运行时"就是指 runtime 了. runtime是在自 iOS 平台开放并基于 Objective-C 语言开发后的一个编程语言上的高级技术. 学习runtime的目的并不是为了开发,而是让你更好的理解 Objective-C

Swift建立栈的泛型结构体以及top()、push()、pop()定义函数的定义

首先可以使用swift定义Stack的结构体 //泛型表达 struct Stack<T> { var items = <T>() //定义栈顶函数,返回栈顶元素 mutating func top()->T{ return items.last! } //定义push函数,将item插入栈中 mutating func push(item:T){ items.append(item) } //定义pop函数,将栈顶函数退栈 mutating func pop()->T

UNITY3D c#脚本中处理类与结构体的区别

1.在C#中结构体类型定义时,成员是不能初始化的,这样就导致了,定义结构体变量时,变量的所有成员都要自己赋值初始化.但对于类,在定义类时,就可以初始化其中的成员变量,所以在定义对象时,对象本身就已经有了初始值,你可以自己在重新给个别变量赋值.(注意在C++中,类的定义中是不能初始化的,初始化要放在构造函数中) 2.结构体变量 和类对象 进行值传递时,结构体变量进行的就是值传递,而类对象进行的是引用传递,或者说传递的是指针,这样在函数中改变参数值,结构体对象的值是不变的,而类对象的值是变化了. 下