当前位置: 代码迷 >> 综合 >> ZigBee组网学习笔记(六)--网络通讯(广播)
  详细解决方案

ZigBee组网学习笔记(六)--网络通讯(广播)

热度:78   发布时间:2024-01-09 19:28:42.0
广播就是任何一个节点设备发出广播数据,网络中的任何设备都能收到。

广播的定义都是协议栈预先定义好的。所以我们直接来运用就可以了。


==========================================
初始化串口(参考协议栈串口实验)

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;
#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; //广播 
SampleApp_Periodic_DstAddr.endPoint =SAMPLEAPP_ENDPOINT;  //20
SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;   //广播地址

--------------------------------
0xFFFF 是广播地址。协议栈广播地址主要有 3 种类型: 
具体的定义如下:
0xFFFF——数据包将被传送到网络上的所有设备
包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时。
0xFFFD——数据包将被传送到网络上的所有在空闲
打开接收的设备(RXONWHENIDLE) ,也就是说,除了睡眠中的所有设备。
0xFFFC——数据包发送给所有的路由器,包括协调器。


enum
{
  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.
  }
}

--------------------------------
#defineSAMPLEAPP_PERIODIC_CLUSTERID 1


3--============================================
//发送数据
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
// 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;

--------------------------------
将修改后的程序分别以协调器、路由器、终端的方式下载到 3 个设备,可以看到各个设备都在广播发送信息,同时也接收广播信息。