Python中如何通过树莓派连接二维码扫描器并在Web端实时显示数据?
python2.7,gpio14 引脚接一个红外传感器触发二维码扫描器,问:扫描器的二维码的数据如何实时显示在 web 浏览器中(不刷新页面),之前试了 flask-socket,可是不知道怎么了,总是报错,除了类似 socket 这类的方案,还有什么好的解决方法吗?
Python中如何通过树莓派连接二维码扫描器并在Web端实时显示数据?
你这个要用 websocket 吧。
感觉普通的轮询不合适。
这个问题挺有意思的,把硬件、后端和前端串起来了。核心思路是:树莓派上的Python脚本通过串口(比如USB)读取扫码枪数据,然后用WebSocket把数据实时推送到网页上。
这里给你一个能跑起来的完整方案,用 pyserial 读串口,用 Flask-SocketIO 做WebSocket服务器。
1. 树莓派上的Python服务端代码 (app.py)
import serial
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
from threading import Thread
import time
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key_here'
socketio = SocketIO(app, cors_allowed_origins="*")
# 配置串口,参数根据你的扫码枪调整,常见的是9600波特率
SERIAL_PORT = '/dev/ttyUSB0' # 树莓派上常见的USB串口设备名
BAUD_RATE = 9600
def read_scanner():
"""后台线程:持续读取串口数据并通过WebSocket发送"""
try:
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
print(f"开始监听串口 {SERIAL_PORT}...")
while True:
if ser.in_waiting > 0:
# 读取一行数据(扫码枪通常以回车结束)
data = ser.readline().decode('utf-8').strip()
if data:
print(f"扫描到: {data}")
# 通过WebSocket广播给所有连接的客户端
socketio.emit('scan_data', {'data': data})
time.sleep(0.01)
except Exception as e:
print(f"串口读取错误: {e}")
socketio.emit('scan_error', {'error': str(e)})
@app.route('/')
def index():
"""提供前端页面"""
return render_template('index.html')
if __name__ == '__main__':
# 启动后台线程读取扫码枪
scanner_thread = Thread(target=read_scanner, daemon=True)
scanner_thread.start()
# 启动Web服务器,host='0.0.0.0'允许局域网访问
socketio.run(app, host='0.0.0.0', port=5000, debug=True)
2. 前端页面 (templates/index.html)
<!DOCTYPE html>
<html>
<head>
<title>二维码扫描器实时显示</title>
<script src="https://cdn.socket.io/4.5.0/socket.io.min.js"></script>
<style>
body { font-family: Arial; margin: 20px; }
#scanData {
border: 1px solid #ccc;
padding: 20px;
margin-top: 20px;
min-height: 100px;
font-size: 18px;
background: #f9f9f9;
}
.new-scan {
color: green;
font-weight: bold;
animation: highlight 1s;
}
@keyframes highlight {
from { background: yellow; }
to { background: transparent; }
}
</style>
</head>
<body>
<h1>二维码扫描器实时数据</h1>
<p>状态: <span id="status">等待连接...</span></p>
<div id="scanData">暂无扫描数据</div>
<script>
// 连接到WebSocket服务器
const socket = io();
const statusEl = document.getElementById('status');
const dataEl = document.getElementById('scanData');
socket.on('connect', () => {
statusEl.textContent = '已连接';
statusEl.style.color = 'green';
});
socket.on('scan_data', function(msg) {
// 显示最新扫描的数据,并添加高亮效果
const newScan = document.createElement('div');
newScan.className = 'new-scan';
newScan.textContent = `[${new Date().toLocaleTimeString()}] ${msg.data}`;
dataEl.prepend(newScan); // 新数据放在最前面
});
socket.on('scan_error', function(msg) {
statusEl.textContent = '错误: ' + msg.error;
statusEl.style.color = 'red';
});
socket.on('disconnect', () => {
statusEl.textContent = '连接断开';
statusEl.style.color = 'red';
});
</script>
</body>
</html>
怎么用:
- 树莓派上:先装库
pip install pyserial flask-socketio。把扫码枪插到USB口,运行python app.py。 - 电脑上:在浏览器打开
http://[树莓派IP地址]:5000,比如http://192.168.1.100:5000。 - 扫码:用扫码枪扫个码,网页上就会立刻显示出来。
几个关键点:
- 串口设备名可能需要改,用
ls /dev/tty*看看扫码枪连上后是哪个(比如可能是/dev/ttyACM0)。 - 扫码枪要设成“串口键盘模拟”模式,这样它才会把数据像键盘输入一样发到串口。
- 如果扫码枪是USB HID模式的(像键盘一样),那得用
evdev库来读,方法不太一样。
一句话总结:用串口读数据,WebSocket推网页,简单直接。
二维码扫描器是什么接口的? USB 的话, 试试 PyUSB
web 上接收的话, ajax+tornado 做 longpulling 稳定性很高的嘛
页面用 reactjs 来做, 不刷新页面直接轮询也能用啊, 这个是一对一的, 刷频繁点问题也不大
数据可以通过命令行读取的话,gayhub 上有一个把任意命令行程序变成 websocket 的项目。
Rs232 接口
gayhub 什么意思?
最简单的办法还是用 flask-socketio,这个库我也用了一年多了,在树莓派上运行的也相当稳定,如果报错,你还是应该检查一下你的代码本身有没有问题,而不是怀疑类库
http://websocketd.com/ 你说的应该是这个吧
你好,请问有相关的代码可以给我参考一下吗?先谢谢了
安装 flask-socket 总是不成功?请问是什么原因导致的?还需要安装其它依赖库吗?
请问这是哪里出错了,琢磨了大半个星期了,还是没让扫描器的数据输出到 html 页面上
错误如图:http://photo.weibo.com/1550152757/wbphotos/large/mid/4144774288225164/pid/5c657435gy1fiwdv0tiylj21b10ql7c3

你还是把 Python 重装一遍吧,感觉你的 Python 安装的本来就有问题
重装 python 后,然后只安装 web-socketIO 就能用吗?还是需要安装其它的库?
建议你先好好学学 Python 基础再来编程吧
websocket 好使
给个地址
websocket 是个服务啊?服务器上 python 搭建一个,然后树莓派保持一个 ws 链接,有数据就发回去没数据就静默。


