zigbee 案例实验
ZStack-CC2530-2.3.0-1.4.0
/* Switches (keys) */
#define HAL_KEY_SW_1 0x01 // Joystick up
#define HAL_KEY_SW_2 0x02 // Joystick right
#define HAL_KEY_SW_5 0x04 // Joystick center
#define HAL_KEY_SW_4 0x08 // Joystick left
#define HAL_KEY_SW_3 0x10 // Joystick down
#define HAL_KEY_SW_6 0x20 // Button S1 if available
#define HAL_KEY_SW_7 0x40 // Button S2 if available
/* Joystick */
#define HAL_KEY_UP 0x01 // Joystick up
#define HAL_KEY_RIGHT 0x02 // Joystick right
#define HAL_KEY_CENTER 0x04 // Joystick center
#define HAL_KEY_LEFT 0x08 // Joystick left
#define HAL_KEY_DOWN 0x10 // Joystick down
zigbee 实验 SampleApp
实验采用按键(joystick)来控制工作组内模块 LED 灯闪烁,模块在一个工作组内时,它以下的节点可以控制此模块的 LED灯闪烁。
下载coordinatoreb-pro到板子,
下载enddeviceeb-pro到板子,其会自动加入网络。加入网络后会自动加入工作组。
节点与协调器、路由器加入同一工作组后,就可以控制协调器和路由器的 D1灯闪烁了;按joystick的 UP键,可以控制协调器和路由器的 D1灯闪烁。同样,按路由器的 UP键,也可以控制主机的 D1灯闪烁。协调器和路由器也可以随时退出工作组或加入工作组,
当协调器或路由器在工作组内时,按下 RIGHT 键,就可以退出工作组,反之则加入工作组,一旦退出工作组,终端节点就无法控制主机或路由器了.
zigbee 实验 SerialApp
程序实现两个节点之间的绑定与通讯,同时每个节点可与其“上位机”的串口终端进行通讯
下载coordinatoreb-pro到板子,
下载enddeviceeb-pro到板子,其会自动加入网络。
两个板子依次按下right键,建立绑定,绑定成功时,两个板子的LED1都亮。解除绑定也是两个板子依次按right键。
两个节点就开始相互定时给对方发送数据,此时用串口延长线连接节点和PC,在PC端启动串口调试助手。设置对应的COM口和波特率38400。即可监视串口数据。
但是一般需要更改SerialApp.c的函数SerialApp_Init的 uartConfig.flowControl = FALSE。
zigbee 实验 GenericApp
该实验是将两个模块相互绑定后,进行数据对传,两个模块之间默认相互发送字符串“Hello World”。
下载coordinatoreb-pro到板子,
下载enddeviceeb-pro到板子,其会自动加入网络。
两个板子依次按下right键,建立绑定,绑定成功时,两个板子的LED1都亮。解除绑定也是两个板子依次按right键。
两个节点就开始相互定时给对方发送数据,并在对方的液晶屏上显示出来(发送的数据为"Hello World")
zigbee 实验 TransmitApp
这个实验是一个无线传输数据速度测试实验,主要是完成模块间的绑定、测试两个模块之间相互传输数据的速度实验
下载coordinatoreb-pro到板子,
下载enddeviceeb-pro到板子,其会自动加入网络。
两个板子依次按下right键,建立绑定,绑定成功时,两个板子的LED1都亮。解除绑定也是两个板子依次按right键。
按下其中一个板子的up键可以进行无线数据传输速度测试了。停止发送也按up键。
LCD 第一排显示此模块接收数据的速度和总字节数,第二排 显示此模块发送数据的速度与总字节数。
按下 down,可以清除收发数据的计数值。
可以一个开关与多个灯绑定,实现一个开关控制多个灯。
如果协调器不参与绑定,即绑定建立在多个终端设备之上,比如多个灯终端和开关终端,此时协调器下载灯或者开关的程序都行,只要它能建立网络就行,其实下载其他项目的协调器程序也行。
如果协调器参与绑定,需要按照协调器的功能来下载灯或者开关的程序。
比如
zigbee 实验 sensordemo
下载collectoreb-pro到板子,按up键板子自动重启并设置为协调器而建立网络,此时按下right键,开启接收报告功能,lcd显示 GATEWAY MODE
下载sensoreb-pro到板子,此时板子自动加入网络,而成为终端节点,按down键开始发送报告。
下载collectoreb-pro到板子,,此时板子自动加入网络,而成为路由器,按down键开始发送报告。
终端会选择信号最好的路由器(协调器)作为其父设备。
节点发出的数据是:温度电压和父地址
协调器接收到节点数据
协调器通过串口发出
上位机从串口接收到
zigbee 实验 SimpleApp
数据收集实验:
下载SimpleCollectorEB-pro,按up键板子自动重启并设置为协调器而建立网络,此时按下up键允许绑定
下载SimpleSensorrEB-pro,按up键板子自动重启并设置为终端,自动加入网络,加入成功之后,自动请求绑定,绑定成功之后,自动发送传感器数据
灯控制器实验:
下载SimpleControllerEB-pro,按up键板子自动重启并设置为协调器而建立网络,此时按下up键允许绑定
下载SimpleSwitchEB-pro,按up键板子自动重启并设置为终端,自动加入网络,加入成功之后,按up键请求绑定,绑定成功之后,使用right键控制协调器的led1
/* Switches (keys) */
#define HAL_KEY_SW_1 0x01 // Joystick up
#define HAL_KEY_SW_2 0x02 // Joystick right
#define HAL_KEY_SW_5 0x04 // Joystick center
#define HAL_KEY_SW_4 0x08 // Joystick left
#define HAL_KEY_SW_3 0x10 // Joystick down
#define HAL_KEY_SW_6 0x20 // Button S1 if available
#define HAL_KEY_SW_7 0x40 // Button S2 if available
/* Joystick */
#define HAL_KEY_UP 0x01 // Joystick up
#define HAL_KEY_RIGHT 0x02 // Joystick right
#define HAL_KEY_CENTER 0x04 // Joystick center
#define HAL_KEY_LEFT 0x08 // Joystick left
#define HAL_KEY_DOWN 0x10 // Joystick down
zigbee 实验 SampleApp
实验采用按键(joystick)来控制工作组内模块 LED 灯闪烁,模块在一个工作组内时,它以下的节点可以控制此模块的 LED灯闪烁。
下载coordinatoreb-pro到板子,
下载enddeviceeb-pro到板子,其会自动加入网络。加入网络后会自动加入工作组。
节点与协调器、路由器加入同一工作组后,就可以控制协调器和路由器的 D1灯闪烁了;按joystick的 UP键,可以控制协调器和路由器的 D1灯闪烁。同样,按路由器的 UP键,也可以控制主机的 D1灯闪烁。协调器和路由器也可以随时退出工作组或加入工作组,
当协调器或路由器在工作组内时,按下 RIGHT 键,就可以退出工作组,反之则加入工作组,一旦退出工作组,终端节点就无法控制主机或路由器了.
zigbee 实验 SerialApp
程序实现两个节点之间的绑定与通讯,同时每个节点可与其“上位机”的串口终端进行通讯
下载coordinatoreb-pro到板子,
下载enddeviceeb-pro到板子,其会自动加入网络。
两个板子依次按下right键,建立绑定,绑定成功时,两个板子的LED1都亮。解除绑定也是两个板子依次按right键。
两个节点就开始相互定时给对方发送数据,此时用串口延长线连接节点和PC,在PC端启动串口调试助手。设置对应的COM口和波特率38400。即可监视串口数据。
但是一般需要更改SerialApp.c的函数SerialApp_Init的 uartConfig.flowControl = FALSE。
zigbee 实验 GenericApp
该实验是将两个模块相互绑定后,进行数据对传,两个模块之间默认相互发送字符串“Hello World”。
下载coordinatoreb-pro到板子,
下载enddeviceeb-pro到板子,其会自动加入网络。
两个板子依次按下right键,建立绑定,绑定成功时,两个板子的LED1都亮。解除绑定也是两个板子依次按right键。
两个节点就开始相互定时给对方发送数据,并在对方的液晶屏上显示出来(发送的数据为"Hello World")
zigbee 实验 TransmitApp
这个实验是一个无线传输数据速度测试实验,主要是完成模块间的绑定、测试两个模块之间相互传输数据的速度实验
下载coordinatoreb-pro到板子,
下载enddeviceeb-pro到板子,其会自动加入网络。
两个板子依次按下right键,建立绑定,绑定成功时,两个板子的LED1都亮。解除绑定也是两个板子依次按right键。
按下其中一个板子的up键可以进行无线数据传输速度测试了。停止发送也按up键。
LCD 第一排显示此模块接收数据的速度和总字节数,第二排 显示此模块发送数据的速度与总字节数。
按下 down,可以清除收发数据的计数值。
zigbee 实验 HomeAutomation
可以一个灯与多个开关绑定,实现多个开关控制一个灯。可以一个开关与多个灯绑定,实现一个开关控制多个灯。
如果协调器不参与绑定,即绑定建立在多个终端设备之上,比如多个灯终端和开关终端,此时协调器下载灯或者开关的程序都行,只要它能建立网络就行,其实下载其他项目的协调器程序也行。
如果协调器参与绑定,需要按照协调器的功能来下载灯或者开关的程序。
比如
下载sampleswitch coordinatoreb-pro到板子,开关作为协调器。
下载samplelight enddeviceeb-pro到板子,灯作为终端。
两个板子依次按下right键,建立绑定,绑定成功时,sampleswitch的LED1亮。解除绑定也是两个板子依次按right键。多个灯终端与开关协调器绑定也是这个步骤。
zigbee 实验 sensordemo
下载collectoreb-pro到板子,按up键板子自动重启并设置为协调器而建立网络,此时按下right键,开启接收报告功能,lcd显示 GATEWAY MODE
下载sensoreb-pro到板子,此时板子自动加入网络,而成为终端节点,按down键开始发送报告。
下载collectoreb-pro到板子,,此时板子自动加入网络,而成为路由器,按down键开始发送报告。
终端会选择信号最好的路由器(协调器)作为其父设备。
节点发出的数据是:温度电压和父地址
uint8 pData[SENSOR_REPORT_LENGTH]; static uint8 reportNr=0; uint8 txOptions; // Read and report temperature value pData[SENSOR_TEMP_OFFSET] = readTemp(); // Read and report voltage value pData[SENSOR_VOLTAGE_OFFSET] = readVoltage(); pData[SENSOR_PARENT_OFFSET] = HI_UINT16(parentShortAddr); pData[SENSOR_PARENT_OFFSET + 1] = LO_UINT16(parentShortAddr);
协调器接收到节点数据
gtwData.parent = BUILD_UINT16(pData[SENSOR_PARENT_OFFSET+ 1], pData[SENSOR_PARENT_OFFSET]); gtwData.source=source; gtwData.temp=*pData; gtwData.voltage=*(pData+1); // Flash LED 2 once to indicate data reception HalLedSet ( HAL_LED_2, HAL_LED_MODE_FLASH ); // Update the display #if defined ( LCD_SUPPORTED ) HalLcdWriteScreen( "Report", "rcvd" ); #endif // Send gateway report sendGtwReport(>wData);
协调器通过串口发出
uint8 pFrame[ZB_RECV_LENGTH]; // Start of Frame Delimiter pFrame[FRAME_SOF_OFFSET] = CPT_SOP; // Start of Frame Delimiter // Length pFrame[FRAME_LENGTH_OFFSET] = 10; // Command type pFrame[FRAME_CMD0_OFFSET] = LO_UINT16(ZB_RECEIVE_DATA_INDICATION); pFrame[FRAME_CMD1_OFFSET] = HI_UINT16(ZB_RECEIVE_DATA_INDICATION); // Source address pFrame[FRAME_DATA_OFFSET+ ZB_RECV_SRC_OFFSET] = LO_UINT16(gtwData->source); pFrame[FRAME_DATA_OFFSET+ ZB_RECV_SRC_OFFSET+ 1] = HI_UINT16(gtwData->source); // Command ID pFrame[FRAME_DATA_OFFSET+ ZB_RECV_CMD_OFFSET] = LO_UINT16(SENSOR_REPORT_CMD_ID); pFrame[FRAME_DATA_OFFSET+ ZB_RECV_CMD_OFFSET+ 1] = HI_UINT16(SENSOR_REPORT_CMD_ID); // Length pFrame[FRAME_DATA_OFFSET+ ZB_RECV_LEN_OFFSET] = LO_UINT16(4); pFrame[FRAME_DATA_OFFSET+ ZB_RECV_LEN_OFFSET+ 1] = HI_UINT16(4); // Data pFrame[FRAME_DATA_OFFSET+ ZB_RECV_DATA_OFFSET] = gtwData->temp; pFrame[FRAME_DATA_OFFSET+ ZB_RECV_DATA_OFFSET+ 1] = gtwData->voltage; pFrame[FRAME_DATA_OFFSET+ ZB_RECV_DATA_OFFSET+ 2] = LO_UINT16(gtwData->parent); pFrame[FRAME_DATA_OFFSET+ ZB_RECV_DATA_OFFSET+ 3] = HI_UINT16(gtwData->parent); // Frame Check Sequence pFrame[ZB_RECV_LENGTH - 1] = calcFCS(&pFrame[FRAME_LENGTH_OFFSET], (ZB_RECV_LENGTH - 2) ); // Write report to UART HalUARTWrite(HAL_UART_PORT_0,pFrame, ZB_RECV_LENGTH);
上位机从串口接收到
//----------------------------------------------------------------------------- /** \brief Pops a single packet from the local data buffer * * Search for Start Of Packet(SOP) in Local UART buffer. * If SOP found, check if the complete packet is given in the buffer. * The total packet is given in the following format: * SOP(1) + COMMAND(2) + LENGTH(1) + PACKET(n) + FCS(1) * * * \param[out] pLength * Length of current data packet. * \param[out] pData * Pointer to data buffer. * * \return * \b bool. TRUE when the returned data is valid, otherwise FALSE. */ //----------------------------------------------------------------------------- bool ComPortThread::PopUartBuffer(int *pLength, BYTE *pData) { // search for sop if( SearchForSop() ){ // Fetch the data length *pLength = uartBuffer.pData[uartBuffer.outPos + 1] + LEN_CMD + LEN_LEN; int totalPacketLength = LEN_SOP + *pLength + LEN_FCS; if(uartBuffer.outPos + totalPacketLength - 1 < uartBuffer.inPos) { // check CRC if( CrcValid( &uartBuffer.pData[uartBuffer.outPos + 1], totalPacketLength - LEN_SOP) ) { // if CRC ok then extract data. Copy all data from SOP byte memcpy(pData, uartBuffer.pData + uartBuffer.outPos + LEN_SOP, *pLength); uartBuffer.outPos += totalPacketLength; uartBuffer.bufferedCount -= totalPacketLength; return true; } else { // Invalid CRC, Continue with the first byte after the invalid SOP uartBuffer.outPos++; } } else { if (*pLength > m_maxDataLength) { // Packet to long and can be seen as corrupted. Continue with the first byte after // the invalid SOP. uartBuffer.outPos++; } } } return false; } // PopUartBuffer
zigbee 实验 SimpleApp
数据收集实验:
下载SimpleCollectorEB-pro,按up键板子自动重启并设置为协调器而建立网络,此时按下up键允许绑定
下载SimpleSensorrEB-pro,按up键板子自动重启并设置为终端,自动加入网络,加入成功之后,自动请求绑定,绑定成功之后,自动发送传感器数据
灯控制器实验:
下载SimpleControllerEB-pro,按up键板子自动重启并设置为协调器而建立网络,此时按下up键允许绑定
下载SimpleSwitchEB-pro,按up键板子自动重启并设置为终端,自动加入网络,加入成功之后,按up键请求绑定,绑定成功之后,使用right键控制协调器的led1
refer to qiujie zigbee, thanks