更新记录

1.0.1(2025-04-17)

  1. 增加客户端模块功能,包含扫描、连接、断开连接、收发数据

1.0.0(2025-04-02)

经典蓝牙服务端


平台兼容性

Vue2 Vue3
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
HBuilderX 3.6.8,Android:4.4,iOS:不支持,HarmonyNext:不支持 × × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序 鸿蒙元服务
× × × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × × × × × × ×

经典蓝牙客户端、服务端

低功耗ble蓝牙请使用插件https://ext.dcloud.net.cn/plugin?id=19861

开发文档

  1. 拷贝demo的AndroidManifest.xml到项目根目录
  2. 集成插件步骤请参考 https://www.cnblogs.com/wenrisheng/p/18323027

接口


import {
    UTSClassicsBtServer,
    UTSBt,
    UTSClassicsBtClient
} from "@/uni_modules/wrs-uts-classicsbt"
let client = new UTSClassicsBtClient()
let server = new UTSClassicsBtServer()
  • 判断蓝牙是否已经开启

let isEnabled = UTSBt.isEnable()
if (!isEnabled) {

}
  • 开启蓝牙

let suc = UTSBt.enable()
this.showMsg("打开蓝牙:" + suc)
  • 获取蓝牙名

let name = UTSBt.getName()
  • 设置蓝牙名

 UTSBt.setName("XXXX")

客户端

  • 设置回调

client.onCallback((resp) => {
    this.showMsg(JSON.stringify(resp))
    let opt = resp.opt
    switch (opt) {
        case "onScanDevice": {
            let action = resp.action
            switch (action) {
                case "android.bluetooth.device.action.FOUND": {
                    // 扫描到蓝牙
                    // 扫描到蓝牙
                    let device = resp.device
                    if(device.name) {
                        console.log(JSON.stringify(resp))
                        this.bluetoothArray.push(device)
                    }

                }
                break;
                case "android.bluetooth.device.action.BOND_STATE_CHANGED": {
                    // 蓝牙状态变更
                    let device = resp.device;
                    let bondState = device.bondState;
                    switch (bondState) {
                        case 11: {
                            // 正在配对......
                        }
                        break;
                        case 12: {
                            // 完成配对
                        }
                        break;
                        case 10: {
                            // 取消配对
                        }
                        break;
                        default:
                            break;
                    }
                }
                break;
                case "android.bluetooth.adapter.action.DISCOVERY_FINISHED": {
                    // 蓝牙扫描完成
                }
                break;
                default:
                    break;
            }

        }
        break;
case "onDisconnectClient": {
            this.showMsg("连接被断开")
        }
        break;
        default:
            break;
    }
})
  • 注册扫描接收器

// 每个实例变量调用一次就可以
client.registerReceiver()
  • 取消扫描接收器

client.unregisterReceiver()
  • 开始扫描 扫描结果在client.onCallback里回调

client.startScan()
  • 停止扫描

client.stopScan()
  • 连接设备

let params = {}
params.address = this.address
params.uuid = this.SPP_UUID
// secure
// true: 加密传输,Android强制执行配对,弹窗显示配对码
// false: 明文传输(不安全),无需配对
params.secure = this.secure // true
let result = client.connect(params)
if(result.flag) {
    this.showMsg("连接成功")
} else {
    this.showMsg("连接失败")
}
  • 发送数据

let params = {}
// 地址
params.address = this.address
// 十六进制数据,如果需要进制进制转换、modbus、crc、ASCII等,请使用插件https://ext.dcloud.net.cn/plugin?id=19206
params.data = [0x00, 0x02, 0xfc]
client.sendData(params)

服务端

  • 启动可检测性 当服务端启动后,如果无法被扫描到,可以启动可检测性

let scanMode = UTSBt.getScanMode()
if (scanMode != 23) {
    // 通常持续 120-300 秒
    let durationTime = 300
    UTSBt.startDiscoverable(durationTime)
}
  • 设置服务端回调

server.onCallback((resp) => {
    this.showMsg(JSON.stringify(resp))
    let opt = resp.opt
    switch (opt) {
        case "onNewClient": {
            // 
            let remoteDevice = resp.remoteDevice
            // 蓝牙mac地址
            let address = remoteDevice.address
            this.showMsg("收到一个新连接:" + address)
        }
        break;
        case "onReceiveData": {
                let remoteDevice = resp.remoteDevice
                let data = resp.data
                this.showMsg("收到数据:" + JSON.stringify(data))
        }
        break;
        case "onDisconnectClient": {
            this.showMsg("连接被断开")
        }
        break;
        default:
            break;
    }
})
  • 服务端开启服务

let params = {}
params.name = "BTServer"
params.uuid = "00001101-0000-1000-8000-00805F9B34FB"
// secure
// true: 加密传输,Android强制执行配对,弹窗显示配对码
// false: 明文传输(不安全),无需配对
params.secure = false // true
server.startServer(params)
  • 停止监听

server.stopServer()
  • 断开连接

let address = "0x:xx"
server.disconnect(address)
  • 发送数据

let params = {}
params.address = "xxx"
params.data = [0x01, 0x02, 0x03] // 十六进制数组
server.sendData(params)

隐私、权限声明

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

蓝牙、定位

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

插件不采集任何数据

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

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