Апплет WeChat Bluetooth-связь Демо-модуль Bluetooth [просто понять]
Апплет WeChat Bluetooth-связь Демо-модуль Bluetooth [просто понять]

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

В проектах компании используется Bluetooth и аппаратная связь.,Приложение находится в разработке,возьми одинВичатМини программаBluetooth-связьdemo,В будущем может появиться проект Вичат Bluetooth.,Впервые делаю это,Столкнулся с 2 подводными камнями:

1. Порядок получения UUID аппаратного сервиса, полученного Android и Apple, различен.

2. Текущая версия «Включить функцию уведомления при изменении характеристического значения маломощных устройств Bluetooth» возвращает ошибку запуска как на тестовых компьютерах Android, так и на Apple. Фактически, она была запущена успешно, и на моей машине она возвращается нормально. Android-телефон коллеги.

index.wxml

Язык кода:javascript
копировать
<!--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

Язык кода:javascript
копировать
//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

Язык кода:javascript
копировать
.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 выполняется на стороне сервера.

Язык кода:javascript
копировать
/**
	 * Вичат Интерфейс шифрования 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();
	}
Язык кода:javascript
копировать
Язык кода:javascript
копировать
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
Язык кода:javascript
копировать
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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose