如何使用Web Bluetooth API在Web应用中读取Leica Disto D2激光测距仪的测量数据
使用Web Bluetooth API读取Leica Disto D2测距数据(适配Android Chrome/三星浏览器)
嘿,刚好之前帮朋友做过类似的需求——在Android端用Chrome或三星浏览器读取Leica Disto D2的测距数据,而且适配的都是近期发布的设备,给你整理一套靠谱的方案:
一、先确认前提条件
- 设备支持:近期Android设备(Android 6.0+)都满足,Chrome 56+、三星浏览器7.0+原生支持Web Bluetooth API
- 环境要求:必须在HTTPS环境下运行(本地开发可以用
localhost或者127.0.0.1,线上部署必须配置HTTPS) - 用户交互限制:浏览器不允许自动触发蓝牙请求,必须通过用户点击按钮等交互动作来启动连接流程
二、核心实现步骤(附代码)
Leica Disto D2用的是蓝牙SPP(串口协议),对应Web Bluetooth里的固定服务和特征UUID,我们可以直接基于这个来开发:
1. 触发设备配对与连接
先给页面加一个按钮,让用户点击后发起蓝牙设备搜索:
<button id="connectBtn">连接Leica Disto D2</button> <div id="distanceDisplay">等待测量...</div>
然后写JavaScript逻辑:
document.getElementById('connectBtn').addEventListener('click', async () => { try { // 搜索并请求Leica Disto D2设备,过滤指定服务UUID(D2的标准SPP服务UUID) const device = await navigator.bluetooth.requestDevice({ filters: [{ services: ['0000ffe0-0000-1000-8000-00805f9b34fb'] }], optionalServices: ['0000ffe0-0000-1000-8000-00805f9b34fb'] // 确保能访问该服务的特征 }); // 连接设备的GATT服务器 const gattServer = await device.gatt.connect(); // 获取SPP服务 const sppService = await gattServer.getPrimaryService('0000ffe0-0000-1000-8000-00805f9b34fb'); // 获取负责数据传输的特征(D2的SPP数据特征UUID) const dataCharacteristic = await sppService.getCharacteristic('0000ffe1-0000-1000-8000-00805f9b34fb'); // 开启特征值变化监听,等待测量数据推送 await dataCharacteristic.startNotifications(); dataCharacteristic.addEventListener('characteristicvaluechanged', handleDistanceData); console.log('已成功连接到Leica Disto D2,现在可以开始测量啦!'); } catch (error) { console.error('连接失败:', error); alert(`连接出错:${error.message}`); } });
2. 解析测量数据
D2的测量数据会以ASCII字符串的形式推送,我们需要从原始字节中提取出有效的距离值:
function handleDistanceData(event) { // 将原始字节数组转成UTF-8字符串 const rawData = new TextDecoder().decode(event.target.value); // 提取数值(适配D2的输出格式,比如"1250"代表1250毫米,或者"1.25"代表1.25米) const distanceMatch = rawData.trim().match(/(\d+\.?\d*)/); if (distanceMatch) { let distance = parseFloat(distanceMatch[1]); // 判断单位:如果数值大于100,大概率是毫米,转成米 if (distance >= 100) { distance /= 1000; } // 更新页面显示 document.getElementById('distanceDisplay').textContent = `当前测量距离:${distance.toFixed(3)} 米`; } }
三、踩过的坑与注意事项
- 三星浏览器权限:部分三星设备需要用户手动在系统设置中给浏览器开启蓝牙权限(Chrome会自动弹出权限请求,但三星浏览器可能不会)
- 固件版本差异:极少数老固件的D2可能UUID有变化,你可以用Chrome DevTools的「Bluetooth」面板(在More Tools里)查看设备的服务和特征,确认UUID是否匹配
- 断开重连:可以监听
device.gatt.disconnected事件,当设备断开时提示用户重新连接 - 数据容错:有时候会收到无关的心跳数据,所以用正则提取数值的方式能有效过滤无效内容
如果遇到问题,先检查Chrome/三星浏览器的版本,或者用调试工具确认设备的服务特征是否正常~
内容的提问来源于stack exchange,提问作者Mark Robinson
相关产品推荐
相关产品推荐

