大佬帮看看,效果已下面有图...安卓一切正常的说,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" ), "" );
}
第一次
第二次:
我也遇到这个问题,在ios设备下,wx.writeBLECharacteristicValue这个方法,已经success了,但是
onBLECharacteristicValueChange没有接收到任何值;同样代码,安卓是可以正常监听到特征值数据变化的,求解答哈
iOS 在低功耗蓝牙传输中的 MTU 一般是 20 bytes,超出该限制蓝牙设备会拒绝写入的数据。iOS 目前不支持与设备约定 MTU 的大小。
可以确认下设备用于写入的特征值属性是否为 writeWithoutResponse ,如果是该属性,小程序在执行完 write 操作后会直接返回 success。
我也遇到这个问题,在ios设备下,wx.writeBLECharacteristicValue这个方法,已经success了,但是
onBLECharacteristicValueChange没有接收到任何值;同样代码,安卓是可以正常监听到特征值数据变化的,求解答哈
我也不清楚啊