item_基于ZigBee/ARM的无线环境监测网络(+源代码)
要求打通这样的一条通讯链路:传感器 ⇌ ZigBee网络 ⇌ ARM网关 ⇌ 服务器 ⇌ Internet网络 ⇌ 用户。存档并分享源代码。
文章目录
01-设计篇
最后效果: Client打开应用程序(C/S模式),发送命令请求数据,Server服务多个Client,接到Client命令然后封装发送给ARM网关,ARM网关负责与ZigBee协调器串口通讯转发命令,ZigBee协调器根据命令进行广播/单播请求数据,ZigBee终端收到数据包后采集数据,原路返回直到给Client显示。
传感器ZigBee网络ARM网关服务器Internet网络用户
使用ZigBee协议栈进行数据采集和传输,实际上是ZigBee终端(带传感器)与ZigBee协调器的通讯,终端负责传感器数据采集和数据包传输,协调器负责组网,连接多个终端,最后负责转发数据包(数据包可能是ARM网关的命令),不作任何数据处理。
ZigBee协调器ZigBee终端AZigBee终端B......... ZigBee网络 ⇌ ARM网关使用串口通讯,ARM网关与ZigBee协调器相连,从底层的ZigBee网络转换为Internet网络,ZigBee协调器负责上报数据和接收ARM网关下发的命令,ARM网关则负责接收数据和发出命令(命令来自服务器)
环境数据命令ZigBee协调器ARM网关 ARM网关 ⇌ 服务器使用socket的TCP编程进行连接,ARM网关中运行Linux系统,配置网卡进行Internet联网,与特定IP的socket(服务器)进行连接,同时保持与ZigBee协调器的串口通讯。ARM网关负责接收服务器的命令和上报数据,服务器则负责接收数据和下发命令(命令来自用户)。
socket数据socket命令ARM网关服务器 服务器 ⇌ Internet网络⇌ 用户使用socket的TCP编程进行数据报的发送和接收,采用C/S传输模式,提供一个PC的终端客户程序,程序会主动与指定的服务器连接,并在PC界面下接收用户命令,经过封装后通过Internet网络发送给服务器。用户主要访问服务器的数据库以及请求实时数据,服务器主要作数据库储存和数据帧处理。
C/S模式服务器用户02-硬件篇
使用到的一些ZigBee节点和ARM以及一些驱动器
名称 | 用途 | 通讯接口 |
---|---|---|
ZigBee终端 | 传感器数据采集 | ZigBee协议栈 |
ZigBee协调器 | 组网、转发数据 | ZigBee协议栈、串口 |
ARM(nano) | 数据转换、转发数据 | socket、串口 |
各种驱动器(如继电器、电机等) | 实现远程开关 | 普通IO |
各种电器(小风扇、水泵等) | 被远程控制 | 普通IO |
上文并没有说应用,因为目的只是打通一条链路,至于后期的应用,可以是农业大棚、养殖户、小花园等等。
03-软件篇
分为3部分:ZigBee协议栈编程、ARM-Linux编程和Linux-socket编程
ZigBee协议栈编程 使用的ZigBee节点是CC2530这一款,协议栈版本是ZStack-CC2530-2.5.1a,开发基于Sample例程。
出厂商附带了很多传感器的使用例程,稍加修改就可以直接使用,最后对协议栈的串口、数据发送AF_DataRequest和数据处理SampleApp_MessageMSGCB进行详细编程即可,传感器数据在终端处就要进行数据格式封装处理,自定义的数据格式如下:
更多的ZigBee协议栈编程可以直接下载文末的源代码查看。
小白使用的是友善之臂的nano-PC,板载Linux系统,虽然文档不多,裸机编程比较困难,但是直接使用Linux编程就可以了
对于ARM的操作,主要是操作串口通讯、管理员输入操作和服务器请求,这3个IO的并发操作使用Linux的文件集进行,等待文件集中描述符的变动,以响应某个动作,以下是文件集的相关操作:
void FD_Init(void) { /*将文件描述符加入读描述符集合*/ FD_ZERO(&fds); //清0 FD_SET(scanf_fd,&fds); //加入键盘输入文件描述符 FD_SET(serial_fd,&fds); //加入串口文件描述符 FD_SET(server_sockfd,&fds);//加入服务器文件描述符 /* 超时1秒0毫秒 */ timeout.tv_sec = 1; timeout.tv_usec = 0; }
/*----键盘输入IO-----*/ if(FD_ISSET(scanf_fd,&fds)) { …… } /*----串口输入IO-----*/ if(FD_ISSET(serial_fd,&fds)) { …… } /*----服务器请求IO-----*/ if(FD_ISSET(server_sockfd,&fds)) { …… }Linux-socket编程
比较重要的就是socket编程了,先在ARM板载Linux上启动应用程序,使用文件集等待Server的连接,在一台服务器的Linux系统上运行Server,socket连接ARM,同时等待Client的接入,以下是Server等待Client的相关代码:
//等待客户端连接请求到达 struct sockaddr_in remote_addr = *client_addr; //客户端网络地址结构体 if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0) { perror("[FLASE] Server accepting\n"); return -1; } else { *client_addr = remote_addr; //IP地址获取 char addr[20] = {0}; struct sockaddr* t = (struct sockaddr*)&remote_addr; //强制转换地址 inet_ntop(AF_INET, (void *)t, addr, sizeof(addr)); //网络字节顺序IP地址->点分IP //数据库操作 char str_sql[128] = {0}; connectDB(); sprintf(str_sql,"INSERT INTO client (login_time,IP,contrl_time,contrl_action) VALUES (datetime('now'),'%s',datetime('now'),'logo_in');",addr); sqlite_ret = sqlite3_exec(db, str_sql, callback, 0, &zErrMsg); if( sqlite_ret != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); return false; } else printf("[OK] Successfully records insert for client\n"); closeDB(); //提示信息 printf("[OK] Server accept client %d\n",remote_addr.sin_addr.s_addr); printf("[OK] IP=%s\n",addr); printf("[OK] Server accepting\n"); return client_sockfd; }
04-测试篇
因为小白需要用账号密码登陆上网,不能直接连接ARM,可以借助使用云服务器,小白就偷懒不用了,因此只在局域网内进行测试。
以下是小白录制的桌面视频的缩减版(暂时不支持插入视频,用GIF代替)
网盘链接
最后分享所有的源代码和文档: 百度网盘 密码: 2u7z
- 使用Eclipse开发的ZigBee无线网络环境监测系统
- [置顶] 基于zigbee+arm+nodejs+html环境信息采集代码
- Zigbee无线网络在线心电监测系统
- 基于ZigBee的短距离无线通信网络技术
- 基于ZigBee与GPRS的农业大棚环境监测系统
- 【Firewall系列一】浅析基于区域的防火墙方案如何监测网络环境中内外流量与程序会话
- 基于无线ZigBee的污水监测系统
- 基于无线ZigBee的污水监测系统
- Zigbee无线网络在线心电监测系统
- 【技术】基于GPRS无线网络的嵌入式远程车载监测系统[图]
- 基于Windows 7环境的WAPI无线网络应用层控制实现
- ios 确认网络环境3G/WIFI,网络状态监测的总结
- 基于ARM的智能灯光控制系统总结(8-网络客户端进程)
- 基于嵌入式linux和ARM设计的无线家庭网关
- linux下搭建基于Eclipse的arm的开发环境
- 5_1_天天向上_(葵花宝典第1章ZigBee无线网络和收发器)
- Windows下基于ADS+J-Link 的ARM开发环境搭建
- 基于ZigBee的远程温度监测系统.
- Windows下 基于ADS+J-Link 的ARM开发环境搭建
- 基于ARM+LINUX的无线视频采集系统设计----------搭建嵌入式web服务器