详细问题描述
在写一个蓝牙模块,安卓真机调试没有任何问题,但是在IOS下,发现uni.writeBLECharacteristicValue函数根本不执行,连错误也不报,求修复.
[内容]
重现步骤
[步骤]
1.初始化蓝牙适配器,安卓IOS都成功
- 搜索蓝牙,安卓IOS都成功
- 连接,安卓IOS都成功
- 写入数据,就这里,安卓成功,IOS函数不执行,不打印任何东西,感觉根本没有进入函数体.
- 断开蓝牙,安卓IOS都成功
- 关闭蓝牙适配器
[结果]
我在绑定那里,调用了uni.writeBLECharacteristicValue,就没有任何反应了.
[期望]
[如果语言难以表述清晰,拍一个视频或截图,有图有真相]
IDE运行环境说明
HBuilderX
[IDE版本号]
[mac版本号]
1.9.9.20190522
uni-app运行环境说明
[运行端是h5或app或某个小程序?]
app
[运行端版本号]
IOS11.4
[项目是cli创建的还是HBuilderX创建的?如果是cli创建的,请更新到最新版cli再试]
HBuilderX创建
[编译模式是老模板模式还是新的自定义组件模式?]
App运行环境说明
[Android版本号]
[iOS版本号]
IOS11.4
[手机型号]
iphone6s
[模拟器型号]
真机调试
附件
[IDE问题请提供HBuilderX运行日志。菜单帮助-查看运行日志,点右键打开文件所在目录,将log文件压缩成zip包上传]
已上传
[App问题请提供可重现问题的代码片段,你补充的细一点,问题就解决的快一点]
下面是index.vue的代码,目前就这里写了代码,其它都是新建的示例模板工程.其中,引用了uni-list组件,可不看,没啥用
<template>
<view class="">
<uni-list>
<uni-list-item title="标题文字" show-arrow="false"></uni-list-item>
<uni-list-item title="标题文字"></uni-list-item>
<uni-list-item title="标题文字" show-badge="true" badge-text="12"></uni-list-item>
<uni-list-item title="禁用状态" disabled="true" show-badge="true" badge-text="12"></uni-list-item>
</uni-list>
<button type="primary" @click="initBuletooth">初始化蓝牙</button>
<button type="primary" @click="searchBuletooth">搜索蓝牙5S</button>
<button type="primary" @click="connectBuletooth">连接</button>
<button type="primary" @click="bindBuletooth">绑定</button>
<button type="primary" @click="unbindBuletooth">解绑设备</button>
<button type="primary" @click="writeBLE">写入数据</button>
<button type="primary" @click="stopBuletooth">断开连接</button>
<button type="primary" @click="closeBuletooth">关闭蓝牙</button>
</view>
</template>
<script>
import uniList from '../../components/uni-list/uni-list.vue'
import uniListItem from '../../components/uni-list-item/uni-list-item.vue'
export default {
data() {
return {
title: 'Hello',
deviceId: '',
serviceId: '',
characteristicId: ''
}
},
onLoad() {
},
methods: {
initBuletooth() {
let that = this;
console.log('点击了');
uni.openBluetoothAdapter({
success() {
//console.log(JSON.stringify(res))
uni.startBluetoothDevicesDiscovery({
success(res) {
console.log(res);
// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('')
}
uni.onBluetoothDeviceFound(function(devices) {
//console.log('new device list has founded')
//console.dir(devices)
//console.log(devices.devices[0]);
if (devices.devices[0].name == '智能暖贴') {
console.log(devices.devices[0]);
that.deviceId = devices.devices[0].deviceId;
console.log(that.deviceId);
that.serviceId = devices.devices[0].advertisServiceUUIDs[0];
}
})
setTimeout(function() {
uni.stopBluetoothDevicesDiscovery({
success(res) {
console.log(res)
}
})
}, 5000)
}
})
//获取在蓝牙模块生效期间所有已发现的蓝牙设备
/* uni.getBluetoothDevices({
success(res) {
console.log(res)
}
}) */
}
}) //openBluetoothAdapter结束
},
connectBuletooth() {
let that = this;
console.log('准备连接' + that.deviceId),
uni.createBLEConnection({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: that.deviceId,
success(res) {
console.log('连接成功');
},
complete(res) {
//console.log(res);
}
})
},
bindBuletooth() {
let that = this;
console.log('绑定' + that.deviceId);
// 向蓝牙设备发送的16进制数据
const buffer = new ArrayBuffer(4)
const dataView = new DataView(buffer)
var a1 = '0xA5';
var a2 = '0x03';
var a3 = '0x' + '2c';
var a4 = '0x' + '1f'
dataView.setUint8(0, a1) //这里也能写十进制数
dataView.setUint8(1, a2) //...
dataView.setUint8(2, a3)
dataView.setUint8(3, a4)
uni.writeBLECharacteristicValue({
// 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId: "5F73CF0E-F91F-6FF0-4170-9EE52CBDDFD0",
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId: "0000ACA0-0000-1000-8000-00805F9B34FB",
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId: '0000FEE7-0000-1000-8000-00805F9B34FB',
// 这里的value是ArrayBuffer类型
value: buffer,
success(res) {
console.log('writeBLECharacteristicValue success', res.errMsg)
},
complete(res) {
console.log(res);
}
})
},
unbindBuletooth() {
console.log('解绑');
// 向蓝牙设备发送的16进制数据
const buffer = new ArrayBuffer(4)
const dataView = new DataView(buffer)
var a1 = '0xA5';
var a2 = '0x04';
var a3 = '0x' + '22';
var a4 = '0x' + '23';
dataView.setUint8(0, a1) //这里也能写十进制数
dataView.setUint8(1, a2) //...
dataView.setUint8(2, a3)
dataView.setUint8(3, a4)
uni.writeBLECharacteristicValue({
// 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId: "5F73CF0E-F91F-6FF0-4170-9EE52CBDDFD0",
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId: "0000ACA0-0000-1000-8000-00805F9B34FB",
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId: "0000ACA1-0000-1000-8000-00805f9b34fb",
// 这里的value是ArrayBuffer类型
value: buffer,
success(res) {
console.log('writeBLECharacteristicValue success', res.errMsg)
},
complete(res) {
console.log(res);
}
})
},
writeBLE() {
console.log('开始写入数据');
},
stopBuletooth() {
let that = this;
console.log('断开连接');
uni.closeBLEConnection({
deviceId : that.deviceId,
success(res) {
console.log(res)
}
})
},
closeBuletooth() {
console.log('关闭蓝牙适配器');
uni.closeBluetoothAdapter({
success(res) {
console.log(res)
}
})
}
},
components: {
uniList,
uniListItem
}
}
</script>
<style>
</style>
[App安装包或H5地址]
[可重现代码片段]
请注意bindBuletooth这个函数,问题就在这里面了.安卓走下来没有任何问题,IOS就不行了.
联系方式
[QQ]443469005
y***@qq.com (作者)
解决了,最后发现是顺序问题.
2019-10-25 14:36
3***@qq.com
回复 y***@qq.com: 请问是什么顺序问题?我也是这么情况
2019-10-31 17:14