zigbee复习笔记

笔记本:Zigbee复习
作者:hree
更新时间:2023/1/3


考点1:功率转换

1.什么是RSSI?接收机灵敏度?并利用"一个基准、两个原则"将dBm转换为mW的方法

  • RSSI:Received Signal Strength Indication接收的信号强度指示,无线发送层的可选部分,用来判定链接质量,以及是否增大广播发送强度。RSSI只是信号强度的一个指示值!

  • 接收机灵敏度:接收机灵敏度定义了接收机可以接收到的并仍能正常工作的最低信号强度。如果接收机接收到的信号功率等于或大于接收机灵敏度的接收功率,则链路在起作用,也就是说接收机能正确地提取发射信号中所包含的信息。如果接收功率小于灵敏度电平,那么所提取的信息质量就达不到要求。

  • dBm是一个表示功率绝对值的单位;W转换为dBm计算公式为:10 lg(功率值/1mW)

  • 一个基准,两个原则:
    一个基准:30dBm=1W
    两个原则:(1) +3dBm,功率×2;-3dBm功率×1/2
    举例∶33dBm=(30+3)dBm=1W×2=2W,27dBm=(30-3)dBm=1W×1/2=0.5W
    (2)+10dBm,功率×10; -10dBm,功率×1/10
    举例:40dBm=(30+10)dBm=1W×10=10W,20dBm=(30-10)dBm=1Wx0.1=0.1 W

2.讨论问题:

  • A. 66dBm、4dBm转换为mW,如何转换?详细过程(最好对一个基准和两个原则进行以下证明再使用)和结果?

    66dBm=(60+3+3)dBm,60dBm=106mW,则66dBm=106x2x2mW=4x106mW
    4dBm=(30-10-10-3-3)dBm=1Wx1/10x1/10x1/2x1/2=0.0025W=2.5mW

  • B.实验答辩题中将-67dBm 转换为mW,如何转换?详细过程(最好对一个基准和两个原则进行以下证明再使用)和结果?

​ -67dBm=(30-100+3)dBm=1Wx(1/10)10x2=2x10-10W=2x10-7mW

考点2:zigbee网络构型

3.Zigbee的树型网络中,网络地址分配算法需要三个参数分别是什么?表示什么意思?协调器的深度为多少?其它子节点的网络深度是多少?短地址长度为?地址计算的思想是?

  • 三个参数:子节点最大数目nwkMaxChildren(Cm)、子节点当中路由器的最大数目nwkMaxRouters(Rm)、网络最大深度nwkMaxDepth(Lm);协调器的深度为0;其他子节点的深度为父节点的深度+1;短地址长度为2个字节,协调器短地址为0x0000;父节点分配地址的时候,给网络深度为d+1的路由器子节点预留一段大小为Cskip(d)的地址块,该路由器子节点本身取地址块的第一个地址。

  • 例题:ZigBee网络中,父节点在网络中最多可以连接子节点的数目是Cm,子节点在网络中最多可以连接的路由节点是Rm,同时网络的最大深度是Lm,这三个参数分别取值5、3、2,试采用树编址设计出该网络可能的一种地址分配方案,要求网络中节点数目最大,请画出父子关系图,并标明d=1处每个节点的地址。

image-20221229220054610

修正:0x000D、0x0013和0x0014的d=1

  • c s k i p ( d ) = 1 + C m − R m − C m ⋅ R m L m − d − 1 1 − R m , d < L m cskip\left( d\right) =\dfrac{1+C_{m}-R_{m}-C_{m}\cdot R_{m}^{Lm-d-1}}{1-R_{m}},d <L_{m} cskip(d)=1Rm1+CmRmCmRmLmd1,d<Lm

考点3:数据帧结构与可靠传输

1.根据ZigBee无线抓包中ZigBee MAC帧结构图,发送节点设备无线发送FIFO数据SendPacket[ ],分析SendPacket[]中第一个字节指的是哪些字段的长度?
image-20221229221731228

这里只在同一个网络间不同的设备通信,故没有涉及源PAN标识符。载荷即为要传送的数据。SendPacket[]中第一个字节指后面还有多少字节要发送包括2字节的CRC校验

2.根据ZigBee PHY帧结构图和第一问,写出此时物理层报头应该是多少?给出你的理由。
物理层帧负载长度为12B,则PHR=00001100,即0x0C。

3.PSDU和PPDU分别指的是什么?二者之间有何关系?

1):前同步码(Preamble):4个字节长,收发器在接收数据期间会根据前导码的特征完成片同步和符号同步
2):帧起始间隔符(SFD):一个字节长,标识一个物理帧的开始,固定为0xA7
3):物理层报头(PHR):帧长度表示物理帧的负载长度,最长为127个字节,其中低7bit用于表示物理层帧的长度,剩下1bit是预留位
4):物理服务数据单元(PSDU):MAC层帧,根据MAC帧的不同物理帧的长度也会不同

image-20221229224927369
  • PSDU:物理层服务数据单元;PPDU:物理层协议数据单元(PHY帧)。

4.ZigBee无线环境如何避免多用户发生数据碰撞的情况?采取了什么措施?具体详情如何?

  • 采用CSMA/CA算法进行数据传输,CSMA/CA全称载波监听多点接入/碰撞避免。当节点请求发送数据时,先在初始退避窗口内随机退避一段时间,然后侦听信道;如果信道空闲,则发送数据;否则将继续随机退避,每次失败后的退避窗口将按照2的指数级增加,经过有限次的尝试后,则放弃数据的发送,宣告信道接入失败,在数据发送成功后,将退避窗口置为初始最小值。若发送数据发生冲突,则进行MAC层重传,超过重传次数则放弃此次数据发送,交由上层处理。

5.ZigBee MAC层采取了哪些提高数据可靠性的措施?分别是什么?点到点通信需要采用信道接入算法吗?MAC层的CSMA/CA算法主要解决什么问题?

  • CSMA/CA算法、ACK应答机制、MAC重传机制。如果只是一个设备向另一个设备发送数据时(点到点通信),不需要考虑太多信道接入的问题,这时设备可以独占所有信道资源,但是当多个设备进行通信时,为了合理安排每个设备占用的通信资源,信道接入技术就十分重要了,如防止不同设备的通信发生冲突;

6.ZigBee 可靠性的措施仅仅在MAC层实现吗?为什么?给出你的依据。

  • 不是。ZigBee在MAC层采用有CSMA/CA算法、ACK确认、重传机制、CRC校验。在PHY层也采用了多种保障数据传输可靠性的方法,比如调制、解调、编码、解码等

7.根据ZigBee MAC帧的结构图和发送FIFO中SendPacket[ ]的内容,解释SendPacket[ ]中第一个字节的含义?它具体指的是MAC帧中哪些域的长度?并以此判断AutoCRC=1?还是AutoCRC=0?给出你的判断依据。

image-20221230110243022
  • SendPacket[]中第一个字节表示在其之后还有多少字节的字符需要发送。表示的是MAC帧头、MAC帧负载、MAC帧尾字段的长度和。若2字节的CRC在发送的SendPacket中,则AutoCRC=0,否则AutoCRC=1,为硬件自动追加。

8.根据ZigBee MAC帧的结构图和发送FIFO中SendPacket[ ]的内容,分析得到无线MAC数据包的发送源地址是多少?目标地址是多少?发送源PANID号与目标PANID 号是多少?ZDAPP_CONFIG_PAN_ID取值==0xFFFF和!=0xFFFF,对于协调器、路由器、终端节点而言,分别表示什么含义?

  • ZDAPP_CONFIG_PAN_ID=0xFFFF时,协调器则随机产生一个值作为自己的PANID,路由器和终端设备则会在自己的默认信道上随机选择一个网路加入,加入之后协调器的PANID即为自己的PANID,ZDAPP_CONFIG_PAN_ID != 0xFFFF时,对于协调器而言,则表示该节点建立网络时的PANID应该是取特定值即与此ZDAPP_CONFIG_PAN_ID相同,而对于路由器或终端则表示加入网络时,应该加入网络的PANID取特定值即与此ZDAPP_CONFIG_PAN_ID相同的网络。

9.硬件可以支持某种协议的这种说法对吗?举例说明。

  • 对。比如CRC校验为的产生可由硬件支持,Ti的CC2530芯片支持IEEE802.15.4协议(CC2530上RF模块中有CSMA协处理器和MAC定时器就可以印证)。

10.在某协议栈分层结构中,假设只有PHY、MAC、NET、APP4层,请画出支持该协议栈的2个节点之间进行APP层通信时,封包和解包的示意图。
封包解包

考点4:OSAL事件处理

根据osal_start_system( )函数的具体实现以及某ZigBee工程的应用层事件处理函数HreeApp_ProcessEvent( )的具体实现,分析并回答:
1.OSAL任务事件调度机制处理各层任务时,优先级最高的那层任务的任务ID是多少?为什么?试分析代码后给出你的依据。

  • 任务ID初始化在函数osalInitTasks里
void osalInitTasks(void)  //在初始化操作系统osal_init_system()中调用  
{
  uint8 taskID = 0;
  tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
  osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
  macTaskInit( taskID++ );     //MAC层任务初始化 
  nwk_init( taskID++ );              //网络层任务初始化
  Hal_Init( taskID++ );              //硬件任务初始化
  APS_Init( taskID++ );              //应用支持子层任务初始化
……
  ZDApp_Init( taskID++ );            //设备应用层初始化
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
  ZDNwkMgr_Init( taskID++ );         //ZDO网络管理层任初始化
#endif
  HreeApp_Init( taskID );          //用户应用层接口初始化
}

由代码可知,优先级最高的是MAC层ID为0,其次是网络层。

2.App层事件处理代码中共处理了几类事件?分别指的是什么事件?

  • App层事件处理函数HreeApp_ProcessEvent
UINT16 HreeApp_ProcessEvent( byte task_id, UINT16 events )
{
……
if ( events & SYS_EVENT_MSG )
  {
    MSGpkt =(afIncomingMSGPacket_t *)osal_msg_receive(HreeApp_TaskID );
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
        case ZDO_CB_MSG:
         HreeApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
          break;
         case ZDO_STATE_CHANGE:
             ……
        default:
          break;
      }
   }
      return (events ^ SYS_EVENT_MSG);
if ( events &HreeApp_SEND_PERIODIC_MSG_EVT )
  {
   HreeApp_SendPeriodicMessage();
  osal_start_timerEx(HreeApp_TaskID,HreeApp_SEND_PERIODIC_MSG_EVT,
        (HreeAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );
       return (events ^HreeApp_SEND_PERIODIC_MSG_EVT);
  }
if ( events &HreeApp_My_EVT )
  {
       HreeApp_SendTheMessage();
        osal_start_timerEx(HreeApp_TaskID,
                       HreeApp_SEND_MSG_EVT,
                     HreeApp_SEND_MSG_TIMEOUT );
        return (events ^HreeApp_My_EVT);
  }
  return 0;
}

由代码可知,HreeApp_ProcessEvent一共处理了3类事件分别为SYS_EVENT_MSG、HreeApp_SEND_PERIODIC_MSG_EVT、HreeApp_My_EVT。

3.App层事件处理代码对事件的处理有优先级吗?你的判断依据是什么?

  • 有,在App层处理函数HreeApp_ProcessEvent里可知处理事件的优先级分别为SYS_EVENT_MSG、HreeApp_SEND_PERIODIC_MSG_EVT、HreeApp_My_EVT。

4.根据代码写出OSAL中App层事件处理机制的具体方法。

  • 检测到App层事件,进入App层处理函数HreeApp_ProcessEvent,判断事件类型是SYS_EVENT_MSG、HreeApp_SEND_PERIODIC_MSG_EVT、HreeApp_My_EVT中的哪一种,判断事件类型后,判断触发事件的消息类型之后进入相应的处理函数。

5.当OSAL事件处理队列中,MAC层有1个事件event1等待处理,而APP层有2个事件 SYS_EVENT_MSG和HreeApp_My_EVT等待处理,结合代码和项目经验,试分析接下来,OSAL将如何处理这几个事件?在OSAL处理完一个事件后,网络层又发生了event4事件,则OSAL又将如何处理呢?OSAL将如下处理这几个事件:

  • 1)层层之间优先级:MAC层event1 优先级高于APP层 SYS_EVENT_MSG和FactoryApp_My_EVT事件优先级;
    2)某层事件之间有优先级:APP层 SYS_EVENT_MSG和HreeApp_My_EVT事件之间也是有优先级的;
    3)每调用一次函数,只处理一个事件,没处理的事件,等待下次循环调度,重新排队:比如,即使MAC层的 event1 处理完了,它也不一定会接下来就会去处理APP层 SYS_EVENT_MSG和HreeApp_My_EVT事件,因为此时可能MAC层又有新的事件产生了,等待处理
    4)各层待处理事件重新排队,进入死循环。

6.例:如下图所示为Zstack协议栈中OSAL执行流程示意图
image-20221230125209191

void osal_start_system(void)
{ ……
    uint8 idx = 0;
    osalTimeUpdate( );
   Hal_ProcessPoll();      
   do {
      if (tasksEvents[idx])  
      {                     
        break;
      }
      } while (++idx < tasksCnt);
     ……
if (idx < tasksCnt)  
    {
      uint16 events;
      halIntState_t intState;
      HAL_ENTER_CRITICAL_SECTION(intState);
      events = tasksEvents[idx];
      tasksEvents[idx] = 0;  
      HAL_EXIT_CRITICAL_SECTION(intState);
      events = (tasksArr[idx])( idx, events ); //函数指针
      HAL_ENTER_CRITICAL_SECTION(intState);
      tasksEvents[idx] |= events;  
      HAL_EXIT_CRITICAL_SECTION(intState);
      }
……
}

(1)代码中idx、tasksEvents[1]、tasksArr[0]分别指的是什么?

  • idx指的是任务ID号;tasksEvents[1] 表示任务ID为1的NET层的任务事件标志变量;tasksArr[0]表示任务ID号为0的MAC层的任务事件处理函数的首地址。

(2)据代码并结合你平时的相关项目经验,给出OSAL中任务事件调度机制具体方法。

  • 1)OSAL首先通过Zmain目录下的Zmain.c的main()函数进行系统初始化工作,初始化结束后,进入系统运行与任务调度。
    2)OSAL进行系统初始化主要完成了系统硬件、软件、操作系统的初始化,而在操作系统初始化中,主要完成了各层任务的初始化taskInit()。
    3)在各层任务初始化taskInit()中,主要分配了各层的taskID号;分配了事件标志变量并将其放置在了数组tasksEvent[ ]中;注册了各层事件处理函数并将其首地址放置在了数组tasksArr[]中。
    4)初始化结束后,进入系统运行与任务调度,主要调用OSAL目录下的osal.c中的函数进行任务调度。查看此时的事件处理队列中,优先级高的层有没有事件待处理,然后,找到该层待处理的事件中,哪个事件优先级最高,处理完该事件,则OSAL跳出此次事件处理循环,再次重新查看事件处理队列……无限循环。

考点5:CC2530GPIO

1.能够编程配置IO口的各种寄存器,设计分析外围电路控制和检测方法;
2.能够根据电路图,设计CC2530中断初始化配置程序和服务子程序控制程序执行流程,并编程实现CC2530中断初始化配置程序和服务子程序控制程序;
3.能够比较CC2530中断程序与查询控制方案的区别和优缺点。
4.掌握按键消抖方法。

详见Zigbee GPIO与中断(查询法与中断法点亮LED)

考点6:OSAL系统运行

1.工程文件中,无线信道的配置在哪里?如何修改?PANID的配置在哪里?如何修改?

  • 在Tools–>f8wconfig.cfg。
    image-20221231120325253

image-20221231120433949

2.入口函数Main()的功能及流程分析?

  • 系统初始化等,包括操作系统初始化Osal_Start_system(),第三方模块初始化函数。

3.Osal_Start_system()功能分析?

void osal_start_system( void )
{
#if !defined ( ZBIT ) && !defined ( UBIT )
  for(;;)  // Forever Loop
#endif
  {
    uint8 idx = 0;

    osalTimeUpdate();
    Hal_ProcessPoll();  // This replaces MT_SerialPoll() and osal_check_timer().
    
    do {
      if (tasksEvents[idx])  // Task is highest priority that is ready.
      {
        break;
      }
    } while (++idx < tasksCnt);

    if (idx < tasksCnt)
    {
      uint16 events;
      halIntState_t intState;

      HAL_ENTER_CRITICAL_SECTION(intState);
      events = tasksEvents[idx];
      tasksEvents[idx] = 0;  // Clear the Events for this task.
      HAL_EXIT_CRITICAL_SECTION(intState);

      events = (tasksArr[idx])( idx, events );

      HAL_ENTER_CRITICAL_SECTION(intState);
      tasksEvents[idx] |= events;  // Add back unprocessed events to the current task.
      HAL_EXIT_CRITICAL_SECTION(intState);
    }
#if defined( POWER_SAVING )
    else  // Complete pass through all task events with no activity?
    {
      osal_pwrmgr_powerconserve();  // Put the processor/system into sleep
    }
#endif
  }
}
  • 这个是任务系统轮询的主要函数。它会查找发生的事件然后调用相应的事件执行函数。如果没有事件登记要发生,那么就进入睡眠模式。这个函数是永远不会返回的。

考点7:zigbee无线通信

1.Zstack AF层进行无线数据发送的发送模式有哪4种?有何区别?

  • 单播、广播、组播、(MAC地址通信、)绑定。
    单播:网络中两个节点进行点对点数据通信。
    广播:网络中某个节点发送数据包,其他的所有节点都能收到。
    组播:网络中某个节点发送数据包,只有属于某一组的结点才能收到。
    绑定:所谓绑定就是发送节点与被绑定的结点建立一种关系,当发送节点发出数据时就默认是发到被绑定节点(个人理解>->),详细可见Zigbee绑定通信原理
    各个模式的配置见Here

2.Zstack AF层主要解决什么问题?

  • 无线数据包的收发。

3.Zstack AF层如何解决应用层交互统一性的问题?定义的应用子集和簇、属性和命令分别是指什么?长度如何?

  • 定义应用子集(application profile)来保证应用层交互的同一性,这个交互的同一性,主要涉及到空中接口。
    应用子集(2字节):规定了各行业每一类应用子集需要做什么,比如灯光控制、空调控制、温度检测等均属于智能家居ProfileID所规范的这类应用。
    簇:将每个应用中的属性和命令归在一起。
    以灯光控制为例
    属性(2字节):亮度、由亮变暗过程所经历多长时间等。
    命令(1字节):调升、降低等。

4.Zstack AF层如何解决应用层支持多个APP的问题?定义的端点是什么意思?长度如何?端点与应用什么关系?端点描述符是什么?简单描述符是什么?

  • 通过定义端点来支持多个APP。端点(EndPoint)这个概念正是针对应用的,每个应用位于一个端点上,每个ZigBee设备的所有端点用一个==8比特(1字节)==的标识来表示,其中,0x00用来放置ZigBee设备子集这个特殊应用,0xff表示所有生效的端点,即广播端点,而0xf1~0xfe是预留的,因此留给设计者使用的端点号还有240个。
    这些描述符是一些数据结构,即为一些列参数的组合。
    简单描述符是描述应用的,每个端点对应一个简单描述符。
//简单描述符
const SimpleDescriptionFormat_t HreeApp_SimpleDesc =
{
  HreeAPP_ENDPOINT,              //  int    端点号
  HreeAPP_PROFID,                //  uint16 Profile ID
  HreeAPP_DEVICEID,              //  uint16 设备 ID
  HreeAPP_DEVICE_VERSION,        //  int    设备版本
  HreeAPP_FLAGS,                 //  int    程序标识
  HreeAPP_MAX_CLUSTERS,          //  byte   输入命令数
  (cId_t *)HreeAPP_ClusterList,  //  byte   输入命令列表地址
  HreeAPP_MAX_CLUSTERS,          //  byte   输出命令数
  (cId_t *)HreeAPP_ClusterList   //  byte   输出命令列表地址
}

端点描述符:
发送函数AF_Data_Request(*dstAddr,*srcEP,clD, len, *buf,*transID , options, radius )
image-20230101112740459
端点描述符可作为发送函数的参数2使用。

5.簇的方向性如何理解?
image-20230101113127401

6.AF层发送函数如何使用?AF层如何处理接收到的无线数据?

  • 发送函数AF_Data_Request(*dstAddr,*srcEP,clD, len, *buf,*transID , options, radius )
    AF层数据接收流程:
    image-20230101130338735

7.APP层任务、端点、应用ID、输入输出簇之间的关系。
image-20230101123751479

总结的可能并不到位,毕竟各个学校的考点可能不一样
END

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值