环境实时监控系统的设计(以物联网仓储为例)

目录
前言 3
1. 系统概述 3
1.1. 全局定义 3
2. 主程序 7
2.1. 数据库操作 9
2.1.1数据库操作线程 9
2.2. 消息队列请求线程 10
2.3. M0接收线程 11
2.4. 共享内存线程 12
2.5. 摄像头模块线程 13
2.6. M0控制命令发送线程 14
3. M0模块 15
3.1. M0芯片简介 15
3.2. 工作流程 15
3.2.1. 信息的采集功能 16
3.2.2. 信息的发送 18
3.3. 流程图 19
3.4. 消息命令字 19
5. 系统移植 20
4.1摄像头驱动移植 20
4.2 JPEG库移植 21
4.3 MJPG-streamer视频流服务器移植 22
4.4 BOA Web服务器移植 23
5.1. SQLite移植 25
6. 网页客户端模块 26
6.1. HTML简介 26
6.2. HTML语言的基本代码结构 27
6.3. CGI程序 28

前言
随着计算机技术、网络技术和物联网技术快速发展,智能家居、远程控制仓储等都已经进入人们的工作生活。于是大家对食品物流环境有了更多的想法,希望物流管理智能化,减少人工负担,提高效率,还需要能够防火防盗。
本系统正是融合了物联网技术、嵌入式技术这两门门技术实现了对仓储管理和控制的智能化,大大提高了仓储管理的效率,降低了人工及维护成本,实现了对仓储系统的远程监控和访问。
物联网仓储系统使用更方便,操作更简单,用户体验更健康、更人性化。

  1. 系统概述
    本项目分为三个模块:客户端(网页)、数据处理中心(A9)、数据采集中心(M0) 。
    环境实时监控系统的设计(以物联网仓储为例)
    系统工作过程如下:
    1.通过M0进行实时采集环境参数,例如温度、湿度、光感数据,进行物品刷卡;
    2.再通过ZigBee把采集到的环境参数或物品信息发送给A9;
    3.由A9的M0线程负责接收环境参数或物品信息,**数据库线程对数据库进行相应的处理,假如是环境参数则对环境参数进行判断处理进行报警。
    4.用摄像头采集图片,存储到A9上。
    5.构建嵌入式web服务器,使用户通过网络利用pc机进行监控。
    6.在web页面上设置控制按钮,监控设备识别用户指令并进行相应动作

1.1. 全局定义

宏定义
名字 表达式 描述
STORAGE_NUM 5 仓库总数
GOODS_NUM 10 货物总数
QUEUE_MSG_LEN 100 共享内存大小
sTime 20 环境数据采集时间
MSG_LEN (sizeof(msg)-sizeof(long)) 消息长度
Picture 0x3 拍照请求标志位
Control 0x4 控制M0请求标志位
Env 0x5 设置环境变量标志位

全局结构体变量
数据类型 数据类型、成员名 描述
storage_goods_info unsigned int goods_type 货物类型 单个货物信息描述结构体
unsigned int goods_count 货物数量
storage_info unsigned char storage_status 仓库开关 单个仓库信息描述结构体
unsigned char led_status LED状态
unsigned char buzzer_status 蜂鸣器状态
unsigned char fan_status 风扇状态
unsigned char seg_status 数码管状态
signed char x 三轴状态
signed char y
signed char z
char samplingTime[sTime] 环境数据采集时间
float temperature 当前温度
float temperatureMAX 温度上限
float temperatureMIN 温度下限
float humidity 当前湿度
float humidityMAX 湿度上限
float humidityMIN 湿度下限
float illumination 当前光照强度
float illuminationMAX 光照强度上限
float illuminationMIN 关照强度下限
float battery FS11C14电池电量
float abc[2] 模拟电压
float abcMIN 模拟电压最小值
storage_goods_info goods_info[GOODS_NUM] 仓库内货物的信息
union_uart storage_info cur_storage_info M0采集的仓库信息 仓库信息结构体与字符数据共用体
char recvbuf[sizeof(storage_info)]
env_info_client_addr storage_info storage_no[STORAGE_NUM] 仓库实时信息
shm_addr char cgi_status 标志位1 共享内存
char qt_status 标志位2
env_info_client_addr rt_status 实时信息
msg long type 消息队列结构体
long msgtype 消息类型
unsigned char text[QUEUE_MSG_LEN] 消息正文
sqllink_t char buf[1024] 数据库命令语句 数据库链表
struct sqllink *next

全局变量
数据类型 变量名 描述
Int msgid 消息队列id
shmid 共享内存id
semid 信号灯id
storagenum 仓库号
goodskind 货物种类
fd_zigbee zigbee设备节点
PicNum 拍摄照片的张数
unsigned int uartcmd CGI传递的控制命令
char uartmsg[3] 发送给FS11C14的控制命令
sql[256] 数据库操作命令
msg cur_msg 消息队列
shm_addr* shm_point 共享内存首地址
union_uart recv 接收仓库信息的共用体
pthread_mutex_t mutex_slinklist 互斥锁
mutex_sqlite
mutex_uart_cmd
mutex_client_request
mutex_buzzer
mutex_led
mutex_camera
mutex_refresh
mutex_global
pthread_cond_t cond_sqlite 条件变量
cond_uart_cmd
cond_client_request
cond_buzzer
cond_led
cond_camera
cond_refresh
sqlite3 * db 数据库
sqllink_t * l 数据库链表头
env_info_client_addr env_info_clien_addr_t 仓库信息结构体变量

全局函数
返回值数据类型 函数名 形参 描述
Void* pthread_client_request Void*arg 处理用户请求线程
pthread_refresh 刷新共享内存线程
pthread_sqlite 数据库线程
pthread_transfer 接收仓库信息线程
pthread_uart_cmd M0命令发送线程
pthread_led LED控制线程
pthread_camera 摄像头控制线程
pthread_buzzer 蜂鸣器控制线程
int check_fd_zigbee Int fd_zigbee 检查zigbee设备状态
void serial_init Int fd_zigbee 初始化串口
setuartcmd Unsigned char tmp 设置仓库控制命令
sqllink_t * link_create 创建数据库链表
int insert_l sqllink_t *l,char *p 插入节点
void dele_l sqllink_t *l, int pos 删除节点
sqlite_task sqllink_t *new 执行数据库命令

  1. 主程序
    环境实时监控系统的设计(以物联网仓储为例)

其中用到的线程如下:
pthread_client_request():处理消息队列里请求的线程.
pthread_refresh():更新共享内存里的实时数据.
pthread_sqlite():数据库线程.
pthread_uart_cmd:串口命令线程
pthread_transfer():接收M0数据线程.
pthread_camera():摄像头模块控制线程.
说明:
1. 摄像头部分有监控和抓拍两个功能,其中摄像头线程只完成了抓拍功能,抓拍命令是从消息队列里获得的,而视频监控功能直接走的MJPG-stream,所以上图中有画的与实际不相符的地方。
2. 数据库部分在客户端没有体现,所以CGI中也没有编写相应的数据库CGI进程,但是主程序中会将采集到的环境信息和货物信息存入数据库。
3. M0数据接收线程会将接收到的数据直接插入到链表中,之后唤醒数据分析线程。

2.1. 数据库操作
2.1.1数据库操作线程

环境实时监控系统的设计(以物联网仓储为例)
1.数据库操作线程需要创建一个用于存储对数据库操作的链表;
2.链表创建之后,等待其他线程的唤醒;
3.唤醒之后进入循环,判断链表不为空,则读取节点中的内容;
4.对数据进行相应的操作;
5.删除并释放节点。

2.2. 处理用户请求线程
环境实时监控系统的设计(以物联网仓储为例)

1.处理用户请求线程被唤醒后,先设置仓库号(1号或2号);
2.根据消息类型,进入拍照、控制、环境三个分支;
3.拍照分支设置拍照张数,唤醒摄像头线程拍照;
4.控制分支设置控制命令,唤醒M0控制线程,通过zigbee发送命令给FS11C14执行;
5.环境分支设置环境极限参数,唤醒数据库线程,将设定值插入数据库;唤醒共享内存刷新线程,刷新极限参数设定值。

2.3. 接收仓库信息线程
环境实时监控系统的设计(以物联网仓储为例)

1.接收M0数据线程被创建后,先互斥锁上锁,设置仓库号;
2.根据仓库号打开zigbee设备节点,并初始化;
3.调用recv_from_zigbee()函数读写设备节点;
4. recv_from_zigbee()函数:先接收“Y”,然后发送“N”,再接收“Y”,最后接收仓库信息结构体,结束时再发送“DOK”,清空接收缓冲区。将接收的仓库信息结构体赋值给env_info_clien_addr_t,函数返回;
5.互斥锁解锁,将货物信息、实时环境信息写入数据库,等待1秒后回到第1步。

2.4. 共享内存刷新线程

环境实时监控系统的设计(以物联网仓储为例)
1.刷新共享内存线程被唤醒后,先申请信号量;
2.将变量env_info_clien_addr_t里的仓库信息赋值给共享内存shm_point里的同类型变量rt_status;
3.释放信号量,返回第1步;

2.5. 摄像头模块线程
环境实时监控系统的设计(以物联网仓储为例)

1.摄像头线程被创建后,先判断管道是否存在,不存在则创建,创建失败则返回并打印错误提示;
2.摄像头线程等待被唤醒;
3.被唤醒后,互斥锁上锁,打开管道,设置照片张数;
4.发送照片张数,关闭管道;
5.互斥锁解锁,返回第2步。

2.6. M0控制命令发送线程
环境实时监控系统的设计(以物联网仓储为例)

1.M0控制命令发送线程等待被唤醒;
2.互斥锁上锁,打开设备节点,初始化串口;
3.发送控制命令;
4.关闭设备节点,互斥锁解锁,返回第2步。
3. M0模块
3.1. M0芯片简介
Cortex-M0处理器,是市场上现有的最小、能耗最低、最节能的ARM处理器。该处理能耗非常低、门数量少、代码占用空间小,使得MCU开发人员能够以8位处理器的价位,获得32位处理器的性能。超低门数还使其能够用于模拟信号设备和混合信号设备及MCU应用中,可望明显节约系统成本。

3.2. 工作流程
环境实时监控系统的设计(以物联网仓储为例)

向A9发送仓库信息:
环境实时监控系统的设计(以物联网仓储为例)

3.2.1. 信息的采集功能
每1秒,采集光敏传感器,温湿度传感器,RFID信息,三轴加速度传感器的信息。
(1) 采用DHT11传感器对温湿度信息进行采集
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接,单线制串行接口,DATA引脚与LPC11C14的PIO3_2引脚相连

在程序中通过ReadDHT11函数进行信息的读取,M0发送一次开始信号后,DHT11从低功耗模式转换为高速模式,开始信号接收后,DHT11发送响应信号,送出40bit的数据,并触发下一次信号采集。

数据格式:
8bit湿度整数数据 + 8bit湿度小数数据+8bit温度整数数据 + 8bit温度小数数据+8bit校验位。

校验位数据定义 :
“8bit湿度整数数据 + 8bit湿度小数数据+8bit温度整数数据 + 8bit温度小数数据”
8bit校验位等于所得结果的末 8位。
数据分小数部分和整数部分,当前小数部分用于以后扩展,现读出为零。

环境实时监控系统的设计(以物联网仓储为例)

(2) 采用ISL29003传感器对光照强度信息进行采集
LPC1114的PIN15和PIN16有两个功能,一个是GPIO引脚p0.4和p0.5,另一个是I2C通信用的SCL和SDA引脚。我们选择这个引脚作为什么功能,就需要用IOCON寄存器,这两个脚默认是GPIO引脚p0.4和p0.5。
1.初始化I2C总线 I2CInit(I2CMASTER, 0);
2.光敏电阻的初始化管脚 light_init();
3.设置光敏电阻的敏感值 light_setRange(LIGHT_RANGE_4000);
4.读取光敏电阻的感光值 uint32_t light_read(void) ;

(3) 采用CY14443/SPI对RFID信息采集;
• SPI高速串行接口;
• 能自动感应到靠近天线区的卡片,并产生中断信号;
• 采用高集成ISO14443A 读卡芯片,支持MIFARE标准的加密算法;
• 具有TTL/CMOS两种电压工作模式,工作电压3-5.5V;
• 采用工业级高性能处理器,内置硬看门狗,具备高可靠性;
• 抗干扰处理,EMC性能优良;
• 把复杂的底层读写卡操作简化为简单的几个命令;

CY-14443A系列射频读写模块采用基于ISO14443标准的非接触卡读卡机专用芯片,采用0.6微米CMOS EEPROM工艺,支持ISO14443 typeA协议,支持MIFARE标准的加密算法。芯片内部高度集成了模拟调制解调电路,只需最少量的外围电 路就可以工作,支持UART接口(-C),IIC接口(-U),或者SPI接口(-P),数字电路具有TTL、CMOS两种电压工作模式。特别适用于ISO14443标准下水、电、煤气表、自动售货机、门禁、电梯、饮水机、电话机等计费系统或身份识别系统的读卡器的应用。

芯片特性如下:
用户不必关心射频基站复杂的控制方法,只需要简单地通过选定的UART 或IIC 或SPI接口发送命令就可以对卡片进行完全的操作。CY-14443A系列全部有板载内置天线,SPI高速串行接口,能自动感应到靠近天线区的卡片,并产生中断信号。
把复杂的底层读写卡操作简化为简单的几个命令,这个很重要,因为这样就很方便的进行开发,不必在意内部具体的复杂实现方法,提高了开发的效率。
CY-14443A系列射频读写模块采用基于ISO14443标准的非接触卡读卡机专用芯片,采用0.6微米CMOS EEPROM工艺,支持ISO14443 typeA协议,支持MIFARE标准的加密算法。
通讯速率不大于 3Mbps,MSB 在前,上升沿采样。模块工作在半双工方式,即模块接受指令后才会做出应答,由于 SPI 接口发送数据的同时接受上一时钟周期的从机响应数据,因此在命令发送结束后,需要稍作延时,等待模块处理命令并做出响应,命令发送阶段,都会来上一次发送的 命令和数据内容,可以用来作为校验,读响应时可以发送0数据给模块。

命令格式为:前导头+通讯长度+命令字+数据域+校验码

前导头: 0xAA0xBB 两个字节,若数据域中也包含 0xAA 那么紧随其后为数据0,但是长度字不增加。
通讯长度:指明去掉前导头之外的通讯帧所有字节数(含通讯长度字节本身)
命令字: 各种用户可用命令
校验码: 去掉前导头和校验码字节之外,所有通讯帧所含字节的异或值

CPU 发送命令帧之后,需要等待读取返回值,返回值的格式如下:
正确:前导头+通讯长度+上次所发送的命令字+数据域+校验码
错误:前导头+通讯长度+上次所发送的命令字的取反+校验码

3.2.2. 信息的发送
采用ZICM2410无线通信。
 ZigBee模块选用周立功公司出产的ZICM2410,ZigBee模块实际上用串口和它连接即可以收发数据,它功耗低,成本低,具有优良的网络拓扑结构,便于组网。
 但M0开发板CPU(LPC11C14)唯一的一路串口用于了串口转USB。所以开发板上用了•0省了片上有限的UART资源。
 所以通过ZigBee模块发送数据即变成了写SPI1发送数据程序。
 ZICM2410模块对外部系统提供的接口包括:(1)UART0和UART1(2)I2c(3)SPI(4)GPIO(5)AD—-4路(6)IIs音频输入输出
4接收由A9传输的信息
接收A9传入的信息结构体,根据结构体的信息控制蜂鸣器,风扇,led,数码管。

3.3. 流程图
环境实时监控系统的设计(以物联网仓储为例)
3.4. 消息命令字
4. 仓库编号
0x40 1号仓库
0x80 2号仓库
0xc0 3号仓库

设备编号 操作掩码
0x00 风扇 0x00 关闭风扇
0x01 1档
0x02 2档
0x03 3档
0x10 蜂鸣器 0x00 关闭
0x01 打开
0x02 自动报警关闭
0x03 自动报警打开
0x20 LED 0x00 关闭
0x01 打开
0x30 数码管 0x00~0x09 显示0~9数字
0x0f 关闭数码管
仓库编号 + 设备编号 + 操作掩码 = 命令
例如:
0x40 +0x 00 + 0x 01 =0x 41 风扇一档
0x40 + 0x30 + 0x08 = 0x78 数码管显示8
0x40 +0x 30 + 0x0f = 0x7f 关闭数码管

  1. 系统移植
    4.1摄像头驱动移植
    摄像头用于查看仓库内的场景,此项目用到的摄像头为OV9650。
    摄像头移植操作流程:

环境实时监控系统的设计(以物联网仓储为例)
4.2 JPEG库移植
由于平板摄像头采集上的数据为YUV格式,而我们希望得到 JPEG 的压缩图像,所以需要 JPEG 库的支持,将YUV(欧洲电视系统所采用的一种颜色编码方法 )转化为JPEG 的压缩图像,这就需要JPEG库的移植。
JPEG库移植操作流程:

环境实时监控系统的设计(以物联网仓储为例)

4.3 MJPG-streamer视频流服务器移植
MJPG-streamer是一款基于IP地址的视频流服务器,它的输入插件从摄像头读取视频数据,这个输入插件产生视频数据并将视频数据复制到内存中,它有多个输出插件将这些视频数据经过处理,其中最重要的输出插件是网站服务器插件,它将视频数据传送到用户浏览器中,MJPG-streamer的工作就是将其中的一个输入插件和多个输出插件绑定在一起,所有的工作都是通过它的各个插件完成的。
各个插件如下:
(1)input_testpicture.so。这是一个图像测试插件,它将预设好的图像编译成一个头文件,可以在没有摄像头的情况下传输图像,从而方便调试程序。
(2)input_uvc.so。此文件调用USB摄像头驱动程序V4L2,从摄像头读取视频数据。
(3)input_control.so。这个文件实现对摄像头转动的控制接口。
(4)output_http.so。这是一个功能齐全的网站服务器,它不仅可以从单一文件夹中处理文件,还可以执行一定的命令,它可以从输入插件中处理一幅图像,也可以将输入插件的视频文件根据现有M-JPEG标准以HTTP视频数据服务流形式输出。
(5)output_file.so。这个插件的功能是将输入插件的JPEG图像存储到特定的文件夹下,它可以用来抓取图像。

MJPG-streamer移植操作流程:
环境实时监控系统的设计(以物联网仓储为例)
测试流程:
移植完成后,打开自己的浏览器输入:# mjpg_streamer -i “/mjpg/input_uvc.so -y” -o”/mjpg/output_http.so -w 192.168.XXX.XXX:8080” &,注意xxx.xxx要和电脑的windows IP 地址相同。
这时会看到在浏览器上所拍摄的画面

4.4 BOA Web服务器移植
BOA是一款非常小巧的Web服务器,源代码开放、性能优秀、支持CGI通用网关接口技术,特别适合应用在嵌入式系统中。
BOA服务器主要功能是在互联嵌入式设备之间进行信息交互,达到通过网络对嵌入式设备进行监控,并将反馈信息自动上传给主控设备的目的。它是基于HTTP超文本传输协议的,Web网页是Web服务最基本的传输单元。

嵌入式Web服务的工作基于客户机/服务器计算模型,由Web浏览器(客户机)和Web服务器(服务器)构成,也即著名的B/S结构。运行于客户端的浏览器首先要与嵌入式Web服务器BOA端建立连接,打开一个套接字虚拟文件,此文件建立标志着SOCKET连接建立成功然后客户端浏览器通过套接字SOCKET以GET或者POST参数传递方式向Web服务器提交请求,Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到请求后,根据请求的不同进行事务处理,返回HTML文件或者通过CGI调用外部应用程序,返回处理结果。服务器通过CGI与外部应用程序和脚本之间进行交互,根据客户端浏览器在请求时所采用的方法,服务器会搜集客户所提供的信息,并将该部分信息发送给指定的CGI扩展程序,CGI扩展程序进行信息处理并将结果返回给服务器,然后服务器对信息进行分析,并将结果发送回客户端在浏览器上显示出来。

BOA Web服务器移植操作流程:
环境实时监控系统的设计(以物联网仓储为例)

BOA服务器测试流程:
运行BOA:在开发板上运行 ./boa,界面如下就说明已经移植成功了:
环境实时监控系统的设计(以物联网仓储为例)

5.1. SQLite移植
SQLite,是一款轻型的数据库,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
此项目中我们用SQLite来管理从M0端接收的数据,将检测到的仓库信息存储起来。

SQLite移植操作流程:
环境实时监控系统的设计(以物联网仓储为例)

  1. 网页客户端模块
    这次项目HTML文件是通过cgi程序用来和M0,A9进行交互的。总共有10个html文件,分辨是登录页面,仓库选择页面,主控页面,M0控制页面,实时监控页面,环境信息,历史信息等
    通过html页面登录BOA服务器,就可以实时查看操作仓储

前言:通过html请求链接boa服务器实现客户端与服务器进行实时数据交互有效缩短了客户端程序开发周期,升级维护起来较为方便。这让我们将更多的精力放在设计出交互性较好的页面上;

6.1. HTML简介
HTML(HyperText MarkUp Language)是使用特殊标记来描述文档结构和表现形式的一种语言,由W3C(World Wide Web Consortium)所制定和更新。我们可以用任何一种文本编译起来编辑HTML文件,因为它就是一总纯文本文件。
HTML即超文本标记语言(标准通用标记语言下的一个应用)或超文本链接标示语言,是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言。HTML文件是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。HTML文件的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。
6.2. HTML语言的基本代码结构


HTML语言的基本结构

HTML(HyperText MarkUp Language)使用标记来描述文档结构的一种标记语言

1、HTML与cotexA9,和m0开发板的数据交互流程:

环境实时监控系统的设计(以物联网仓储为例)

2、页面布局:
环境实时监控系统的设计(以物联网仓储为例)

说明:实时监控通过数据流直接读到摄像头信息
6.3. CGI程序
CGI是一段程序,它运行在Server上,提供同客户端 Html页面的接口,CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器。

在这次项目中,CGI程序处理页面请求分别有:
1. 登录时查询用户输入用户名和密码时,查询数据库里的用户信息是否匹配
2. 图片拍摄,用户可以在页面输入要拍照的张数
3. 删除历史照片
4. 查看环境信息
5. M0一系列的控制信号

如图:

环境实时监控系统的设计(以物联网仓储为例)

说明:
在主界面上,有三个cgi接口分别是SetEnv.cgi,Sql.cgi,picture.cgi;
在历史照片界面上,有delete.cgi;
在实时监控界面上,有Capture.cgi
在M0控制界面上,有M0_led.cgi,M0_seg.cgi,M0_fan.cgi,M0_beep.cgi
在环境信息界面上,有Env.cgi

它们具体的用途如下:

SetEnv.cgi 将设置的最大温度,湿度等值通过消息队列发送给A9
Sql.cgi 读取数据库货物表信息
picture.cgi 打开照片所在文件夹,查看照片
delete.cgi 删除所有历史照片
Capture.cgi 通过消息队列发送拍摄张数的信息给A9
M0_led.cgi 通过消息队列将开关灯的数据发给A9
M0_seg.cgi 通过消息队列将开关数码管的数据发给A9
M0_fan.cgi 通过消息队列将开关风扇的数据发给A9
M0_beep.cgi 通过消息队列将开关蜂鸣器的数据发给A9
Env.cgi 通过共享内存实时读取环境信息发送给实时监控界面