纵有疾风起
人生不言弃

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

组播描述的就是网络中所有节点设备被分组后组内相互通信的过程。确定通信对象的就是节点的组号。
 

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

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


ZigBee组网学习笔记(六)–网络通讯(组播)插图


———————————————–



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

Tools下面
将 f8config.cfg 配 置 文 件 中 的 -RFD_RCVC_ALWAYS_ON=FALSE 改 为
-RFD_RCVC_ALWAYS_ON=
TRUE
 就可以了!
ZigBee组网学习笔记(六)–网络通讯(组播)插图1












原文链接:https://blog.csdn.net/scgaliguodong123_/article/details/41748001

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

未经允许不得转载:起风网 » ZigBee组网学习笔记(六)–网络通讯(组播)
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录