wxzhuhua
wxzhuhua
  • 发布:2020-03-06 16:46
  • 更新:2023-03-21 19:47
  • 阅读:1866

【报Bug】安卓低功耗蓝牙:app订阅特征值后无法监听到改变的特征值

分类:uni-app

详细问题描述

(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)

[内容] 低功耗蓝牙串口,无法接收到设备端发送的信息

重现步骤

[步骤] 订阅特征值成功后,无法监听到变化的特征值

[结果] 特征值变化后无反应

[期望] 收到变化的特征值

[如果语言难以表述清晰,拍一个视频或截图,有图有真相]

IDE运行环境说明

[HBuilder 或 HBuilderX。如果你用其他工具开发uni-app,也需要在此说明] HBuilderX

[IDE版本号] 2.6.1.20200226

[windows版本号] windows 7

[mac版本号]

uni-app运行环境说明

[运行端是h5或app或某个小程序?] 安卓app

[运行端版本号] 9.6.76

[项目是cli创建的还是HBuilderX创建的?如果是cli创建的,请更新到最新版cli再试] HBuilderX

[编译模式是老模板模式还是新的自定义组件模式?] 非v3编译器

App运行环境说明

[Android版本号] 6.0

[iOS版本号]

[手机型号] HTC-M8WL

[模拟器型号]

附件

[IDE问题请提供HBuilderX运行日志。菜单帮助-查看运行日志,点右键打开文件所在目录,将log文件压缩成zip包上传]

[App问题请提供可重现问题的代码片段,你补充的细一点,问题就解决的快一点]

[App安装包或H5地址]

[可重现代码片段]
···
<template>
<view>
<page-head :title="title"></page-head>
<view class="uni-padding-wrap uni-common-mt">
<view>
本蓝牙协议只支持低功耗蓝牙协议ble。
</view>
<view class="uni-btn-v">
<button type="primary" :disabled="disabled[0]" @click="openBluetoothAdapter">
初始化蓝牙模块
</button>
<view v-if="!adapterState.available">
{{ '蓝牙适配器不可用,请初始化蓝牙模块' }}
</view>
<button type="primary" :loading="searchLoad" :disabled="disabled[1]" @click="startBluetoothDevicesDiscovery">
开始搜索蓝牙设备
</button>
<button type="primary" :disabled="disabled[2]" @click="stopBluetoothDevicesDiscovery(false)">
停止搜索蓝牙设备
</button>
<button type="primary" :loading="newDeviceLoad" :disabled="disabled[3]" @click="queryDevices">
选择设备
</button>
<view v-if="equipment.length > 0">
{{
(connected ? '已连接设备' : '已选择设备') +
' : ' +
equipment[0].name +
' (' +
equipment[0].deviceId +
')'
}}
</view>
<button type="primary" :disabled="disabled[4]" @click="createBLEConnection">
连接蓝牙设备
</button>
<button type="primary" :disabled="disabled[5]" @click="getBLEDeviceServices">
选择设备服务
</button>
<view v-if="servicesData.length > 0">已选服务uuid:{{ servicesData[0].uuid }}</view>
<button type="primary" :disabled="disabled[6]" @click="getBLEDeviceCharacteristics">
获取服务的特征值
</button>
<view v-if="characteristicsData.length > 0">
<view class="uni-list_name">uuid:{{ characteristicsData[0].uuid }}</view>
<view class="uni-list_item">
是否支持 read 操作:{{ characteristicsData[0].properties.read }}
</view>
<view class="uni-list_item">
是否支持 write 操作:{{ characteristicsData[0].properties.write }}
</view>
<view class="uni-list_item">
是否支持 notify 操作:{{ characteristicsData[0].properties.notify }}
</view>
<view class="uni-list_item">
是否支持 indicate 操作:{{ characteristicsData[0].properties.indicate }}
</view>
</view>
<!-- <button type="primary" :disabled="disabled[7]" @click="readBLECharacteristicValue"> -->
<button type="primary" :disabled="disabled[7]" @click="notifyBLECharacteristicValueChange">
<!--zzzz <button type="primary" :disabled="disabled[7]" @click="doWR"> -->
<!-- 读取特征值数据 -->
订阅特征值数据
</button>
<view v-if="valueChangeData.serviceId">
<view class="list-name">
特征值最新的值:{{ valueChangeData.value || '还没有最新值' }}
</view>
</view>
<!-- zzz "w" -->
<button type="primary" :disabled="disabled[8]" @click=writeBLECharacteristicValue(cmd)>写入特征值数据</button>
<button type="primary" :disabled="disabled[9]" @click="closeBLEConnection">
断开蓝牙设备
</button>
<button type="primary" :disabled="disabled[10]" @click="closeBluetoothAdapter">
关闭蓝牙模块
</button>
</view>
</view>
<!-- 遮罩 -->
<view v-if="maskShow" class="uni-mask" @touchmove.stop.prevent="moveHandle" @click="maskclose">
<scroll-view class="uni-scroll_box" scroll-y @touchmove.stop.prevent="moveHandle" @click.stop="moveHandle">
<view class="uni-title">
已经发现{{ list.length }}{{ showMaskType === 'device' ? '台设备' : '个服务' }}:
</view>
<view class="uni-list-box" v-for="(item, index) in list" :key="index" @click="tapQuery(item)">
<view v-if="showMaskType === 'device'">
<view class="uni-list_name">{{ item.name || item.localName }}</view>
<view class="uni-list_item">信号强度:{{ item.RSSI }}dBm</view>
<view class="uni-list_item">UUID:{{ item.deviceId }}</view>
<!-- <view class="list-item" v-if="showMaskType === 'device'">
Service数量:{{ item.advertisServiceUUIDs.length }}
</view> -->
</view>
<view v-if="showMaskType === 'service'">
<view class="uni-list_item" style="line-height:2.2;">
UUID: {{ item.uuid }}
<text v-if="showMaskType === 'service'">
{{ item.isPrimary ? '(主服务)' : '' }}
</text>
</view>
</view>
<view v-if="showMaskType === 'characteristics'">
<view class="uni-list_name">uuid:{{ item.uuid }}</view>
<view class="uni-list_item">是否支持 read 操作:{{ item.properties.read }}</view>
<view class="uni-list_item">
是否支持 write 操作:{{ item.properties.write }}
</view>
<view class="uni-list_item">
是否支持 notify 操作:{{ item.properties.notify }}
</view>
<view class="uni-list_item">
是否支持 indicate 操作:{{ item.properties.indicate }}
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
title: 'bluetooth',
disabled: [false, true, true, true, true, true, true, true, true, true, true],
newDeviceLoad: false,
searchLoad: false,
maskShow: false,
equipment: [],
adapterState: {
discovering: false,
available: false
},
connected: false,
showMaskType: 'device',
servicesData: [],
characteristicsData: [],
valueChangeData: {},
isStop: true,
list: [],
cmd: "66" //zzz
};
},
onLoad() {
this.onBLEConnectionStateChange();
},
methods: {
moveHandle() {},
/**

  • 关闭遮罩
    */
    maskclose() {
    this.maskShow = false;
    },
    /**
  • 选择设备
    */
    queryDevices() {
    // this.newDeviceLoad = true;
    this.showMaskType = 'device';
    this.maskShow = true;
    },
    tapQuery(item) {
    if (this.showMaskType === 'device') {
    this.$set(this.disabled, 4, false);
    if (this.equipment.length > 0) {
    this.equipment[0] = item;
    } else {
    this.equipment.push(item);
    }
    this.newDeviceLoad = false;
    }
    if (this.showMaskType === 'service') {
    this.$set(this.disabled, 6, false);
    if (this.servicesData.length > 0) {
    this.servicesData[0] = item;
    } else {
    this.servicesData.push(item);
    }
    }
    if (this.showMaskType === 'characteristics') {
    //zzz this.$set(this.disabled, 7, false);
    if (this.characteristicsData.length > 0) {
    this.characteristicsData[0] = item;
    } else {
    this.characteristicsData.push(item);
    }
    //zzz
    if (this.characteristicsData[0].properties.read === true) {
    this.$set(this.disabled, 7, false);
    } else {
    this.$set(this.disabled, 7, true);
    }
    if (this.characteristicsData[0].properties.write === true) {
    this.$set(this.disabled, 8, false);
    } else {
    this.$set(this.disabled, 8, true);
    }

            }  
            this.maskShow = false;  
        },  
        /**  
  • 初始化蓝牙设备
    */
    openBluetoothAdapter() {
    uni.openBluetoothAdapter({
    success: e => {
    console.log('初始化蓝牙成功:' + e.errMsg);
    console.log(JSON.stringify(e));
    this.isStop = false;
    this.$set(this.disabled, 0, true);
    this.$set(this.disabled, 1, false);
    this.$set(this.disabled, 10, false);
    this.getBluetoothAdapterState();
    },
    fail: e => {
    console.log(e)
    console.log('初始化蓝牙失败,错误码:' + (e.errCode || e.errMsg));
    if (e.errCode !== 0) {
    initTypes(e.errCode, e.errMsg);
    }
    }
    });
    },
    /**
  • 开始搜索蓝牙设备
    */
    startBluetoothDevicesDiscovery() {
    uni.startBluetoothDevicesDiscovery({
    success: e => {
    console.log('开始搜索蓝牙设备:' + e.errMsg);
    this.searchLoad = true;
    this.$set(this.disabled, 1, true);
    this.$set(this.disabled, 2, false);
    this.$set(this.disabled, 3, false);
    this.onBluetoothDeviceFound();
    },
    fail: e => {
    console.log('搜索蓝牙设备失败,错误码:' + e.errCode);
    if (e.errCode !== 0) {
    initTypes(e.errCode);
    }
    }
    });
    },
    /**
  • 停止搜索蓝牙设备
    */
    stopBluetoothDevicesDiscovery(types) {
    uni.stopBluetoothDevicesDiscovery({
    success: e => {
    console.log('停止搜索蓝牙设备:' + e.errMsg);
    if (types) {
    this.$set(this.disabled, 1, true);
    } else {
    this.$set(this.disabled, 1, false);
    }
    this.$set(this.disabled, 2, true);
    // this.$set(this.disabled, 3, true);
    this.searchLoad = false;
    },
    fail: e => {
    console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode);
    if (e.errCode !== 0) {
    initTypes(e.errCode);
    }
    }
    });
    },
    /**
  • 发现外围设备
    */
    onBluetoothDeviceFound() {
    uni.onBluetoothDeviceFound(devices => {
    console.log('开始监听寻找到新设备的事件');
    // this.$set(this.disabled, 3, false);
    this.getBluetoothDevices();
    });
    },
    /**
  • 获取在蓝牙模块生效期间所有已发现的蓝牙设备。包括已经和本机处于连接状态的设备。
    */
    getBluetoothDevices() {
    uni.getBluetoothDevices({
    success: res => {
    this.newDeviceLoad = false;
    console.log('获取蓝牙设备成功:' + res.errMsg);
    // console.log(JSON.stringify(res))
    this.list = res.devices;
    },
    fail: e => {
    console.log('获取蓝牙设备错误,错误码:' + e.errCode);
    if (e.errCode !== 0) {
    initTypes(e.errCode);
    }
    }
    });
    },
    /**
  • 获取本机蓝牙适配器状态
    */
    getBluetoothAdapterState() {
    console.log('--->');
    uni.getBluetoothAdapterState({
    success: res => {
    console.log(JSON.stringify(res));
    this.adapterState = res;
    },
    fail: e => {
    console.log('获取本机蓝牙适配器状态失败,错误码:' + e.errCode);
    if (e.errCode !== 0) {
    initTypes(e.errCode);
    }
    }
    });
    },
    /**
  • 连接低功耗蓝牙
    */
    createBLEConnection() {
    let deviceId = this.equipment[0].deviceId;
    uni.showToast({
    title: '连接蓝牙...',
    icon: 'loading',
    duration: 99999
    });
    uni.createBLEConnection({
    // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
    deviceId,
    success: res => {
    console.log(res);
    console.log('连接蓝牙成功:' + res.errMsg);
    // 连接设备后断开搜索 并且不能搜索设备
    this.stopBluetoothDevicesDiscovery(true);
    uni.hideToast();
    uni.showToast({
    title: '连接成功',
    icon: 'success',
    duration: 2000
    });
    this.$set(this.disabled, 3, true);
    this.$set(this.disabled, 4, true);
    this.$set(this.disabled, 5, false);
    this.$set(this.disabled, 9, false);
    this.connected = true;
    },
    fail: e => {
    console.log('连接低功耗蓝牙失败,错误码:' + e.errCode);
    if (e.errCode !== 0) {
    initTypes(e.errCode);
    }
    }
    });
    },
    /**
  • 断开与低功耗蓝牙设备的连接
    */
    closeBLEConnection() {
    let deviceId = this.equipment[0].deviceId;
    uni.closeBLEConnection({
    deviceId,
    success: res => {
    console.log(res);
    console.log('断开低功耗蓝牙成功:' + res.errMsg);
    this.$set(this.disabled, 1, false);
    this.$set(this.disabled, 3, true);
    this.$set(this.disabled, 4, true);
    this.$set(this.disabled, 5, true);
    this.$set(this.disabled, 6, true);
    this.$set(this.disabled, 7, true);
    this.$set(this.disabled, 8, true);
    this.$set(this.disabled, 9, true);
    this.equipment = [];
    this.servicesData = [];
    this.characteristicsData = [];
    },
    fail: e => {
    console.log('断开低功耗蓝牙成功,错误码:' + e.errCode);
    if (e.errCode !== 0) {
    initTypes(e.errCode);
    }
    }
    });
    },
    /**
  • 获取所有服务
    */
    getBLEDeviceServices() {
    let deviceId = this.equipment[0].deviceId;
    console.log('获取所有服务的 uuid:' + deviceId);

            uni.getBLEDeviceServices({  
                // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接  
                deviceId,  
                success: res => {  
                    console.log(JSON.stringify(res.services));  
                    console.log('获取设备服务成功:' + res.errMsg);  
                    this.$set(this.disabled, 7, true);  
                    this.$set(this.disabled, 8, true);  
                    this.showMaskType = 'service';  
                    this.list = res.services;  
    
                    this.characteristicsData = [];  
                    if (this.list.length <= 0) {  
                        toast('获取服务失败,请重试!');  
                        return;  
                    }  
                    this.maskShow = true;  
                },  
                fail: e => {  
                    console.log('获取设备服务失败,错误码:' + e.errCode);  
                    if (e.errCode !== 0) {  
                        initTypes(e.errCode);  
                    }  
                }  
            });  
        },  
        /**  
  • 获取某个服务下的所有特征值
    */
    getBLEDeviceCharacteristics() {
    let deviceId = this.equipment[0].deviceId;
    let serviceId = this.servicesData[0].uuid;
    console.log(deviceId);
    console.log(serviceId);
    uni.getBLEDeviceCharacteristics({
    // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
    deviceId,
    // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
    serviceId,
    success: res => {
    console.log(JSON.stringify(res));
    console.log('获取特征值成功:' + res.errMsg);
    this.$set(this.disabled, 7, true);
    //zzz
    this.$set(this.disabled, 8, true);

                    this.valueChangeData = {};  
                    this.showMaskType = 'characteristics';  
                    this.list = res.characteristics;  
                    if (this.list.length <= 0) {  
                        toast('获取特征值失败,请重试!');  
                        return;  
                    }  
                    this.maskShow = true;  
                },  
                fail: e => {  
                    console.log('获取特征值失败,错误码:' + e.errCode);  
                    if (e.errCode !== 0) {  
                        initTypes(e.errCode);  
                    }  
                }  
            });  
        },  
        //zzz  
        /**  
  • 写入控制命令
  • writeCode 写入的控制命令
    */
    writeBLECharacteristicValue(writeCode) {
    // let deviceId = this.deviceId;
    // let serviceId = this.serviceId;
    // let characteristicId = this.writeId;
    let deviceId = this.equipment[0].deviceId;
    let serviceId = this.servicesData[0].uuid;
    let characteristicId = this.characteristicsData[0].uuid;

            //因为协议文档中,一个字节两个字符的控制命令,codeLength为命令字节数  
            let codeLength = writeCode.length / 2;  
            const buffer = new ArrayBuffer(codeLength);  
            const dataView = new DataView(buffer)  
    
            //在这里解析将要写入的值  
            for (let i = 0; i < codeLength; i++) {  
                dataView.setUint8(i, '0X' + writeCode.substring(i * 2, i * 2 + 2));  
                console.log("次数:" + i + "-----" + writeCode.substring(2 * i, 2 * i + 2));  
            }  
    
            console.log("写入数据中deviceId:" + deviceId);  
            console.log("写入数据中serviceId:" + serviceId);  
            console.log("写入数据中characteristicId:" + characteristicId);  
            console.log("分割线************************************");  
    
            console.log("发送的数据:")  
            for (let i = 0; i < dataView.byteLength; i++) {  
                console.log("0x" + dataView.getUint8(i).toString(16))  
            }  
    
            uni.writeBLECharacteristicValue({  
                // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取  
                deviceId,  
                // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取  
                serviceId,  
                // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取  
                characteristicId,  
                // 这里的value是ArrayBuffer类型  
                value: buffer,  
                success(res) {  
                    console.log('writeBLECharacteristicValue success', res.errMsg)  
                    console.log('writeBLECharacteristicValue success', JSON.stringify(res))  
                    //this.notifyCharacteristicValueChange();  
                },  
                fail(res) {  
                    console.log("写入数据失败", res.errMsg)  
                }  
            });  
        },  
    
        /**  
  • 监听低功耗蓝牙连接状态的改变事件。包括开发者主动连接或断开连接,设备丢失,连接异常断开等等
    */
    onBLEConnectionStateChange() {
    uni.onBLEConnectionStateChange(res => {
    // 该方法回调中可以用于处理连接意外断开等异常情况
    console.log(蓝牙连接状态 -------------------------->);
    console.log(JSON.stringify(res));
    if (!res.connected) {
    if (this.isStop) return;
    console.log('断开低功耗蓝牙成功:');
    this.$set(this.disabled, 1, false);
    this.$set(this.disabled, 3, true);
    this.$set(this.disabled, 4, true);
    this.$set(this.disabled, 5, true);
    this.$set(this.disabled, 6, true);
    this.$set(this.disabled, 7, true);
    this.$set(this.disabled, 8, true);
    this.$set(this.disabled, 9, true);
    this.searchLoad = false;
    this.equipment = [];
    this.servicesData = [];
    this.characteristicsData = [];
    this.valueChangeData = {};
    toast('已经断开当前蓝牙连接');
    }
    });
    },
    /**
  • 读取低功耗蓝牙设备的特征值的二进制数据值。注意:必须设备的特征值支持 read 才可以成功调用
    */
    readBLECharacteristicValue() {
    let deviceId = this.equipment[0].deviceId;
    let serviceId = this.servicesData[0].uuid;
    let characteristicId = this.characteristicsData[0].uuid;
    console.log(deviceId);
    console.log(serviceId);
    console.log(characteristicId);
    uni.readBLECharacteristicValue({
    // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
    deviceId,
    // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
    serviceId,
    // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
    characteristicId,
    success: res => {
    console.log('读取设备数据值成功');
    console.log(JSON.stringify(res));
    this.notifyBLECharacteristicValueChange();
    },
    fail(e) {
    console.log('读取设备数据值失败,错误码:' + e.errCode);
    if (e.errCode !== 0) {
    initTypes(e.errCode);
    }
    }
    });
    this.onBLECharacteristicValueChange();
    },
    //zzz
    ab2hex(buffer) {
    const hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function(bit) {
    return ('00' + bit.toString(16)).slice(-2)
    }
    )
    return hexArr.join('')
    },
    doWR(){
    this.writeBLECharacteristicValue(this.cmd);
    this.readBLECharacteristicValue();
    },
    /**
  • 监听低功耗蓝牙设备的特征值变化事件。必须先启用 notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification。
    */
    onBLECharacteristicValueChange() {
    // 必须在这里的回调才能获取
    uni.onBLECharacteristicValueChange(characteristic => {
    console.log('监听低功耗蓝牙设备的特征值变化事件成功');
    console.log(JSON.stringify(characteristic));
    this.valueChangeData = characteristic;
    //zzzz this.valueChangeData.value = ab2hex(characteristic.value);
    });
    },

        /**  
  • 订阅操作成功后需要设备主动更新特征值的 value,才会触发 uni.onBLECharacteristicValueChange 回调。
    */
    notifyBLECharacteristicValueChange() {
    let deviceId = this.equipment[0].deviceId;
    let serviceId = this.servicesData[0].uuid;
    let characteristicId = this.characteristicsData[0].uuid;
    let notify = this.characteristicsData[0].properties.notify;
    console.log(deviceId);
    console.log(serviceId);
    console.log(characteristicId);
    console.log(notify);
    uni.notifyBLECharacteristicValueChange({
    state: true, // 启用 notify 功能
    // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
    deviceId,
    // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
    serviceId,
    // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
    characteristicId,
    success(res) {
    console.log('notifyBLECharacteristicValueChange success:' + res.errMsg);
    console.log(JSON.stringify(res));
    }
    });
    },
    /**
  • 断开蓝牙模块
    */
    closeBluetoothAdapter(OBJECT) {
    uni.closeBluetoothAdapter({
    success: res => {
    console.log('断开蓝牙模块成功');
    this.isStop = true;
    this.$set(this.disabled, 0, false);
    this.$set(this.disabled, 1, true);
    this.$set(this.disabled, 2, true);
    this.$set(this.disabled, 3, true);
    this.$set(this.disabled, 4, true);
    this.$set(this.disabled, 5, true);
    this.$set(this.disabled, 6, true);
    this.$set(this.disabled, 7, true);
    this.$set(this.disabled, 8, true);
    this.$set(this.disabled, 9, true);
    this.$set(this.disabled, 10, true);
    this.equipment = [];
    this.servicesData = [];
    this.characteristicsData = [];
    this.valueChangeData = {};
    this.adapterState = [];
    this.searchLoad = false;
    toast('断开蓝牙模块');
    }
    });
    }
    }
    };

    /**

    • 判断初始化蓝牙状态
      */
      function initTypes(code, errMsg) {
      switch (code) {
      case 10000:
      toast('未初始化蓝牙适配器');
      break;
      case 10001:
      toast('未检测到蓝牙,请打开蓝牙重试!');
      break;
      case 10002:
      toast('没有找到指定设备');
      break;
      case 10003:
      toast('连接失败');
      break;
      case 10004:
      toast('没有找到指定服务');
      break;
      case 10005:
      toast('没有找到指定特征值');
      break;
      case 10006:
      toast('当前连接已断开');
      break;
      case 10007:
      toast('当前特征值不支持此操作');
      break;
      case 10008:
      toast('其余所有系统上报的异常');
      break;
      case 10009:
      toast('Android 系统特有,系统版本低于 4.3 不支持 BLE');
      break;
      default:
      toast(errMsg);
      }
      }

    /**

    • 弹出框封装
      */
      function toast(content, showCancel = false) {
      uni.showModal({
      title: '提示',
      content,
      showCancel
      });
      }
      </script>

<style>
.uni-title {
width: 100%;
height: 20upx;
text-align: center;
}

.uni-mask {  
    position: fixed;  
    top: 0;  
    left: 0;  
    bottom: 0;  
    display: flex;  
    align-items: center;  
    width: 100%;  
    background: rgba(0, 0, 0, 0.6);  
    padding: 0 30upx;  
    box-sizing: border-box;  
}  

.uni-scroll_box {  
    height: 70%;  
    background: #fff;  
    border-radius: 20upx;  
}  

.uni-list-box {  
    margin: 0 20upx;  
    padding: 15upx 0;  
    border-bottom: 1px #f5f5f5 solid;  
    box-sizing: border-box;  
}  

.uni-list:last-child {  
    border: none;  
}  

.uni-list_name {  
    font-size: 30upx;  
    color: #333;  
}  

.uni-list_item {  
    font-size: 24upx;  
    color: #555;  
    line-height: 1.5;  
}  

.uni-success_box {  
    position: absolute;  
    left: 0;  
    bottom: 0;  
    min-height: 100upx;  
    width: 100%;  
    background: #fff;  
    box-sizing: border-box;  
    border-top: 1px #eee solid;  
}  

.uni-success_sub {  
    /* width: 100%%; */  
    height: 100upx;  
    display: flex;  
    justify-content: space-between;  
    align-items: center;  
    padding: 0 30upx;  
}  

.uni-close_button {  
    padding: 0 20upx;  
    height: 60upx;  
    line-height: 60upx;  
    background: #ce3c39;  
    color: #ffffff;  
    border-radius: 10upx;  
}  

.uni-success_content {  
    height: 600upx;  
    margin: 30upx;  
    margin-top: 0;  
    border: 1px #eee solid;  
    padding: 30upx;  
}  

.uni-content_list {  
    padding-bottom: 10upx;  
    border-bottom: 1px #f5f5f5 solid;  
}  

.uni-tips {  
    text-align: center;  
    font-size: 24upx;  
    color: #666;  
}  

</style>

···

联系方式

[QQ] 419423189

2020-03-06 16:46 负责人:无 分享
已邀请:
CLP

CLP

提供demo看,这谁看的清楚

  • wxzhuhua (作者)

    你好,不知情况怎样?

    2020-03-09 14:05

  • CLP

    回复 wxzhuhua: 已经转给安卓的同事

    2020-03-09 15:45

  • wxzhuhua (作者)

    回复 CLP: 好的,谢谢!

    2020-03-09 21:10

  • wxzhuhua (作者)

    回复 CLP: 等了3天了,不知贵同事怎么说?

    2020-03-13 09:41

wxzhuhua

wxzhuhua (作者) - 60后闷骚男

已将项目目录打包上传,请看附件。

y***@hotmail.com

y***@hotmail.com

我也碰到了这个问题,uni.notifyBLECharacteristicValueChange 中的函数完全不会执行啊

7***@qq.com

7***@qq.com

楼主解决这个问题了吗

北斗星辰

北斗星辰

楼主有空回复一下啊,解决了吗?

要回复问题请先登录注册