所謂組播拄踪,就是在網(wǎng)絡(luò)中所有節(jié)點(diǎn)設(shè)備被分組后組內(nèi)相互通信的過(guò)程。
通過(guò)節(jié)點(diǎn)的組號(hào)來(lái)確定通信對(duì)象。
1.組播參數(shù)設(shè)置
在文件SampleApp.c中,已經(jīng)定義了組播地址以及組播內(nèi)容
afAddrType_t SampleApp_Flash_DstAddr;//組播地址類型
aps_Group_t SampleApp_Group;//組播內(nèi)容
組播的地址參數(shù)設(shè)置如下:
// Setup for the flash command's destination address - Group 1
SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;//地址類型為組播
SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;
組播的分組參數(shù)設(shè)置如下,將原有的ID修改為對(duì)應(yīng)的SAMPLEAPP_FLASH_GROUP贸人,便于以后對(duì)分組的擴(kuò)展:
// By default, all devices start out in Group 1
//SampleApp_Group.ID = 0x0001;
SampleAPP_Group.ID=SAMPLEAPP_FLASH_GROUP;//Kevin@20161118
osal_memcpy( SampleApp_Group.name, "Group 1", 7 );
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
SAMPLEAPP_FLASH_GROUP的定義在SampleApp.h文件中
// Group ID for Flash Command
#define SAMPLEAPP_FLASH_GROUP 0x0001
- 組播發(fā)送函數(shù)
在SampleApp.c文件中添加組播發(fā)送函數(shù)實(shí)現(xiàn)及其函數(shù)聲明间景。
void SampleApp_sendGroupMessage()
{
uint8 data[10]={'0','1','2','3','4','5','6','7','8','9'};//定義發(fā)送內(nèi)容
//uint8 data[10]="0123456789";
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.
}
}
其中佃声,SAMPLEAPP_FLASH_CLUSTERID的定義在SampleApp.h文件中:
#define SAMPLEAPP_FLASH_CLUSTERID 2
在函數(shù)uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
中調(diào)用組播發(fā)送函數(shù)
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// Send the periodic message
//SampleApp_SendPeriodicMessage();//周期廣播發(fā)送函數(shù)
//SampleApp_SendPointToPointMessage(); //點(diǎn)對(duì)點(diǎn)通信發(fā)送函數(shù)
SampleApp_sendGroupMessage(); //組播通信發(fā)送函數(shù)
// Setup to send message again in normal period (+ a little jitter)
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );
// return unprocessed events
return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
}
- 組播接收函數(shù)
在函數(shù)void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
中修改case SAMPLEAPP_FLASH_CLUSTERID
case SAMPLEAPP_FLASH_CLUSTERID:
HalUARTWrite(0,"Group Message:",14);//提示信息
HalUARTWrite(0,pkt->cmd.Data,pkt->cmd.DataLength);//打印接收到的數(shù)組
HalUARTWrite(0,"\n",1);//回車換行
//flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
//HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
break;
4.下載程序,查看實(shí)驗(yàn)結(jié)果
程序修改完成之后分別以1個(gè)協(xié)調(diào)器倘要、兩個(gè)路由器的方式下載到3個(gè)節(jié)點(diǎn)設(shè)備中圾亏,將協(xié)調(diào)器和路由器1的組號(hào)(Rebuild All之前修改SampleApp_Group.ID的值)設(shè)置為**SAMPLEAPP_FLASH_GROUP **,即0x0001封拧,路由器設(shè)備2設(shè)置為0x0002志鹃,節(jié)點(diǎn)設(shè)備通過(guò)串口與PC相連,查看串口接收的信息泽西。
結(jié)論:在組播通信中曹铃,只有組內(nèi)的節(jié)點(diǎn)設(shè)備(協(xié)調(diào)器和路由器1)才能進(jìn)行通信。
注
終端設(shè)備不參與組播捧杉,因?yàn)樵赟ampleApp例程中終端設(shè)備默認(rèn)采取睡眠中斷的工作方式陕见,射頻不是一直工作,協(xié)議規(guī)范中規(guī)定睡眠中斷不接收組播信息味抖,因此下載組播程序到終端中评甜,終端設(shè)備并不能正常接收組播信息。
當(dāng)然仔涩,如果確需終端設(shè)備參與到組播中忍坷,確保終端設(shè)備可以接收到組播信息,那么根據(jù)協(xié)議規(guī)范可知,需要終端設(shè)備的接收機(jī)一直處于開機(jī)狀態(tài)佩研。將配置文件f8config.cfg中的
-RFD_RCVC_ALWAYS_ON=FALSE
修改為-RFD_RCVC_ALWAYS_ON=TRUE
即可柑肴。