广播就是任何一个节点设备发出广播数据,网络中的任何设备都能收到。
广播的定义都是协议栈预先定义好的。所以我们直接来运用就可以了。
广播的定义都是协议栈预先定义好的。所以我们直接来运用就可以了。
==========================================
初始化串口(参考协议栈串口实验)
1、
SampleApp.c
#include "MT_UART.h" //串口头文件引用
2、
SampApp.c
SampApp_Init()
SampApp_TransID() = 0;
MT_UartInit();
3、
void MT_UartInit()
uartConfig.baudRate =MT_UART_DEFAULT_BAUDRATE;
uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;
uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200 //38400
#define MT_UART_DEFAULT_OVERFLOW FALSE //TRUE
4、
用 ZTOOL,串口 0。我们可以在 option——C/C++ 的 CompilerPreprocessor 里面看到,已经默认添加 ZTOOL_P1 预编译。
5、
void SampleApp_Init( uint8 task_id )
MT_UartInit();
MT_UartRegisterTaskID(task_id);//登记任务号
至此,就可以使用 HalUARTWrite(0, "Hello,world\n", 12); //(串口, 字符, 字符个数) 发送数据了。
==========================================
1--============================================
广播参数配置
SampleApp.c
void SampleApp_Init( uint8 task_id )
// Setup for the periodic message's destination address
// Broadcast to everyone
SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast; //广播
// Broadcast to everyone
SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast; //广播
SampleApp_Periodic_DstAddr.endPoint =SAMPLEAPP_ENDPOINT; //20
SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF; //广播地址
SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF; //广播地址
--------------------------------
0xFFFF 是广播地址。协议栈广播地址主要有 3 种类型:
具体的定义如下:
0xFFFF——数据包将被传送到网络上的所有设备,
包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时。
0xFFFD——数据包将被传送到网络上的所有在空闲时
打开接收的设备(RXONWHENIDLE) ,也就是说,除了睡眠中的所有设备。
0xFFFC——数据包发送给所有的路由器,包括协调器。
具体的定义如下:
0xFFFF——数据包将被传送到网络上的所有设备,
包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时。
0xFFFD——数据包将被传送到网络上的所有在空闲时
打开接收的设备(RXONWHENIDLE) ,也就是说,除了睡眠中的所有设备。
0xFFFC——数据包发送给所有的路由器,包括协调器。
enum
{
AddrNotPresent = 0,
AddrGroup = 1,
Addr16Bit = 2,
Addr64Bit = 3,
AddrBroadcast = 15
};
{
AddrNotPresent = 0,
AddrGroup = 1,
Addr16Bit = 2,
Addr64Bit = 3,
AddrBroadcast = 15
};
#defineSAMPLEAPP_ENDPOINT 20
--------------------------------
2--============================================
SampleApp.c
void SampleApp_SendPeriodicMessage( void )
{
uint8 data[10]={'0','1','2','3','4','5','6','7','8','9'};//自定义数据
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_PERIODIC_CLUSTERID, //广播传输编号 发送 ID
10,//字节数
data,//指针头
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
{
uint8 data[10]={'0','1','2','3','4','5','6','7','8','9'};//自定义数据
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_PERIODIC_CLUSTERID, //广播传输编号 发送 ID
10,//字节数
data,//指针头
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
--------------------------------
#defineSAMPLEAPP_PERIODIC_CLUSTERID 1
3--============================================
//发送数据
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
// Send the periodic message
SampleApp_SendPeriodicMessage();//周期性发送函数
// Send the periodic message
SampleApp_SendPeriodicMessage();//周期性发送函数
--------------------------------
接收方面:
1--============================================
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
uint16 flashTime;
switch ( pkt->clusterId )
case SAMPLEAPP_PERIODIC_CLUSTERID: //接收ID
HalUARTWrite(0,"I get data\n",11);//用于提示有数据
HalUARTWrite(0, &pkt->cmd.Data[0],10); //打印收到数据
HalUARTWrite(0,"\n",1); //回车换行,便于观察
break;
uint16 flashTime;
switch ( pkt->clusterId )
case SAMPLEAPP_PERIODIC_CLUSTERID: //接收ID
HalUARTWrite(0,"I get data\n",11);//用于提示有数据
HalUARTWrite(0, &pkt->cmd.Data[0],10); //打印收到数据
HalUARTWrite(0,"\n",1); //回车换行,便于观察
break;
--------------------------------
将修改后的程序分别以协调器、路由器、终端的方式下载到 3 个设备,可以看到各个设备都在广播发送信息,同时也接收广播信息。