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 实验 HomeAutomation

可以一个灯与多个开关绑定,实现多个开关控制一个灯。
可以一个开关与多个灯绑定,实现一个开关控制多个灯。
如果协调器不参与绑定,即绑定建立在多个终端设备之上,比如多个灯终端和开关终端,此时协调器下载灯或者开关的程序都行,只要它能建立网络就行,其实下载其他项目的协调器程序也行。
如果协调器参与绑定,需要按照协调器的功能来下载灯或者开关的程序。

比如

下载sampleswitch coordinatoreb-pro到板子,开关作为协调器。
下载samplelight enddeviceeb-pro到板子,灯作为终端。
两个板子依次按下right键,建立绑定,绑定成功时,sampleswitch的LED1亮。解除绑定也是两个板子依次按right键。多个灯终端与开关协调器绑定也是这个步骤。

按下协调器的up键可以对已经绑定的灯终端进行控制,其LED1。

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

posted on 2013-02-26 13:08  _song  阅读(898)  评论(0编辑  收藏  举报