Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
В проектах компании используется Bluetooth и аппаратная связь.,Приложение находится в разработке,возьми одинВичатМини программаBluetooth-связьdemo,В будущем может появиться проект Вичат Bluetooth.,Впервые делаю это,Столкнулся с 2 подводными камнями:
1. Порядок получения UUID аппаратного сервиса, полученного Android и Apple, различен.
2. Текущая версия «Включить функцию уведомления при изменении характеристического значения маломощных устройств Bluetooth» возвращает ошибку запуска как на тестовых компьютерах Android, так и на Apple. Фактически, она была запущена успешно, и на моей машине она возвращается нормально. Android-телефон коллеги.
index.wxml
<!--index.wxml-->
<view class="content">
<text class="status">состояние адаптера:{
{ status }}</text>
<text class="sousuo">Искать или нет:{
{ sousuo }}</text>
<text class="msg">информация:{
{ msg }} </text>
<text class="msg1">информация:{
{ msg1 }}</text>
<button type="primary" class="button" bindtap="lanya1">1Инициализация адаптера Bluetooth</button>
<button type="primary" class="button" bindtap="lanya2">2Статус адаптации встроенного Bluetooth</button>
<button type="primary" class="button" bindtap="lanya3">3Поиск периферийных устройств</button>
<button type="primary" class="button" bindtap="lanya4">4Получите устройство и подключитесь в списке</button>
<button type="primary" class="button" bindtap="lanya5">5停止Поиск периферийных устройств</button>
<button type="primary" class="button" bindtap="lanya6">6Получить все подключенные устройстваservice</button>
<button type="primary" class="button" bindtap="lanya7">7Получить все подключенные устройства特征值</button>
<button type="primary" class="button" bindtap="lanya8">8发送指定информация</button>
<button type="primary" class="button" bindtap="lanya9">9давать возможность При изменении характеристического значения оборудованияnotify</button>
<button type="primary" class="button" bindtap="lanya10">10接收информация</button>
<view class="section">
<text class="status">接收到информация:{
{ jieshou }}</text>
</view>
<button type="primary" class="button" bindtap="lanya0">0Отключить Bluetooth</button>
</view>
<view class="venues_list">
<block wx:for="{
{devices}}" wx:key="{
{test}}">
<view class="venues_item">
<text class="status">Имя устройства:{
{item.name}}</text>
<text class="status">оборудованиеID:{
{item.deviceId}}</text>
<text class="status">статус соединения:{
{connectedDeviceId == item.deviceId?«Подключено»:"Не подключено"}}</text>
<view class="section">
</view>
<view class="section">
<button type="warn" class="button" id="{
{item.deviceId}}" bindtap="connectTO">соединять</button>
</view>
</view>
</block>
</view>
index.js
//index.js
//Получаем экземпляр приложения
var app = getApp();
Page({
data: {
status: "",
sousuo: "",
connectedDeviceId: "", //UUID подключенного устройства
services: "", // Сервисы для подключенных устройств
characteristics: "", // Значение состояния подключенного устройства
writeServicweId: "", // UUID записываемого сервиса
writeCharacteristicsId: "", // записываемое значение функции uuid
readServicweId: "", // Читаемый сервисный UUID
readCharacteristicsId: "", //Читаемое значение функции uuid
notifyServicweId: "", // UUid службы уведомлений
notifyCharacteristicsId: "", //UUID значения характеристики уведомления
inputValue: "",
characteristics1: "", // Значение состояния подключенного устройства
},
onLoad: function () {
if (wx.openBluetoothAdapter) {
wx.openBluetoothAdapter()
} else {
// Если вы хотите, чтобы пользователи использовали ваш Mini в последней версии клиента программа, вы можете подсказать так
wx.showModal({
title: 'намекать',
content: «Текущая версия Вичата слишком низкая для использования этой функции. Обновите Вичат до последней версии и повторите попытку. '
})
}
},
// Инициализация адаптера Bluetooth
lanya1: function () {
var that = this;
wx.openBluetoothAdapter({
success: function (res) {
that.setData({
msg: "Инициализация адаптера Bluetooth, успех! " + JSON.stringify(res),
})
//Отслеживание состояния адаптера Bluetooth
wx.onBluetoothAdapterStateChange(function (res) {
that.setData({
sousuo: res.discovering ? "Идет поиск." : «Не искал.»,
status: res.available ? "Доступный." : "Нет в наличии.",
})
})
}
})
},
// Статус встроенного адаптера Bluetooth
lanya2: function () {
var that = this;
wx.getBluetoothAdapterState({
success: function (res) {
that.setData({
msg: "Статус встроенного адаптера Bluetooth" + "/" + JSON.stringify(res.errMsg),
sousuo: res.discovering ? "Идет поиск." : «Не искал.»,
status: res.available ? "Доступный." : "Нет в наличии.",
})
//Отслеживание состояния адаптера Bluetooth
wx.onBluetoothAdapterStateChange(function (res) {
that.setData({
sousuo: res.discovering ? "Идет поиск." : «Не искал.»,
status: res.available ? "Доступный." : "Нет в наличии.",
})
})
}
})
},
//Поиск устройств
lanya3: function () {
var that = this;
wx.startBluetoothDevicesDiscovery({
success: function (res) {
that.setData({
msg: «Поиск устройств» + JSON.stringify(res),
})
//Отслеживание состояния адаптера Bluetooth
wx.onBluetoothAdapterStateChange(function (res) {
that.setData({
sousuo: res.discovering ? "Идет поиск." : «Не искал.»,
status: res.available ? "Доступный." : "Нет в наличии.",
})
})
}
})
},
// Получить все обнаруженные устройства
lanya4: function () {
var that = this;
wx.getBluetoothDevices({
success: function (res) {
//Есть ли подключенное устройство
wx.getConnectedBluetoothDevices({
success: function (res) {
console.log(JSON.stringify(res.devices));
that.setData({
connectedDeviceId: res.deviceId
})
}
})
that.setData({
msg: «Поиск устройств» + JSON.stringify(res.devices),
devices: res.devices,
})
//Отслеживание состояния адаптера Bluetooth
wx.onBluetoothAdapterStateChange(function (res) {
that.setData({
sousuo: res.discovering ? "Идет поиск." : «Не искал.»,
status: res.available ? "Доступный." : "Нет в наличии.",
})
})
}
})
},
//Остановим поиск периферийных устройств
lanya5: function () {
var that = this;
wx.stopBluetoothDevicesDiscovery({
success: function (res) {
that.setData({
msg: «Хватит искать периферию» + "/" + JSON.stringify(res.errMsg),
sousuo: res.discovering ? "Идет поиск." : «Не искал.»,
status: res.available ? "Доступный." : "Нет в наличии.",
})
}
})
},
//Подключаем устройство
connectTO: function (e) {
var that = this;
wx.createBLEConnection({
deviceId: e.currentTarget.id,
success: function (res) {
console.log(res.errMsg);
that.setData({
connectedDeviceId: e.currentTarget.id,
msg: «Подключено» + e.currentTarget.id,
msg1: "",
})
},
fail: function () {
console.log("Ошибка вызова");
},
complete: function () {
console.log("Вызов завершен");
}
})
console.log(that.data.connectedDeviceId);
},
// Получите сервисное обслуживание подключенного устройства
lanya6: function () {
var that = this;
wx.getBLEDeviceServices({
// Вот deviceId Нужно быть на высоте getBluetoothDevices или onBluetoothDeviceFound Получено из интерфейса
deviceId: that.data.connectedDeviceId,
success: function (res) {
console.log('device services:', JSON.stringify(res.services));
that.setData({
services: res.services,
msg: JSON.stringify(res.services),
})
}
})
},
//Получаем все значения характеристик подключенного устройства Цикл for не может получить значение
lanya7: function () {
var that = this;
wx.getBLEDeviceCharacteristics({
// Вот deviceId Нужно быть на высоте getBluetoothDevices или onBluetoothDeviceFound Получено из интерфейса
deviceId: that.data.connectedDeviceId,
// Вот serviceId Нужно быть на высоте getBLEDeviceServices Получено из интерфейса
serviceId: that.data.services[0].uuid,
success: function (res) {
for (var i = 0; i < res.characteristics.length; i++) {
if (res.characteristics[i].properties.notify) {
console.log("11111111", that.data.services[0].uuid);
console.log("22222222222222222", res.characteristics[i].uuid);
that.setData({
notifyServicweId: that.data.services[0].uuid,
notifyCharacteristicsId: res.characteristics[i].uuid,
})
}
if (res.characteristics[i].properties.write) {
that.setData({
writeServicweId: that.data.services[0].uuid,
writeCharacteristicsId: res.characteristics[i].uuid,
})
} else if (res.characteristics[i].properties.read) {
that.setData({
readServicweId: that.data.services[0].uuid,
readCharacteristicsId: res.characteristics[i].uuid,
})
}
}
console.log('device getBLEDeviceCharacteristics:', res.characteristics);
that.setData({
msg: JSON.stringify(res.characteristics),
})
},
fail: function () {
console.log("fail");
},
complete: function () {
console.log("complete");
}
})
wx.getBLEDeviceCharacteristics({
// Вот deviceId Нужно быть на высоте getBluetoothDevices или onBluetoothDeviceFound Получено из интерфейса
deviceId: that.data.connectedDeviceId,
// Вот serviceId Нужно быть на высоте getBLEDeviceServices Получено из интерфейса
serviceId: that.data.services[1].uuid,
success: function (res) {
for (var i = 0; i < res.characteristics.length; i++) {
if (res.characteristics[i].properties.notify) {
that.setData({
notifyServicweId: that.data.services[1].uuid,
notifyCharacteristicsId: res.characteristics[i].uuid,
})
}
if (res.characteristics[i].properties.write) {
that.setData({
writeServicweId: that.data.services[1].uuid,
writeCharacteristicsId: res.characteristics[i].uuid,
})
} else if (res.characteristics[i].properties.read) {
that.setData({
readServicweId: that.data.services[1].uuid,
readCharacteristicsId: res.characteristics[i].uuid,
})
}
}
console.log('device getBLEDeviceCharacteristics1:', res.characteristics);
that.setData({
msg1: JSON.stringify(res.characteristics),
})
},
fail: function () {
console.log("fail1");
},
complete: function () {
console.log("complete1");
}
})
},
//Отключаем устройство
lanya0: function () {
var that = this;
wx.closeBLEConnection({
deviceId: that.data.connectedDeviceId,
success: function (res) {
that.setData({
connectedDeviceId: "",
})
}
})
},
//Прослушиваем форму ввода
inputTextchange: function (e) {
this.setData({
inputValue: e.detail.value
})
},
//отправлять
lanya8: function () {
var that = this;
// Вот обратный звонок можно получить write что приводит к изменению собственных значений
wx.onBLECharacteristicValueChange(function (characteristic) {
console.log('characteristic value changed:1', characteristic)
})
var buf = new ArrayBuffer(16)
var dataView = new DataView(buf)
wx.request({
url: **/getEncrypt',
success: function (data) {
var arr = data.data.data.split(",");
console.log(arr);
for (var i = 0; i < arr.length; i++) {
dataView.setInt8(i, arr[i]);
}
console.log('str', buf);
console.log("writeServicweId", that.data.writeServicweId);
console.log("writeCharacteristicsId", that.data.writeCharacteristicsId);
wx.writeBLECharacteristicValue({
// Вот deviceId Нужно быть на высоте getBluetoothDevices или onBluetoothDeviceFound Получено из интерфейса
deviceId: that.data.connectedDeviceId,
// Вот serviceId Нужно быть на высоте getBLEDeviceServices Получено из интерфейса
serviceId: that.data.writeServicweId,
// Вот characteristicId Нужно быть на высоте getBLEDeviceCharacteristics Получено из интерфейса
characteristicId: that.data.writeCharacteristicsId,
// Вотvalue имеет тип ArrayBuffer.
value: buf,
success: function (res) {
console.log('writeBLECharacteristicValue success', res.errMsg)
}
})
}
})
},
//Включаем маломощное устройство Bluetooth при изменении значения характеристики notify Функция
lanya9: function () {
var that = this;
//var notifyServicweId = that.data.notifyServicweId.toUpperCase();
//var notifyCharacteristicsId = that.data.notifyCharacteristicsId.toUpperCase();
//console.log("11111111", notifyServicweId);
//console.log("22222222222222222", notifyCharacteristicsId);
wx.notifyBLECharacteristicValueChange({
state: true, // давать возможность notify Функция
// Вот deviceId Нужно быть на высоте getBluetoothDevices или onBluetoothDeviceFound Получено из интерфейса
deviceId: that.data.connectedDeviceId,
// Вот serviceId Нужно быть на высоте getBLEDeviceServices Получено из интерфейса
serviceId: that.data.notifyServicweId,
// Вот characteristicId Нужно быть на высоте getBLEDeviceCharacteristics Получено из интерфейса
characteristicId: that.data.notifyCharacteristicsId,
success: function (res) {
console.log('notifyBLECharacteristicValueChange success', res.errMsg)
},
fail: function () {
console.log('shibai');
console.log(that.data.notifyServicweId);
console.log(that.data.notifyCharacteristicsId);
},
})
},
// получаем сообщение
lanya10: function () {
var that = this;
// Должно быть получено в обратном вызове Вот
wx.onBLECharacteristicValueChange(function (characteristic) {
let hex = Array.prototype.map.call(new Uint8Array(characteristic.value), x => ('00' + x.toString(16)).slice(-2)).join('');
console.log(hex)
wx.request({
url: '***/getDecrypt',
data: {hexString:hex},
method:"POST",
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success:function(data){
//console.log(data)
var res = data.data.data;
that.setData({
jieshou: res,
})
}
})
})
console.log(that.data.readServicweId);
console.log(that.data.readCharacteristicsId);
wx.readBLECharacteristicValue({
// Вот deviceId Нужно быть на высоте getBluetoothDevices или onBluetoothDeviceFound Получено из интерфейса
deviceId: that.data.connectedDeviceId,
// Вот serviceId Нужно быть на высоте getBLEDeviceServices Получено из интерфейса
serviceId: that.data.readServicweId,
// Вот characteristicId Нужно быть на высоте getBLEDeviceCharacteristics Получено из интерфейса
characteristicId: that.data.readCharacteristicsId,
success: function (res) {
console.log('readBLECharacteristicValue:', res.errMsg);
}
})
},
})
index.wxss
.content {
margin: 0 10px;
}
.status, .sousuo, .msg, .msg1 {
display: block;
line-height: 35px;
margin: 0 10px;
}
.button {
margin: 10px;
}
.sendto {
line-height: 30px;
display: block;
margin: 10px;
}
Шифрование и дешифрование Bluetooth выполняется на стороне сервера.
/**
* Вичат Интерфейс шифрования Bluetooth
*/
public void getEncrypt(){
byte[] bs = new byte[]{25,1,49};
String string = null;
try {
string = AesEntryDetry.encrypt(bs);
} catch (Exception e) {
logger.info("Ошибка шифрования");
}
if(string != null){
setAttr("msg", «Шифрование успешно!»);
setAttr("code", "200");
setAttr("data", string);
}else{
setAttr("msg", «Шифрование не удалось!»);
setAttr("code", "400");
}
renderJson();
}
/**
* Интерфейс дешифрования Вичат Bluetooth
*/
public void getDecrypt(){
String hexString = getPara("hexString");
byte[] bs = AesEntryDetry.hex2Bytes(hexString);
String resString = null;
try {
resString = AesEntryDetry.decrypt(bs);
} catch (Exception e) {
logger.info("Ошибка расшифровки");
}
if(resString != null){
setAttr("msg", «Шифрование успешно!»);
setAttr("code", "200");
setAttr("data", resString);
}else{
setAttr("msg", «Шифрование не удалось!»);
setAttr("code", "400");
}
renderJson();
}
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class AesEntryDetry {
// ключ шифрования , 16 байт это 128 bit
private static final byte[] AES_KEY = { Необходимость унификации с аппаратным обеспечением };
// Метод шифрования
public static String encrypt(byte[] bs) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(AES_KEY, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
if(bs.length < 16){
bs = Arrays.copyOf(bs, 16);
}
byte[] encrypted = cipher.doFinal(bs);
return BytetohexString(encrypted);
}
// Метод расшифровки
public static String decrypt(byte[] bs)throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(AES_KEY, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] decrypted = cipher.doFinal(bs);
return BytetohexString(decrypted);
}
// Массив байтов преобразуется и собирается в строку в соответствии с определенным форматом.
private static String BytetohexString(byte[] b) {
int len = b.length;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < len; i++) {
if (i < len - 1){
sb.append(b[i]);
sb.append(",");
}else{
sb.append(b[i]);
}
}
return sb.toString();
}
public static byte[] hex2Bytes(String src){
byte[] res = new byte[src.length()/2];
char[] chs = src.toCharArray();
int[] b = new int[2];
for(int i=0,c=0; i<chs.length; i+=2,c++){
for(int j=0; j<2; j++){
if(chs[i+j]>='0' && chs[i+j]<='9'){
b[j] = (chs[i+j]-'0');
}else if(chs[i+j]>='A' && chs[i+j]<='F'){
b[j] = (chs[i+j]-'A'+10);
}else if(chs[i+j]>='a' && chs[i+j]<='f'){
b[j] = (chs[i+j]-'a'+10);
}
}
b[0] = (b[0]&0x0f)<<4;
b[1] = (b[1]&0x0f);
res[c] = (byte) (b[0] | b[1]);
}
return res;
}
}
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/133926.html Исходная ссылка: https://javaforall.cn