定义
ZigBee在网络里的两个地址
a. 2个字节在网络里唯一的网络短地址
b. TI的CC2530在出厂的时候,每一个芯片都固化了一个唯一一个的8个字节的地址,MAC 或者IEEE地址。Addr64Bit = 3,//MAC地址
操作
协调器
- 进入协调器后,可以查看网络短地址、MAC地址
NwkAddr = NLME_GetShortAddr();//获得当前网络短地址
memcpy(MacAddr,NLME_GetExtAddr(),8);//获取MAC地址,拷贝给数组 MacAddr
//NLME_GetShortAddr()返回MAC地址保存的数组的首地址。
- 接收函数,通过串口打印接收到的数据
static void LEDApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
switch ( pkt->clusterId )
{
case LEDApp_CLUSTERID:
// "the" message
#if defined( LCD_SUPPORTED )
HalLcdWriteScreen( (char*)pkt->cmd.Data, "rcvd" );
#elif defined( WIN32 )
WPRINTSTR( pkt->cmd.Data );
#endif
// pkt->cmd.DataLength;//得到接收数据的长度
// pkt->cmd.Data[0];//首地址
UartTX_Send_String( pkt->cmd.Data,pkt->cmd.DataLength);
break;
}
终端
- 定义一个数组,值为前一步获得协调器的MAC地址
uint8 DestMac[8] = {0x0F,0X55,0X16,0X07,0X00,0X48,0X12,0X00};//0X001248000716550F
- 按键发送处理
if ( events & LEDApp_MY_EVT )
{
if(P0_4 == 0)//S5
{
char theMessageData[] = "KEY1按下\n";
LED02 =~LED02;
LEDApp_DstAddr.addrMode = (afAddrMode_t)Addr64Bit;
//LEDApp_DstAddr.addr.shortAddr = 0x0000;//接收模块的网络地址
memcpy(LEDApp_DstAddr.addr.extAddr,DestMac,8);//把MAC地址拷贝到LEDApp_DstAddr.addr.extAddr接收模块的目的地址
// Take the first endpoint, Can be changed to search through endpoints
LEDApp_DstAddr.endPoint = LEDApp_ENDPOINT;//接收模块的端点号
//LEDApp_epDesc结构体 端点描述符有源端点的信息,延时10
//发送 (byte)osal_strlen( theMessageData ) + 1表示发送的字节
AF_DataRequest( &LEDApp_DstAddr, &LEDApp_epDesc,
0x0001,//目标端点簇,房间的连接端点数据宏是1,2个字节,所以在射频是0x0001
(byte)osal_strlen( theMessageData ) + 1,//发送字符串的长度
(byte *)&theMessageData,//字符串内容数组的首地址
&LEDApp_TransID,//记录我们应用层任务发送的数据包个数
AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
}
P0IFG = 0;
P0IF = 0;
return (events ^ LEDApp_MY_EVT);
}
注:
长距离时,为了完全传输可以现在LEDApp_MY_EVT
事件获取(MAC地址对应的模块,的网络短地址),再等待30us去执行LEDApp_SEND_MSG_EVT
事件,LEDApp_SEND_MSG_EVT
MAC地址发送数据。
if ( events & LEDApp_MY_EVT )
{
if(P0_4 == 0)//S5
{
char theMessageData[] = "KEY1按下\n";
LED02 =~LED02;
ZDP_NwkAddrReq(DestMac,ZDP_ADDR_REQTYPE_SINGLE,0,0);//让我们MAC地址对应的模块,把自己的网络短地址回复给我
osal_start_timerEx(LEDApp_TaskID,LEDApp_SEND_MSG_EVT ,30);
}
P0IFG = 0;
P0IF = 0;
return (events ^ LEDApp_MY_EVT);
}
if ( events & LEDApp_SEND_MSG_EVT )
{
LEDApp_DstAddr.addrMode = (afAddrMode_t)Addr64Bit;
//LEDApp_DstAddr.addr.shortAddr = 0x0000;//接收模块的网络地址
memcpy(LEDApp_DstAddr.addr.extAddr,DestMac,8);//把MAC地址拷贝到LEDApp_DstAddr.addr.extAddr接收模块的目的地址
// Take the first endpoint, Can be changed to search through endpoints
LEDApp_DstAddr.endPoint = LEDApp_ENDPOINT;//接收模块的端点号
//LEDApp_epDesc结构体 端点描述符有源端点的信息,延时10
//发送 (byte)osal_strlen( theMessageData ) + 1表示发送的字节
AF_DataRequest( &LEDApp_DstAddr, &LEDApp_epDesc,
0x0001,//目标端点簇,房间的连接端点数据宏是1,2个字节,所以在射频是0x0001
(byte)osal_strlen( theMessageData ) + 1,//发送字符串的长度
(byte *)&theMessageData,//字符串内容数组的首地址
&LEDApp_TransID,//记录我们应用层任务发送的数据包个数
AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
return (events ^ LEDApp_SEND_MSG_EVT);
}