给一个客户对接人脸识别的设备,最后需要通知服务端进行一些消息推送。
# 作者 陈老师
# https://v.iiar.cn
import json
import paho.mqtt.client as mqtt
import requests
from flask import Flask, request
app = Flask(__name__)
# MQTT配置
mq_broker = "127.0.0.1" # MQTT测试服务器
mq_port = 1883 # 非加密端口
zt = 'ddddd'
def http_post(data):
url = "http://127.0.0.1:6688/api/user/mqtt_msg"
try:
res = requests.post(url, json=data)
print(res.text)
except Exception as e:
print(e)
# MQTT连接回调函数
def on_connect(client, userdata, flags, rc):
if rc == 0:
client.subscribe(zt)
print("MQTT连接成功")
else:
print(f"MQTT连接失败,返回码:{rc}")
# 处理接收到的MQTT消息
def on_message(client, userdata, msg):
mqtt_message = msg.payload.decode() # 解析MQTT消息
print('收到消息', mqtt_message)
http_post(json.loads(mqtt_message))
# 连接MQTT服务器
mq = mqtt.Client()
mq.on_connect = on_connect
mq.on_message = on_message
mq.connect(mq_broker, mq_port, 60)
# 启动MQTT客户端线程
mq.loop_start()
def send_mqtt_msg(text):
mq.publish(zt, text)
@app.route('/', methods=['POST'])
def index():
data = request.json
print('给机器发消息', data)
t = json.dumps(data)
t = json.loads(t)
send_mqtt_msg(t)
return 'ok'
# 调试模式运行
if __name__ == '__main__':
# debug=True,
app.run(port=6699, host='0.0.0.0')
# 安装依赖
# pip install -r requirements.txt
# 导出依赖库
# pip freeze > requirements.txt
requirements.txt
blinker==1.9.0
certifi==2024.8.30
charset-normalizer==3.4.0
click==8.1.7
Flask==3.1.0
idna==3.10
importlib_metadata==8.5.0
itsdangerous==2.2.0
Jinja2==3.1.4
MarkupSafe==3.0.2
paho-mqtt==2.1.0
requests==2.32.3
urllib3==2.2.3
Werkzeug==3.1.3
zipp==3.21.0
# 作者 陈老师
# https://v.iiar.cn
import json
from datetime import datetime
import paho.mqtt.client as mqtt
import requests
from flask import Flask, request
app = Flask(__name__)
# MQTT配置
mq_broker = "127.0.0.1" # MQTT测试服务器
mq_port = 1883 # 非加密端口
sb = '123456789' # 我的设备号
zt = f'fungxi_{sb}_downLink' # 发给设备
zt2 = f'fungxi_{sb}_upLink' # 设备上报
def http_post(data): # 接收mqtt回调的api
url = "http://127.0.0.1:6688/api/user/mqtt_msg"
try:
res = requests.post(url, json=data)
print(res.text)
except Exception as e:
print(e)
# MQTT连接回调函数
def on_connect(client, userdata, flags, rc):
if rc == 0:
client.subscribe(zt)
client.subscribe(zt2)
print("MQTT连接成功")
else:
print(f"MQTT连接失败,返回码:{rc}")
# 处理接收到的MQTT消息
def on_message(client, userdata, msg):
mqtt_message = msg.payload.decode() # 解析MQTT消息
try:
data = json.loads(mqtt_message)
except json.JSONDecodeError:
print("无效的JSON数据")
return
if msg.topic == zt:
if data['cmd'] == 'heartD':
return
print('发给设备', mqtt_message)
elif msg.topic == zt2:
if data['cmd'] == 'heartU':
bot_heartbeat()
return
elif data['cmd'] == 'strangerRecordU': # 陌生人
return
elif data['cmd'] == 'verifiedRecordU': # 人脸库的
# http_post(['data'])
check_successfully(data['data'])
print('设备上报', mqtt_message)
# 连接MQTT服务器
mq = mqtt.Client()
mq.on_connect = on_connect
mq.on_message = on_message
mq.connect(mq_broker, mq_port, 60)
# 启动MQTT客户端线程
mq.loop_start()
def send_mqtt_msg(text):
mq.publish(zt, text)
# 机器返回心跳
def bot_heartbeat():
r = {
"cmd": "heartD",
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
t = json.dumps(r)
send_mqtt_msg(t)
def check_successfully(data):
data = data[0]
user_id = data['num'] # 用户id
name = data['name'] # 用户名
img = data['liveImageBase64'] # 扫脸图片
verifiedCode = data['verifiedCode'] # 识别状态
bot_time = data['time'] # 机器里识别时间
personType = data['personType']
if personType == '1' and verifiedCode == 0: # 通过
pass
send_data = {
'user_id': user_id,
'name': name,
'img': img,
'verifiedCode': verifiedCode,
'bot_time': bot_time,
'personType': personType
}
# print(bot_time)
http_post(send_data)
@app.route('/', methods=['POST'])
def index():
data = request.json
print('给机器发消息', data)
t = json.dumps(data)
t = json.loads(t)
send_mqtt_msg(t)
return 'ok'
# 调试模式运行
if __name__ == '__main__':
# debug=True,
app.run(port=6699, host='0.0.0.0')
# 安装依赖
# pip install -r requirements.txt
# 导出依赖库
# pip freeze > requirements.txt
由chatGPT整理
该项目实现了一个基于 MQTT 协议和 Flask 框架的应用。它的功能主要包括:
该应用集成了 MQTT 客户端库 paho.mqtt.client
,用于与设备进行通信,并使用 Flask 框架提供一个HTTP接口,接收外部发送的消息并转发给设备。
MQTT通信:
HTTP接口:
POST /
)接收外部请求,通过MQTT协议向设备发送消息。人脸识别处理:
mq_broker = "127.0.0.1" # MQTT测试服务器
mq_port = 1883 # 非加密端口
sb = '123456789' # 我的设备号
zt = f'fungxi_{sb}_downLink' # 发给设备
zt2 = f'fungxi_{sb}_upLink' # 设备上报
def http_post(data):
url = "http://127.0.0.1:6688/api/user/mqtt_msg" # 本地API接口地址
try:
res = requests.post(url, json=data) # 发送POST请求
print(res.text) # 打印服务器响应内容
except Exception as e:
print(e) # 打印异常信息
def on_connect(client, userdata, flags, rc):
if rc == 0: # 连接成功
client.subscribe(zt) # 订阅设备下行消息
client.subscribe(zt2) # 订阅设备上行消息
print("MQTT连接成功")
else: # 连接失败
print(f"MQTT连接失败,返回码:{rc}")
zt
(发送给设备)和zt2
(设备上报的消息)。def on_message(client, userdata, msg):
mqtt_message = msg.payload.decode() # 解析MQTT消息
try:
data = json.loads(mqtt_message) # 将消息转为JSON格式
except json.JSONDecodeError: # 如果无法解析为JSON
print("无效的JSON数据")
return
if msg.topic == zt: # 如果是下行消息
if data['cmd'] == 'heartD': # 如果是心跳消息,直接返回
return
print('发给设备', mqtt_message)
elif msg.topic == zt2: # 如果是设备上报消息
if data['cmd'] == 'heartU': # 如果是设备上报的心跳消息
bot_heartbeat() # 发送机器心跳
return
elif data['cmd'] == 'strangerRecordU': # 陌生人记录
return
elif data['cmd'] == 'verifiedRecordU': # 人脸识别记录
check_successfully(data['data']) # 检查是否识别成功
print('设备上报', mqtt_message)
def send_mqtt_msg(text):
mq.publish(zt, text) # 向设备下行主题发送消息
def bot_heartbeat():
r = {
"cmd": "heartD", # 命令类型:心跳
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 当前时间
}
t = json.dumps(r) # 将数据转换为JSON字符串
send_mqtt_msg(t) # 发送心跳消息
def check_successfully(data):
data = data[0] # 获取识别结果中的第一条数据
user_id = data['num'] # 用户ID
name = data['name'] # 用户名
img = data['liveImageBase64'] # 扫脸图片的Base64编码
verifiedCode = data['verifiedCode'] # 识别状态(0为通过)
bot_time = data['time'] # 机器识别的时间
personType = data['personType'] # 人员类型(1为已登记用户)
if personType == '1' and verifiedCode == 0: # 如果是已登记用户且识别通过
pass # 这里可以处理已通过的情况
# 构造发送数据
send_data = {
'user_id': user_id,
'name': name,
'img': img,
'verifiedCode': verifiedCode,
'bot_time': bot_time,
'personType': personType
}
# 打印识别时间(可用于调试)
# print(bot_time)
# 发送数据到本地API
http_post(send_data)
@app.route('/', methods=['POST'])
def index():
data = request.json # 获取请求中的JSON数据
print('给机器发消息', data) # 打印发送给机器的消息
t = json.dumps(data) # 将数据转换为JSON字符串
t = json.loads(t) # 重新解析JSON(这里可以进行进一步的数据处理)
send_mqtt_msg(t) # 发送消息给设备
return 'ok' # 返回成功响应
安装依赖:
在项目根目录下创建 requirements.txt
文件,列出项目的依赖库:
pip install -r requirements.txt
启动服务:
运行Flask应用:
python app.py
服务器将会监听在 6699
端口上。
导出依赖:
如果需要将当前环境的依赖导出为 requirements.txt
文件,可以运行:
pip freeze > requirements.txt
该项目主要通过MQTT协议与设备进行实时通信,通过Flask框架提供一个HTTP接口接收外部请求并转发给设备。它主要应用于设备控制、实时数据处理和系统集成等场景。
这种基于 MQTT 协议和 Flask 框架的系统,通常会应用于需要实时设备控制、数据收集和状态反馈的场景。以下是一些典型的应用场景:
在智能门禁系统中,设备(如门禁机、门锁等)可能需要通过人脸识别来判断是否允许某人进入。设备通过MQTT协议将人脸识别结果(例如是否识别成功、人员身份等)上报到服务器,服务器根据识别结果进行处理,并反馈给设备是否允许打开门锁。
使用场景:
在智能监控系统中,摄像头、传感器等设备可能会使用人脸识别、动作检测等技术监控环境。当发现可疑人物或异常行为时,设备会通过MQTT协议将监控数据上传至服务器,服务器进行处理(如报警、记录日志等),并根据规则发送指令给设备(如开启警报、录像等)。
使用场景:
在智能家居场景中,设备之间的交互和控制通常通过MQTT协议实现。例如,用户通过手机APP控制家里的智能灯泡、空调、门锁等设备,设备将状态更新上报到服务器,服务器再根据控制指令下发新的状态更新给设备。
使用场景:
在医疗设备或健康监测系统中,传感器(如心率监测仪、血压计、体温计等)通过MQTT将患者的健康数据实时上传到服务器,服务器将数据存储并进行分析,同时向设备发送指令进行实时干预(例如在心率异常时提醒设备报警)。
使用场景:
在工业物联网(IIoT)应用中,传感器和设备需要实时监控生产线或设备的状态,例如温度、压力、湿度、运行速度等数据。这些设备通过MQTT协议上传状态数据,服务器根据数据进行故障预警、生产调度等。
使用场景:
在智慧停车系统中,停车场的入口、出口、车位传感器等设备通过MQTT协议上传实时的停车数据。例如,设备上报车辆进出情况、空闲车位数等,系统根据这些信息提供停车导航、收费结算等服务。
使用场景:
在智能农业和环境监测系统中,设备(如土壤湿度传感器、气象站、灌溉系统等)通过MQTT协议实时上传环境数据,系统根据数据分析向设备发送指令(如启动灌溉、调整温室温度等)。
使用场景:
这种需求主要出现在那些 需要实时监控、数据收集、设备控制与反馈的场景。利用MQTT协议和Flask框架实现的系统能够高效地处理设备之间的消息传递和数据流转。典型的应用场景包括:
这些场景都涉及到设备与服务器之间的高效通信、状态反馈和远程控制,且对于实时性、稳定性和可扩展性有较高的要求。