更新记录

1.0.4(2023-08-02)

  1. 修复mtu问题
  2. 修复openNotify回调问题

1.0.3(2023-05-06)

  1. 增加Android 设置MTU接口
  2. 增加iOS发送数据自动拆包流程

1.0.2(2023-04-28)

  1. 增加获取当前扫描到的所有蓝牙设备接口
查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 12.0 armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 适用版本区间:9 - 16

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


前言

功能

  • 判断蓝牙是否打开,打开/关闭蓝牙
  • 蓝牙扫描,获取蓝牙名、信号强度、广播数据等
  • 获取service、characteristic
  • 蓝牙通讯,读、写、通知
  • 支持十六进制、ASCII、iso、utf-8、utf-16等多种字符格式通讯

接入步骤

如不了解原生插件接入步骤的同学请参考: https://www.jianshu.com/p/830ccc503e29https://blog.csdn.net/wenrisheng/article/details/124057700

介绍

蓝牙分为中心设备(Central、Master、主设备、客户端)和外围设备(Peripheral、Slave、从设备、服务端) 手机做为客户端可以连接多个蓝牙设备,所以手机又可以叫中心设备(Central),蓝牙设备叫外围设备(Peripheral)。 例如:通过手机蓝牙开启共享单车,手机称为中心设备,共享单车称为外围设备

本插件是中心设备(Central、Master、主设备、客户端)

外围设备插件插件可使用https://ext.dcloud.net.cn/plugin?id=9597

  • 权限 android:

    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-feature
        android:name="android.hardware.bluetooth_le"
        android:required="true" />

ios:


    <key>NSBluetoothAlwaysUsageDescription</key>
    <string>访问蓝牙需要您的授权</string>

ios如果需要后台使用蓝牙功能,在项目的"App其它常用设置"里的"后台运行能力"里增加bluetooth-central

  • 接口

var bluetoothcenter = uni.requireNativePlugin("wrs-bluetoothcenter");

  1. 打开蓝牙,仅支持Android,android开启蓝牙不是实时开启的,开启状态以isEnableBluetooth获取为准

bluetoothcenter.enableBluetooth();
  1. 关闭蓝牙,仅支持Android

bluetoothcenter.disableBluetooth();
  1. 获取蓝牙打开关闭状态,仅支持Android,ios蓝牙状态的变更通过回调centralManagerDidUpdateState获取

var resp = bluetoothcenter.isEnableBluetooth();
if (isString(resp)) {
    resp = JSON.parse(resp);
}
var isEnable = resp.isEnable;
  1. 设置回调

            // 设置蓝牙回调
            bluetoothcenter.setCenterCallback((resp) => {
                var opt = resp.opt;
                switch (opt) {
                    // 蓝牙状态改变,仅支持iOS
                    case "centralManagerDidUpdateState":
                         // state:
                        // 0: CBManagerStateUnknown
                        // 1: CBManagerStateResetting
                        // 2: CBManagerStateUnsupported
                        // 3: CBManagerStateUnauthorized
                        // 4: CBManagerStatePoweredOff
                        // 5: CBManagerStatePoweredOn
                      var state = resp;
                    break;
                    // 扫描发现蓝牙设备
                    case "onScanBluetooth":
                        this.deviceArray.push(resp);
                        break;
                        // 蓝牙连接成功
                    case "onConnectSuccess":
                        var deviceId = resp.device.deviceId;
                        var bluetooth = this.getBluetooth(deviceId);
                        this.$set(bluetooth, "isConnected", true);
                        // 连接成功后,开始查找service和characteristic
                        this.$set(bluetooth, "services", []);
                        bluetoothcenter.findServiceAndCharacteristic({
                            "deviceId": deviceId
                        });
                        break;
                        // 蓝牙连接失败
                    case "onConnectFail":
                        var deviceId = resp.device.deviceId;
                        var bluetooth = this.getBluetooth(deviceId);
                        this.$set(bluetooth, "isConnected", false);
                        this.$set(bluetooth, "services", []);
                        break;
                        // 蓝牙断开连接
                    case "onDisConnected":
                        var deviceId = resp.device.deviceId;
                        var bluetooth = this.getBluetooth(deviceId);
                        this.$set(bluetooth, "isConnected", false);
                        this.$set(bluetooth, "services", []);
                        break;
                        // 发现characteristic
                    case "onFindCharacteristic":
                        var deviceId = resp.device.deviceId;
                        var bluetooth = this.getBluetooth(deviceId);
                        bluetooth.services.push(resp.service);
                        break;
                        // 收到数据
                    case "onCharacteristicWriteRequest":
                        var str = JSON.stringify(resp);
                        this.showMsg("收到数据:" + str);
                        break;
                        // 写数据成功,即成功发送数据
                    case "onWriteSuccess":
                        this.showMsg("写数据成功");
                        break;
                        // 写数据失败,即发送数据失败
                    case "onWriteFailure":
                        this.showMsg("写数据失败");
                        break;
                        // 读数据成功
                    case "onReadSuccess":
                        this.showMsg("读数据成功");
                        break;
                        // 读数据失败
                    case "onReadFailure":
                        this.showMsg("读数据失败");
                        break;
                    default:
                        break;
                }
            });
  1. 初始化蓝牙

            var params = {};
            switch (uni.getSystemInfoSync().platform) {
                case 'ios':
                    params.CBCentralManagerOptionShowPowerAlertKey = true;
                    // params.CBCentralManagerOptionRestoreIdentifierKey = "xxx";
                    break;
                default:
                    break;
            }
            bluetoothcenter.initBluetoothCenter(params);
  1. 扫描蓝牙,扫描结果通过onScanBluetooth回调
  • Android里需要同时开启蓝牙和定位才能扫描到设备

                    var params = {};
                    // params.filterName = "slave"; // 过滤蓝牙名
                    switch (uni.getSystemInfoSync().platform) {
                        case 'ios':
                            params.CBCentralManagerScanOptionAllowDuplicatesKey = false; // 是否运行重复扫描已经发现的设备,仅支持iOS
                            break;
                            case 'android':
                            // params.mac = "xx"; // mac地址,仅支持Android
                            break;
                        default:
                            break;
                    }
                    // params.services = ["0000fff1-0000-1000-8000-00805f9b34fb"]; // 服务UUID

                    // params.timeout = 10000; // 扫描时间,毫秒
                    bluetoothcenter.startScanBluetooth(params);
  1. 获取当前扫描到的所有蓝牙设备

bluetoothcenter.getCurScanDevice((resp)=>{
    var devices = resp.devices;
});
  1. 是否在扫描中

var resp = bluetoothcenter.isScanning();
if(isString(resp)) {
    resp = JSON.parse(resp);
}
  1. 停止扫描

bluetoothcenter.stopScanBluetooth();
  1. 判断蓝牙连接状态

                var resp = bluetoothcenter.isConnected({
                    "deviceId": bluetooth.device.deviceId
                });
                if (isString(resp)) {
                    resp = JSON.parse(resp);
                }
                if (resp.isConnected) {

                } else {

                }
  1. 查找服务和characteristic,查找结果通过onFindCharacteristic回调

                        bluetoothcenter.findServiceAndCharacteristic({
                            "deviceId": deviceId
                        });
  1. 读数据

                bluetoothcenter.readData({
                    "deviceId": bluetooth.device.deviceId,
                    "serviceUuid": service.uuid,
                    "characteristicUuid": characteristic.uuid
                });
  1. 写数据

                    bluetoothcenter.writeData({
                        "deviceId": bluetooth.device.deviceId,
                        "serviceUuid": service.uuid,
                        "characteristicUuid": characteristic.uuid,
                        "value": value,
                        "dataType": -1, // 发送数据类型, -1: 不进行转换,以原始数据发送 0: 以十六进制发送,此时data数据为十六进制字符串或整型数组 1:以字符编码发送,此时data数据为字符串
                        "charsetName": "UTF_8", // 字符编码, 当dataType为1时生效,常用编码为:ISO_8859_1、US_ASCII、UTF_16、UTF_16BE、UTF_16LE、UTF_8
                        "writeType": 0 // 写类型,仅支持iOS, 0: CBCharacteristicWriteWithResponse 1: CBCharacteristicWriteWithoutResponse

                    });
  1. 打开notify通知,characteristic只有打开notify通知后才能收到对方发来的数据

                bluetoothcenter.openNotify({
                    "deviceId": bluetooth.device.deviceId,
                    "serviceUuid": service.uuid,
                    "characteristicUuid": characteristic.uuid
                }, (resp)=> {
                    if(resp.flag) { // 打开成功

                    } else { // 打开失败

                    }
                });
  1. 关闭notify通知

                bluetoothcenter.stopNotify({
                    "deviceId": bluetooth.device.deviceId,
                    "serviceUuid": service.uuid,
                    "characteristicUuid": characteristic.uuid
                }, (resp)=> {
                    if(resp.flag) { // 打开成功

                    } else { // 打开失败

                    }
                });
  1. 设置接收数据类型,设置后接收到的数据都会按照设置的字符数据类型进行转换

var params = {};
params.dataType = -1; // -1: 不转换数据 0: 以十六进制接收 1:以字符编码接收
params.charsetName = "UTF_8"; // 字符编码,当dataType为1时生效,常用编码为:ISO_8859_1、US_ASCII、UTF_16、UTF_16BE、UTF_16LE、UTF_8
bluetoothcenter.setReceiveDataDataType(params);
  1. 释放资源

            // 释放资源
bluetoothcenter.releaseResource();
  1. 判断设备是否支持蓝牙,仅支持Android

var resp = bluetoothcenter.isScanning();
if(isString(resp)) {
    resp = JSON.parse(resp);
}
  1. 设置MTU,仅支持Android,ios系统没有提供设置MTU,插件做了自动拆包逻辑

var params = {};
params.deviceId = "xxx";
params.mtu = 100; // 23~512
bluetoothcenter.setMtu(params, (resp)=>{
    var flag = resp.flag;
    if(flag) {// 设置成功

    } else { // 设置失败

    }
});

支持定制,联系方式 QQ:252797991

如果觉得可以就点个👍吧,欢迎粉丝收藏,土豪打赏,您的关注就是我们创作的动力!

隐私、权限声明

1. 本插件需要申请的系统权限列表:

android: ``` <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- Android 12以下才需要定位权限, Android 9以下官方建议申请ACCESS_COARSE_LOCATION --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" /> ``` ios: ``` <key>NSBluetoothAlwaysUsageDescription</key> <string>访问蓝牙需要您的授权</string> ```

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问