更新记录
1.0.2(2024-09-20)
扫描和连接设备时自动请求权限 构建 targetSdkVersion 建议 34
测试需要自定义基座打包权限
1.0.1(2024-09-16)
调整为数据发送默认16进制字符串模式 接收为16进制字符串
1.0.0(2024-09-16)
初始版本
查看更多平台兼容性
Vue2 | Vue3 |
---|---|
√ | √ |
App | 快应用 | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节小程序 | QQ小程序 |
---|---|---|---|---|---|---|
HBuilderX 4.23,Android:6.0,iOS:不支持,HarmonyNext:不确定 | × | × | × | × | × | × |
钉钉小程序 | 快手小程序 | 飞书小程序 | 京东小程序 |
---|---|---|---|
× | × | × | × |
H5-Safari | Android Browser | 微信浏览器(Android) | QQ浏览器(Android) | Chrome | IE | Edge | Firefox | PC-Safari |
---|---|---|---|---|---|---|---|---|
× | × | × | × | × | × | × | × | × |
bluetooth-manager uni-APi插件
- android 6 至 android 14
- 支持异常断开检测,断开,连接,扫描,配置连接服务uuid(默认串口服务uuid),重复连接检测, 数据发送,接收
- 理论支持vue2 未实验
- 理论支持多台设备连接 手头设备有限 未实验
- 有问题反馈就处理
- uni-app uni-app-x
权限
<!-- Android 12以下配置的三个蓝牙权限 -->
<!-- 这个权限允许程序连接到已配对的蓝牙设备, 请求连接/接收连接/传输数据需要改权限, 主要用于对配对后进行操作 -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<!-- 这个权限允许程序发现和配对蓝牙设备, 该权限用来管理蓝牙设备, 有了这个权限, 应用才能使用本机的蓝牙设备, 主要用于对配对前的操作 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<!-- Android 6.0以后,12.0以下,这两个权限是必须的,蓝牙扫描周围的设备需要获取模糊的位置信息。这两个权限属于同一组危险权限,在清单文件中声明之后,还需要再运行时动态获取。 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Android 12以下配置的两个蓝牙权限 -->
<!-- Android 12 及以上版本配置的三个权限 -->
<!-- 您的应用查找蓝牙设备时添加 -->
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="s" />
<!-- 应用程序使手机蓝牙可被其它蓝牙设备发现时才需要-->
<!-- <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> -->
<!-- 仅应用程序与已配对的蓝牙设备通信时才需要 -->
<uses-permission
android:name="android.permission.BLUETOOTH_CONNECT"
tools:targetApi="s" />
<!-- Android 12 及以上版本配置的三个权限 -->
数据类型
type Device = {
name: string;
address: string;
rssi: number,
};
API接口说明
- 初始化蓝牙适配器
initBluetoothAdapter(options: {
success?: () => void;
fail?: (res: ApiFailImpl) => void;
complete?: () => void;
}): void;
- 设置扫描到设备回调(传入null可取消回调)
onScan((device: Device) => {
})
- 设备接收到数据回调
onDataReceived((address: string, data: string) => {
toast(address + '收到数据:' + data) // 收到数据:102030405060708090A0B0C0D0E0F0
})
- 设备异常断开回调
onDisconnect((address: string) => {
toast(address + '异常断开')
})
- 连接到指定设备 (需要验证权限)
uni.showLoading()
connectToDevice({
address: device.address,
//uuid: "xxxx-xxxx-...", // 连接到指定服务
success() {
toast('连接设备成功')
connectedDevices.value.push(device);
},
fail(e: any) {
toast(e.errMsg || '连接设备失败');
console.error(e);
},
complete() {
uni.hideLoading();
}
})
- 断开指定设备
disconnectDevice({
address: device.address,
success() {
toast('断开设备成功')
},
fail(e: any) {
toast(e.errMsg || '断开设备失败')
console.error(e);
}
})
- 向指定设备写入数据
writeData({
address: device.address,
data: '102030405060708090A0B0C0D0E0F0',
type?: 'hex' | 'text' // 默认 hex
success() {
toast('发送数据成功')
},
fail(e: any) {
toast(e.errMsg || '发送数据失败')
console.error(e);
}
})
- 开始扫描设备 (需要验证权限)
startScanning({
success() {
console.log('ok')
isScan.value = true
},
fail(e: any) {
toast(e.errMsg || '失败')
console.error(e);
}
})
- 停止扫描设备
stopScanning({
success() {
console.log('ok')
isScan.value = false
},
fail(e: any) {
toast(e.errMsg || '失败')
console.error(e);
}
})
主要接口类型
export type DefaultOptions = {
success?: () => void;
fail?: (res: ApiFailImpl) => void;
complete?: () => void;
}
export type Device = {
name: string;
address: string;
rssi: number,
}
export type ConnectToDeviceOptions = {
address: string;
uuid?: string;
success?: () => void;
fail?: (res: ApiFailImpl) => void;
complete?: () => void;
}
export type DisconnectToDeviceOptions = {
address: string;
success?: () => void;
fail?: (res: ApiFailImpl) => void;
complete?: () => void;
}
export type WriteDataOptions = {
address: string;
data: string;
success?: () => void;
fail?: (res: ApiFailImpl) => void;
complete?: () => void;
}
注意
- 不会主动提示消息,错误消息需要自行在fail回调中展示e.errMsg
toast(e.errMsg || '操作失败')
- 安卓需要配置蓝牙相关权限,当前版本仅作权限检查, 未作权限动态申请,需要开发者在调用相关接口前自行检查权限并申请
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<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" tools:ignore="CoarseFineLocation"/>