zigbee协议栈初使用(五)点播无线通讯
点播:点对点通讯,即两个设备间通讯,不容许第三个设备接收数据信息。
在AF.h中 有如下定义
typedef enum
{
afAddrNotPresent = AddrNotPresent,
afAddr16Bit = Addr16Bit, //点播方式
afAddr64Bit = Addr64Bit,
afAddrGroup = AddrGroup, //组播方式
afAddrBroadcast = AddrBroadcast //广播方式
} afAddrMode_t;
typedef struct
{
union
{
uint16 shortAddr; //短地址
ZLongAddr_t extAddr; //IEEE地址
} addr;
afAddrMode_t addrMode; //传送模式
byte endPoint; //端点号
uint16 panId; // used for the INTER_PAN feature
} afAddrType_t;
这些是关于组网方式的结构体,后面会用到。
在SampleApp.c中找到如下代码并添加点播定义
afAddrType_t SampleApp_Periodic_DstAddr; //广播
afAddrType_t SampleApp_Flash_DstAddr; //组播
afAddrType_t SampleApp_P2P_DstAddr; //点播
在函数声明处声明点播发送函数
void SampleApp_sendP2P_Message(void);
在初始化函数里添加初始化点播
SampleApp_P2P_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; //点播
SampleApp_P2P_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; //终端
SampleApp_P2P_DstAddr.addr.shortAddr = 0x0000; //协调器地址
添加地址位置在下图
之后添加自己定义的点播发送函数
void SampleApp_SendP2P_Message(void)
{
uint8 data[11] = "0123456789";
if ( AF_DataRequest( &SampleApp_P2P_DstAddr, //P2P的方式
&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_CLUSTERID在头文件中定义如下:
在uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )事件处理函数中将协调器关闭,协调器不需要发送数据
将周期发送函数注释,添加刚刚写的点播发送数据
修改接收函数
最后,因为用到了串口记得初始化串口及添加串口头文件。
本文数据仅周期发送,如果需要点播收发,可以参考上篇串口透传,修改使用串口接收数据包即可。