You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在React-Native中实现适配所有智能手机的蓝牙连接?

在React Native中实现适配绝大多数智能手机的蓝牙连接

你踩的这个坑其实挺常见的——react-native-ble-managerreact-native-ble-plx都是专门针对BLE(低功耗蓝牙)开发的库,而普通智能手机之间的蓝牙通信大多依赖经典蓝牙(BR/EDR,比如常用的SPP串口协议),这类设备通常不会以BLE外设模式运行,所以这两个库自然无法识别或连接。

要实现适配绝大多数智能手机的蓝牙连接,你需要转向支持经典蓝牙的解决方案,这里推荐靠谱的方案和实践步骤:

一、使用react-native-bluetooth-classic

这个库是React Native生态中专门处理经典蓝牙的成熟方案,支持SPP协议,能完美适配普通手机、蓝牙音箱、串口设备等绝大多数经典蓝牙设备。

1. 安装与配置

  • 安装依赖:
    npm install react-native-bluetooth-classic --save
    # 或者用yarn
    yarn add react-native-bluetooth-classic
    
  • 权限配置:
    • Android:在AndroidManifest.xml中添加必要权限(根据系统版本调整):
      <!-- 基础蓝牙权限 -->
      <uses-permission android:name="android.permission.BLUETOOTH" />
      <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
      <!-- Android 6+ 需要位置权限用于扫描 -->
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <!-- Android 12+ 新增的细分权限 -->
      <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
      <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
      
    • iOS:在Info.plist中添加蓝牙权限描述:
      <key>NSBluetoothAlwaysUsageDescription</key>
      <string>需要蓝牙权限来连接其他设备</string>
      <key>NSBluetoothPeripheralUsageDescription</key>
      <string>需要蓝牙权限来扫描和连接外设</string>
      

2. 核心功能实现示例

  • 检查并开启蓝牙:
    import BluetoothClassic from 'react-native-bluetooth-classic';
    import { DeviceEventEmitter } from 'react-native';
    
    // 检查蓝牙是否开启
    const isEnabled = await BluetoothClassic.isEnabled();
    if (!isEnabled) {
      // 请求用户开启蓝牙
      const enabled = await BluetoothClassic.requestEnable();
      if (!enabled) {
        console.log('用户拒绝开启蓝牙');
        return;
      }
    }
    
  • 扫描周边蓝牙设备:
    // 监听扫描到设备的事件
    DeviceEventEmitter.addListener(
      BluetoothClassic.Events.BLUETOOTH_DISCOVERED,
      (device) => {
        console.log('发现设备:', device.name, device.address);
        // 将设备添加到列表中展示
      }
    );
    
    // 开始扫描
    await BluetoothClassic.startDiscovery();
    // 扫描10秒后自动停止
    setTimeout(() => {
      BluetoothClassic.stopDiscovery();
    }, 10000);
    
  • 配对并连接设备:
    // 配对设备(部分设备需要PIN码,可提前传入,比如pairDevice(device.address, '0000'))
    const paired = await BluetoothClassic.pairDevice(device.address);
    if (!paired) {
      console.log('配对失败');
      return;
    }
    
    // 连接设备
    const connected = await BluetoothClassic.connect(device.address);
    if (connected) {
      console.log('连接成功');
      // 监听数据接收
      DeviceEventEmitter.addListener(
        BluetoothClassic.Events.BLUETOOTH_READ,
        (data) => {
          console.log('收到数据:', data);
        }
      );
    }
    
  • 发送数据:
    // 发送字符串数据
    await BluetoothClassic.write('Hello, Bluetooth!');
    // 发送二进制数据
    await BluetoothClassic.write(Buffer.from([0x01, 0x02]));
    

二、注意事项

  • 平台差异处理:Android和iOS的蓝牙行为有差异,比如Android的配对弹窗由系统触发,iOS则需要用户在设置中完成配对;
  • PIN码处理:部分设备默认使用固定PIN码(比如0000、1234),可以直接传入参数跳过手动输入;
  • 后台通信:如果需要在后台保持蓝牙连接,Android需要配置后台权限,iOS需要在Xcode中开启Background ModesBluetooth LE Accessories选项;
  • 兼容性react-native-bluetooth-classic支持RN0.60+版本,覆盖了绝大多数主流React Native项目。

如果你的需求同时需要支持BLE和经典蓝牙,可以考虑同时集成react-native-ble-plxreact-native-bluetooth-classic,通过判断设备类型来选择对应的连接方式。

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

火山引擎 最新活动