更新记录
1.0.4(2023-08-02)
- 修复mtu问题
- 修复openNotify回调问题
1.0.3(2023-05-06)
- 增加Android 设置MTU接口
- 增加iOS发送数据自动拆包流程
1.0.2(2023-04-28)
- 增加获取当前扫描到的所有蓝牙设备接口
平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:4.4 - 12.0 | armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 | 适用版本区间:9 - 16 |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
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/830ccc503e29 或 https://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");
- 打开蓝牙,仅支持Android,android开启蓝牙不是实时开启的,开启状态以isEnableBluetooth获取为准
bluetoothcenter.enableBluetooth();
- 关闭蓝牙,仅支持Android
bluetoothcenter.disableBluetooth();
- 获取蓝牙打开关闭状态,仅支持Android,ios蓝牙状态的变更通过回调centralManagerDidUpdateState获取
var resp = bluetoothcenter.isEnableBluetooth();
if (isString(resp)) {
resp = JSON.parse(resp);
}
var isEnable = resp.isEnable;
- 设置回调
// 设置蓝牙回调
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;
}
});
- 初始化蓝牙
var params = {};
switch (uni.getSystemInfoSync().platform) {
case 'ios':
params.CBCentralManagerOptionShowPowerAlertKey = true;
// params.CBCentralManagerOptionRestoreIdentifierKey = "xxx";
break;
default:
break;
}
bluetoothcenter.initBluetoothCenter(params);
- 扫描蓝牙,扫描结果通过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);
- 获取当前扫描到的所有蓝牙设备
bluetoothcenter.getCurScanDevice((resp)=>{
var devices = resp.devices;
});
- 是否在扫描中
var resp = bluetoothcenter.isScanning();
if(isString(resp)) {
resp = JSON.parse(resp);
}
- 停止扫描
bluetoothcenter.stopScanBluetooth();
- 判断蓝牙连接状态
var resp = bluetoothcenter.isConnected({
"deviceId": bluetooth.device.deviceId
});
if (isString(resp)) {
resp = JSON.parse(resp);
}
if (resp.isConnected) {
} else {
}
- 查找服务和characteristic,查找结果通过onFindCharacteristic回调
bluetoothcenter.findServiceAndCharacteristic({
"deviceId": deviceId
});
- 读数据
bluetoothcenter.readData({
"deviceId": bluetooth.device.deviceId,
"serviceUuid": service.uuid,
"characteristicUuid": characteristic.uuid
});
- 写数据
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
});
- 打开notify通知,characteristic只有打开notify通知后才能收到对方发来的数据
bluetoothcenter.openNotify({
"deviceId": bluetooth.device.deviceId,
"serviceUuid": service.uuid,
"characteristicUuid": characteristic.uuid
}, (resp)=> {
if(resp.flag) { // 打开成功
} else { // 打开失败
}
});
- 关闭notify通知
bluetoothcenter.stopNotify({
"deviceId": bluetooth.device.deviceId,
"serviceUuid": service.uuid,
"characteristicUuid": characteristic.uuid
}, (resp)=> {
if(resp.flag) { // 打开成功
} else { // 打开失败
}
});
- 设置接收数据类型,设置后接收到的数据都会按照设置的字符数据类型进行转换
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);
- 释放资源
// 释放资源
bluetoothcenter.releaseResource();
- 判断设备是否支持蓝牙,仅支持Android
var resp = bluetoothcenter.isScanning();
if(isString(resp)) {
resp = JSON.parse(resp);
}
- 设置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 { // 设置失败
}
});