
基于Linux泰山派与无线传感网ZigBee的环境监测系统设计
简介
本科毕业设计: 硬件方案:泰山派+CC2530核心板、协调器底板、终端节点底板 知识体系:单片机软硬件开发+Linux多线程开发+web开发 功能:环境数据采集,网页远程实时查看、设备控制
简介:本科毕业设计: 硬件方案:泰山派+CC2530核心板、协调器底板、终端节点底板 知识体系:单片机软硬件开发+Linux多线程开发+web开发 功能:环境数据采集,网页远程实时查看、设备控制开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
本科毕业设计:基于Linux泰山派与无线传感网ZigBee的环境监测系统设计
硬件方案:泰山派+CC2530(ZigBee)核心板、协调器底板、终端节点底板
知识体系:单片机软硬件开发+Linux多线程开发+web开发
实际功能:环境数据采集,网页远程实时查看、设备控制
B站https://www.bilibili.com/video/BV1gZgSeCE9H
系统功能介绍
本系统通过无线传感网部分的终端节点搭载的DHT11温湿度传感器,MQ-2烟雾传感器,光敏电阻来获取环境中温度、湿度、气体浓度和光照强度,并通过ZigBee协议上报给协调器,协调器通过串口将环境数据发送给泰山派,泰山派Linux系统主控程序通过串口接收线程接收数据,并将数据放到链表当中,同时主控程序的共享内存线程获取链表的环境数据,并将数据放到共享内存中。网页浏览器服务程序的CGI接口通过共享内存获取环境数据,并实时刷新网页页面显示获取到的环境数据,电脑和手机的浏览器均可以访问网页浏览器服务程序实时查看环境数据。浏览器服务程序页面还可以实现远程控制终端节点的功能,具体实现流程为:电脑和手机的浏览器访问网页浏览器服务程序远程控制时,CGI接口程序获取远程控制时的页面表单数据,并转换为节点的控制指令,同时将节点控制指令放到消息队列中。Linux主控程序的消息队列线程获取消息队列数据后,将远程控制指令放到链表中,同时主控程序串口发送线程获取链表数据,并通过串口发送给无线传感网部分的协调器。协调器通过ZigBee协议发送给终端节点,终端节点接收到控制指令后根据指令做出对应的LED、蜂鸣器或继电器控制。另外网页浏览器服务程序通过CGI程序使用sqlite3数据库,电脑和手机的浏览器访问网页浏览器服务程序时需要进行登录或注册。
系统所有设备运行画面
立创泰山派卡片电脑实物图
核心板实物
协调器实物
终端节点实物
测试
无线传感网测试
协调器和终端节点组网时,需要先启动协调器,后启动终端节点才能组网成功,组网成功后,终端节点屏幕才会显示该节点的信息,一号、二号和三号终端节点均可以实现组网,组网成功后,每个终端节点屏幕都会显示节点编号相关信息,并初始化屏幕显示内容,一号、二号、三号终端节点组网成功屏幕显示内容如图所示,二号终端节点组网成功屏幕显示内容如图所示,三号终端节点组网成功屏幕显示内容如图所示。
一号终端节点组网成功画面
二号终端节点组网成功画面
三号终端节点组网成功画面
组网成功后,终端根节点才会开始环境数据的采集,采集环境数据后,各个终端节点的屏幕实时显示采集到的环境数据,一号、二号、三号终端节点采集数据显示画面如图所示,二号终端节点采集数据显示画面如图所示,三号终端节点采集数据显示画面如图所示。根据屏幕显示的环境信息,无线传感网终端节点搭载的传感器采集到的环境数据有一定的差异,为使无线传感网采集的环境数据准确,则需要通过专业的设备进行矫正。
一号终端节点采集数据画面
二号终端节点采集数据画面
三号终端节点采集数据画面
组网成功后,终端节点会将采集到的数据通过ZigBee协议发送到协调器,协调器接收到数据后,屏幕显示对应节点的环境信息,协调器成功接收一号终端节点环境数据画面如图所示,二号终端节点环境数据画面如图所示,三号终端节点环境数据画面如图所示。
协调器接收一号终端节点环境数据画面
协调器接收二号终端节点环境数据画面
协调器接收三号终端节点环境数据画面
协调器接收到终端节点环境数据,通过串口将数据上报给Linux系统,在进行无线传感网测试时可以使用串口工具查看上报的数据,本系统使用的串口工具为友善串口调试助手,协调器串口输出数据如图所示。
协调器串口上报的环境数据
对无线传感网的功耗进行测试,测试结果如表所示。从测试结果来看,本系统无线传感网部分的终端节点底板和协调器底板设计存在一定的问题,使得无线传感网的功耗较高。
无线传感网功耗测试结果
Linux系统测试
启动无线传感网和Linux主控程序,Linux主控程序数据正常接收协调器发送的数据,如图所示。
Linux主控程序接收协调器发送的环境数据
只启动网页浏览服务程序,验证登录、注册等功能。通过注册页面,向系统注册用户名为123456,密码为654321的用户,如图所示。注册成功后查看数据库中是否存在注册的用户,查看数据库内容,注册的用户信息确实存在,注册成功,如图所示。登录成功后进入环境数据实时显示页面,如图所示,由于此时没有启动无线传感网和主控程序,CGI程序无法正常获取到环境信息,所以该页面未显示环境信息。LED,蜂鸣器,继电器控制页面如图所示。
注册页面
注册成功后数据库内容
环境数据实时显示页面
远程设备控制页面
系统完整功能测试
整个系统运行时,在非本系统所在的局域网的网络环境下使用内网穿透成功后的外网地址http://my.zyfrp.vip:7896
来访问本系统的BOA服务器,外网地址能够成功访问本系统的BOA服务器,如图所示。(已失效)
外网条件下成功访问BOA服务器
当整个系统运行时,电脑浏览器页面正常实时显示环境数据,如图所示。根据显示信息,可知当前一号终端节点所处环境下的温度为26摄氏度,湿度为54%,光照强度为127,气体浓度为3%,该环境参数是在未经专业设备矫正情况下得到的,不能反应一号终端节点所处环境下精确的环境参数。
浏览器页面实时显示终端节点环境信息
整个系统运行时,使用远程设备控制网页控制LED亮,可以成功控制LED,终端节点上的绿色LED亮,如图所示。
成功远程控制LED画面
整个系统运行时,使用远程设备控制网页控制继电器,可以成功控制继电器,终端节点上继电器模块的绿色LED亮,如图所示。
成功远程控制继电器画面
ZigBee部分硬件设计
无线传感网硬件整体设计
无线传感网硬件设计分三部分:核心板、终端节点底板和协调器底板。终端节点与协调器由核心板和对应的底板组成。终端节点底板与协调器底板都具备一定的人机交互能力,终端节点底板搭载各种传感器和外设,主要负责环境数据的采集和外设控制;协调器底板在终端节点底板基础上删减传感器和外设,主要负责数据的收集,上传及其远程控制命令的发送。
无线传感网核心板设计
无线传感网核心板主要依靠德州仪器的CC2530芯片来完成无线传感网络的组建,系统终端节点与协调器都需要用到核心板,根据CC2530的数据手册,参考资料的参考电路来完成核心板的设计。核心板主要包括天线及巴伦匹配电路和晶振电路]。
天线和巴伦匹配电路的设计对ZigBee曲线传感器网络的性能和通信距离有重要影响。在天线设计方面,可以灵活选择多种方案。一方面,可采用PCB天线,比如倒F天线、螺旋天线等,这些天线设计紧凑且易于集成在电路板上。另一方面,也可以选用带有SMA接口的杆状天线,这种天线在某些应用场景中可能更具优势。综合考虑各种因素,本文最终选用了SMA接口的杆状天线。至于巴伦匹配电路的设计,则是确保天线与整个系统之间实现高效能量传输的关键。通过匹配电路,可以最大限度地减少信号损失,提高ZigBee无线传感网络的通信质量。如图2-1所示,通过合理的天线选择和匹配的电路设计,可以确保系统具有良好的射频性能,从而实现更远的通信距离和更低的系统功耗。
图2-1 天线及巴伦匹配电路设计
CC2530核心板晶振电路如图2-2所示。本文设计的晶振电路包括2个晶振,32MHz晶振和32.768KHz晶振。
图2-2 晶振电路设计
通过嘉立创专业版EDA软件绘制核心板完整原理图和PCB,,核心板完整原理图如图2-3所示,PCB如图2-4所示,核心板通过排针与终端节点底板或者协调器底板连接使用,核心板供电也来自终端节点底板或者协调器底板。完成PCB绘制后打板进行实物验证。
图2-3 核心板完整原理图
图2-4 核心板PCB(正面)
终端节点硬件设计
本系统的终端节点主要由核心板和终端节点底板组成。终端节点底板包含电源、USB转串口、按键、LED指示灯、屏幕、蜂鸣器、光敏、继电器接口、温湿度传感器DHT11接口、MQ-2气体传感器接口电路组成。终端节点的核心板需要完成驱动按键、LED、串口、继电器、各种传感器,通过DHT11温湿度传感器、MQ-2气体传感器和光敏电阻获取环境中温度、湿度、气体浓度和光照强度信息,同时完成数据的收发,显示等任务。
电源电路
终端节点输入电压由USB接口或者排针输入5V,除继电器和MQ-2气体传感器为5V供电外,其他部分的供电都是3.3V,所以需要得到3.3V电压,该系统使用AMS1117-3.3稳压器芯片来得到3.3V电压。电源部分电路如图2-6所示,电源部分由AMS1117降压电路、电源指示灯,TVS保护电路和自锁开关组成,TP1、2、3为测试点。
图2-6 电源电路
蜂鸣器电路
本设计使用华能制造的无源蜂鸣器,该蜂鸣器以其出色的性能与稳定性而备受赞誉。蜂鸣器驱动电路如图2-7所示,蜂鸣器的正极与3.3V的电压源直接相连,确保在需要发声时能够提供充足的电能。而蜂鸣器的负极则与NPN型晶体管SS8050的集电极相连,通过晶体管的开关作用,实现对蜂鸣器发声的精确控制。当P0.0引脚接收到信号时,通过R6电阻给Q1的基极提供偏置电流,使Q1导通,蜂鸣器得到电源和地之间的连接而发声。
蜂鸣器驱动电路
光敏电阻电路
光敏电阻电路如图2-8所示,电阻R11的阻值为10KΩ,它与光敏电阻GL5528并联,共同形成一个电压分压器。光敏电阻GL5528的阻值范围是10-20KΩ,其阻值会根据光照强度的变动而进行相应的调整。当光照强度改变,光敏电阻的阻值改变,从而改变R11和GL5528之间的节点电压,这个电压被送到P0.6引脚。通过读取P0.6引脚的电压,可以得知光照强度的变化,从而实现光敏功能。
图2-8 光敏电阻电路
气体传感器电路
MQ-2是一款气体感应器,主要用于探测环境中存在的易燃气体和烟雾。本系统MQ-2传感器电路如图2-9所示,MQ-2传感器电路使用5V电源供电,电阻R16、R17、R18和R15在电路中起到限流和电压分压的作用。LM393是一种电压比较器,用于处理MQ-2传感器的信号。当MQ-2气体传感器检测到的环境中的气体浓度超过设定阈值时,LM393比较器将输出高电平。电阻R15和R17形成一个反馈回路,连接到LM393的一个输入端,用于设定比较器的阈值。LED8是一个指示灯,通过电阻R18连接到比较器的输出端,当比较器输出高电平时,LED8亮起,表示检测到的气体浓度超过阈值。电路的数字输出DOUT接口通过核心板与单片机连接,单片机采集数字输出并通过转换得到相关气体浓度。
图2-9 气体传感器电路
DHT11电路
DHT11是一款出色的数字温湿度传感器,以其精确校准的数字信号输出能力,在温湿度检测领域赢得了广泛的关注和好评。DHT11采用先进的数字模块和温湿度感应技术,具有高可靠性和长期稳定性。传感器内部装有湿度感应元件和温度测量元件,配合高效的微控制器,能提供精确和高效的温湿度测量体验。DHT11数字温湿度传感器因其品质、响应速度、抗干扰能力和性价比等优点而受到市场的广泛称赞。无论是在家庭环境监控、工业自动化还是其他需要精确温湿度测量的场合,DHT11数字温湿度传感器都能展现其强大的功能,为用户提供准确、稳定的温湿度数据,帮助用户实现精确的控制和管理。
本文DHT11温湿度传感器电路如图2-10所示,温湿度传感器DHT11使用3.3V供电,电阻R12的阻值为4.7KΩ,它连接在VCC和DHT11的DATA引脚之间,起到上拉电阻的作用,确保DATA线在无信号输入时保持高电平。DHT11的DATA引脚连接CC2530核心板单片机的P0.4引脚,用于实现温湿度数据的采集。
温湿度传感器DHT11电路
继电器电路
继电器使用松乐继电器,它的线圈一端连接到电源5V电源,另一端连接到晶体管Q2的集电极。二极管D2并联在继电器线圈两端,用于消除反向电动势,保护电路。NPN型晶体管Q2用于驱动继电器,当其基极接收到足够的电流时,集电极和发射极之间导通,继电器线圈得电而吸合。
本系统继电器电路如图2-11所示,电阻R19连接在Q2的基极和微控制器的一个引脚之间,用于限制流向基极的电流。电阻R20连接在LED9和地之间,限制LED的电流。LED9和LED10是指示灯,通过电阻R20和R21连接到电源和地,可以用于指示继电器的工作状态或其他信号状态。单片机P1.3引脚通过核心板与继电器电路的控制接口连接,来控制继电器的闭合。
图2-11 继电器电路
终端节点完整设计
终端节点底板采用两层PCB板设计,元器件集中在正面,背面只有TVS保护电路的双向TVS二极管SMBJ6.8和10uF电容。终端节点原理图如图2-12所示,其中继电器电路、DHT11电路、MQ-2电路集成为模块,使用排针或排母连接。PCB如图2-13所示,该PCB中信号线走线宽度为10mil,电源3.3V和5V走线宽度为20mil或30mil。
图2-12 终端节点原理图
图2-13 终端节点PCB(正面)
2.6 协调器硬件设计
本系统的协调器主要由核心板和协调器底板组成。协调器底板在终端节点底板基础上删减掉了各种传感器接口,蜂鸣器等不需要的电路。具体电路分析参考2.5终端节点硬件设计章节的内容。协调器需要完成数据的收发,显示,与Linux系统部分的交互等任务。协调器底板原理图如图2-15所示,PCB如图2-16所示。
图2-15 协调器原理图
协调器PCB(正面)
软件设计(部分)
Linux+web部分
Linux主控程序开发与实现
主控程序实际上就是一个进程,这个进程包含多个线程和模块,用于接收和处理来自传感器的数据,并进行相应的处理和控制。Linux主控程序开发中主要使用了文件IO、多线程编程、多进程编程、信号量、共享内存、消息队列、互斥锁、条件变量、链表操作等技术。
数据存放链表与命令存放链表
链表可以在运行时动态地添加和删除节点,不需要在编译时就知道数据的大小,这使得内存管理更加灵活。在链表中插入和删除节点通常是一个高效的操作,时间复杂度为O(1),只需要改变指针,不需要像数组那样移动大量元素。链表的结构简单,易于理解和实现,适合于嵌入式系统等资源受限的环境。在Linux主控程序中使用了两个链表数据存放链表与命令存放链表,数据存放链表结构如图所示,命令存放链表如图所示,数据存放链表和命令存放链表均为单链表。两个链表都分别实现了相关的创建一个空的链表函数、检查链表是否为空函数、从链表中获取一个节点函数、在链表末尾插入一个新的节点函数方便链表的使用。
数据存放链表结构图
命令存放链表结构图
进程间通讯与资源的保护
进程间的通信(Inter-Process Communication,简称IPC)是指在操作系统中运行的不同进程之间交换数据和协调工作的机制。在一个多任务操作系统中,进程是独立的执行单元,每个进程都有自己的虚拟地址空间,这意味着它们默认情况下不能直接访问彼此的数据。因此,为了进行协作,进程需要通过特定的通信手段来传递信息。以下是几种常见的IPC方式:管道(Pipes)、无名管道、命名管道(FIFO)、消息队列(Message Queues)、信号量(Semaphores)、共享内存(Shared Memory)、套接字(Sockets)、信号(Signals)等。每种通信方式都有其适用的场景和优缺点,选择哪种方式取决于具体的需求,如数据量、实时性要求、安全性以及通信的复杂性。
共享内存
共享内存使用时进程能够直接对内存进行读写操作,无需进行数据拷贝的繁琐步骤。为了实现多个进程间的信息互通有无,内核精心设置了一块特定的内存区域,供有需求的进程映射至其各自的私有地址空间。这一设计使得进程能够直接对这块共享内存进行读写,彻底摆脱了数据拷贝的束缚,从而显著提升了通信效率。然而,多个进程共享同一块内存也带来了一定的挑战,即如何确保数据访问的同步性和一致性。为此,使用共享内存的同时需要使用一系列同步机制,如互斥锁、条件变量和信号量等,以确保各进程在访问共享内存时能够遵循一定的规则和顺序,避免数据冲突和错误,本系统中使用的同步机制后文将介绍。
在ZigBee网络环境数据的传输场景时,需要确保所有相关进程能够定时从某块特定的共享内存中读取数据,并在有新数据更新时能够方便地将数据写入该内存。同时,读取操作不应影响原有数据的保留,而写入操作则应对内存中的数据进行更新。因此,在该系统中,使用共享内存机制来实现ZigBee网络环境数据的刷新。具体实现上,Linux操作系统提供了相关的函数,通过调用一系列函数来管理共享内存,这些函数如表所示。通过这些函数的灵活运用,能够轻松地在多个进程间共享数据,实现高效、可靠的进程间通信。
消息队列
消息队列,作为IPC(进程间通信)对象的一种关键形式,通过独特的消息队列ID进行标识,本质上就是一个有序的消息集合。用户可轻松地在其中添加、读取或处理各种消息。不仅如此,消息队列还具备按照特定类型发送和接收消息的功能,使得通信过程更为灵活和高效。
在将Web页面或APP下发的控制命令通过串口传递给ZigBee网络终端节点,以实现对各类外设的控制时,需考虑以下问题:首先,必须确保所有控制命令都能准确无误地传递,即便用户在连续点击页面按钮时也不能有任何遗漏;其次,命令的发送顺序至关重要,必须严格按照既定顺序进行排列;最后,ZigBee网络可能存在较大的延时,需要控制发送速度,避免过快导致的问题。为解决上述问题,采用消息队列作为控制命令获取与发送的机制。通过消息队列,可以确保命令的完整性和顺序性,同时有效应对网络延时带来的挑战。而消息队列的具体实现则依赖一系列函数,同样这些函数都是Linux操作系统提供的,如表所示,这些函数为消息队列的高效运作提供了有力支持。
消息队列操作函数
信号量
一次只允许一个进程使用的资源称为临界资源。临界资源并不全是硬件或是软件,而是两者都能作为临界资源。访问共享变量的程序代码段称为临界区,也称为临界段(critical section)。两个或以上的进程必须避免同时进入关于同一组共享变量的临界区,以防止可能的时间相关错误,这种同步现象被统称为进程互斥。在这样一个系统中,共享内存的访问必须是互斥的,即当一个进程正在访问共享内存时,其他所有进程都必须等待其完成,不得同时进行访问。信号量(semaphore)作为一种高效的同步机制,不仅可用于不同进程间的同步,也可实现同一进程内不同线程间的同步。在本系统的Linux主控程序中,正是借助信号量来确保共享内存的互斥访问。如表4-3所示,通过信号量控制策略,能够有效地防止多个进程同时进入临界区,从而确保系统运行的稳定性和数据的一致性。
信号量操作函数
互斥锁与条件变量
对于多个阻塞任务,必须使用多进程或多线程,所有的临界资源操作都必须互斥。该系统使用的同步机制为:互斥锁、条件变量。互斥锁,作为一种关键的同步机制,其核心作用在于保护那些至关重要的临界资源。每个这样的资源都配备了专属的互斥锁,确保在任何时间点,仅有一个线程能够对其进行访问。在使用规则上,线程必须先成功获取互斥锁,方能触及临界资源;而一旦访问完毕,则需立即释放该锁,以便其他线程有机会获取。若线程未能顺利获取锁,它将会进入阻塞状态,持续等待直至成功获取锁为止。条件变量则是本文使用的另一种高效的同步机制,它依赖于线程间共享的全局变量来实现同步。条件变量的核心逻辑在于:一个线程会等待某个特定条件成立而进入挂起状态;而另一个线程则负责在条件成立时发出信号,并唤醒那些因等待条件而挂起的线程。为了避免潜在的竞争问题,条件变量的使用常常与互斥锁相结合,确保对条件的测试总是在互斥锁的保护下安全进行。
在主控进程的主线程中,主线程通过阻塞方式从消息队列中提取指令,并需要将这些指令发送给ZigBee命令发送线程。ZigBee命令发送线程必须保持阻塞状态,直到主线程完成数据发送。此外,数据共享内存数据刷新线程也需阻塞等待,直至ZigBee数据采集线程通过串口成功读取到所需数据。在这样的场景下,条件变量成为实现同步的理想选择,确保了各个线程之间的协调与高效运行。互斥锁与条件变量操作函数。
互斥锁与条件变量操作函数
多线程
Linux主控程序实现了一个主进程,其中包括4个线程。终端结点将采集到的环境数据通过ZigBee协议发送给协调器,协调器通过串口上传到Linux系统,并在网页服务程序端进行显示,网页服务程序端也可以下发命令到终端节点。数据读取线程,通过串口读取数据,送入链表中,并给数据上传线程发送条件变量信号。数据上传线程,收到信号后从链表中读取数据送入共享内存中,共享内存中数据供网页服务程序端读取。命令下发线程,在网页服务程序端与上位机端还有一个消息队列,上位机下发命令送入消息队列中,由命令下发线程从消息队列中取出数据进行甄别,如果是下位机的命令则送入链表中并给下位机线程发送条件变量信号。串口发送线程,收到信号后取出命令,并通过串口送入协调器,协调器通过ZigBee网络发送到终端结点实现设备远程控制。
网页浏览服务程序开发与实现
本系统中设计的网页浏览服务则为用户提供网页浏览服务,实现了账号登录、注册,实时显示环境信息,远程控制设备等功能。Web服务器使用BOA服务器;网页浏览服务页面则通过html+css+javascript开发实现;账号登录、注册通过使用数据库sqlite3和CGI实现;显示环境信息,远程控制设备等功能则通过CGI来实现。
BOA服务器的搭建
BOA是一款非常小巧的Web服务器,源代码开放、性能优秀、支持CGI通用网关接口技术,特别适合应用在嵌入式系统中。BOA服务器主要功能是在互联嵌入式设备之间进行信息交互,通过网络对嵌入式设备进行监控,并将反馈信息自动上传给主控设备。
获取BOA安装包后,对安装包进行解压,然后对BOA源码进行修改,再进行编译,编译之后生成配置文件boa.conf,修改配置文件参数为该系统的配置,具体修改配置内容如表。配置修改完成后在/www文件夹下进行网页浏览服务的其他功能开发。
配置文件具体修改内容
数据库SQLite的使用
数据在实际工作中应用非常广泛,数据库的产品也比较多,如oracle、DB2、ssQL2000、mySQL等。基于嵌入式Linux的数据库主要有SQLite,Firebird,BerkeIeyDB,eXtremeDB。本系统中使用SQLite数据库来实现登录、注册功能。SQLite数据库有如下特点:零配置一无需安装和管理配置;储存在单一磁盘文件中的一个完整的数据库;数据库文件可以在不同字节顺序的机器间自由共享;支持数据库大小至2TB;足够小,全部源码大致3万行c代码,250KB;比目前流行的大多数数据库对数据的操作要快。本系统中使用了下列C编程接口,如表。登录、注册功能都是通过CGI程序接口编程实现的。
SQLite3数据库C编程接口函数
CGI接口的实现
CGI,即通用网关接口(Common Gateway Interface),是一种标准化协议,用于规定Web服务器与应用程序之间高效、稳定的数据传输方式。CGI应用程序是部署在服务器上的可执行代码片段,具备与浏览器进行实时交互的能力,同时能够借助数据API与数据库服务器等外部数据源保持通信,从而轻松获取和展示来自数据库的数据。无论是哪种类型的服务器,包括BOA服务器在内,几乎都能无缝支持CGI。这种广泛的兼容性使得开发者能够选择自己擅长的编程语言来编写CGI应用程序,进一步提升了开发的灵活性和效率。CGI技术的运用,使得Web应用能够更加便捷地与后端系统交互,为用户带来更加丰富、个性化的体验。
CGI运行的整体流程是一个复杂而有序的过程,它涉及到多个组件之间的交互和协作。首先,用户通过访问Web应用来发起一个HTTP请求。这个请求可能包含了一些特定的参数或数据,用于指示Web服务器执行特定的操作或返回特定的内容。一旦HTTP请求被发送,它会被Web服务器接收并处理。Web服务器是负责管理和处理来自客户端的HTTP请求的关键组件。它会仔细解析从HTTP请求中传来的数据,包括请求的URL、请求方法(如GET或POST)、请求头以及请求体等。根据解析后的请求数据,Web服务器会确定如何响应这个请求。如果请求需要执行一些动态生成内容的操作,比如访问数据库或执行特定的程序,那么Web服务器就会创建一个新的CGI进程来处理这个请求。在创建CGI进程时,Web服务器会根据请求的URL和其他相关信息来确定要启动哪个CGI程序。然后,它会将HTTP请求的相关数据传递给CGI程序,并等待CGI程序处理完成后返回结果。CGI程序在接收到请求数据后,会执行相应的操作,比如操作数据库、获取数据、写入数据等。根据CGI程序的具体实现,本文CGI程序会查询并操作SQLite数据库、访问并获取共享内存中的数据、向消息队列写入数据,并将结果返回给Web服务器。最后,Web服务器把接收到的CGI程序返回的结果封装成一个HTTP响应,并把这个HTTP响应发送给发起请求的用户。这个HTTP响应可能包含了生成的内容、状态码、响应头等信息,用于告知用户请求的处理结果。
通过移植cgic库,用来支持CGI编程,该库符合ANSI-C标准,有较好的移植性。用一般ANSI C或C++编译器就可以编译CGI程序,与C程序不同的是,用CGI写的源码其主函数是cgiMain(),而不是通常的main。CGI的函数库会自动把cgiMain链接到相应的main上。调用前会准备好环境变量。
登录与注册时的数据库操作、环境数据的显示和远程控制命令的下发都需要使用到CGI。数据库操作通过CGI编程接口获取表单输入的账号与密码,使用SQLite的C编程接口操作数据库实现登录注册功能。环境数据信息的实时显示和设备的远程控制通过信号量,共享内存,消息队列,HTML,CGI共同实现,通过HTML关联到CGI程序,在CGI程序中则通过信号量和共享内存实时获取到无线传感网采集到的环境数据,并将结果输出写回HTML页面中;或者是通过HTML页面的控制命令的输入,使用消息队列供Linux主程序获取。CGI程序通过下面函数实现页面的数据获取与输出,如表。
CGI程序C编程接口函数
网页页面的实现
网页页面是通过html+css+javascript,并依赖CGI程序实现的。网页作为环境数据实时显示与终端节点远程控制平台的前端界面,采用HTML5标准编写,遵循XHTML 1.0 Transitional规范。页面设计采用表格布局(Table-based layout),兼顾结构清晰与兼容性。样式方面,融合了内联CSS、外部CSS文件(skin.css和fox.css)以及特定的内联样式块,共同塑造页面视觉效果。字符集设置为UTF-8,确保多语言环境下内容的准确展示。页面交互基于HTTP POST请求,通过提交表单数据触发后台CGI脚本来执行远程控制操作。
网页页面主要包括登录页面,实时显示数据页面与控制页面。以实时显示环境数据页面为例,这个页面主要用于实时显示终端节点的环境信息。页面上有一个iframe元素,其src属性设置为cgi程序的完整路径,这表示它会加载并显示来自服务器上对应名的CGI脚本的输出。这些脚本负责收集显示终端节点的环境信息(如温度、湿度、光照等),并将这些信息格式化为HTML,并在网页上显示。页面的其余部分主要是静态HTML和CSS,用于设置页面的布局和样式。控制页面,页面主要用于远程控制终端节点的设备,如LED和警报器等。页面上有三个个表单,每个表单都有一个单选按钮组,用于选择设备的状态(开或关),以及一个提交按钮,用于发送控制命令。当用户选择一个选项并点击提交按钮时,表单会将用户的选择作为POST数据发送到服务器上的相应CGI脚本。这些脚本负责解析POST数据,并根据用户的选择发送控制命令到终端节点。页面的其余部分同样是静态HTML和CSS,用于设置页面的布局和样式,本系统中使用到的HTML标签(部分)如表所示。
本系统中使用到的HTML标签(部分)
页面的完整内容呈现需要依赖CGI程序。CGI程序负责与Linux主控程序通信,获取环境信息、发送控制命令等。
内网穿透
基于BOA服务器实现的网页浏览服务只能在局域网下才能访问,即不能在任何非本系统所处局域网的网络环境下访问本系统的网页浏览服务,这大大限制了本系统的可用性和便利性。而内网穿透可以解决这一问题。内网穿透是一种技术,它允许用户通过公共网络(如互联网)访问处于私有局域网(内网)中的资源。这些资源可能是文件、应用程序、服务器等。内网穿透也叫做内网映射,也叫“NAT穿透”,一句话来说就是,让外网能访问你的内网;把自己的内网(主机)当成服务器,让外网能访问。
内网穿透有很多工具可以选择,比如FRP、Ngrok、NPS等,本文使用的工具为FRP。本文使用卓越内网穿透FRP服务器,在卓越内网穿透官方网站www.frpnc.com ,根据泰山派的ip地址和BOA服务器的端口新建隧道,在泰山派上设置FRP客户端相关的文件,即可实现内网穿透。本系统中泰山派的ip地址为192.168.113.40,BOA服务器的端口号为80,内网穿透设置的远程端口为7896,内网穿透成功后的外网地址为http://my.zyfrp.vip:7896 ,通过外网地址即可实现BOA服务器的访问。
ZigBee部分
屏幕程序设计
屏幕使用ST7735驱动显示屏,屏幕型号为Z144SN005,大小1.44寸,分辨率128*128,驱动芯片ST7735S,通讯方式SPI串口。根据屏幕厂商提供的代码进行移植,修改相关引脚,单片机P1.2显示复位控制引脚,P1.6为AO数据或命运模式控制引脚,P1.5为数据引脚,P1.7时钟引脚,实现屏幕的驱动,并在此基础上实现显示相关的函数。
MQ-2程序设计
MQ-2作为一款全面的气体泄露检测设备,广泛应用于家庭和工厂环境,能够精确检测液化气、苯、烷、酒精、氢气以及烟雾等多种气体,被誉为一款多功能的气体检测器。MQ-2型烟雾传感器,这款卓越的装置,其核心材质源于二氧化锡半导体气敏材料,其独特的表面离子式N型半导体特性使其在检测领域大放异彩。当MQ-2型烟雾传感器遭遇烟雾时,烟雾分子会与传感器的晶粒间界发生相互作用,进而调整其势垒状态。这种势垒状态的变化将直接反映在传感器的表面导电率上,从而实现烟雾存在的有效检测。
为了实现对MQ-2烟雾浓度的精确采集,本文使用CC2530芯片的ADC对信号进行实时采集。CC2530芯片的ADC采集到的信号仅为原始数据,要将其转化为具有实际意义的烟雾浓度值,还需依据MQ-2传感器的特性进行细致的校正和公式转换。通过这些处理,最终才能够获取到准确的烟雾浓度值。本文CC2530单片机的P0.7引脚进行信号的采集,采集到的信号由于没有专业的仪器,未能进行矫正,简单使用百分比来反应气体浓度。
继电器程序设计
继电器,简而言之,就是一个控制开关的装置。VCC代表电源的正极,本系统中为5V电源,为继电器提供所需的电能;而GND则代表电源的负极,确保电流能够形成闭合回路。IN作为信号输入脚,接收来自外部的信号指令;而COM则代表公共端,它是继电器内部电路的关键连接点。NC,即常闭端,表示在继电器未激活状态下,该端子是闭合的,电流可以通过;而NO,即常开端,则与之相反,表示在继电器未激活状态下,该端子是断开的,电流无法通过。继电器能够根据外部信号灵活地控制电路的通断,从而实现各种自动化控制功能。单片机P1.3引脚通过核心板与继电器电路的控制接口连接,只需要控制P1.3引脚输出高低电平就可以控制继电器的闭合。
温湿度传感器程序设计
DHT11湿度精度为±5%RH,温度精度为±2℃,湿度量程为5-95%RH,温度量程为0-50℃。当用户的MCU发送一次启动信号后,DHT11会从低功耗模式切换到高速模式,主机开始信号结束后,DHT11会发送响应信号,DHT11会输出40bit的数据,并触发一次信号采集,用户可以选择读取部分数据。本系统的单片机P0.4引脚与DHT11之间的通信和同步,使用单总线数据格式,一次通信时间大约为4ms,数据包括小数部分和整数部分,当前的小数部分用于未来的扩展,现在读出的是零,一次完整的数据传输为40bit,高位先出,数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。
光敏程序设计
光敏电阻以3.3V供电,单片机P0.6引脚采集经10k电阻分压后的电压信号,该信号值得大小用来粗略反应光照强度大小。
LED程序设计
LED1、2、3,当单片机连接的引脚输出高电平时亮,单片机连接的引脚输出低电平时灭;LED4、5则相反,当单片机连接的引脚输出高电平时灭,单片机连接的引脚输出低电平时亮。
设计图

BOM


评论