通过 Web Bluetooth API 读取打印机信息

分类:打印     发布时间:2024-11-08     最后更新:2024-11-08     浏览数:320
本文详细介绍了如何通过 Web Bluetooth API 读取打印机信息。

如果你还不了解 Web Bluetooth,请先看我之前写的 《通过 Web Bluetooth 驱动打印机打印》

Characteristic 可以翻译为特征、特性,本文一律用特征表示 Characteristic,单词太长,不好记,简写为 chatt。

这篇文章假设你已经知道怎样连接蓝牙打印机、怎样连接 GATT 服务器,怎样获取 service、怎样获取写特征。

开始前,你需要知道服务的 UUID、写特征的 UUID、读特征的 UUID、如果没有读特征的 UUID,要知道通知特征的 UUID。

如果不知道,可以通过 LightBlue (iOS app) 连接上蓝牙打印机查看。

我手上这台打印机没有读特征。

大体步骤如下:

1、请求设备 navigator.bluetooth.requestDevice(过滤条件),得到设备 selectedDevice

2、连接到 GATT 服务器(打印机)selectedDevice.gatt.connect(),得到 server

3、获取主服务 server.getPrimaryService(服务 UUID),得到 service

4、获取写特征 service.getCharacteristic(写特征 UUID),得到 writeChatt

5、获取通知特征 service.getCharacteristic(通知特征 UUID),得到 notifyChatt

读数据的交互流程:

1、向打印机写命令,比如 GET MODEL NAME,这不是真实的打印机指令,只是一个例子,具体的指令需要参考自己打印机支持的指令。

2、启动通知

3、监听 notifyChatt 的 characteristicvaluechanged 事件

4、characteristicvaluechanged 事件处理函数处理接收到的数据

4、characteristicvaluechanged 事件处理函数最后一步停止通知

封装读取函数如下:

const read = (cmd) => {
  return new Promise(async (resolve, reject) => {
    await send(cmd);
    let timer;
    const handler = async (evt) => {
      if (timer) {
        clearTimeout(timer);
      }
      const value = evt.target.value;
      resolve(value);
      await notifyChatt.stopNotifications();
    };
    await notifyChatt.startNotifications();
    notifyChatt.addEventListener("characteristicvaluechanged", handler);
    timer = setTimeout(() => {
      reject(new Error("Timeout"));
    }, 5 * 1000);
  });
};
上一篇: 通过 WebUSB 获取打印机信息 下一篇: 没有了