关注zigbee(四)--无线收发

对于使用者来说,最基本的就是先搞清楚无线收发。

无线收发有两种方式:

1、调用最基本的底层收发函数,即读写寄存器收发,不经过协议栈。这种收发方式最直接,但是没有安全和可靠性保障,不利于组网。

2、利用协议栈收发,应用层只关心数据本身

先说方式一,方式一的官方说法是Basic RF。它的数据包是802.15.4的格式。但是没有扫描的功能,没有节点,协调器,路由的说法,不会自动加入网路,重传数据包。

发送: 调用uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length) , 填入目的地址,要发送的数据载荷以及长度。

接收:通过不断查询标志位 while(!basicRfPacketIsReady());来检测是否收到数据包,这个标志位在接收中断中被置位;检测到收到数据后,通过basicRfReceive来读取数据。


方式二:

协议栈的发送函数

afStatus_t AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP,
                           uint16 cID, uint16 len, uint8 *buf, uint8 *transID,
                           uint8 options, uint8 radius )

第一个参数afAddrType_t *dstAdd 是 目的地址

第二个参数endPointDesc_t *srcEP 发送节点的描述符

第三个参数cID, 即消息ID号,接收方利用该ID来解析消息。

第四个参数 len, 消息长度。

第五个参数buf, 指向要发送的数据。

第六个参数transID,发送 序列号

第六个参数options 发送选项

第七个参数radius  通常设置为 AF_DEFAULT_RADIUS


接收:

在任务注册的处理函数中取到数据。比如官方例子 SampleApp_ProcessEvent,

1 通过uint8 *osal_msg_receive( uint8 task_id )读取对应任务的消息,该函数的输入参数为 task_id,即任务注册时的ID。

2、从协议栈送上来的数据包,被协议栈打包为afIncomingMSGPacket_t 的形式,它里面包含了地址,RSSI事件类型,事件相关的数据。根据 MSGpkt->hdr.event分辨出消息的类型,然后进入不同的分支进行处理。

2.1 普通接收消息通常为AF_INCOMING_MSG_CMD类型,进入SampleApp_MessageMSGCB进行处理。

   SampleApp_MessageMSGCB 里面再根据消息的cluster id(pkt->clusterId )分别进行处理。可见,这里将收到的包分两个层次进行处理,首先是事件类型,然后是包的cluster id。 这个ID在发送函数里提到过。

afMSGCommandFormat_t 中的 afMSGCommandFormat_t cmd 包含了序列号,包长度,包的数据。结构体如下。

typedef struct
{
  uint8   TransSeqNumber;
  uint16  DataLength;              // Number of bytes in TransData
  uint8  *Data;
} afMSGCommandFormat_t;










你可能感兴趣的:(无线技术)