You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:07:46