文章目录
一、相关概念
单播:两个设备相互之间通信,不经过第三方。
当应用程序需要将数据包发送给网络的另一个设备时,使用这种模式。地址模式设置为Addr16Bit。
二、代码讲解
1.打开SampleApp.c,找到afAddrType_t SampleApp_Periodic_DstAddr;并添加
afAddrType_t SampleApp_P2P_DstAddr;
找到afAddrType_t SampleApp_Periodic_DstAddr;并在其后面添加
void SampleApp_Send_P2P_Message(void);
该函数为单播发送数据的函数,这里进行函数声明。
afAddrType_t SampleApp_Periodic_DstAddr; //广播
afAddrType_t SampleApp_Flash_DstAddr; //组播
afAddrType_t SampleApp_P2P_DstAddr; //点播
aps_Group_t SampleApp_Group;
uint8 SampleAppPeriodicCounter = 0;
uint8 SampleAppFlashCounter = 0;
/*********************************************************************
* LOCAL FUNCTIONS
*/
void SampleApp_HandleKeys( uint8 shift, uint8 keys );
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
void SampleApp_SendPeriodicMessage( void );
void SampleApp_SendFlashMessage( uint16 flashTime );
void SampleApp_Send_P2P_Message(void);

2.找到 SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//广播
SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;并在后面添加(可能已经有了)
SampleApp_P2P_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; //点播
SampleApp_P2P_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_P2P_DstAddr.addr.shortAddr = 0x0000;
0X0000为协调器的地址

3.增加发送函数内容

在void SampleApp_Send_P2P_Message( void )中可以将自己想要发送的数据,发送出去,可以在该函数中完成数据的处理并送出去。
发送函数
if ( AF_DataRequest( &SampleApp_P2P_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_P2P_CLUSTERID,
10,
data,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
SampleApp_P2P_DstAddr为第一步中定义的。SAMPLEAPP_P2P_CLUSTERID是在SampleApp.h中定义的
#define SAMPLEAPP_MAX_CLUSTERS 3
#define SAMPLEAPP_P2P_CLUSTERID 3
需要修改最大值,然后再添加。

4. 发送端:找到轮询事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT
// Send a message out - This event is generated by a timer
// (setup in SampleApp_Init()).
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )
{
// Send the periodic message
//SampleApp_SendPeriodicMessage();
SampleApp_Send_P2P_Message();
// 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);
}

在这里周期性的调用SampleApp_Send_P2P_Message发送函数
5.接收端处理
找到SampleApp_MessageMSGCB函数

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint16 flashTime;
switch ( pkt->clusterId )
{
case SAMPLEAPP_P2P_CLUSTERID:
HalUARTWrite(0, "Rx:", 3); //提示接收到数据
HalUARTWrite(0, pkt->cmd.Data, pkt->cmd.DataLength); //串口输出接收到的数据
HalUARTWrite(0, "\n", 1); // 回车换行
break;
case SAMPLEAPP_PERIODIC_CLUSTERID:
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;
}
}
在case SAMPLEAPP_P2P_CLUSTERID:下面便可以进行单播数据的处理。
三、问题
1.最终的现象就是,终端周期性发送数据,协调器接收到。
(回家了,下学期去吧串口的图片补上。)

1989

被折叠的 条评论
为什么被折叠?



