目录
利用ZigBee协议栈进行数据传输对的目标,在无线传感器网络中,大多数传感节点负责数据的采集工作,如温度,湿度,压力,烟雾浓度等信息。以下通过例子展示传感器数据的采集,传输与现实基本流程。
协调器建立ZigBee网络,终端节点自动加入该网络中,然后终端节点周期性地采集温度数据并将其发送给协调器,协调器收到温度数据后,通过串口将其输出到用户PC机。
协调器编程:
//Coordinator.h
typedef union h
{
uint8 TEMP[4];
struct RFRXBUF
{
unsigned char Head; //命令头
unsigned char value[2]; //温度数据
unsigned char Tail; //命令尾
}BUF;
}TEMPERATURE;
此时实验的数据包格式如下:
通过一个共用体来表示整个数据包,里面有两个成员变量,一个是数组TEMP,该数组有4个元素;另一个是结构体,该结构体具体实现了数据包的数据头,温度数据,数据尾。
//Coordinator.c
void GenericApp_Init( byte task_id )
{
halUARTCfg_t uartConfig;
GenericApp_TaskID = task_id;
GenericApp_TransID = 0;
GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
GenericApp_epDesc.task_id = &GenericApp_TaskID;
GenericApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
GenericApp_epDesc.latencyReq = noLatencyReqs;
afRegister( &GenericApp_epDesc );
uartConfig.configured = TRUE;
uartConfig.baudRate = HAL_UART_BR_115200;
uartConfig.flowControl = FALSE;
uartConfig.callBackFunc = NULL; //此时不需要回调函数了,设置为NULL
HalUARTOpen(0, &uartConfig);
}
初始化系统和串口函数
//Coordinator.c
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
unsigned char buffer[2]={0x0A , 0x0D}; //定义温度的位数字节,回车换行符的ASCII码
TEMPERATURE temperature;
switch ( pkt->clusterId )
{
case GENERICAPP_CLUSTERID:
osal_memcpy( & temperature,pkt->cmd.Data,sizeof(temperature));
HalUARTWrite(0,(uint8 *)&temperature,sizeof(temperature));
HalUARTWrite(0,buffer,2);
break;
}
}
数组buffer中存储的是回车换行符的ASCII码,主要是为了向串口发送一个回车换行符号;定义一个TEMPERATURE类型的变量用于存储接收到的数据;使用osal_memcpy()函数,并将接收到的数据拷贝到temperature中;通过HalUARTWrite()函数向串口发送数据。
终端节点编程:
CC2530单片机内部有温度传感器,步骤如下:
1)使能温度传感器;
2)连接温度传感器到ADC;
3)初始化ADC,确定参考电压,分辨率等;
4)启动ADC读取温度数据
//Enddevice.c
void GenericApp_SendTheMessage( void )
{
//unsigned char theMessageData[10] = "EndDevice";
uint8 tvalue;
TEMPERATURE temperature;
temperature.BUF.Head = '&';
tvalue = readTemp();
temperature.BUF.value[0] = tvalue / 10 + '0';
temperature.BUF.value[1] = tvalue % 10 + '0';
temperature.BUF.Tail = 'C';
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,
sizeof(temperature),
(uint8 *)&temperature,
&GenericApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) ;
}
使用TEMPERATURE类型的变量temperature,使得发送和接收双方共同使用数据包格式;填充命令头,读取温度数据,将数据转换为ASCII码,填充命令尾;初始化目的地址以及发送格式,使用单播发送,协调器的网络地址是0x0000;调用数据发送函数AF_DataRequest()进行数据发送