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); |