Uniapp se conecta al dispositivo mediante Bluetooth y envía comandos.
uni.openBluetoothAdapter({
Éxito: e = & gt{
// console.log('Inicialización de Bluetooth exitosa:'+ e. errmsg);
this.onBluetoothDeviceFound()
uni.getBluetoothAdapterState({
Éxito: función (res) {
//Comenzar a buscar después de la inicialización
If (recursos disponibles) {
if (res.discovering) {
// console.log('Detener conexión. ');
this.closeBluetooth()
}
uni . start descubrimiento de dispositivos bluetooth({
Éxito: res = & gt {
},
Error: res = & gt{
Onsole.log("¡Dispositivo no encontrado!");
uni.showToast({
Icono: "Ninguno",
Título: "¡Dispositivo no encontrado!",
Duración: 3000,
})
}
})
} De lo contrario {
Console.log("Bluetooth no está disponible en esta máquina ”)
}
}
})
},
Error: e = & gt{
if(e . errcode == 10001){
uni.showModal({
Título: "Preguntar",
Contenido : "Tu Bluetooth no está encendido, enciéndelo",
Éxito: función (res) {
if (res.confirm == true) {
if (uni.getSystemInfoSync(). plataforma == 'ios') {
} else if (uni.getSystemInfoSync().
Plataforma === 'android') {
}
}else{
uni.navigateBack({
URL: '. ./../Detalles 3/Detalles 3 '
})
}
},
});
}
Console.log('Error al inicializar Bluetooth, código de error: '+(e . errcode | | e . errmsg)
} p >
});
},
onBluetoothDeviceFound() {
// console.log("Escuchando nuevo dispositivo"); p>
uni . onbluetoothdevicefound(devices = & gt; {
// console.log('Comenzar a escuchar eventos cuando se descubran nuevos dispositivos');
// Controlar Taiwan.log(devices.length);
this .getbluetooth devices();
});
},
getBluetoothDevices () {
// console.log("Obtener dispositivos Bluetooth");
uni.getBluetoothDevices({
Éxito: res = & gt{
// console.log('Obtener dispositivo Bluetooth');
this.resdic = res
// console.log(res)
//console . log(' dispositivos . longitud = = = = '+this . resdic . dispositivos . longitud);
for(set I = 0; i<this . resdic . dispositivos . longitud ; i++) {
Supongamos que dispositivos DIC = this . resdic . dispositivos[I];
if(dispositivos DIC . nombre & amp; & ampdevicesDic.name == ' & lt Dobby& gt'& amp& ampdevices DIC . anuncianteviceuuids){
this . dispositivos DIC id de dispositivo)
}
}
}
});
},<. /p>
createBLEConnection(id de dispositivo){
Console.log("Conectar Bluetooth - "+id de dispositivo)
// setTimeout(function(){
//that . closebleconnection();
//that . createbleconnection(ids de dispositivo)
// },5000)
uni.createBLEConnection ({
deviceId: deviceIds.toString(),
Éxito: (RES) = & gt; {
Console.log("Conexión Bluetooth exitosa" );
//this . getbledeviceservices(ID de dispositivo)
this.stopBluetooth()
Cambiar eso = this
uni.getSystemInfo({
Éxito(res) {
if (res.platform == 'ios') {
setTimeout(()= & gt;{
eso. getBLEDeviceServices(id de dispositivo)
}, 2000)
}si no {
setTimeout(()= & gt;{
eso .nogetBLEDeviceServices(identificación del dispositivo)
}, 3000)
}
},
Error (res) {
console.log(77777777777777)
}
})
},
Error: (res) = >{
Console.log('Error de conexión Bluetooth:'+res.errCode)
that . closebleconnection()
that.createBLEConnection(id del dispositivo)
},
});
},
getBLEDeviceServices asincrónico(id de dispositivo){
Cambiar eso =esto
dejar servicios del dispositivo = esperar uni getbledeviceservices({
DeviceId: deviceid
})
if (deviceServices [0] ] == null) {
let services = servicios del dispositivo[1]. Servicios
if (services.length == 0) {
setTimeout(()= & gt; {
that.getBLEDeviceServices(id de dispositivo) p>
p>
}, 1500)
} De lo contrario, {
console.log(service, 8888888888)
for(Set I = 0; I& ltservice.length; i++) {
Supongamos serviceId = servicios[i]. uuid
//console . log(' id de servicio = = = = '+id de servicio);
dejar caracteres DIC = esperar uni . >DeviceId: ID del dispositivo,
serviceId: serviceId,
})
. Entonces (data = & gt{
//console . log(JSON . stringify(data))
if (data[0] == null) {
Dejar caracteres arr = datos[1]. Características
Dejar propiedades = caracteres arr[0].
Rendimiento
console.log(properties)
if (properties.write == true) {
that.serviceIdStr = serviceId
que .characteristicidstr = data[1]. Características[0]. uuid
ese . notifyblecharacteryvaluechange(ese . caracteristidstr)
// console.log(deviceIds)
//console log(ese . service idstr)<. /p>
//console . log(that . Characteristidstr)
that.writeBLECharacteristic(deviceId, serviceid, that .characteristicIdStr)
}de lo contrario {
p >Console.log('No editable', datos[1].Carácter[0].uuid)
}
}
} )
}
}
} En caso contrario {
uni.showModal({
Título: "Preguntar " ,
Contenido: "Error al obtener información de servicio del dispositivo, consígala nuevamente",
showCancel: false,
Éxito (res) {
uni.navigateBack({
URL: '../upload/upload'
})
}
} )
}
},
nogetBLEDeviceServices(id del dispositivo){
Cambiar eso=esto
console .log(777777)
uni.getBLEDeviceServices({
DeviceId: ID del dispositivo,
Éxito (res) {
Dejar Servicios = Servicios de recursos
console.log(services, 55555)
if (services.length == 0) {
setTimeout(()= & gt ; {
that.nogetBLEDeviceServices(identificación del dispositivo)
}, 3000)
} De lo contrario {
for(set I = 0 ;i<service.length; i++) {
Supongamos serviceId = services[i]. uuid
//Esto compara serviceId, los fabricantes de dispositivos hablarán de ello, debido a las características de Android. El valor no se puede escribir, pero lo que obtiene iOS se puede escribir, por lo que Android determina directamente si el serviceId es el serviceId enviado por el fabricante.
if (serviceId == '') {
uni getbledevicecharacteristics({
DeviceId: ID del dispositivo,
serviceId: serviceId ,
Éxito(resultado){
let propiedades DIC = resultado caracteres[0]
console.log(propertiesDic, 55555)
//if(properties DIC . properties . write == true){
that.serviceIdStr = serviceId
that . Characteristidstr = propiedades DIC ;
ese . notifyblecharacteryvaluechange(ese . caracteristidstr)
setTimeout(()= >{
ese.writeBLECharacteristic(deviceId, serviceid, ese .characteristicIdStr)
}, 2000)
// }Otro{
// console.log('not editable', propertiesDic.uuid)
// }
},
Error (resultado){
console.log(resultado, 2222222)
} p>
})
}
}
}
},
Error (res ) {
console.log(res, 8888888)
}
})
},
Este método debe llamarse De lo contrario, los datos devueltos por el dispositivo no se podrán monitorear. Siempre pensé que podría obtener el valor de retorno en la devolución de llamada de la universidad. valor de carácter grabable. Este método no funcionó, lo intenté durante varios días pero no funcionó.
notifyblecharacteryvaluechange(characteristid){
console.log(CharacteristicId, 'CharacteristicId')
uni . true, //Habilitar la función de notificación.
ID de dispositivo: this.deviceIdStr,
ID de servicio: this.serviceIdStr,
ID de característica: este .characteristidstr,
Éxito: ( RES)= & gt;{
// console.log(res)
//console . log(this . ID de caracter)
console log. ('notifyblecharacteryvaluechange exitoso', res)
//that .writeblecharacterization(id de dispositivo, serviceId, that.characteristicsIdStr)?
this.onBLECharacteristicValue()
},
Error: (res) = >{
console .log(' notifyblecharacteryvaluechange Success. 2 ', res.errMsg)
}
})
},
onBLECharacteristicValue() {
Cambiar eso=this
uni . onblecharacteristicvaluechange(function(RES){
//console . log(` caracterización ${ RES . carácter izid } ha cambiado, ahora es $ { RES . value } `)
let resultStr = that . buffer string(RES . value)
// console.log(resultStr, 111)
if(resultStr & ampresultStr!= '') {
//resultStr son los datos devueltos por el dispositivo. Dependiendo del dispositivo, el formato del dispositivo obtenido también es diferente.
}
})
},
writeBLECharacteristic(deviceId, serviceId, featureId) {
Cambiar that = this
console . log(1111111111)
let sgInt = that . string 2 buffer('<sAg>')
// console. log(sgInt.byteLength)
uni . writeblecharacteryvalue({
deviceId: that.deviceIdStr,
serviceId: that.serviceIdStr,
Id. de característica: that .IdStr de característica,
Valor: sgInt,
Éxito: función (res) {
console.log( Tipo de (res) )
console . log(' writeblecharacteryvalue Success ', res.errMsg)
// that.closeBluetooth()
},
Error: función (res) {
console.log(tipo de(res))
console . log(' writeblecharactervalue fail = = ', res. errCode, res.errMsg )
}
})
},
//Cadena a arraybuffer
string2buffer: función ( str) {
//Primero convierte la cadena a 16 hexadecimales.
Let val = " "
for(let I = 0; i & lt longitud de cadena; i++) {
if (val === ' ' ) {
val = str.charCodeAt(i). toString(16)
}else {
val += ', '+ str.charCodeAt(i). toString(16)
}
}
//Console. log(val)
//Convierte 16 en ArrayBuffer.
Devuelve new uint 8 array(val . match(/[\da-f]{ 2 }/gi).map(function(h) {
Devuelve parseInt(h , 16)
})).Buffer
},
//arraybuffer a cadena
bufferString: función (str ) {
Ejemplo de ArrayBuffer a 16 cadenas de progreso
Función ab2hex(buffer){
const hexArr = array prototipo call(
Función(bit){
return(' 00 '+bit . tostring(16)).
segmento(-2)
}
)
return hexArr.join(' ')
}
//16 hexadecimal
Supongamos systemStr = ab2hex(str)
//console . log(hexCharCodeToStr(systemStr), 99)
Función 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("¡Código ASCII de formato ilegal!");
Return "";
}
var curCharCode
var resultStr =[];
for(var I = 0; i & ltleni = i + 2) {
curCharCode = parse int(raw str . substr(I, 2), 16); // valor del código ASCII
Supongamos str 5 = cadena de charcode(curCharCode)
if(str 5 . comienza con(' \ n ')= = false){
resultstr . push(string . from charcode(curCharCode));
}
}
Devuelve resultadostr . join(" ");
}
//console .log(hexCharCodeToStr(systemStr), 888)
Devuelve hexCharCodeToStr(systemStr)
},
//Monitorear el evento de cambio del estado de la conexión Bluetooth Low Energy.
onBLEConnectionStateChange() {
uni . onbleconnectionstatechange(función(RES){
if (!res.connected) {
/ / console.log('Bluetooth desconectado')
this.closeBluetooth()
}
})
}, p>
Detener Bluetooth(){
uni. Detener el descubrimiento de dispositivos bluetooth({
Éxito: e = & gt{
// console. log('Dejar de buscar dispositivos Bluetooth:'+e . errmsg);
},
Error: e = & gt{
// console. log('No se puede dejar de buscar dispositivos Bluetooth, código de error: '+e . errcode
}
});
}, p>
//Cerrar módulo Bluetooth
closeBluetooth() {
uni.closeBluetoothAdapter({
Éxito(res) {
console.log(res)
}
})
}
},