ZStack-CC2530-2.5.1a开发(八)Binding通信实验

ZStack版本:ZStack-CC2530-2.5.1a
下载和调试器:SmartRF04EB
IDE开发软件:IAR Embedded Workbench IDE - 8051 10.20.1
开发平台:基于TI-CC2530的任意厂家的
一、Zigbee Binding概念简介
对于ZigBee的无线通信来说,除了广播模式外,一般都需要知道目标设备的地址信息,比如16位网络地址或是64位MAC地址等,才能够进行无线发送。但是,在Zigbee网络中,每个设备的16位网络地址是由其父节点随机分配的,并且每次上电或重启后都可能不一样。为了解决这一问题,Zigbee引入了Binding通信的机制。

在ZStack-CC2530-2.5.1a的Documents里的文档《Z-Stack Developer’s Guide.pdf》中的解释为:
绑定(Binding)是用于一个应用到一个或多个应用的信息流的控制机制,它允许应用在不知道目标设备地址的情况下仍可以实现消息的无线发送。

二、实验目的简介
本实验在ZStack-CC2530-2.5.1a开发(六)16位网络地址_广播实验的基础上,实现Binding通信,当终端设备上电或重启后,每隔5S发送一次信息"i am enddevice!\r\n"给协调器,此时终端设备未实现Binding,所以协调器收不到信息,当按下终端设备的按键后,终端设备发送Binding请求,Binding成功后,发送"Binding success!\r\n"到串口,否则发送"Binding failure!\r\n"到串口。当Binding成功后,协调器就会受到终端设备的信息,并通过串口打印。
三、Binding代码移植
本次代码移植,协调器的代码不用修改,只修改终端设备的代码:
3.1 将EndDevice.c文件中,用户任务初始化代码中目标设备地址配置信息做修改:
我们上个工程修改过的如下:

GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
  GenericApp_DstAddr.endPoint = GENERICAPP_ENDPOINT;
  GenericApp_DstAddr.addr.shortAddr = 0x0000;

更改成未修改的原版代码:

GenericApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
  GenericApp_DstAddr.endPoint = 0;
  GenericApp_DstAddr.addr.shortAddr = 0;

3.2 修改用户任务事件处理函数中,Binding事件发生时所调用的处理函数:
原代码如下:

static void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
{
  switch ( inMsg->clusterID )
  {
    case End_Device_Bind_rsp:
      if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
      {
        // Light LED
        HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
      }
#if defined( BLINK_LEDS )
      else
      {
        // Flash LED to show failure
        HalLedSet ( HAL_LED_4, HAL_LED_MODE_FLASH );
      }
#endif
      break;
      }
     }

修改为:

static void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
{
  switch ( inMsg->clusterID )
  {
    case End_Device_Bind_rsp:
      if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
      {
        printf("Binding success!\r\n");
      }
      else
      {     
       printf("Binding failure!\r\n");
      }
      break;
   }
}

3.3 Binding请求代码的分析和更改:
在ZStack-CC2530-2.5.1a协议栈里已经有了Binding请求的代码,其位于EndDevice.c的用户按键处理程序,shift不等于TRUE分支的if(keys & HAL_KEY_SW_2)分支,代码如下:

// Initiate an End Device Bind Request for the mandatory endpoint
      dstAddr.addrMode = Addr16Bit;
      dstAddr.addr.shortAddr = 0x0000; // Coordinator
      ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
                            GenericApp_epDesc.endPoint,
                            GENERICAPP_PROFID,
                            GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
                            GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
                            FALSE );

而我们的项目中,使用的是HAL_KEY_SW_6,且shift为TRUE,为什么我们的shift为TRUE,这是因为在KEY的回调函数中,有这么一句话:

shift = (keys & HAL_KEY_SW_6) ? true : false;

所以我们需要将这部分代码复制或剪贴到shift为TRUE且if(keys & HAL_KEY_SW_6)分支,即可。
3.3

你可能感兴趣的:(Zigbee)