zigbee无线数据透明传输系统1.4.3和1.4.2的差不多。
协调器工程设置选项:
CC2430EB
COORDINATOR_BINDING
HAL_UART 串口
SERIAL_APP_PORT=0 串口号,初始化中位0
xLCD_SUPPORTED 没有lcd,取消预编译
REFLECTOR 1.4.3中多了这个绑定,
路由和终端设备工程选项设置
CC2430EB
NWK_AUTO_POLL //自动加入网络
HAL_UART
SERIAL_APP_PORT=0
xLCD_SUPPORTED
xPOWER_SAVING
任务和事件
#define SERIALAPP_MSG_RTRY_EVT 0x0001 //重发数据事件
#define SERIALAPP_RSP_RTRY_EVT 0x0002 //重发响应信息事件
#define SERIALAPP_MSG_SEND_EVT 0x0004 //发送数据事件
//#define SERIALAPP_AUTO_FIND_EVT 0x0008 //自动寻找目的设备事件,14.3用的是广播描述符绑定Match_Desc_rsp,这两个都是直接地址模式。
static void SerialApp_SendData( uint8 *buf, uint8 len ) 发送事件
信道和PANID
在f8wConfig.cfg中有信道和PANID的设置
信道设置
//-DDEFAULT_CHANLIST=0x04000000 // 26 - 0x1A
//-DDEFAULT_CHANLIST=0x02000000 // 25 - 0x19
//-DDEFAULT_CHANLIST=0x01000000 // 24 - 0x18
//-DDEFAULT_CHANLIST=0x00800000 // 23 - 0x17
//-DDEFAULT_CHANLIST=0x00400000 // 22 - 0x16
//-DDEFAULT_CHANLIST=0x00200000 // 21 - 0x15
//-DDEFAULT_CHANLIST=0x00100000 // 20 - 0x14
//-DDEFAULT_CHANLIST=0x00080000 // 19 - 0x13
//-DDEFAULT_CHANLIST=0x00040000 // 18 - 0x12
//-DDEFAULT_CHANLIST=0x00020000 // 17 - 0x11
//-DDEFAULT_CHANLIST=0x00010000 // 16 - 0x10
//-DDEFAULT_CHANLIST=0x00008000 // 15 - 0x0F
//-DDEFAULT_CHANLIST=0x00004000 // 14 - 0x0E
//-DDEFAULT_CHANLIST=0x00002000 // 13 - 0x0D
//-DDEFAULT_CHANLIST=0x00001000 // 12 - 0x0C
-DDEFAULT_CHANLIST=0x00000800 // 11 - 0x0B
zigbee系统有11个信道协调器将在其中一个默认信道上建立网络,路由器和终端节点也将选择自己的一个默认信道加入网络,路由器和终端节的默认信道和协调器的一致,这样通过改变信道就能建立不同的网络,避免干扰。
PANID设置
zigbee还有一个方法解决干扰问题,PANID,PANID指网络编号,范围是0x0001-0xFFFF,可通过给不同的网络
设置不同的PANID来区分网络,避免干扰。在f8wConfig.cfg中可以设置DZDAPP_CONFIG_PAN_ID值,本系统设置-DZDAPP_CONFIG_PAN_ID=0x1001,1.4.3一般都是oxFFFF。终端节点和路由器的DZDAPP_CONFIG_PAN_ID与协调器一样。
命令和簇
本系统需要定义两个命令,一个用于传输,另一个用于接收数据响应。
#define SERIALAPP_MAX_CLUSTERS 2
#define SERIALAPP_CLUSTERID1 1 //数据传输
#define SERIALAPP_CLUSTERID2 2 //接收数据响应
命令列表
const cId_t SerialApp_ClusterList[SERIALAPP_MAX_CLUSTERS] =
{
SERIALAPP_CLUSTERID1, //数据传输
SERIALAPP_CLUSTERID2 //接收数据响应
};
建网与入网
串口设置
#if !defined( SERIAL_APP_PORT )
#define SERIAL_APP_PORT 0 //串口号
#endif
#if !defined( SERIAL_APP_BAUD )
// CC2430 only allows 38.4k or 115.2k.
#define SERIAL_APP_BAUD HAL_UART_BR_38400 //串口波特率
//#define SERIAL_APP_BAUD HAL_UART_BR_115200
#endif
串口初始化
halUARTCfg_t uartConfig; //串口配置信息
SerialApp_MsgID = 0x00;
SerialApp_SeqRx = 0xC3; //接收序列号
SerialApp_TaskID = task_id; //任务
SerialApp_DstAddr.endPoint = 0; //目的设备端口
SerialApp_DstAddr.addr.shortAddr = 0; //目的地址
SerialApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent; //目的地址模式
SerialApp_RspDstAddr.endPoint = 0;
SerialApp_RspDstAddr.addr.shortAddr = 0;
SerialApp_RspDstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
afRegister( (endPointDesc_t *)&SerialApp_epDesc ); //注册端口描述符
RegisterForKeys( task_id ); //注册按键事件
uartConfig.configured = TRUE; // 2430 don't care.
uartConfig.baudRate = SERIAL_APP_BAUD; //波特率
uartConfig.flowControl = FALSE; //流量控制
uartConfig.flowControlThreshold = SERIAL_APP_THRESH; //流控阈值
uartConfig.rx.maxBufSize = SERIAL_APP_RX_MAX; //最大接收量
uartConfig.tx.maxBufSize = SERIAL_APP_TX_MAX; //最大发送量
uartConfig.idleTimeout = SERIAL_APP_IDLE; // 2430 don't care.
uartConfig.intEnable = TRUE; // 2430 don't care.
#if SERIAL_APP_LOOPBACK
uartConfig.callBackFunc = rxCB_Loopback;
#else
uartConfig.callBackFunc = rxCB; //接收回调函数
#endif
HalUARTOpen (SERIAL_APP_PORT, &uartConfig); //打开串口
数据通信
当按键绑定后,通过上位机给串口发送数据,接收上位机的串口会调用接收回调函数rxCB,初始化中有函数
#if SERIAL_APP_LOOPBACK
uartConfig.callBackFunc = rxCB_Loopback;
#else
uartConfig.callBackFunc = rxCB; //接收回调函数
#endif
当zigbee的串口缓存器中接收到数据 len = HalUARTRead( port, buf+1, SERIAL_APP_RX_CNT-1 );读一个buffer到串口。这时就会通过函数osal_set_event( SerialApp_TaskID,SERIALAPP_MSG_SEND_EVT );触发SERIALAPP_MSG_SEND_EVT事件,无线数据发送函数被调用void SerialApp_SendData( uint8 *buf, uint8 len )。将无线数据发送到接收节点。
重发机制
接收节点收到接收数据命令SERIALAPP_CLUSTERID1后,利用函数 HalUARTWrite将数据发送到串口。
发送节点在发送完数据之后会等待接收节点返回接收数据响应,接收节点返回接收数据响应的函数为 stat = AF_DataRequest( &(pkt->srcAddr), (endPointDesc_t*)&SerialApp_epDesc,
SERIALAPP_CLUSTERID2, SERIAL_APP_RSP_CNT , rspBuf,
&SerialApp_MsgID, 0, AF_DEFAULT_RADIUS );
当发送节点收到返回接收数据响应命令SERIALAPP_CLUSTERID2后,会判断接收节点串口状态,函数
case SERIALAPP_CLUSTERID2:
if ( (pkt->cmd.Data[1] == SerialApp_SeqTx) &&
((pkt->cmd.Data[0] == OTA_SUCCESS) || //表示接收成功,发送节点不用重发
(pkt->cmd.Data[0] == OTA_DUP_MSG)) ) //接收节点串口繁忙,启动重发机制
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_RSP_RTRY_EVT,
SERIALAPP_RSP_RTRY_TIMEOUT ); //接收节点重发数据接收响应事件
osal_stop_timerEx( SerialApp_TaskID, SERIALAPP_MSG_RTRY_EVT ); //发送节点重发数据事件。
四种地址模式(绑定)
1 直接地址模式
ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
FALSE );
也叫匹配描述符绑定,一般相当于广播绑定,网络中可能有一个或多个与本节点端口匹配的设备,本节点只接受其中一个节点的设备信息,既一对一绑定。处理函数是:
case Match_Desc_rsp:
{
ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
if ( pRsp )
{
if ( pRsp->status == ZSuccess && pRsp->cnt )
{
SerialApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
SerialApp_DstAddr.addr.shortAddr = pRsp->nwkAddr;
// Take the first endpoint, Can be changed to search through endpoints
SerialApp_DstAddr.endPoint = pRsp->epList[0];
// Light LED
HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
}
osal_mem_free( pRsp );
}
}
2 间接地址模式
也叫终端绑定,当按键按下时,调用函数
ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
SerialApp_epDesc.endPoint,
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
FALSE );
终端绑定实际上是两个终端设备通过与协调器绑定,实现两个终端设备之间互相通信。处理函数
case End_Device_Bind_rsp:
3 广播模式
广播模式一般采用匹配符绑定方式,和直接地址模式相似,只是在发送函数中加入下列语句
SerialApp_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//自己添加
SerialApp_DstAddr.addr.shortAddr = 0xffff;//自己修改,用于协调器广播
然后会调用 AF_DataRequest函数,这样既可以将协调器数据发给网络中的所有设备。
4 组模式(组播模式)
aps_Group_t SerialApp_Group;
SerialApp_Group.ID = 0x0001;
osal_memcpy(SerialApp_Group.name,"Broad Group",11);
static afAddrType_t SerialApp_GrpDstAddr;
SerialApp_GrpDstAddr.addrMode = (afAddrMode_t)afAddrGroup;
SerialApp_GrpDstAddr.endPoint = SERIALAPP_ENDPOINT;
SerialApp_GrpDstAddr.addr.shortAddr = SerialApp_Group.ID;
aps_AddGroup(SERIALAPP_ENDPOINT,&SerialApp_Group);