uniapp 通过蓝牙连接设备并发送命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uniapp 通过蓝牙连接设备并发送命令相关的知识,希望对你有一定的参考价值。

参考技术A openBluetoothAdapter()

uni.openBluetoothAdapter(

success: e =>

// console.log('初始化蓝牙成功:' + e.errMsg);

this.onBluetoothDeviceFound()

uni.getBluetoothAdapterState(

success: function(res)

// 初始化完毕开始搜索

if (res.available)

if (res.discovering)

// console.log('停止连接');

this.closeBluetooth()



uni.startBluetoothDevicesDiscovery(

success: res =>

,

fail: res =>

onsole.log("查找设备失败!");

uni.showToast(

icon: "none",

title: "查找设备失败!",

duration: 3000,

)



)

else

console.log('本机蓝牙不可用')





)

,

fail: e =>

if (e.errCode == 10001)

uni.showModal(

title: "提示",

content: "您的蓝牙没有打开,请打开蓝牙",

success: function(res)

if (res.confirm == true)

if (uni.getSystemInfoSync().platform == 'ios')

else if (uni.getSystemInfoSync().platform === 'android')



else

uni.navigateBack(

url: '../../detail3/detail3'

)



,

);



console.log('初始化蓝牙失败,错误码:' + (e.errCode || e.errMsg));



);

,

onBluetoothDeviceFound()

// console.log("监听寻找新设备");

uni.onBluetoothDeviceFound(devices =>

// console.log('开始监听寻找到新设备的事件');

// console.log(devices.length);

this.getBluetoothDevices();

);

,

getBluetoothDevices()

// console.log("获取蓝牙设备");

uni.getBluetoothDevices(

success: res =>

// console.log('获取蓝牙设备');

this.resdic = res

// console.log(res)

// console.log('devices.length===='+this.resdic.devices.length);

for (let i = 0; i < this.resdic.devices.length; i++)

let devicesDic = this.resdic.devices[i];

if (devicesDic.name && devicesDic.name == '<Dobiy>' && devicesDic.advertisServiceUUIDs)

this.deviceIdStr = devicesDic.deviceId

this.stopBluetooth()

this.createBLEConnection(devicesDic.deviceId)







);

,

createBLEConnection(deviceIds)

console.log("连接蓝牙---------------" + deviceIds)

// setTimeout(function()

//    that.closeBLEConnection();

//    that.createBLEConnection(deviceIds)

// ,5000)

uni.createBLEConnection(

deviceId: deviceIds.toString(),

success: (res) =>

console.log('蓝牙连接成功');

// this.getBLEDeviceServices(deviceIds)

this.stopBluetooth()

var that = this

uni.getSystemInfo(

success(res)

if (res.platform == 'ios')

setTimeout(() =>

that.getBLEDeviceServices(deviceIds)

, 2000)

else

setTimeout(() =>

that.nogetBLEDeviceServices(deviceIds)

, 3000)



,

fail(res)

console.log(777777777777777)



)

,

fail: (res) =>

console.log('蓝牙连接失败:' + res.errCode)

that.closeBLEConnection();

that.createBLEConnection(deviceIds)

,

);

,

async getBLEDeviceServices(deviceIds)

var that = this

let deviceServices = await uni.getBLEDeviceServices(

deviceId: deviceIds

)

if (deviceServices[0] == null)

let services = deviceServices[1].services

if (services.length == 0)

setTimeout(() =>

that.getBLEDeviceServices(deviceIds)

, 1500)

else

console.log(services, 88888888888)

for (let i = 0; i < services.length; i++)

let serviceId = services[i].uuid

// console.log('serviceId====' + serviceId);

let characteristicsDic = await uni.getBLEDeviceCharacteristics(

deviceId: deviceIds,

serviceId: serviceId,

)

.then(data =>

// console.log(JSON.stringify(data))

if (data[0] == null)

let characteristicsArr = data[1].characteristics

let properties = characteristicsArr[0].properties

console.log(properties)

if (properties.write == true)

that.serviceIdStr = serviceId;

that.characteristicsIdStr = data[1].characteristics[0].uuid;

that.notifyBLECharacteristicValueChange(that.characteristicsIdStr)

// console.log(deviceIds)

// console.log(that.serviceIdStr)

// console.log(that.characteristicsIdStr)

that.writeBLECharacteristic(deviceIds, serviceId, that.characteristicsIdStr)

else

console.log('不可编辑', data[1].characteristics[0].uuid)





)





else

uni.showModal(

title: "提示",

content: "获取设备服务信息失败,请重新获取",

showCancel: false,

success(res)

uni.navigateBack(

url: '../uploadImg/uploadImg'

)



)



,

nogetBLEDeviceServices(deviceIds)

var that = this

console.log(777777)

uni.getBLEDeviceServices(

deviceId: deviceIds,

success(res)

let services = res.services

console.log(services, 55555)

if (services.length == 0)

setTimeout(() =>

that.nogetBLEDeviceServices(deviceIds)

, 3000)

else

for (let i = 0; i < services.length; i++)

let serviceId = services[i].uuid

//这个比对serviceId,设备厂家会告诉,因为安卓获取特征值都是不可写入的,iOS 的可以写入的,所以安卓直接判断serviceId是不是厂家发的serviceId

if (serviceId == '')

uni.getBLEDeviceCharacteristics(

deviceId: deviceIds,

serviceId: serviceId,

success(result)

let propertiesDic = result.characteristics[0]

console.log(propertiesDic, 55555)

// if (propertiesDic.properties.write == true)

that.serviceIdStr = serviceId;

that.characteristicsIdStr = propertiesDic.uuid;

that.notifyBLECharacteristicValueChange(that.characteristicsIdStr)

setTimeout(() =>

that.writeBLECharacteristic(deviceIds, serviceId, that.characteristicsIdStr)

, 2000)

// else

// console.log('不可编辑', propertiesDic.uuid)

//

,

fail(result)

console.log(result, 2222222)



)







,

fail(res)

console.log(res, 8888888)



)

,

一定要调用这个方法,否则无法监听设备返回的数据,之前一直以为在uni.writeBLECharacteristicValue的回调里能得到返回的值,这个方法没有用,结果试了几天都不行,

notifyBLECharacteristicValueChange(characteristicId)

console.log(characteristicId, 'characteristicId')

uni.notifyBLECharacteristicValueChange(

state: true, // 启用 notify 功能

deviceId: this.deviceIdStr,

serviceId: this.serviceIdStr,

characteristicId: this.characteristicsIdStr,

success: (res) =>

// console.log(res)

// console.log(this.characteristicId)

console.log('notifyBLECharacteristicValueChange success', res)

// that.writeBLECharacteristic(deviceIds, serviceId, that.characteristicsIdStr)             

this.onBLECharacteristicValue()

,

fail: (res) =>

console.log('notifyBLECharacteristicValueChange success2', res.errMsg)



)

,

onBLECharacteristicValue()

var that = this

uni.onBLECharacteristicValueChange(function(res)

// console.log(`characteristic $res.characteristicId has changed, now is $res.value`)

let resultStr = that.bufferString(res.value)

// console.log(resultStr,111)

if (resultStr && resultStr != '')

//resultStr就是设备上返回的数据,根据设备不同,获取的设备格式也就不同,自己筛选吧



)

,

writeBLECharacteristic(deviceId, serviceId, characteristicId)

var that = this

console.log(1111111111)

let sgInt = that.string2buffer('<sAg>')

// console.log(sgInt.byteLength)

uni.writeBLECharacteristicValue(

deviceId: that.deviceIdStr,

serviceId: that.serviceIdStr,

characteristicId: that.characteristicsIdStr,

value: sgInt,

success: function(res)

console.log(typeof(res))

console.log('writeBLECharacteristicValue success', res.errMsg)

// that.closeBluetooth()

,

fail: function(res)

console.log(typeof(res))

console.log('writeBLECharacteristicValue fail==', res.errCode, res.errMsg)



)

,

//字符串转arraybuffer

string2buffer: function(str)

// 首先将字符串转为16进制

let val = ""

for (let i = 0; i < str.length; i++)

if (val === '')

val = str.charCodeAt(i).toString(16)

else

val += ',' + str.charCodeAt(i).toString(16)





// console.log(val)

// 将16进制转化为ArrayBuffer

return new Uint8Array(val.match(/[\da-f]2/gi).map(function(h)

return parseInt(h, 16)

)).buffer

,

//arraybuffer 转字符串

bufferString: function(str)

// 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('')



//16进制

let systemStr = ab2hex(str)

// console.log(hexCharCodeToStr(systemStr),99)

function hexCharCodeToStr(hexCharCodeStr)

var trimedStr = hexCharCodeStr.trim();

var rawStr =

trimedStr.substr(0, 2).toLowerCase() === "0x" ?

trimedStr.substr(2) :

trimedStr;

var len = rawStr.length;

if (len % 2 !== 0)

alert("Illegal Format ASCII Code!");

return "";



var curCharCode;

var resultStr = [];

for (var i = 0; i < len; i = i + 2)

curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value

let str5 = String.fromCharCode(curCharCode)

if (str5.startsWith('\n') == false)

resultStr.push(String.fromCharCode(curCharCode));





return resultStr.join("");



// console.log(hexCharCodeToStr(systemStr),888)

return hexCharCodeToStr(systemStr)

,

//监听低功耗蓝牙连接状态的改变事件

onBLEConnectionStateChange()

uni.onBLEConnectionStateChange(function(res)

if (!res.connected)

// console.log('蓝牙断开链接')

this.closeBluetooth()



)

,

stopBluetooth()

uni.stopBluetoothDevicesDiscovery(

success: e =>

// console.log('停止搜索蓝牙设备:' + e.errMsg);

,

fail: e =>

// console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode);



);

,

//关闭蓝牙模块

closeBluetooth()

uni.closeBluetoothAdapter(

success(res)

console.log(res)



)



,

以上是关于uniapp 通过蓝牙连接设备并发送命令的主要内容,如果未能解决你的问题,请参考以下文章

如何检测我通过蓝牙连接从一台设备发送到另一台设备的消息

uniapp蓝牙连接+打印

C# 在PC上的通过蓝牙(bluetooth)发送数据到手机

手机蓝牙连接其他手机,传输文件时,怎么找到对方设备

从 iPhone 应用程序通过蓝牙传输文件

是否有 AT 命令可以在通过蓝牙连接的两个设备之间引导音频(语音通话)?