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

如何通过浏览器获取蓝牙设备数组?现有代码返回单对象问题求解

解决方案:获取蓝牙设备数组

一、JavaScript原生实现(浏览器环境)

Web Bluetooth API提供两种方式获取多设备数组,根据需求选择:

1. 让用户手动选择多个设备

Chrome 85+、Edge、Opera等现代浏览器支持在requestDevice中添加multipleDevices: true参数,允许用户一次性选择多个设备,直接返回设备数组:

navigator.bluetooth.requestDevice({
  acceptAllDevices: true,
  multipleDevices: true // 启用多选模式
})
.then(deviceArray => {
  // 遍历处理设备数组
  deviceArray.forEach(device => {
    console.log(`设备名称: ${device.name || '未知'}, ID: ${device.id}`);
  });
})
.catch(err => console.error('请求失败:', err));

2. 获取已授权/配对的设备

如果需要获取用户之前已授权过的蓝牙设备列表,可使用getDevices()方法,无需再次弹出选择框:

navigator.bluetooth.getDevices()
.then(deviceArray => {
  console.log('已授权设备列表:', deviceArray);
})
.catch(err => console.error('获取失败:', err));

注意:Web Bluetooth API出于隐私安全限制,不允许无用户交互的后台扫描所有周围设备,必须通过用户主动选择或获取已授权设备来拿到数组。

二、推荐的JavaScript库

1. noble(Node.js/Electron环境)

适合后端或桌面应用,支持扫描所有可发现的BLE设备,无需用户手动选择:

const noble = require('noble');

const discoveredDevices = new Set();

noble.on('stateChange', state => {
  if (state === 'poweredOn') {
    noble.startScanning([], true); // 扫描所有服务,允许重复发现
  } else {
    noble.stopScanning();
  }
});

noble.on('discover', peripheral => {
  discoveredDevices.add({
    name: peripheral.advertisement.localName || '未知设备',
    id: peripheral.id,
    rssi: peripheral.rssi // 信号强度
  });
  console.log('当前发现的设备:', Array.from(discoveredDevices));
});

2. react-native-ble-plx(React Native移动端)

针对移动端跨平台开发,提供完整的BLE扫描、连接能力,可直接返回设备数组:

import { BleManager } from 'react-native-ble-plx';

const manager = new BleManager();

manager.startDeviceScan(null, null, (error, device) => {
  if (error) {
    console.error(error);
    return;
  }
  console.log(`发现设备: ${device.name}, 地址: ${device.id}`);
  // 可自行将设备收集到数组中
});

三、其他编程语言/框架推荐

1. Python(bleak库)

跨平台BLE扫描工具,用法简洁:

import asyncio
from bleak import BleakScanner

async def scan_bluetooth_devices():
    devices = await BleakScanner.discover(timeout=5)
    for device in devices:
        print(f"名称: {device.name or '未知'}, 地址: {device.address}, 信号强度: {device.rssi}")

asyncio.run(scan_bluetooth_devices())

2. Android(Kotlin)

使用原生BluetoothLeScanner类扫描BLE设备,获取完整设备列表:

val scanner = BluetoothAdapter.getDefaultAdapter().bluetoothLeScanner
val scanCallback = object : ScanCallback() {
    override fun onScanResult(callbackType: Int, result: ScanResult?) {
        result?.let {
            println("设备名称: ${it.device.name}, 地址: ${it.device.address}, 信号强度: ${it.rssi}")
        }
    }
}
scanner.startScan(scanCallback)

3. iOS(Swift)

通过CoreBluetooth框架的CBCentralManager扫描设备:

import CoreBluetooth

class BluetoothScanner: NSObject, CBCentralManagerDelegate {
    private var centralManager: CBCentralManager!
    
    override init() {
        super.init()
        centralManager = CBCentralManager(delegate: self, queue: nil)
    }
    
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            central.scanForPeripherals(withServices: nil)
        }
    }
    
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        print("设备名称: \(peripheral.name ?? "未知"), 地址: \(peripheral.identifier.uuidString), 信号强度: \(RSSI)")
    }
}

内容的提问来源于stack exchange,提问作者profundusman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:15:44