组播描述的就是网络中所有节点设备被分组后组内相互通信的过程。确定通信对象的就是节点的组号。
==========================================
初始化串口(参考协议栈串口实验)
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中
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;
{
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;
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 );
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 //组号
#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 )
{
{
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.
}
}
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( );//周期性组播
// 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;
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 例程中终端设备默认采用睡眠中断的工作方式,射频不是一直工作,我们可以下载组播例程到终端,发现不能正常接收组播信息。确实需要使用终端设备参与组播可以参考下面方法:
这个在协议规范里面是有规定的,睡眠中断不接收组播信息,如果一定想要接收的话,只有将终端的接收机一直打开,这样就可以接收到了。具体做法为:
刚刚我们提到终端设备不参与组播,原因是 SampleAPP 例程中终端设备默认采用睡眠中断的工作方式,射频不是一直工作,我们可以下载组播例程到终端,发现不能正常接收组播信息。确实需要使用终端设备参与组播可以参考下面方法:
这个在协议规范里面是有规定的,睡眠中断不接收组播信息,如果一定想要接收的话,只有将终端的接收机一直打开,这样就可以接收到了。具体做法为:
Tools下面
将 f8config.cfg 配 置 文 件 中 的 -RFD_RCVC_ALWAYS_ON=FALSE 改 为
-RFD_RCVC_ALWAYS_ON=
TRUE
就可以了!