y***@qq.com
y***@qq.com
  • 发布:2019-05-23 01:55
  • 更新:2020-10-14 09:45
  • 阅读:2326

【报Bug】uni.writeBLECharacteristicValue函数在IOS里不执行[自己已经解决了,不用看了,但是不知道在哪删话题]

分类:uni-app

详细问题描述

在写一个蓝牙模块,安卓真机调试没有任何问题,但是在IOS下,发现uni.writeBLECharacteristicValue函数根本不执行,连错误也不报,求修复.

[内容]

重现步骤

[步骤]
1.初始化蓝牙适配器,安卓IOS都成功

  1. 搜索蓝牙,安卓IOS都成功
  2. 连接,安卓IOS都成功
  3. 写入数据,就这里,安卓成功,IOS函数不执行,不打印任何东西,感觉根本没有进入函数体.
  4. 断开蓝牙,安卓IOS都成功
  5. 关闭蓝牙适配器

[结果]
我在绑定那里,调用了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

2019-05-23 01:55 负责人:无 分享
已邀请:
3***@qq.com

3***@qq.com - 80后it男

楼主问题己决了吗?我碰到了同样的问题,你最后是什么问题?

  • y***@qq.com (作者)

    解决了,最后发现是顺序问题.

    2019-10-25 14:36

  • 3***@qq.com

    回复 y***@qq.com: 请问是什么顺序问题?我也是这么情况

    2019-10-31 17:14

店小二丶

店小二丶 - 江湖小二

请问具体调用顺序是什么呢?我也是同样的情况。

y***@qq.com

y***@qq.com (作者) - 我们的未来,很光明!

统一回复一下哈,主要原因是要给除蓝牙链接外的步骤加上异步,让它们按顺序来执行,否则安卓和小程序都能成功,IOS是成功不了的.

1***@163.com

1***@163.com

你好,我这边将蓝牙连接成功后的步骤加上异步,用async/await,但是iOS端已经停留在writeBLECharacteristicValue方法,成功失败都不调用,是怎么回事?还是说蓝牙连接前的方法也需要添加异步?

  • y***@qq.com (作者)

    有点久远了记不清了,好像是都要异步。

    2020-08-13 11:21

y***@qq.com

y***@qq.com (作者) - 我们的未来,很光明!

晚点我做成插件分享到插件市场吧

  • 隔壁老王LMW

    你好,我现在IOS上也是出现了这种情况,请问怎么解决呢?

    2020-09-15 09:09

  • Kris__

    回复 隔壁老王LMW: 大哥你解决了吗,我也遇到了,连complete都没有执行啊我

    2020-09-17 18:06

  • 隔壁老王LMW

    回复 Kris__: 我的解决了,有需要加我扣扣:215909034

    2020-10-07 17:26

y***@qq.com

y***@qq.com (作者) - 我们的未来,很光明!

插件市场不好弄,有需要的直接加微信:call-me-if,我发源码参考,这个论坛不经常上。

该问题目前已经被锁定, 无法添加新回复