zigbee设备与网关、后端服务器的绑定、通信

正常的控制命令等都是使用此网络地址

这个地址也叫短地址

设备入网时会向整个网络广播自己的长短地址,此时协调器可以从广播的数据包中拿到设备的长短地址

获取此地址的方法是读取Devic_annce数据包

方法如下

在系统初始化时注册ZOD消息

如下,第三行便是

#ifdef ZDO_COORDINATOR
  zclGenericApp_InitUart();
  ZDO_RegisterForZDOMsg ( zclGenericApp_TaskID, Device_annce );
  bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_FORMATION | BDB_COMMISSIONING_MODE_FINDING_BINDING);
#else
  
#endif

在系统任务中添加接收消息回调函数

#ifdef ZDO_COORDINATOR
          case ZDO_CB_MSG:
          zclGenericApp_processZDOMgs( (zdoIncomingMsg_t *)MSGpkt );
          break;
        #else
        #endif

此部分添加位置如下图

然后便是编写回调函数

从zdoIncomingMsg_t结构体中可以看到device_annce数据包包含的内容

typedef struct
{
  osal_event_hdr_t hdr;
  zAddrType_t      srcAddr;
  uint8            wasBroadcast;
  cId_t            clusterID;
  uint8            SecurityUse;
  uint8            TransSeq;
  uint8            asduLen;
  uint16           macDestAddr;
  uint8            *asdu;
  uint16           macSrcAddr;
} zdoIncomingMsg_t;

其中结构体secAddr中包含的便是长短地址数据

如下

typedef struct
{
  union
  {
    uint16      shortAddr;
    ZLongAddr_t extAddr;
  } addr;
  byte addrMode;
} zAddrType_t;

此时只需在回到函数中定义相同类型数据并赋值此结构体相应成员即可获取长短地址,

但是这里有点问题,长地址虽然有定义但是设备貌似并没有进行发送,所以一直获取不到,

短地址是可以的

方法按如下

static void zclGenericApp_processZDOMgs(zdoIncomingMsg_t *pMsg)  
{  
  switch ( pMsg->clusterID )  
  {
    case Device_annce:
    {
      uint8 databuf[20];
      uint16 shortAddr;
      shortAddr = pMsg->srcAddr.addr.shortAddr;
      printf("nwkID:%X\r\n",shortAddr);
      
      uint8 i;
      uint8 *xad;
      uint8 IEEE_buf[Z_EXTADDR_LEN*2+1];
      xad = aExtendedAddress+ Z_EXTADDR_LEN - 1;

      for (i = 0; i < Z_EXTADDR_LEN*2; xad--)
      {
        uint8 ch;
        ch = (*xad >> 4) & 0x0F;
        IEEE_buf[i++] = ch + (( ch < 10 ) ? '0' : '7');
        ch = *xad & 0x0F;
        IEEE_buf[i++] = ch + (( ch < 10 ) ? '0' : '7');
      }
      IEEE_buf[Z_EXTADDR_LEN*2] = '\0';
      sprintf(databuf,"%s@%x\r\n",IEEE_buf,shortAddr);
      HalUARTWrite(HAL_UART_PORT_0,databuf,20);
      
      break;
    }
    default:
      break;
  }  
}

此时便可以从串口接收到设备入网时的短地址了,

协调器长地址与设备短地址使用@符号进行连接,最后在串口打印,这样上位机便可以区分设备是处于哪一个协调器网络下

同时可以使用短地址对网络内的指定设备进行控制

获取本机IEEE地址方法就有很多了此处省略

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kongbai_w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值