项目场景:
zigbee cc2530 协调器向终端发信息过程
问题描述:
协调器向终端发信息的过程:
1.终端给协调器发送自己的网络(短)地址
2.协调器接收到地址之后向终端发消息
程序:
1.终端向协调器发自己的短地址:
static void SampleApp_SendTheMessage()
{
uint16 nwkAddr;//本设备地址
uint16 parentNwkAddr;//父节点地址
char buff[30] = {0};//发送缓存数组
afAddrType_t SampleApp_Addr;
HalLedBlink( HAL_LED_2, 3, 50, (1000 / 4) );
nwkAddr = NLME_GetShortAddr();//获取本设备地址
parentNwkAddr = NLME_GetCoordShortAddr();//获取父设备地址
sprintf(buff, "parent:%d self:%d\r\n", parentNwkAddr, nwkAddr);
SampleApp_Addr.addrMode = (afAddrMode_t)Addr16Bit;
SampleApp_Addr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Addr.addr.shortAddr = 0;//因为我这个是发送给协调器的,所以是0,如果是发送给父节点的,用parentNwkAddr ;
buff[0] = HI_UINT16( nwkAddr );
buff[1] = LO_UINT16( nwkAddr );//因为发送是八位的,所以需要将地址存到数组里
HalUARTWrite ( 0, (uint8*)buff, strlen(buff));
if ( AF_DataRequest( &SampleApp_Addr, &SampleApp_epDesc,
SAMPLEAPP_CLUSTERID,
2,
(uint8*)buff,
&SampleApp_TransID,
0,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
2.协调器接收终端短地址:
static void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
switch ( pkt->clusterId )//这个就是簇,必须要保证发来的簇与要判断的簇保持一致才可以
{
case SAMPLEAPP_CLUSTERID://收到数据进行解析 终端节点发来消息
endpointaddr = (pkt->cmd.Data[0]) + (pkt->cmd.Data[1]<<8);//我把endpointaddr设成了全局变量
HalUARTWrite(0, (uint8*)&endpointaddr , 2);//串口打印到电脑查看
break;
default:
break;
}
}
3.协调器向终端发送消息:
static void SampleApp_SendTheMessage()
{
afAddrType_t SampleApp_DstAddr;
SampleApp_DstAddr.addr.shortAddr = endpointaddr; //终端短地址(逻辑/网络)地址
SampleApp_DstAddr.addrMode = afAddr16Bit; //通信模式,通过短地址点对点通信
SampleApp_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; //终端的endpoint
if (AF_DataRequest(&SampleApp_DstAddr, //目的地址
&SampleApp_epDesc, //发送端(源)端点号
SAMPLEAPP_CLUSTERID, //命令ID
2, //发送数据的长度
(uint8 *)Buf, //指向存放发送数据缓冲区的指针,自行设置
&SampleApp_TransID, //指向发送序列号的指针
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS
) == afStatus_SUCCESS)
{
}
else
{
}
}