Python中如何通过树莓派连接二维码扫描器并在Web端实时显示数据?

python2.7,gpio14 引脚接一个红外传感器触发二维码扫描器,问:扫描器的二维码的数据如何实时显示在 web 浏览器中(不刷新页面),之前试了 flask-socket,可是不知道怎么了,总是报错,除了类似 socket 这类的方案,还有什么好的解决方法吗?
Python中如何通过树莓派连接二维码扫描器并在Web端实时显示数据?

21 回复

你这个要用 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>

怎么用:

  1. 树莓派上:先装库 pip install pyserial flask-socketio。把扫码枪插到USB口,运行 python app.py
  2. 电脑上:在浏览器打开 http://[树莓派IP地址]:5000,比如 http://192.168.1.100:5000
  3. 扫码:用扫码枪扫个码,网页上就会立刻显示出来。

几个关键点:

  • 串口设备名可能需要改,用 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 总是不成功?请问是什么原因导致的?还需要安装其它依赖库吗?

你记错名字吧,只有 flask-socketio 并没有 flask-socket 这个库

请问这是哪里出错了,琢磨了大半个星期了,还是没让扫描器的数据输出到 html 页面上
错误如图:http://photo.weibo.com/1550152757/wbphotos/large/mid/4144774288225164/pid/5c657435gy1fiwdv0tiylj21b10ql7c3

你还是把 Python 重装一遍吧,感觉你的 Python 安装的本来就有问题

重装 python 后,然后只安装 web-socketIO 就能用吗?还是需要安装其它的库?

建议你先好好学学 Python 基础再来编程吧

websocket 好使

给个地址

websocket 是个服务啊?服务器上 python 搭建一个,然后树莓派保持一个 ws 链接,有数据就发回去没数据就静默。

回到顶部