更新记录
1.0.1(2025-04-17)
- 增加客户端模块功能,包含扫描、连接、断开连接、收发数据
1.0.0(2025-04-02)
经典蓝牙服务端
平台兼容性
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
开发文档
- 拷贝demo的AndroidManifest.xml到项目根目录
- 集成插件步骤请参考 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)