我也遇到这个问题,在ios设备下,wx.writeBLECharacteristicValue这个方法,已经success了,但是 onBLECharacteristicValueChange没有接收到任何值;同样代码,安卓是可以正常监听到特征值数据变化的,求解答哈
BLE下ISO下关于发字节长度问题,怪异 显示发送成功,实则失败现象大佬帮看看,效果已下面有图...安卓一切正常的说,ios就不清楚什么原因了,连报错都没有给我 /ios下: var test = 12345678123456781234 20个数可以正常发送, // 超出20个数发送失败,奇妙的是 writeBLECharacteristicValue回调函数成功执行表示发送成功,可实际串 //口上没有显示数据,设备也没有返回数据, //已知安卓没有这个情况出现.. 代码 var deviceId = "" ; //mac var localName = "" ; //设备名称 var exist = false ; //ios下,是否找个设备 var result = "" ; //返回的数据 var characteristicId; //蓝牙特征值的 uuid var serviceId; // 蓝牙设备服务的 uuid var rawData = [], delayTimer //停止循环获取tag // **********************~蓝牙开始~*************************** openBluetoothAdapter(e) { var that = this ; deviceId = e.target.dataset.mac; localName = e.target.dataset.localname; // 初始化小程序蓝牙模块 wx.openBluetoothAdapter({ success: (res) => { wx.showLoading({ title: '正在搜索' , icon: "loading" , }) console.log( "蓝牙初始化成功" , res); //如果当前是android,请直接连接低功耗蓝牙设备 if (that.data.android) { that.createBLEConnection(e, deviceId); } else if (!that.data.android) { // IOS,马上开始寻找附近的蓝牙设备 that.startBluetoothDevicesDiscovery(); delayTimer = setInterval( function () { if (exist) { that.createBLEConnection(e, deviceId); } else { wx.getBluetoothDevices({ success: function (res) { console.log( "每1秒取一次当前蓝牙模块生效期间所有已发现的蓝牙设备" ) console.log(res) if (res.devices.length == 0 ) { console.log( "设备数为0" ) clearInterval(delayTimer) return ; } for ( let i = 0 ; i < res.devices.length; i++) { if (res.devices[i].localName == localName) { deviceId = res.devices[i].deviceId; console.log(res.devices[i].locklName) console.log(deviceId) //开始连接 that.createBLEConnection(e, deviceId); //关掉计时器 clearInterval(delayTimer) return ; } } } }) } }, 2000 ) } }, // 初始化失败?提示用户打开蓝牙,并监听蓝牙状态 fail: (res) => { wx.showToast({ title: '请正确蓝牙开启' , icon: 'none' , duration: 2000 }) wx.onBluetoothAdapterStateChange( function (res) { // console.log('onBluetoothAdapterStateChange', res) if (res.available) { // 蓝牙适配器是否可用? // 开始搜寻附近的蓝牙外围设备 that.startBluetoothDevicesDiscovery(); } else if (!res.available) { } }) } }) }, // 获取本机蓝牙适配器状态 getBluetoothAdapterState() { wx.getBluetoothAdapterState({ success: (res) => { //console.log("本机蓝牙适配器状态"); if (res.discovering) { // 是否正在搜索设备 //监听寻找到新设备的事件 that.onBluetoothDeviceFound() } else if (res.available) { // 蓝牙适配器是否可用 // 开始搜寻附近的蓝牙外围设备 that.startBluetoothDevicesDiscovery() } } }) }, //开始搜寻附近的蓝牙外围设备 startBluetoothDevicesDiscovery() { var that = this ; console.log( "开始搜寻附近的蓝牙外围设备" ) // 开始搜寻附近的蓝牙外围设备 wx.startBluetoothDevicesDiscovery({ services: [], //只搜索主服务 UUID 为 ["???] 的设备 allowDuplicatesKey: true , success: (res) => { console.log( "开始搜寻附近的蓝牙外围设备---成功" ) //监听寻找到新设备的事件 that.onBluetoothDeviceFound() wx.getBluetoothDevices({ success: function (res) { console.log( "得到蓝牙信息" ); console.log(res); //是否有已连接设备 wx.getConnectedBluetoothDevices({ success: function (res) { //console.log(JSON.stringify(res.devices)); } }) } }) }, fail: function (err) { console.log( "搜寻附近的蓝牙外围设备" , err) } }) }, //停止搜寻附近的蓝牙外围设备。若已经找到需要的蓝牙设备并不需要继续搜索时,建议调用该接口停止蓝牙搜索。 stopBluetoothDevicesDiscovery() { wx.stopBluetoothDevicesDiscovery() }, //监听寻找到新设备的事件 onBluetoothDeviceFound() { var that = this ; wx.onBluetoothDeviceFound((res) => { // console.log(171, "新设备的事件") res.devices.forEach(device => { console.log(res.devices[ 0 ].localName) console.log(res.devices[ 0 ].advertisServiceUUIDs[ 0 ]) if (!that.data.android) { if (res.devices[ 0 ].localName == localName) { exist = true ; deviceId = res.devices[ 0 ].deviceId; console.log(deviceId) console.log( "找到匹配的设备了" ) //开始连接 //that.createBLEConnection(e, deviceId); //停止搜索 that.stopBluetoothDevicesDiscovery(); //关掉计时器 //clearInterval(delayTimer) return ; } console.log( '新设备' ) console.log(res) } }) }) }, // 断开连接 DisconnectBle: function (deviceId) { wx.closeBLEConnection({ deviceId: deviceId, success: function (res) { console.log( "正常断开" ) } }) }, //连接低功耗蓝牙设备 createBLEConnection(e, deviceId) { var that = this ; console.log( "开始连接" ) //连接低功耗蓝牙设备。 wx.createBLEConnection({ deviceId: deviceId, //android==mac,ios==uuid timeout: 5000 , success: (res) => { console.log( "连接成功" ) //获取蓝牙设备所有 service(服务) that.getBLEDeviceServices(deviceId) //连接成功,停止计时器 clearInterval(delayTimer) exist = false ; // 连接成功, 停止搜索 that.stopBluetoothDevicesDiscovery(); }, fail: function (err) { exist = false ; wx.showToast({ title: '接连失败' , icon: 'none' , duration: 2000 }) // // 断开 // that.DisconnectBle(deviceId); // // 关闭蓝牙 // that.closeBluetoothAdapter(); wx.onBLEConnectionStateChange( function (res) { // 该方法回调中可以用于处理连接意外断开等异常情况 // console.log( `device ${ res.deviceId } state has changed, connected: ${ res.connected }` ) }) } }) }, //获取蓝牙设备所有 service(服务)。 getBLEDeviceServices(deviceId) { var that = this ; wx.getBLEDeviceServices({ deviceId: deviceId, success: (res) => { for ( let i = 0 ; i < res.services.length; i++) { // if (res.services[i].isPrimary) { if (res.services[i].uuid.toUpperCase().indexOf( "0000110" ) != - 1 ) { // //蓝牙设备characteristic(特征值)信息 serviceId = res.services[i].uuid // 蓝牙设备服务的 uuid that.getBLEDeviceCharacteristics(deviceId, serviceId) break ; } } } }) }, //蓝牙设备characteristic(特征值)信息 getBLEDeviceCharacteristics(deviceId, serviceId) { var that = this ; wx.getBLEDeviceCharacteristics({ deviceId: deviceId, serviceId: serviceId, //蓝牙服务 uuid success: (res) => { console.log( '启动获取(特征值)信息' , res.characteristics) for ( let i = 0 ; i < res.characteristics.length; i++) { let item = res.characteristics[i] characteristicId = item.uuid; if (item.properties.notify || item.properties.indicate) { // 启用低功耗蓝牙设备特征值变化时的 notify 功能,须设备的特征值支持notify或者indicate才可以成功调用 wx.notifyBLECharacteristicValueChange({ deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId, state: true , success: function (res) { //// 向蓝牙设备发送一个0x00的16进制数据 setTimeout( function () { that.writeBLECharacteristicValue(deviceId, serviceId, characteristicId); }, 2000 ) }, complete: function () { wx.onBLECharacteristicValueChange( function (characteristic) { console.log( '对比,解密:' ) let buffer = characteristic.value let getData = ab2hex(buffer) console.log(getData) if (getData == '01' ) { // 断开 that.DisconnectBle(deviceId); setTimeout( function () { that.closeBluetoothAdapter(); }, 500 ) } else { //定义设备没找到 } }) } }) } } }, fail(res) { console.error( 'getBLEDeviceCharacteristics' , res) } }) }, // 向蓝牙设备发送一个0x00的16进制数据 writeBLECharacteristicValue(deviceId, serviceId, characteristicId) { var that = this ; // 向蓝牙设备发送一个0x00的16进制数据 var test = '12345678' ; //0x12,0x34 IOS:16(1) 24(2) 22(1 没有返回值) 20(1正常) //ios下: var test = 12345678 123456781234 20个数可以正常发送, // 超出20个数发送失败,奇妙的是 writeBLECharacteristicValue回调函数成功执行表示发送成功,可实际串 //口上没有显示数据,设备也没有返回数据, //已知安卓没有这个情况出现.. let buffer = hexStringToArrayBuffer( test ) console.log( "开始向蓝牙设备发送一个0x00的16进制数据" , buffer) console.log( 'uuid:' , deviceId, ' 蓝牙设备服务的 uuid:' , serviceId, '蓝牙特征值的 uuid:' , characteristicId) //向低功耗蓝牙设备特征值中写入二进制数据。注意:必须设备的特征值支持write wx.writeBLECharacteristicValue({ deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId, value: buffer, success: function (res) { setTimeout( function () { wx.hideLoading() }, 2000 ) console.log(res) console.log( "成功向低功耗蓝牙设备特征值中写入二进制数据" ) }, fail: function (err) { console.log( '写入二进制数据--失败' ) console.log(err.errCode); }, complete: function () { } }) }, onBLEConnectionStateChange() { wx.showToast({ title: '蓝牙正在断开' , icon: 'loading' , duration: 3000 }) }, //关闭蓝牙模块,使其进入未初始化状态 closeBluetoothAdapter() { wx.openBluetoothAdapter({ success: function (res) { wx.closeBluetoothAdapter({ success: function (res) {} }) } }) }, }) function inArray(arr, key, val) { for ( let i = 0 ; i < arr.length; i++) { if (arr[i][key] === val) { return i; } } return - 1 ; } // 十六进制字符串===>ArrayBuffer function hexStringToArrayBuffer(str) { if (!str) { return new ArrayBuffer( 0 ); } var buffer = new ArrayBuffer(str.length); //创建str.length字节的内存 let dataView = new DataView(buffer) let ind = 0 ; for ( var i = 0 , len = str.length; i < len; i += 2 ) { //parseInt()将str 转换成 16进制 数值 //substr()在字符串中抽取从 start 下标开始的指定数目的字符, //var str="ABCDCF" //document.write(str.substr(2,4)) //==>CDCF let code = parseInt(str.substr(i, 2 ), 16 ); // DataView 向内存的位置写入数据 dataView.setUint8(ind, code) ind++ } return buffer; } // ArrayBuffer转16进度字符串示例 function ab2hex(buffer) { var hexArr = Array.prototype.map.call( new Uint8Array(buffer), function (bit) { return ( '00' + bit.toString( 16 )).slice(- 2 ) } ) return hexArr.join( '' ); } //去年空格 function Trim(sText) { return sText.replace( new RegExp( "(^[\\s]*)|([\\s]*$)" , "g" ), "" ); } 第一次 [图片] 第二次: [图片]
2018-08-20就是发现input标签在真机上,设置opacity: 0;属性是不起作用的。电脑上没问题。。测试过的机型有phone8,phoneX, 荣耀V8, 最新的微信版本
微信小程序input的文本框标签,遮罩层无法覆盖文字问题input框上面有个遮罩层,输入内容遮罩层显示的时候,input框里面的文字会显示出来,电脑没问题,真机有问题怎么办
2018-08-01