读取com口电子秤数据,并在网页中填充数据

admin2025-01-15CS196

Chrome 浏览器插件本身无法直接访问本地计算机的硬件资源(如串口 COM 口),因为出于安全性考虑,Chrome 插件运行在浏览器的沙盒环境中,没有权限直接与本地硬件交互。但是你可以通过一些方法间接实现你的需求,将串口数据写入网页输入框。


实现思路

  1. 通过本地程序与串口交互
    使用一个本地应用(如 Python、Node.js)读取串口数据,并将数据通过 WebSocket 或 HTTP 与浏览器插件通信。

  2. Chrome 插件与网页交互
    使用 Chrome 插件监听来自本地应用的数据流,并将这些数据自动填入网页的输入框中。


实现步骤

第一步:本地程序读取串口数据

用 Python 或 Node.js 实现一个小工具,负责读取串口数据并通过 WebSocket 或 HTTP 提供给 Chrome 插件。

示例:用 Python 读取串口数据并通过 WebSocket 发送

python
import serialimport asyncioimport websockets# 串口配置SERIAL_PORT = 'COM3'  # 修改为实际串口号BAUD_RATE = 9600      # 根据电子秤配置修改WEBSOCKET_PORT = 8765async def send_serial_data():
    # 打开串口
    ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)    print(f"串口 {SERIAL_PORT} 已连接,等待数据...")    async with websockets.serve(websocket_handler, "localhost", WEBSOCKET_PORT):        await asyncio.Future()  # 挂起以保持服务运行async def websocket_handler(websocket, path):
    while True:        # 从串口读取数据
        weight_data = ser.readline().decode('utf-8').strip()        if weight_data:            print(f"读取到称重数据: {weight_data}")            # 将数据通过 WebSocket 发送
            await websocket.send(weight_data)if __name__ == "__main__":
    asyncio.run(send_serial_data())

运行以上代码后,本地 WebSocket 服务器会监听 ws://localhost:8765,把串口数据实时发送给连接的客户端。


第二步:编写 Chrome 插件

Chrome 插件负责与网页交互,并通过 WebSocket 接收来自本地程序的串口数据。

插件结构

Chrome 插件需要以下文件和目录:

my-chrome-extension/│
├── manifest.json         # 插件的配置文件├── background.js         # 后台脚本,用于连接 WebSocket├── content.js            # 内容脚本,用于操作网页 DOM└── inject.js             # 注入脚本,自动填充输入框

1. manifest.json 文件

json
{  "manifest_version": 3,  "name": "Serial to Input",  "version": "1.0",  "permissions": ["scripting", "activeTab"],  "background": {    "service_worker": "background.js"
  },  "host_permissions": ["<all_urls>"],  "action": {    "default_popup": "popup.html",    "default_icon": {      "16": "icon.png",      "48": "icon.png",      "128": "icon.png"
    }
  }
}

2. background.js 文件

负责连接本地 WebSocket 服务器并转发数据给内容脚本。

javascript
let websocket;

chrome.runtime.onInstalled.addListener(() => {  console.log("插件已安装");  // 连接本地 WebSocket 服务器
  websocket = new WebSocket("ws://localhost:8765");

  websocket.onopen = () => {    console.log("已连接到 WebSocket 服务器");
  };

  websocket.onmessage = (event) => {    const weight = event.data;    console.log(`接收到称重数据: ${weight}`);    // 将数据发送到当前活动页面的内容脚本
    chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {      if (tabs.length > 0) {
        chrome.tabs.sendMessage(tabs[0].id, { weight });
      }
    });
  };

  websocket.onclose = () => {    console.log("WebSocket 连接已关闭");
  };

  websocket.onerror = (error) => {    console.error("WebSocket 错误:", error);
  };
});

3. content.js 文件

负责接收后台脚本的数据并操作网页 DOM。

javascript
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {  const { weight } = message;  // 自动填入网页的第一个输入框
  const inputField = document.querySelector("input");  if (inputField) {
    inputField.value = weight;    console.log(`输入框已填入数据: ${weight}`);
  } else {    console.log("未找到输入框");
  }

  sendResponse({ status: "success" });
});

4. inject.js 文件

如果目标网页是动态加载的,可能需要主动监控 DOM 的变化并寻找输入框。这部分代码可选。


第三步:安装并测试插件

  1. 打开 Chrome,进入 chrome://extensions/

  2. 点击右上角“开发者模式”,然后点击“加载已解压的扩展程序”。

  3. 选择包含 manifest.json 文件的插件目录。

  4. 启用插件。


第四步:测试完整流程

  1. 运行本地 Python 脚本,确保 WebSocket 服务器在运行。

  2. 打开目标网页,并确保页面上有输入框。

  3. 插件会自动填充从串口读取的称重数据到输入框中。


可行性总结

通过以上方法,Chrome 插件可以间接实现串口到网页输入框的自动填充,具体流程是:

  • 本地程序读取串口数据并通过 WebSocket 提供数据。

  • Chrome 插件通过内容脚本操作网页 DOM,将接收到的数据填入输入框。

要将 Python 代码打包成一个可以在客户电脑上安装并运行的独立程序(无需客户安装 Python 环境),可以使用打包工具如 PyInstallercx_Freeze。这些工具可以将 Python 脚本打包为可执行文件(如 .exe)。以下是具体步骤:


使用 PyInstaller 打包 Python 程序

1. 安装 PyInstaller

在开发环境中,使用 pip 安装 PyInstaller:

bash
pip install pyinstaller

2. 准备 Python 脚本

确保你的脚本(如 serial_to_websocket.py)可以正常运行,并且所有依赖库都已安装(如 pyserialwebsockets)。

示例脚本文件名:serial_to_websocket.py


3. 使用 PyInstaller 打包

运行以下命令,将 Python 脚本打包成独立的可执行文件:

bash
pyinstaller --onefile --noconsole serial_to_websocket.py

参数说明:

  • --onefile:将所有依赖和代码打包成一个独立的可执行文件。

  • --noconsole:隐藏终端窗口(适用于 GUI 程序)。对于你的程序,建议不要加这个参数,因为需要显示日志信息。

运行成功后,PyInstaller 会生成一个可执行文件,位于 dist/serial_to_websocket.exe


4. 分发可执行文件

将生成的 serial_to_websocket.exe 文件分发给客户,客户无需安装 Python 环境即可运行。


优化:为程序添加配置或安装参数

如果你的程序需要配置(例如串口号或波特率可能不同),可以通过以下方法优化用户体验:

1. 在脚本中添加命令行参数

使用 Python 的 argparse 模块,允许客户在运行时指定参数:

python
import argparseimport serialimport asyncioimport websockets# 解析命令行参数parser = argparse.ArgumentParser(description="串口到 WebSocket 转发工具")
parser.add_argument("--port", type=str, default="COM3", help="串口号 (默认: COM3)")
parser.add_argument("--baudrate", type=int, default=9600, help="串口波特率 (默认: 9600)")
parser.add_argument("--ws_port", type=int, default=8765, help="WebSocket 端口 (默认: 8765)")
args = parser.parse_args()async def send_serial_data():
    # 打开串口
    ser = serial.Serial(args.port, args.baudrate, timeout=1)    print(f"串口 {args.port} 已连接,等待数据...")    async with websockets.serve(websocket_handler, "localhost", args.ws_port):        await asyncio.Future()  # 挂起以保持服务运行async def websocket_handler(websocket, path):
    while True:
        weight_data = ser.readline().decode("utf-8").strip()        if weight_data:            print(f"读取到称重数据: {weight_data}")            await websocket.send(weight_data)if __name__ == "__main__":
    asyncio.run(send_serial_data())

运行方式:
客户可以通过命令行运行程序并传递参数,例如:

bash
serial_to_websocket.exe --port COM4 --baudrate 115200 --ws_port 9000

2. 提供默认配置文件

如果客户不希望每次都输入参数,可以将默认配置写入一个文件(如 config.json),程序启动时自动读取配置:

示例配置文件:config.json

json
{  "port": "COM3",  "baudrate": 9600,  "ws_port": 8765}

修改程序代码以读取配置文件:

python
import jsonimport os# 读取配置文件config_file = "config.json"if os.path.exists(config_file):    with open(config_file, "r") as file:
        config = json.load(file)else:
    config = {"port": "COM3", "baudrate": 9600, "ws_port": 8765}# 使用配置serial_port = config["port"]
baud_rate = config["baudrate"]
websocket_port = config["ws_port"]

3. 创建安装程序

为了让客户更方便地安装程序,可以使用工具如 Inno Setup 创建一个安装包:

使用 Inno Setup 制作安装包

  1. 下载并安装 Inno Setup

  2. 创建一个简单的 .iss 脚本,将你的 .exe 和相关配置文件打包到安装包中。

示例 Inno Setup 脚本:

iss
[Setup]
AppName=串口转WebSocket工具
AppVersion=1.0
DefaultDirName={pf}\SerialToWebSocket
DefaultGroupName=SerialToWebSocket
OutputBaseFilename=SerialToWebSocketInstaller
Compression=lzma
SolidCompression=yes

[Files]
Source: "dist\serial_to_websocket.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "config.json"; DestDir: "{app}"; Flags: ignoreversion

[Icons]
Name: "{group}\串口转WebSocket工具"; Filename: "{app}\serial_to_websocket.exe"

运行 Inno Setup 会生成一个安装包(如 SerialToWebSocketInstaller.exe),客户双击运行即可安装程序。


最终交付方式

  1. 可执行文件方式

    • 直接打包为 .exe 文件,客户解压后运行。

    • 配置文件(如 config.json)可放在同目录。

  2. 安装包方式

    • 提供一个安装包(如 SerialToWebSocketInstaller.exe),客户安装后在桌面或开始菜单找到快捷方式即可运行。


常见问题与解决方案

  1. 串口权限问题
    如果客户电脑的串口被占用或权限不足,程序可能会报错。确保客户有管理员权限,并正确配置串口。

  2. 防火墙拦截 WebSocket
    如果客户电脑的防火墙阻止 WebSocket 通信,请指导客户将程序添加到防火墙的信任列表。

  3. 兼容性问题
    在 Windows 不同版本上测试生成的 .exe 文件。如果需要兼容旧版 Windows,可以在打包时指定兼容的 Python 环境。


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。