ZigBee 协议栈网络管理 主要是对新加入的设备节点的设备管理。每个 CC2530 芯片出厂时候都有一个全球唯一的 32 位 MAC地址。当时当设备连入网络中的时候,每个设备都能获得由协调器分配的16 位短地址,协调器默认地址(0x0000)。很多时候网络就是通过短地址进行管理。
修改点播信息发送函数
void SampleApp_SendPointToPointMessage( void ) { uint8 device; //设备类型变量 if ( SampleApp_NwkState == DEV_ROUTER ) device=0x01; //编号1表示路由器 else if (SampleApp_NwkState == DEV_END_DEVICE) device=0x02; //编号2表示终端 else device=0x03; //编号3表示出错 if ( AF_DataRequest( &Point_To_Point_DstAddr, //发送设备类型编号 &SampleApp_epDesc, SAMPLEAPP_POINT_TO_POINT_CLUSTERID, 1, &device, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) { } else { // Error occurred in request to send. } }
修改完成后系统设备自动检测自己烧写的类型,然后发送对应的编号。路由器编号为 1,终端编号为 2。
数据接收方面,我们对接收到的数据进行判断,区分路由器和终端设备。然后在数据包中取出 16 位短地址。通过串口打印出来 。短地址在数据包里的存放位置。依次是 pkt--- srcAddr---shortAddr。
接收函数
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) { uint16 flashTime,temp; //16进制转ASCII码表 uint8 asc_16[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; switch ( pkt->clusterId ) { case SAMPLEAPP_POINT_TO_POINT_CLUSTERID: temp=pkt->srcAddr.addr.shortAddr; //读出数据包的16位短地址 if( pkt->cmd.Data[0]==1 ) //路由器 HalUARTWrite(0,"ROUTER ShortAddr:0x",19); //提示接收到数据 if( pkt->cmd.Data[0]==2 ) //终端 HalUARTWrite(0,"ENDDEVICE ShortAddr:0x",22); //提示接收到数据 /****将短地址分解,ASC码打印*****/ HalUARTWrite(0,&asc_16[temp/4096],1); HalUARTWrite(0,&asc_16[temp%4096/256],1); HalUARTWrite(0,&asc_16[temp%256/16],1); HalUARTWrite(0,&asc_16[temp%16],1); HalUARTWrite(0," ",1); // 回车换行 break; case SAMPLEAPP_FLASH_CLUSTERID: flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] ); HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) ); break; } }
将修改后的程序分别以协调器、路由器、终端的方式下载到 3 个 或以上设备,协调器连接到 PC 机。上电后每个设备往协调器发送自身编号,协调器通过串口打印出来。
可以利用同样的方法可以将 MAC 地址、 PANID 等读取出来。或者自行设定预定义节点编号进行网络管理