點播即點對點通信,也就是在兩個設(shè)備之間進行通信决左,不允許有第三個設(shè)備收到信息撒踪。
點播描述的就是網(wǎng)絡(luò)中兩個節(jié)點之間相互通信的過程,通過16bit短地址來確定通信對象浦箱。
- step 1 定義點播方式
打開SampleApp.c文件,找到組播吸耿、廣播的定義
afAddrType_t SampleApp_Periodic_DstAddr;
afAddrType_t SampleApp_Flash_DstAddr;
按照上述格式添加點播定義
afAddrType_t SampleApp_PointToPoint_DstAddr;//定義點對點通信
在函數(shù)void SampleApp_Init( uint8 task_id )
中配置SampleApp_PointToPoint_DstAddr的相關(guān)參數(shù)(可參考對SampleApp_Periodic_DstAddr和SampleApp_Flash_DstAddr的配置):
SampleApp_PointToPoint_DstAddr.addrMode = (afAddrMode_t)afAddr16Bit;//地址類型為點播地址
SampleApp_PointToPoint_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_PointToPoint_DstAddr.addr.shortAddr = 0x0000;//發(fā)送給協(xié)調(diào)器
- step 2 添加點對點發(fā)送函數(shù)
復(fù)制函數(shù)void SampleApp_SendPeriodicMessage( void )
祠锣,修改相應(yīng)的變量即可
/*********************************************************************
* @fn SampleApp_SendPointToPointMessage
*
* @brief Send the point to pont message .
*
* @param none
*
* @return none
*/
void SampleApp_SendPointToPointMessage()
{
uint8 data[10]={'0','1','2','3','4','5','6','7','8','9'};//定義發(fā)送內(nèi)容
// uint8 data[10]="0123456789";//上述方式二選一
if(AF_DataRequest(&SampleApp_PointToPoint_DstAddr,&SampleApp_epDesc,
SAMPLEAPP_POINTTOPOINT_CLUSTERID,
10,
data,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS) == afStatus_SUCCESS)
{
}
else
{
// Error occurred in request to send.
}
}
函數(shù)實現(xiàn)后請在SampleApp.c文件開頭添加函數(shù)聲明
void SampleApp_SendPointToPointMessage(void);
除此之外,還要添加SAMPLEAPP_POINTTOPOINT_CLUSTERID的定義咽安,具體位置可通過在SAMPLEAPP_PERIODIC_CLUSTERID上右鍵Go to definition of SAMPLEAPP_PERIODIC_CLUSTERID來確定伴网。
#define SAMPLEAPP_POINTTOPOINT_CLUSTERID 3
將宏定義SAMPLEAPP_MAX_CLUSTERS的值更改為3
#define SAMPLEAPP_MAX_CLUSTERS 3
找到函數(shù)uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
,在周期性事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT中調(diào)用點對點通信發(fā)送函數(shù)妆棒,同時注釋掉原有的SampleApp_SendPeriodicMessage();
函數(shù):
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// Send the periodic message
//SampleApp_SendPeriodicMessage();//周期廣播發(fā)送函數(shù)
SampleApp_SendPeriodicMessage(); //點對點通信發(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);
}
- 修改消息接收ID
在函數(shù)void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
中澡腾,修改clusterId,將原有周期發(fā)送的SAMPLEAPP_PERIODIC_CLUSTERID更改為點對點通信的SAMPLEAPP_POINTTOPOINT_CLUSTERID糕珊,然后將接收的數(shù)據(jù)打印到串口动分,具體代碼如下:
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint16 flashTime;
switch ( pkt->clusterId )
{
//case SAMPLEAPP_PERIODIC_CLUSTERID:
//break;
case SAMPLEAPP_POINTTOPOINT_CLUSTERID:
HalUARTWrite(0,"Point_To_Point Communication\n",29);
//此處不要用sizeof計算字符串長度,否則會導(dǎo)致串口顯示的數(shù)據(jù)出錯或者不完整
HalUARTWrite(0,pkt->cmd.Data,pkt->cmd.DataLength);//打印收到的數(shù)據(jù)
HalUARTWrite(0,"\n",1);//換行
break;
case SAMPLEAPP_FLASH_CLUSTERID:
flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
break;
}
}
- 注釋協(xié)調(diào)器的周期事件
協(xié)調(diào)器不需要周期性發(fā)送數(shù)據(jù)红选,在函數(shù)uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
注釋掉協(xié)調(diào)器的周期性事件
if ( //(SampleApp_NwkState == DEV_ZB_COORD)||//協(xié)調(diào)器的周期性事件
(SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE) )
{
// Start sending the periodic message in a regular interval.
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
}
- 上電測試
將修改后的程序分別以CoordinatorEB澜公、RouterEB和EndDeviceEB的方式分別下載到三個節(jié)點中,并通過串口與PC相連喇肋,在串口中查看接收到的信息如下圖坟乾。
附
注意一下定義的區(qū)別和用法:
類型 | 定義 |
---|---|
整型數(shù)組 | int num[10]={0,1,2,3,4,5,6,7,8,9}; |
字符數(shù)組 | char ch[10]={'0','1','2','3','4','5','6','7','8','9'}; |
字符串 | char string[10]="0123456789"; |
字符串 | char string[10]={"0123456789"}; |
字符串?dāng)?shù)組 | char *week[10]={"sunday","monday","tuesday","wednesday","thursday","friday","saturday"}; |