如果你还不了解 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);
});
};