功能
通过终端(端点10)以广播的形式向局域网内10号端点发送信息。
终端(发送):端点设置为10,簇为0x0001,发送到网络中所有10号端点模块,簇0x0001
协调器、路由器(接收):端点设置为10,簇为0x0001
注:如果协调器、路由器(接收)的端点不是设置为10或簇不为0x0001,都将接收不到广播数据。
代码
协调器:主要接受
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];//首地址
LED02 =~LED02;
UartTX_Send_String( pkt->cmd.Data,pkt->cmd.DataLength);
break;
}
}
路由器:
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];//首地址
LED02 =~LED02;
UartTX_Send_String( pkt->cmd.Data,pkt->cmd.DataLength);
break;
}
}
终端:(发送)
if ( events & LEDApp_MY_EVT )
{
if(P0_4 == 0)//S5
{
char theMessageData[] = "KEY1按下\n";
LED02 =~LED02;
LEDApp_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//广播
LEDApp_DstAddr.addr.shortAddr = 0xFFFF;//目标接收模块是网络所有节点
// 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 );
}
if(P0_5 == 0)//S5
{
}
// P0_1 =~P0_1;//led2
P0IFG = 0;
P0IF = 0;
return (events ^ LEDApp_MY_EVT);
}
enum
{
AddrNotPresent = 0,
AddrGroup = 1,
Addr16Bit = 2,//单播
Addr64Bit = 3,
AddrBroadcast = 15//广播
};
说明
- 广播:可以理解为,发送模块发出数据,这个网络里所有节点模块都可以拿到这个数据。
- 广播发送过程:终端发送模块,定义了端点10号,发送出去的方式,目标是网络里所有的节点;其中制定接收的模块,接收这个数据的端点号10,接收簇是0x0001。
- 协调器和路由器接收模块过程:定义了端点10,与应用层挂钩;一旦外部给本模块发送数据时,就会进入这个应用层任务事件处理函数
uint16 LEDApp_ProcessEvent( uint8 task_id, uint16 events )
->void LEDApp_MessageMSGCB( afIncomingMSGPacket_t *pkt );
外部来数据这个消息里,判断LEDApp_CLUSTERID
0x0001;就实现内部代码,通过串口打印接收到是数据。 - 网络特性:
a.协调器创建网络之后,就和网络里的路由器节点在通信过程中、功能上没有任何区别,只不过网络地址有点特殊,永远都是0x0000。
b.终端入网后,他和网络里其他节点数据收和发都要经过他的父节点(路由器)转发。
c.路由器在入网的时候:虽然网络里也有他的父节点,有父子关系,但是他们发数据的时候,不需要父节点转发,入网后协调器和所有的路由器,他们的通信地位是平等的。 - 无线数据包解析:网络源地址 网络目标地址,表示这个无线数据包的目的 是从源地址 发送 到目标地址,而在这个无线数据包里,前面的源地址和目标地址代码,当前的这个无线数据包,是从哪一个模块发出来的,当前这个无线数据包要去哪一个节点。