数据发送函数原型:
afStatus_t AF_DataRequest( afAddrType_t *dstAddr, //指向发送目的地址指针
endPointDesc_t *srcEP, //指向目的端点的端点描述符指针
uint16 cID, //发送端点的输出簇ID
uint16 len, //发送字节数
uint8 *buf, //指向发送数据缓存的指针
uint8 *transID, //发送序列号指针,如果消息缓存发送,这个序列号将增加1
uint8 options, //发送选项 路由发现
uint8 radius //最大条数半径 路由域
)
一般配置模式:
afAddrType_t my_DstAddr;
my_DstAddr.addrMode = (afAddrMode_t)Addr16Bit; //寻址方式
my_DstAddr.endPoint = GENERICAPP_ENDPOINT; //设置端口号
my_DstAddr.addr.shortAddr = 0x0000; //协调器的短地址
AF_DataRequest( &my_DstAddr, &GenericApp_epDesc, //发送目的地址、发送的端点描述符
GENERICAPP_CLUSTERID, //簇 ID
sizeof(data_buffer), //发送的字节长度
(uint8 *)&data_buffer, //发送的数据
&GenericApp_TransID, //发送的数据ID序号
AF_DISCV_ROUTE, //可选一项或几项 路由发现
AF_DEFAULT_RADIUS ); //路由域
路由发现选项:
#define AF_ACK_REQUEST 0x10 //APS层应答确认请求,只使用在单播模式中
#define AF_DISCV_ROUTE 0x20 // 如果要使设备发现路由,将一直使用此选项
#define AF_EN_SECURITY 0x40 //如果使用这个选项将导致设备跳过路由直接发送消息
#define AF_SKIP_ROUTING 0x80 //保留
发送数据的目的地址:
typedef struct
{
union
{
uint16 shortAddr; //目的地址,短地址或长地址
ZLongAddr_t extAddr;
} addr;
afAddrMode_t addrMode; //地址模式,枚举类型,有四种模式
uint8 endPoint; //端点信息
uint16 panId; //网络PANID
} afAddrType_t;
地址模式中的四种寻址方式:
typedef enum
{
afAddrNotPresent = AddrNotPresent, //间接寻址 多用于绑定,当不知道目标地址时,从绑定表中查找
afAddr16Bit = Addr16Bit, //单点寻址,指定短地址 用于点对点通信
afAddr64Bit = Addr64Bit, //单点寻址,指定长地址 用于点对点通信
afAddrGroup = AddrGroup, //组播寻址 使用前必须定义组
afAddrBroadcast = AddrBroadcast //广播寻址
} afAddrMode_t;
广播寻址四种模式:
0xFFFF:数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父节点,直到它苏醒后主动到父节点查询,或者直到消息超时丢失数据包(此为默认值)
0xFFFD:除了睡眠中的任何设备
0xFFFC:发送给所有的路由器,包括协调器
0xFFFE :不指定目标地址,而是通过协议栈读取绑定表获得相应额度的目标设备的短地址
关于发送函数长度的问题:
osal_strlen(theMessageData)+1, 如果不在发送函数中加入这一句,会出现速率倍增问题
广播与单播通信实验!!!!