原文链接:http://blog.csdn.net/wiznet2012/article/details/38379703

*已刊登至:《无线电》8月刊

物联网技术的实现中,无线技术是不可缺少的部分。近年无线技术的发展,将ZigBee推入人们的视线中,那么ZigBee是怎样的一种技术呢?带着疑问,我查询了它的来历:

ZigBee,来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,可以想象蜜蜂依靠这样的方式构成了群体中的通信网络!

是不是有点意思,那么随之 ZigBee的出现就成了一种我们熟知的无线组网通讯技术并广为应用。本篇就带你认识ZigBee,并实现一种常见应用:ZigBee转以太网网关。


  • 将ZigBee技术连接互联网

Image



图1 智能家居中ZigBee应用示意图



ZigBee是一种低成本,低功耗的近距离无线组网通讯技术,在智能家居、智能楼宇、工业监控等领域均有广泛应用。基于ZigBee的智能家居应用,如图1所示,用户在家庭中安装一个主控中心(ZigBee网关),及若干个与家电设备相连的分控终端,来远程操控所有家用电器,设想下躺在沙发上控制厨房的电饭煲煮饭是不是无限畅快呢?如果网关可以连到互联网上,甚至远在公司,打开手机就能登录到家里的网关查看家里的情况。 作为开源爱好者,可能很多人已经做过ZigBee方面的开发,一般使用TI公司的CC2530射频芯片较多,TI公司也针对这类芯片制定了完备的软件协议栈zstack。CC2530受处理器速度和内存限制,无法运行TCP/IP协议,用户往往通过串口获得协调器汇聚的数据。想要让协调器直接连上互联网只能借助其他网络芯片,由于W5500以太网芯片在硬件上实现了TCP/IP协议,即使像CC2530这样的8位单片机也可以自如操控W5500,实现联网,无需借助其他辅助处理器做数据转换。 本文我们使用两个CC2530模块,组建一个小型的ZigBee网络,一个作为协调器建立网络,另一个作为终端节点不断的采集温湿度数据并发送给协调器。为实现协调器的联网,我们在协调器上外接一个W5500模块,协调器作为TCP客户端连接以太网内的主机,并将终端节点发来的数据通过W5500上传给主机。应用系统的实物如图2所示: Zigbee2



Image

图2系统实物


  • 准备工作

1. 安装编译环境IAR Embedded Workbench for MCS-51 7.51A

2. 安装协议栈ZStack-CC2530-2.2.2-1.3.0

3. 安装CC2530模块调试下载器驱动


  • 硬件连接与驱动程序重写



W5500在硬件上实现TCP/IP协议,用户几乎不需要任何网络基础,并且WIZnet公司针对W5500也有很好的程序包的支持,只需调用socket函数,就可以完成网络的建立和通讯,当然,要获得以上便利,我们要先将CC2530与W5500连接起来,并能够发送数据控制W5500。 W5500与MCU通信使用SPI接口,CC2530是带有8051内核的无线MCU,片上有两个SPI接口,并且与USART复用,这里我们选择SPI1作为W5500的控制接口。图2为W5500模块的管脚对应关系,控制这个模块仅需J1插针上的1-7引脚(程序上使用轮询机制,所以可以省略INT中断管脚)。图3为CC2530模块上SPI1引脚的对应关系,另外使用P13作为W5500模块RST(复位)的输出控制引脚。通过排线将以上引脚对应连好后就可以编写硬件驱动程序啦。 Zigbee3



Image

图3 W5500模实物与原理图管脚对照



Image



图4 CC2530EB板SPI管脚对照





由于W5500的函数驱动库是分层次书写的,我们只需将SPI通信的硬件抽象层的函数重新编写即可。 以下为CC2530的SPI1的初始化配置函数和数据收发函数的程序,以及复位管脚的控制程序:


CODE:  SELECT ALL
#include “ioCC2530.h”



//SPI管脚和初始化配置



voidWIZ_SPI_Init(void)



{



  PERCFG |=0×02;//打开UART1外设



  P1SEL  |=0xE0;// 使能P1_7, P1_6, and P1_5 外设功能



  P1SEL  &=~0×10;// 配置P1_4为普通GPIO (SPI_CS)



  P1DIR  |=0×10;// 配置P1_4输出引脚



// Set baud rate to max (system clock frequency / 8)



  U1BAUD =0×00;// BAUD_M = 0



  U1GCR |=0×11;// BAUD_E = 17



  U1CSR &=~0xA0;// SPI 主机模式



// Configure phase, polarity, and bit order



  U1GCR &=~0xC0;// CPOL = CPHA = 0



  U1GCR |=0×20;// ORDER = 1



  P1SEL  &=~0×08;// 配置P1_3为普通GPIO (RST)



  P1DIR  |=0×08;// 配置P1_3为输出引脚



}



//W5500 复位引脚的控制



void WIZ_RST(uint8 val)



{



if(val== LOW){



   P1_3=0;//引脚拉低



}elseif(val== HIGH){



   P1_3=1;//引脚拉高



}



}



//SPI CS管脚的电平控制



void WIZ_CS(uint8 val)



{



if(val== LOW){



     P1_4=0;



}elseif(val== HIGH){



     P1_4=1;



}



}



//SPI数据发送和接收



uint8 SPI2_SendByte(uint8 byte)



{



uint8 temp;



  U1DBUF = byte;



while(!(U1CSR&0×02));//等待数据发送完毕



  U1CSR &=0xFD;



  temp = U1DBUF;//读取数据缓冲区接收字节



return temp;



}





程序重写完毕后,打开zstack的例程,将W55[*]00的驱动程序包添加到工程中。如图5所示,需要注意的是,CC2530的LCD驱动的部分引脚与SPI1的几个引脚是复用的,需要将和LCD有关的编译项去掉,避免发生冲突,导致SPI不可用。具体方法为在工程选项的编译子项里,去掉“LCD_SUPPORTED”,并添加“HAL_LCD=FALSE”。



Image



图5 添加W5500驱动程序包到工程



Image



图6 修改编译项


  • zstack应用任务程序编写



zstack是TI公司按照Zigbee协议编写的协议栈程序,提供了完备的应用函数供用户调用,用户可以在应用层添加自己的任务和事件来完成传感器数据采集、节点通信应答等功能,有关协议栈的任务调度机制还需要读者自行学习,这里介绍如何在应用层维护W5500的通信。在本文的系统中,为了降低与协议栈的耦合度(尽量不在协议栈原有文件中增删改),开机后,当系统运行起来后,我们将W5500的初始化和配置函数放在了应用层的任务里执行,协调器在完成组网后,应用层的任务主要有以下两个事件,一个是W5500网络连接的维护,另一个是终端节点的数据处理。其中第一个事件为定时事件,每隔一段时间就要对W5500的网络状态进行一次轮询处理。 在工程中,APP子栏下有sapi、SimpleCollector(协调器)、SimpleSensor(终端节点)三组文件,其中sapi中定义了节点组网和入网的应用函数,用户不需要改写这些程序,但是其中一些事件会调用SimpleCollector和SimpleSensor中的函数,用户需要在这两个文件中编写处理函数。 先看下协调器的应用层的程序处理过程,在sapi.c文件中初始化了SAPI 任务,在这个任务中定义了ZB_ENTRY_EVENT和ZB_USER_EVENTS两个事件,其中初始化函数SAPI_Init()中启动了ZB_ENTRY_EVENT事件,即在任务建立后会首先进入该事件。任务事件处理函数SAPI_ProcessEvent()中在处理这两个事件时调用zb_HandleOsalEvent()函数,交给用户文件SimpleCollector去处理。其中ZB_ENTRY_EVENT只执行一次,用来定义设备的类型(协调器或终端节点),ZB_USER_EVENTS会执行多次,在这个事件里我们用来维护W5500的网络连接。 以下是任务事件处理函数有关这两个事件的处理程序:


CODE:  SELECT ALL
UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events )



{



……



if( events & ZB_ENTRY_EVENT )



{



uint8startOptions;



// 设备启动应用程序时给出指示



zb_HandleOsalEvent( ZB_ENTRY_EVENT );



zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);



if(startOptions& ZCD_STARTOPT_AUTO_START )



{



zb_StartRequest();



}



else



{



// led闪烁并等待外部输入进行配置及重启



HalLedBlink(HAL_LED_2,0,50,500);



}



return(events ^ ZB_ENTRY_EVENT );



}



// 这是最后一个要处理的事件



if( events &( ZB_USER_EVENTS ))



{



// 用户事件传递给应用程序



zb_HandleOsalEvent( events );



// 这里不要返回,稍后返回0



}



……



}



程序中都调用了zb_HandleOsalEvent( events ),我们看一下协调器中如何处理的:



voidzb_HandleOsalEvent( uint16 event )



{



uint8startOptions;



uint8logicalType;



if( event & ZB_ENTRY_EVENT )



{



initUart(uartRxCB);//初始化调试端口



WIZ_SPI_Init();//初始化 SPI



    Reset_W5500();



printf(“W5500 Init…\r\n”);



set_default();



set_network();



logicalType= ZG_DEVICETYPE_COORDINATOR;//配置节点类型



zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);



startOptions= ZCD_STARTOPT_AUTO_START;// 配置启动类型



zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);



printf(“Waiting the Network…\r\n”);



}



if( event & ZB_USER_EVENTS )



{



do_tcpclient(SOCKET_TCPC);  //tcp 客户端保持



osal_start_timerEx(sapi_TaskID, ZB_USER_EVENTS, ENTHER_TIMEOUT );



}



}





鉴于开机后ZB_ENTRY_EVENT只会执行一次,所以我们将应用的初始化函数放在这里执行,并且配置好网络启动的相关参数并写入到配置信息里,跳出这个函数后,程序就会启动自动组网的程序,完成组网。在ZB_USER_EVENTS中,我们启动TCP客户端程序,用来维护设备与服务器的连接,使得设备在插上网线后能够及时连上服务器。这样当协调器收到其他终端节点的数据,处理后就可以调用socket发送函数发送给主机,我们的协调器就变成了一个zigbee转以太网的网关了。 有了网关节点,我们还需要终端节点提供温湿度数据。我们将DHT11温湿度传感器连接到终端节点上,并在终端节点的应用层添加采集函数,定时采集温湿度数据。 终端节点的应用处理程序在SimpleSensor.c中定义,下面来介绍下终端节点是如何处理相关的任务的:


CODE:  SELECT ALL
void zb_HandleOsalEvent( uint16 event )



{



uint8startOptions;



uint8logicalType;



if( event & ZB_ENTRY_EVENT)



{



logicalType= ZG_DEVICETYPE_ENDDEVICE;//配置成终端节点



zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE,sizeof(uint8),&logicalType);



startOptions= ZCD_STARTOPT_AUTO_START;// 配置成自启动



zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);



}



if( event & MY_START_EVT )



{



//nothing to do



}



if( event & MY_REPORT_TEMP_EVT )



{



ReadValue();//收集DHT11 数据



zb_SendDataRequest(0xFFFE, SENSOR_REPORT_CMD_ID,4,SensorValueBuf,0, AF_ACK_REQUEST,0);//给网关节点发送数据



osal_start_timerEx(sapi_TaskID, MY_REPORT_TEMP_EVT,myTempReportPeriod);// Timed loop collection



}



if( event & MY_FIND_COLLECTOR_EVT )



{



// 查找并绑定到收集器设备



zb_BindDevice( TRUE, SENSOR_REPORT_CMD_ID,(uint8 *)NULL);//找到协调器,启动入网



}



}





一张表一目了然网关节点和终端节点的流程比较:



Image





了解了程序执行流程后,我们就可以操作设备了。 我们首先选择SimpleCollectorEB,编译后通过调试器将程序下载到网关节点中,然后选择SimpleSensorEB,编译后下载到终端节点中。我们在电脑端打开TCP/IP调试助手和串口调试助手,分别用来接收数据和观察网关节点运行的调试信息。



Image







图7 串口及网络调试助手界面







网关节点上电后,串口端会打印设备的IP地址等信息,接下来LED1闪烁,表示网关节点正在组网,当Led1长亮后,网络建立完毕,这时程序的网络维护事件触发,开始连接服务器,通过网络调试助手可以看到,有客户端连接,正是我们的网关节点。



网关节点准备完毕,接下来打开终端节点,开机后Led1闪烁,启动网络,入网后Led1频闪,表示正在数据采集和发送,这时可以看到网络调试助手上有温湿度数据显示,表示终端节点已经将数据发送给网关节点,网关节点解析后再通过W5500发送给了PC。至此,CC2530+W5500实现了ZigBee转以太网网关,数据成功递达网关节点。







以上是以太网网关的实现过程。实际应用中,我们可以看到众多的物联网设备,都可以借助此网关节点,来连入Internet,比如,连接Yeelink这样的云平台,上传传感器数据,可轻松实现!在这里就不给大家列举了,关于Zigbee转以太网网关的应用,同样是个重要且庞大的课题,我们会接下来展开与大家继续分享的。






  • 尾声



目前,在设备的无线通信领域, Zigbee技术相比蓝牙及WiFi,有着成本低、功耗低和低复杂度的特点,同时非常适合电池供电的设备。大量的Zigbee设备会产成庞大的数据量,这些数据不可能全部交付给协调器处理分析,但将协调器接入互联网就完美的解决了此问题,配合W5500,协调器变成了Zigbee和以太网网关,从而使无线Zigbee网络轻松接入互联网,实现物联网应用!


程序下载:http://wizwiki.net/forum/viewtopic.php?f=91&t=1075

By Allen,Katrina,Jerry

与我们更多交流:wiznetbj@wiznet.co.kr

WIZnet官方网站:http://www.iwiznet.cn

WIZnet官方微博:http://weibo.com/wiznet2012

1
0

zigbee以太网网关方案相关推荐

  1. CH9145蓝牙以太网网关方案

    简介 蓝牙以太网网关单芯片方案,快速实现蓝牙设备和TCP/IP网络之间的互通,帮助您将蓝牙设备连接至互联网,实现远程控制或数据采集,即使你不在家里,也可以通过手机.平板或PC等,从千里之外控制家中的蓝 ...

  2. 串口转以太网服务器原理,【干货】自制低成本串口转以太网网关

    原标题:[干货]自制低成本串口转以太网网关 本文经作者yiyi peter pan授权发布. 1.作品简介 串口转以太网网关可以将串口的数据转发到网络上特定服务器的特定端口上,实现设备的远程控制.数据 ...

  3. Atmel公司引进低成本Zigbee转以太网网关参考设计

    低成本Zigbee转以太网网关参考设计是一个关键的产品预备方案,将IEEE 802.15.4无线网络连接有线以太网网络.对于Zigbee,使用Atmel ATmega256RFR2,还有WIZnet ...

  4. 计算机网络 - NB-IOT/LoRa/Zigbee 无线组网方案对比

    NB-IOT/LoRa/Zigbee无线组网方案对比 NB-IOT/LoRa/Zigbee无线组网方案对比 NB-IOT/LoRa/Zigbee无线组网方案对比 物联网设备节点组网存在2种组网方式, ...

  5. 什么是网关模块 工业物联网以太网网关WiFi模块的选型

    在智能科技发展的时代,物联网产品在市场上也是满目琳琅,呈现出万物互联的景象,也给人们生活带来了便利.物联网由多种协议发挥各自优势共同构成.但是要实现网络连接,我们不得不提到的网关.为了方便研发生产,厂 ...

  6. zigbee 报警联动方案原理

    zigbee 报警联动方案原理 传感器设备检测到报警命令传输给网关. 网关遍历底下的所有传感器子设备,并逐一发送报警命令,针对DC类子设备则堆入缓存区(最小缓存时长16s),对于父节点是AC类设备的子 ...

  7. ZigBee室内定位方案的优势在哪里,该技术可靠吗-新导智能

    ​ 苏州新导ZigBee 是一套专为物联网传感和操控开发的通讯协议,首要使用于才智家居.才智健康.才智动力等新兴技能领域,具有近间隔.低杂乱.低功耗.低速率.自组织.高容量等特性.常用的 ZigBee ...

  8. 三菱FX5U以太网数据采集方案

    三菱FX5U以太网数据采集方案 1.需求分析 通过三菱FX5U的网口,直接读写PLC的数据,不修改PLC的程序和接口参数,不影响原系统的运行. 工业通讯桥接器(NET50-MEL)支持IP地址跨网段和 ...

  9. 欧姆龙CP/CJ系列PLC以太网通讯方案

    欧姆龙CPCJ系列PLC以太网通讯方案 描述: NET30-CS用于欧姆龙CP1E/CP1H/CP1L/CJ1M/CJ2M等系列PLC. NET30-CS 桥接器采用三通设计,不占用PLC通讯口,不对 ...

最新文章

  1. 后端说:只是你不懂怎么用 headers!
  2. SAP RETAIL Rapid Replenishment
  3. Java实现有序数组和无序数组_【算法】字典的诞生:有序数组 PK 无序链表
  4. 解决 Out of range value adjusted for column 'ID' at row 1
  5. Python解决数独
  6. 机器学习笔试题精选(七)
  7. html里,实现图片与文字对齐的最简洁方法
  8. RabbitMQ学习之集群消息可靠性测试
  9. Redis源码解析(1)——源码目录介绍
  10. 云计算年度技术盛典,腾讯Techo Park开发者大会将在京召开
  11. 阿里OSS对象存储,实现图片上传进度显示ProgressListener;
  12. 浏览器输入网址回车发生的事情?--
  13. PMP认证的教材更新到第几版了?
  14. 高斯光束matlab 仿真,高斯光束的matlab仿真.docx
  15. php背景四周向中间渐变色,使用CSS巧妙地制作背景色渐变动画实例
  16. oracle查看日期是第几周
  17. python从入门到实践十二章
  18. 家乡 二 十 四 桥的介绍
  19. 基于 flink 的电商用户行为数据分析【8】| 订单支付实时监控
  20. html引入vue不兼容ie11,Vue在IE11版本浏览器中的兼容性问题

热门文章

  1. 线性代数-克莱姆法则
  2. Fiddler抓包工具配置--IE、Chrome
  3. css前端知识分享—页面布局分析
  4. apache实验报告 linux_linux实验报告心得
  5. kubectl全部命令用法示例
  6. iOS 3DES加密解密(一行代码搞定)
  7. Windows 11 版本介绍
  8. 百度地图之鼠标绘制工具条库(开源库)
  9. 设计幸运大转盘h5小游戏总结
  10. 【安卓实验】实验五、广播实验