-
需求分析
在不发生火灾时对室内湿度进行记录,与RFID读写记录等一同存入云端。
在发生火灾时进行相应灭火、阻止火势传播的操作,解除门控方便救火,并通过微信通知用户。
-
设备选择
光照传感器,温湿度传感,烟雾传感器,RFID读写器,电机,zigbee模块,网关设备。
-
设计方案
图 1 总体设计
该系统主要分为3大部分,分别是火情/温度检测,喷水控制部分、门禁控制部分、通风控制部分、数据处理部分。
-
工作原理
(1)、火情/温度检测部分:喷水控制部分由相应电机控制,温湿度传感器,光照传感器和烟雾传感器组成,同时这几台设备的将配备有相应的zigbee模块,并且都作为终端(Zigbee
Enddevice)来进行信息传输。信息将通过zigbee网络传输
(2)、门禁控制部分:由门禁控制装置(电机控制)、RFID接收器组成两者都将使用相应的zigbee模块,并且都作为终端(ZigbeeEnddevice)来进行信息传输。信息同样将通过zigbee网络传输
(3)、通风控制部分:由多个控制通风的电机模块组成,相应的设备同样配备zigbee模块,并且都作为终端(ZigbeeEnddevice)来进行信息传输。信息将通过zigbee网络传输
(4)、Zigbee网络部分:以上的部分的模块都有相应的zigbee终端模块,为了保证相关信息传输的安全性,和可行性,在zigbee网络中各部分向协调器(Zigbee Coordinator)发送信息的路径上可添加路由器Zigbee Router(可选)以保证信号可传达至后端。最终,所有的zigbee终端都将连入协调器并组成一个网络。协调器将通过串口通信连入PC/网关设备。
相应的串口通信代码如下
import serial
import serial.tools.list_ports as serials
import sys
import glob
#这个函数用于检测串口
def serial_ports():
if sys.platform.startswith('win'):
ports = ['COM%s' % (i + 1) for i in range(256)]
elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
# this excludes your current terminal "/dev/tty"
ports = glob.glob('/dev/tty[A-Za-z]*')
elif sys.platform.startswith('darwin'):
ports = glob.glob('/dev/tty.*')
else:
raise EnvironmentError('Unsupported platform')
result = []
for port in ports:
try:
s = serial.Serial(port)
s.close()
result.append(port)
except (OSError, serial.SerialException):
pass
return result
def connect(*args):
print(serial_ports())
# 打开串口
#serialPort="COM"+input("请输入串口号")
serialPort = "COM6" # 串口号
baudRate = 9600 # 波特率
ser = serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate)) # 输出串口号和波特率
# 收发数据
if(len(args)==1):
ser.write((args[0] + '\n').encode())
return
#temp = ser.read(8)
#temp = 'EECC0A0101000002A57D00000FFEE'
if temp == b'':
temp="0000000000000000000000000000"
return temp # 可以接收中文
ser.close()
PC/网关设备通过程序相应的connect函数接收到串口信息后再由相应的客户端程序发送至服务器
程序如下:
from socket import *
from 串口通信 import connect
import time
HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR=(HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
time.sleep(1)
data = connect()
tcpCliSock.send(bytes(data,'utf-8'))
data = tcpCliSock.recv(BUFSIZ)
print(data.decode('utf-8'))
#tcpCliSock.close()
- 、服务器端部分。服务器端接收客户端发送的串口通信信息,经由相应的判断程序处理之后选择是否触发火灾异常,如有异常,通过第三方发送信息至微信通知用户紧急情况。如无异常存入数据库。
相应的代码如下:
服务端程序:
from socket import *
from time import ctime
# PORT can be changed as you need, but it should be notified to client
HOST ='127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpSvrSock = socket(AF_INET,SOCK_STREAM)
tcpSvrSock.bind(ADDR)
tcpSvrSock.listen(5)
while True:
print("Waiting for connection...")
tcpCliSock,addr = tcpSvrSock.accept()
print("...connected from", addr)
while True:
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
data = data.decode('utf-8')
print(data)
respMsg = "[%s] %s"% (ctime(), data)
tcpCliSock.send(bytes(respMsg,'utf-8'))
tcpCliSock.close()
tcpSvrSock.close()
数据库程序:
import mysql.connector
def mysql_insert(temper):
# 建立连接
cnx = mysql.connector.connect(user='root',
password='11248',
database = "IOT")
# 创建游标
cursor = cnx.cursor()
# 执行插入
query = f'insert temper(temper)value({temper})'
cursor.execute(query)
# 提交数据
cnx.commit()
# 关闭游标和连接
cursor.close()
cnx.close()
传入微信程序:
import requests
def sent_to_sever():
keyurl = "https://sctapi.ftqq.com/SCT180092TVjQLw3FfQa3MTs4lEyNl2wfE.send"
payload = {'text':"发生火灾","desp":"","channel":9}
print(requests.post(keyurl,params=payload))
-
工作流程
I、火情/温度检测部分无异常现象,相应的通风系统正常工作,门禁系统正常工作。温度检测数据通过zigbee网络传入网关再进入服务器进行记录,相应的RFID正常工作信息记录同样通过网络进行备份和处理。无通行权限的人无法进出。
II、火情/温度检测部分异常。经由判断程序判断相应的通风系统停止工作,门禁系统转变工作模式。温度检测数据通过zigbee网络传入网关再进入服务器进行记录,相应的RFID信息继续通过网络进行备份和处理。但是通行权限开放,方便他人逃生及进入火场救火。服务器端发送报警微信信息向用户警告。
六、验证方案
图 2 验证方案
情况I、火情/温度检测部分无异常现象
模拟串口通信识别读取
将温度设为正常值
经由客户端发送
服务端接收成功
模拟服务器端将数据插入数据库中
成功插入
II、火情/温度检测部分异常。
模拟串口通信识别读取
将温度设为异常值
发送数据
接收数据
使用步进电机模拟
通过串口发送指令给相应的设备
发送微信通知