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

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

热度:97   发布时间:2024-01-09 19:28:56.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中

afAddrType_t   SampleApp_Flash_DstAddr; //组播
aps_Group_t SampleApp_Group; //分组内容

-----------------------------------------------
typedef struct
{
  union
  {
    uint16      shortAddr;
    ZLongAddr_t extAddr;
  } addr;
  afAddrMode_t addrMode;
  uint8 endPoint;
  uint16 panId;  // used for the INTER_PAN feature
} afAddrType_t;

// Group Table Element   //组播内容结构体
typedef struct
{
  uint16 ID;                       // Unique to this table
  uint8  name[APS_GROUP_NAME_LEN]; // Human readable name of group
} aps_Group_t;


2--========================================
***定义的组信息代码,将 ID 修改成组号相对应 ,方便以后自己扩展分组需 要” SAMPLEAPP_FLASH_GROUP”
void SampleApp_Init( uint8 task_id )
//组播参数配置
SampleApp_Group.ID = SAMPLEAPP_FLASH_GROUP;//0x0001;
osal_memcpy( SampleApp_Group.name, "Group 1", 7  );
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
-----------------------------------------------

// Group ID for Flash Command
#define SAMPLEAPP_FLASH_GROUP                0x0002// 0x0001    //组号


3--========================================
声明  void SampleApp_SendFlashMessage(  void  );

定义
void SampleApp_SendFlashMessage( void )
{
  uint8 data[10]={'0','1','2','3','4','5','6','7','8','9'};//自定义数据
  if ( AF_DataRequest( & SampleApp_Flash_DstAddr,
                       &SampleApp_epDesc,
                       SAMPLEAPP_FLASH_CLUSTERID,  //组播传输编号
                       10,
                       data,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  }
  else
  {
    // Error occurred in request to send.
  }
}

-----------------------------------------------
#define SAMPLEAPP_FLASH_CLUSTERID     2
-----------------------------------------------


4--========================================
SampleApp.c
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
    // Send the periodic message 
    SampleApp_SendFlashMessage( );//周期性组播
-----------------------------------------------

接收方面:
1--========================================
SampleApp.c
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
//uint16 flashTime;
switch ( pkt->clusterId )   //cluster集群

case  SAMPLEAPP_FLASH_CLUSTERID:
HalUARTWrite(0,"I get data\n",11);//用于提示有数据
HalUARTWrite(0, &pkt->cmd.Data[0],10); //打印收到数据
HalUARTWrite(0,"\n",1);  //回车换行,便于观察
//  flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
  // HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
      break;
-----------------------------------------------

2-----------------------------------------------
将修改后的程序分别以 1 个协调器、 2 个路由器的方式下载到 3 个设备,把协调器和路由器组号 1 设置成 0x0001,路由器设备 2 组号设成 0x0002。如图所示;连接串口,可以观察到只有 0x0001 的两个设备相互发送信息。 
SampleApp.h

-----------------------------------------------

组播知识扩展:
刚刚我们提到终端设备不参与组播原因是 SampleAPP 例程中终端设备默认采用睡眠中断的工作方式,射频不是一直工作,我们可以下载组播例程到终端,发现不能正常接收组播信息。确实需要使用终端设备参与组播可以参考下面方法:
这个在协议规范里面是有规定的,睡眠中断不接收组播信息,如果一定想要接收的话,只有将终端的接收机一直打开,这样就可以接收到了具体做法为:
Tools下面 将 f8config.cfg 配 置 文 件 中 的 -RFD_RCVC_ALWAYS_ON=FALSE 改 为
-RFD_RCVC_ALWAYS_ON= TRUE  就可以了!