HarmonyOS 鸿蒙Next中低功耗蓝牙连接成功后,没显示“已连接”和怎么取消配对
HarmonyOS 鸿蒙Next中低功耗蓝牙连接成功后,没显示“已连接”和怎么取消配对
使用低功耗蓝牙,连接成功之后,发起配对,打印了配对成功,数据也可以正常的发送和接收。现在有二个疑问:
-
配对成功之后,在系统里面会有显示这个设备,但是没有显示“已连接”,手动在系统中点击这个设备,才可以显示“已连接”。需要再调用什么代码可以连接成功之后,自动显示“已连接”?
-
配对成功之后,需要取消这个配对(在系统中不显示这个设备),鸿蒙开发中是否有对应的方法?
this.dev = ble.createGattClientDevice(deviceId)
// 连接
this.dev.connect()
// 配对
connection.pairDevice(this.deviceId).then(() => {
console.log('配对成功');
}, (error: BusinessError) => {
console.log('配对失败 errCode: ' + error.code + ',errMessage' + error.message);
})
更多关于HarmonyOS 鸿蒙Next中低功耗蓝牙连接成功后,没显示“已连接”和怎么取消配对的实战教程也可以访问 https://www.itying.com/category-93-b0.html
【背景知识】
蓝牙技术是一种无线通信技术,短距离内进行连接通信,蓝牙connection模块和ble模块提供了对蓝牙操作和管理的方法。
【解决方案】
目前BLE蓝牙暂无自动连接功能; 手动点击连接之后,可以订阅BLE连接状态变化,通过connection.getRemoteDeviceName(connection.getPairedDevices[n]) 方法获取到已配对设备的名称,作为ble扫描过滤条件找到指定设备,在后续断开时的回调中编写重连机制实现重连,可参考如下代码:
import { ble, connection, constant } from '@kit.ConnectivityKit';
let gattClient: ble.GattClientDevice = ble.createGattClientDevice('XX:XX:XX:XX:XX:XX');
gattClient.connect();
let deviceName = connection.getRemoteDeviceName(connection.getPairedDevices()[n])
gattClient.on('BLEConnectionStateChange', (state: ble.BLEConnectionChangeState) => {
console.log('BluetoothPage bluetooth connect state changed');
let deviceId = state.deviceId;
console.log(`BluetoothPage deviceId connectState ${deviceId}`)
// 检测到断开连接
if (state.state == constant.ProfileConnectionState.STATE_DISCONNECTED) {
// 根据设备名设置蓝牙扫描过滤条件
let scanFilter: ble.ScanFilter = {name: deviceName}
let scanOptions: ble.ScanOptions = {
interval: 500,
dutyMode: ble.ScanDuty.SCAN_MODE_LOW_POWER,
matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE,
}
ble.startBLEScan([scanFilter], scanOptions);
// 根据扫描结果获取deviceId进行重连
ble.on('BLEDeviceFind', (data: Array<ble.ScanResult>) => {
console.info(`bluetooth device find on = ${data.toString()}`)
if (data.length > 0) {
gattClient = ble.createGattClientDevice(data[0].deviceId);
gattClient.connect()
}
});
}
})
更多关于HarmonyOS 鸿蒙Next中低功耗蓝牙连接成功后,没显示“已连接”和怎么取消配对的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这些流程我都懂,就是想配对成功之后,在系统的蓝牙里面,可以显示这个设备是“已连接”的,这些代码并不能实现得到啊。
2个原因:
-
Profile连接缺失:
- 配对与连接是独立流程,配对成功后需主动发起profile连接。在BLE场景中,需要确保已建立有效的GATT连接:
// 在配对成功后补充GATT特征值订阅 this.dev.connect((err: BusinessError) => { if (!err) { // 订阅特征值变化通知 this.dev.setCharacteristicChangeNotification(serviceUuid, characteristicUuid, true) .then(() => { console.log('特征值订阅成功'); }); } });
-
系统UI更新机制:
- 系统显示连接状态需要触发蓝牙profile的实际数据传输。在数据交互后可添加状态更新:
// 发送任意特征值数据触发状态更新 const data = new Uint8Array([0x01]); this.dev.writeCharacteristicValue(serviceUuid, characteristicUuid, data) .then(() => { console.log('初始化数据交互成功'); });
取消配对的方法
取消配对的API:
import { connection } from '@kit.ConnectivityKit';
// 取消配对目标设备
try {
connection.unpairDevice(this.deviceId).then(() => {
console.log('取消配对成功');
});
} catch (err) {
console.error('取消配对失败: ' + (err as BusinessError).message);
}
注意
-
权限配置:
- 确保在
module.json5
中声明蓝牙权限:
"requestPermissions": [ { "name": "ohos.permission.DISCOVER_BLUETOOTH", "reason": "$string:desc_bluetooth" }, { "name": "ohos.permission.USE_BLUETOOTH", "reason": "$string:desc_bluetooth" } ]
- 确保在
-
状态监听(建议补充):
// 监听连接状态变化 connection.on('BLEConnectionStateChange', (state: connection.BLEConnectionChangeParam) => { if (state.state === 2) { // STATE_CONNECTED console.log('系统连接状态已更新'); } });
连接成功了,也订阅特征值变化通知。配对也成功了,但是系统的蓝牙里面,并没有显示“已连接”。
一样的硬件设备,在安卓和 iOS 设备中是可以显示到“已连接”的。
connection并没有unpairDevice方法啊,
在HarmonyOS鸿蒙Next中,蓝牙连接成功但未显示"已连接"状态可能是由于UI状态未及时更新或设备未正确上报连接状态。取消配对的操作路径为:进入"设置" > “蓝牙” > 点击已配对设备右侧的齿轮图标 > 选择"取消配对"。若状态显示异常,可尝试关闭蓝牙后重新开启。系统会记录配对信息但不会自动重连。
关于HarmonyOS Next中低功耗蓝牙连接显示和配对管理的问题:
- 连接状态显示问题:
- 系统未自动显示"已连接"状态是因为连接成功后需要主动调用
setDeviceStateChangeCallback
监听设备状态变化 - 建议在
connect()
成功后立即调用:
this.dev.setDeviceStateChangeCallback({
onConnectionStateChange: (state) => {
if (state === profile.ConnectionState.STATE_CONNECTED) {
// 这里会触发系统更新连接状态
}
}
});
- 取消配对方法:
- 可以使用
connection.unpairDevice()
接口:
connection.unpairDevice(this.deviceId).then(() => {
console.log('取消配对成功');
}).catch((error) => {
console.error('取消配对失败', error);
});
注意:取消配对后需要重新扫描才能发现设备。这两个接口都属于@ohos.bluetooth.connection
模块,请确保已正确导入。