收藏
回答

BLE下ISO下关于发字节长度问题,怪异 显示发送成功,实则失败现象

框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本
小程序 需求 writeBLECharacteristicValue 客户端 iOS 6.7.1321 2.2.1

大佬帮看看,效果已下面有图...安卓一切正常的说,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 == ) {

console.log( "设备数为0" )

clearInterval(delayTimer)

return ;

}

for let i = ; 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[ ].localName)

console.log(res.devices[ ].advertisServiceUUIDs[ ])

if (!that.data.android) {

if (res.devices[ ].localName == localName) {

exist = true ;

deviceId = res.devices[ ].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 = ; i < res.services.length; i++) {

// if (res.services[i].isPrimary) {

if (res.services[i].uuid.toUpperCase().indexOf( "0000110" ) != - ) {

// //蓝牙设备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 = ; 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 = ; i < arr.length; i++) {

if (arr[i][key] === val) {

return i;

}

}

return ;

}

// 十六进制字符串===>ArrayBuffer

function hexStringToArrayBuffer(str) {

if (!str) {

return new ArrayBuffer( );

}

var buffer = new ArrayBuffer(str.length); //创建str.length字节的内存

let dataView = new DataView(buffer)

let ind = ;

for var i = , len = str.length; i < len; i += ) {

//parseInt()将str 转换成 16进制 数值

//substr()在字符串中抽取从 start 下标开始的指定数目的字符,

//var str="ABCDCF"

//document.write(str.substr(2,4))

//==>CDCF

let code = parseInt(str.substr(i, ), 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(- )

}

)

return hexArr.join( '' );

}

//去年空格

function Trim(sText) {

return sText.replace( new RegExp( "(^[\\s]*)|([\\s]*$)" "g" ), "" );

}

第一次

 
第二次:


回答关注问题邀请回答
收藏

2 个回答

  • 如果没如果
    如果没如果
    2018-08-20

    我也遇到这个问题,在ios设备下,wx.writeBLECharacteristicValue这个方法,已经success了,但是

    onBLECharacteristicValueChange没有接收到任何值;同样代码,安卓是可以正常监听到特征值数据变化的,求解答哈


    2018-08-20
    有用
    回复
  • 王翊夫if
    王翊夫if
    2018-08-14

    iOS 在低功耗蓝牙传输中的 MTU 一般是 20 bytes,超出该限制蓝牙设备会拒绝写入的数据。iOS 目前不支持与设备约定 MTU 的大小。

    可以确认下设备用于写入的特征值属性是否为 writeWithoutResponse ,如果是该属性,小程序在执行完 write 操作后会直接返回 success。

    2018-08-14
    有用
    回复 2
    • 如果没如果
      如果没如果
      2018-08-20

      我也遇到这个问题,在ios设备下,wx.writeBLECharacteristicValue这个方法,已经success了,但是

      onBLECharacteristicValueChange没有接收到任何值;同样代码,安卓是可以正常监听到特征值数据变化的,求解答哈


      2018-08-20
      回复
    • 思情话意
      思情话意
      2018-08-24回复如果没如果

      我也不清楚啊

      2018-08-24
      回复
登录 后发表内容