接受到的数据放在哪啦?
从天线里接受到的数据后,ZigBee协议栈将收到的数据以及与该数据相关的信息(如:RSS值、链路质量、组号)。然后打包存储起来。打包时使用到的数据结构是afIncomingMSGPacket_t。
afIncomingMSGPacket_t结构如下:
// Filename: AF.h
typedef struct
{
osal_event_hdr_t hdr; /* OSAL Message header 事件头*/
uint16 groupId; /* Message's group ID - 0 if not set */
uint16 clusterId; /* Message's cluster ID */
afAddrType_t srcAddr; /* Source Address, if endpoint is STUBAPS_INTER_PAN_EP,
it's an InterPAN message */
uint16 macDestAddr; /* MAC header destination short address */
uint8 endPoint; /* destination endpoint 存储端口号*/
uint8 wasBroadcast; /* TRUE if network destination was a broadcast address */
uint8 LinkQuality; /* The link quality of the received data frame 链路质量*/
uint8 correlation; /* The raw correlation value of the received data frame */
int8 rssi; /* The received RF power in units dBm RSSI值*/
uint8 SecurityUse; /* deprecated */
uint32 timestamp; /* receipt timestamp from MAC */
afMSGCommandFormat_t cmd; /* Application Data 应用数据,该成员变量是关键,详细见下面*/
} afIncomingMSGPacket_t;
上面afIncomingMSGPacket_t结构中有个成员变量afMSGCommandFormat_t cmd; 该结构如下:
//AF.h
// Generalized MSG Command Format
typedef struct
{
byte TransSeqNumber; //存储的是发送序列号
uint16 DataLength; // Number of bytes in TransData 传输数据的长度
byte *Data; //存储的接受数据缓冲区的指针。
} afMSGCommandFormat_t;
//消息处理函数
UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events)
{
afIncomingMSGPacket_t* MSGpkt;//MSGpkt用于指向接收消息结构体的指针
if(events&SYS_EVENT_MSG)
{
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);//osal_msg_receive()从消息队列上接收消息
while(MSGpkt)
{
switch(MSGpkt->hdr.event) //消息的头部中的event进行匹配
{
case AF_INCOMING_MSG_CMD: //接受到新数据的消息的ID是AF_INCOMING_MSG_CMD,这个宏是在协议栈中定义好的值为0x1A
//接受到的是无线数据包
GenericApp_MessageMSGCB(MSGpkt);//功能是完成对接受数据的处理
break;
default:
break;
}
osal_msg_deallocate((uint8 *)MSGpkt);//接收到的消息处理完后,释放消息所占的存储空间
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
//处理完一个消息后,再从消息队列里接受消息,然后对其进行相应处理,直到所有消息处理完
}
return (events ^ SYS_EVENT_MSG);
}
return 0;
}
注意上面的MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);//osal_msg_receive()从消息队列上接收消息
以及判断下选择GenericApp_MessageMSGCB(MSGpkt);//功能是完成对接受数据的处理,
void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pkt)
{
unsigned char buffer[4]= " ";
switch(pkt->clusterId) //对消息中的簇中的命令ID进行匹配。
{
case GENERICAPP_CLUSTERID:
osal_memcpy(buffer,pkt->cmd.Data,3);
if((buffer[0]=='L')&&(buffer[1]=='E')&&(buffer[2]=='D'))
{
HalLedBlink(HAL_LED_2,0,50,500); //LED2 闪烁
}
else
{
HalLedSet(HAL_LED_2,HAL_LED_MODE_ON);//其他内容 LED2 亮 这几个函数在哪里定义了呢????
}
break;
}
}
注意,这里数据的传递都是通过传递指针的方式来实现。这样省时省电。
本文参考自:《ZigBee无线传感器网络设计与实现》 王小强等人编著化学工业出版社