【微信小程序】連接藍牙設備

1、檢查小程序是否授權藍牙功能
 initBluetooth() {const that = thiswx.getSetting({success: (res) => {if (res.authSetting.hasOwnProperty('scope.bluetooth')) {//'scope.bluetooth'屬性存在,且為falseif (!res.authSetting['scope.bluetooth']) {wx.showModal({title: '溫馨提示',showCancel: false,content: '獲取藍牙授權失敗,需要手動授權'})} else {that.openBluetooth();}} else {//'scope.bluetooth'屬性不存在,需要授權that.openBluetooth();}}})},
  • wx.getSetting()方法獲取用戶的設置信息
  • res.authSetting 包含 scope.bluetooth 屬性,表示已經獲取到了藍牙權限的設置信息
  • scope.bluetooth 的值為false,即用戶沒有授權藍牙權限,為 true,即用戶已經授權藍牙權限,調用 openBluetooth() 方法打開藍牙功能

打開授權

 openBluetooth() {const that = thiswx.closeBluetoothAdapter({success(res) {wx.openBluetoothAdapter({success: function (res) {/*getBluetoothAdapterState() 獲取本機藍牙適配器狀態,判斷是否可用,available為false則因為用戶沒有開啟系統藍牙*/wx.getBluetoothAdapterState({success: function (res) {that.setData({findBluetoothState: setInterval(() => {if (!that.data.theBluetoothState) {that.initBluetooth()clearInterval(that.data.findTimer)}wx.getBluetoothAdapterState({success: function (res) {if (!res.available) {...}},fail: function (res) {...}})}, 1000)})// res.available==true適配器可用 res.available==false適配器不可用if (res.available) {that.findBluetooth()} else {wx.showModal({title: '溫馨提示',showCancel: false,content: '藍牙設備不可用',success(res) {...}})}},fail: function (res) {wx.showModal({title: '溫馨提示',showCancel: false,content: '藍牙設備不可用',success(res) {if (res.confirm) {wx.hideLoading()}}})}})},fail: function (err) {console.log(err);wx.showModal({title: '溫馨提示',showCancel: false,content: '藍牙初始化失敗,請確認藍牙功能已開啟',success(res) {...}})}})}})},
  • wx.closeBluetoothAdapter() 方法關閉藍牙適配器,在成功關閉藍牙適配器后的回調函數中,調用 wx.openBluetoothAdapter() 方法打開藍牙適配器。先關閉再打開的方式來初始化藍牙功能,確保藍牙適配器工作在一個可靠的狀態下,這種做法可以幫助解決一些潛在的問題,比如之前可能存在的連接問題、緩存狀態或其他異常情況
  • wx.getBluetoothAdapterState() 方法獲取本機藍牙適配器的狀態
  • 藍牙適配器可用(res.available 為 true),則去查找藍牙設備;不可用(res.available 為 false),則給出提示
2、搜索附近藍牙設備并匹配
findBluetooth() {const that = thiswx.startBluetoothDevicesDiscovery({services: [],allowDuplicatesKey: false,success: function () {//獲取藍牙設備輸出信息列表let aaa = setInterval(() => {wx.getBluetoothDevices({success: function (res) {res.devices.forEach(item => {if (item.advertisData !== '') {if (...) {console.log('匹配到設備:deviceName-' + item.deviceName + ',deviceId-' + item.deviceId);that.creatDevice(item.deviceId)clearInterval(aaa)}}})}})}, 1000)},fail: function (err) {wx.showModal({title: '溫馨提示',showCancel: false,content: '搜索藍牙失敗,請檢測手機藍牙,定位功能是否已開啟',success(res) {if (res.confirm) {...}}})}});},
  • wx.startBluetoothDevicesDiscovery() 方法開始搜索附近的藍牙設備
  • setInterval() 方法每隔一段時間執行一次藍牙設備搜索操作,在每次執行時,使用 wx.getBluetoothDevices() 方法獲取附近的藍牙設備列表,根據匹配的條件,找到對應的設備,拿到設備的deviceId去與該設備進行連接,注意及時清理定時器

拓展:

wx.getBluetoothDevices()wx.onBluetoothDeviceFound 是小程序中用于搜索藍牙設備的兩種不同方法,它們有以下區別:

1、wx.getBluetoothDevices

  • 用來主動搜索附近的藍牙設備,調用該方法后會返回附近的藍牙設備列表
  • 是一個一次性的操作,即調用一次就會返回當前時刻附近的藍牙設備列表,之后如果需要重新搜索需要再次調用該方法
  • 適用于需要手動觸發搜索藍牙設備的場景,比如用戶點擊搜索按鈕時

2、wx.onBluetoothDeviceFound

  • 用來監聽附近藍牙設備的發現事件,當有新的藍牙設備被發現時會觸發該事件,從而可以實時獲取附近藍牙設備的信息
  • 是一個被動的操作,即當有新的藍牙設備被發現時,會觸發相應的事件回調函數,無需手動觸發搜索
  • 適用于需要實時監測附近藍牙設備變化的場景,比如展示附近藍牙設備列表并實時更新
3、連接藍牙設備
creatDevice(deviceId) {const that = thiswx.getConnectedBluetoothDevices({services: [this.data.serviceId],success(res) {console.log(res);if (res.devices.length > 0) {that.getServices(deviceId)} else {wx.createBLEConnection({deviceId,success: function (res) {console.log('連接成功輸出信息', res)wx.onBLEConnectionStateChange(function (res) {// 該方法回調中可以用于處理連接意外斷開等異常情況console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)if (!res.connected) {console.log('連接斷開');wx.offBLEConnectionStateChange()clearTimeout(that.data.doLinkAgainTimer)that.setData({doLinkAgainTimer: setTimeout(() => {that.creatDevice(deviceId)}, 200),})}})that.getServices(deviceId)},fail: function (err) {console.log(err, '連接失敗')},})}},fail(err) {console.log(err);}})
},
  • 使用 wx.getConnectedBluetoothDevices() 方法獲取已連接的藍牙設備列表
  • 如果已連接的設備列表中包含了符合特定服務 UUID 的設備,則直接去獲取服務
  • 如果未找到已連接的符合條件的設備,則調用 wx.createBLEConnection() 方法嘗試連接指定的設備
  • 如果連接成功,則會設置一個監聽器 wx.onBLEConnectionStateChange() 來監測藍牙連接狀態的變化。如果連接意外斷開,會在回調函數中重新嘗試連接,并設置一個定時器來控制重新連接的時間間隔。
4、獲取服務和特征值
getServices(deviceId) {const that = thiswx.getBLEDeviceServices({// 這里的 deviceId 需要已經通過 wx.createBLEConnection 與對應設備建立連接deviceId,success(res) {console.log('獲取服務:', res)that.getServicesCharacteristics(deviceId)},fail(err) {console.log('獲取服務失敗:', err);}})
},
getServicesCharacteristics(deviceId) {const that = thiswx.getBLEDeviceCharacteristics({// 這里的 deviceId 需要已經通過 wx.createBLEConnection 與對應設備建立連接deviceId,serviceId: this.data.serviceId,success(res) {console.log('獲取特征值:', res);let characteristics = res.characteristics.find(item => item.properties.notify)that.startNotice(characteristics.uuid)},fail(err) {console.log('獲取特征值失敗:', err);}})},
  • wx.getBLEDeviceServices獲取到服務列表,里面每一條數據代表一個服務,UUID 是用來唯一標識一個藍牙服務的字符串
  • wx.getBLEDeviceCharacteristics獲取該服務的所有特征值列表,用properties來區分,代表該特征值支持的操作類型
5、啟動藍牙服務值變化監聽及監聽特征值變化
startNotice(uuid){var that = this;wx.notifyBLECharacteristicValueChange({state: true, // 啟用 notify 功能deviceId: that.data.deviceid,serviceId: that.data.services,characteristicId: uuid,  //第一步 開啟監聽 notityid  第二步發送指令 writesuccess: function (res) {wx.onBLECharacteristicValueChange(function (res) {}})
},
  • wx.notifyBLECharacteristicValueChang用于啟用藍牙特征值變化通知
  • wx.onBLECharacteristicValueChange用于監聽藍牙設備特征值變化,當特征值發生變化時,會觸發這個函數,并可以在這里獲取變化后的值并進行相應的處理
6、建立長連接

藍牙設備通常需要建立長連接才能進行穩定的數據傳輸和控制。默認情況下,微信小程序與藍牙設備的連接會在一定時間內保持活躍,如果超過一定時間沒有數據交互或者沒有持續發送心跳包等保持連接的機制,連接可能會自動斷開。

獲取隨機數并進行外部認證通常用于建立安全連接

  • 獲取隨機數:設備A生成一個隨機數,并將其發送給設備B
  • 進行外部認證:設備B收到隨機數后,可能會使用預共享密鑰或其他加密算法對隨機數進行處理,然后將處理后的結果發送給設備A
  • 驗證認證結果:設備A收到處理后的結果后,進行驗證以確保通信雙方的身份和通信的完整性

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23642.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 連接 MySQL 及 SQL增刪改查(主要使用sqlalchemy)

目錄 一、環境 二、MySQL的連接和使用 2.1方式一:sql為主 2.1.1創建連接 2.1.2 表結構 2.1.3 新增數據 ?編輯 2.1.4 查看數據 ?編輯 2.1.5 修改數據 2.1.6 刪除數據 2.2方式二:orm對象關系映射 2.2.1 mysql連接 2.2.2 創建表 2.2.3 新增…

windows 安裝pnpm

安裝Node.js: 確保系統上已安裝Node.js。pnpm需要Node.js來運行。如果尚未安裝Node.js,請從其官方網站下載并安裝適用于Windows的最新版本。 安裝pnpm: 打開命令行工具(如CMD、PowerShell或Git Bash)。使用npm&…

解鎖機器學習的無限可能:深入探究scikit-learn的強大功能

解鎖機器學習的無限可能:深入探究scikit-learn的強大功能 第一部分:背景和功能介紹 在數據科學和機器學習領域,scikit-learn(簡稱sklearn)是一個廣泛使用的Python庫。它提供了簡單高效的工具用于數據挖掘和數據分析&a…

【Python短期內快速掌握學習人工智能知識能力】:從零到入門的NLP學習秘籍

??我叫憶_恒心,一名喜歡書寫博客的研究生👨?🎓。 如果覺得本文能幫到您,麻煩點個贊👍唄! 近期會不斷在專欄里進行更新講解博客~~~ 有什么問題的小伙伴 歡迎留言提問歐,喜歡的小伙伴給個三連支…

Echarts 在折線圖的指定位置繪制一個圖標展示

文章目錄 需求分析需求 在線段交匯處用一個六邊形圖標展示 分析 可以使用 markPoint 和 symbol 屬性來實現。這是一個更簡單和更標準的方法來添加標記點在運行下述代碼后,你將在瀏覽器中看到一個折線圖,其中在 [3, 35] (即圖表中第四個數據點 Thu 的 y 值為 35 的位置)處…

Java反射Reflect機制詳解

文章目錄 引言反射的基本概念反射基本原理反射應用場景反射基本使用獲取類的Class對象獲取構造方法并實例化對象獲取和調用方法獲取和修改字段反射工具類 反射源碼解讀獲取Class對象的源碼調用方法的源碼 反射優缺點優點缺點 為什么需要反射總結 引言 Java反射是Java語言中的一…

【干貨】視頻文件抽幀(opencv和ffmpeg方式對比)

1 廢話不多說,直接上代碼 opencv方式 import time import subprocess import cv2, os from math import ceildef extract_frames_opencv(video_path, output_folder, frame_rate1):"""使用 OpenCV 從視頻中抽取每秒指定幀數的幀,并保存到指定文件夾…

linux系統使用達夢數據庫

在Linux系統中使用達夢數據庫,首先需要確保已經正確安裝了達夢數據庫軟件。以下是一個基本的使用示例,假設您已經安裝了達夢數據庫并且配置好了相關環境變量。 連接到數據庫: 使用 dsql 命令連接到數據庫 dsql -h hostname -u username -p…

寶貝,帶上WebAssembly,換個姿勢來優化你的前端應用

在你沒崛起之前,臉是用來丟的 大家好,我是柒八九。一個專注于前端開發技術/Rust及AI應用知識分享的Coder 此篇文章所涉及到的技術有 WebAssemblyRustWeb Worker(comlink)wasm-packPhotonffmpeg.wasm腳手架生成前端項目因為,行文字數所限,有些概念可能會一帶而過亦或者提供對…

BOM是什么東西

BOM(Byte Order Mark,字節順序標記)是一個Unicode字符,通常出現在文本文件的開頭。它的作用包括以下幾個方面: 1. 指示文件的編碼方式 BOM可以幫助軟件識別文本文件使用的字符編碼。不同的編碼方式可能會使用不同的B…

經濟與安全兼顧:茶飲店購買可燃氣體報警器的價格考量

可燃氣體報警器在如今的社會中扮演著至關重要的角色。它們用于檢測環境中的可燃氣體濃度,及早發現潛在的火災隱患,保護人們的生命和財產安全。 在這篇文章中,佰德將介紹可燃氣體報警器的安裝、檢定以及價格,通過實際案例和數據&a…

PCL 生成空間橢圓點云

目錄 一、算法原理二、代碼實現三、結果展示本文由CSDN點云俠原創,原文鏈接。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲。 一、算法原理 設橢圓在 X O Y XOY XOY平面上,參數方程為:

怎么保障TikTok直播網絡穩定?

TikTok,這個近年來風靡全球的社交媒體平臺,已成為電商引流的新方向,尤其是其直播功能。然而,對于打算進軍TikTok直播領域的商家和主播而言,確保網絡穩定無疑是首要任務。那么,TikTok直播專線究竟是什么呢&a…

牛啊后續:如何一行C#代碼實現解析類型的Summary注釋(可用于數據字典快速生成)...

前言:下午有小伙伴要求,讓我繼續做個解析實體類注釋信息的內容。所以我也順便加入進來。以下開始正文實戰操作: 項目需要勾選輸出api文檔文件。這樣就可以讓所有實體類的summary信息被寫入到輸出目錄下。如果有多個xml文件也沒關系&#xff0…

小程序 UI 風格美不勝收

小程序 UI 風格美不勝收 小程序 UI 風格美不勝收

PostgreSQL的視圖pg_stat_replication

PostgreSQL的視圖pg_stat_replication pg_stat_replication 是 PostgreSQL 提供的一個系統視圖,用于顯示主服務器上當前正在進行的復制會話的信息。它可以幫助數據庫管理員監控和管理主從復制的狀態,確保數據的正確同步和高可靠性。 pg_stat_replicati…

MyEclipse中properties文件中文亂碼(Unicode字符)解決辦法

程序代碼園發文地址:MyEclipse中properties文件中文亂碼(Unicode字符)解決辦法-程序代碼園小說,Java,HTML,Java小工具,程序代碼園,http://www.byqws.com/ ,MyEclipse中properties文件中文亂碼(Unicode字符)解決辦法htt…

Django學習三:views業務層中通過models對實體對象進行的增、刪、改、查操作。

文章目錄 前言一、Django ORM介紹二、項目快速搭建三、操作1、view.pya、增加操作b、刪除操作c、修改操作d、查詢操作 2、urls.py 前言 上接博文:Django學習二:配置mysql,創建model實例,自動創建數據庫表,對mysql數據…

一周發文9篇!MIMIC-IV數據庫周報(5.22~5.28)

重癥醫學數據庫(MIMIC)是由計算生理學實驗室開發的公開數據集,其中包括與數千個重癥監護病房入院相關的去識別化健康數據,致力于推動臨床信息學、流行病學和機器學習的研究。 MIMIC數據庫于2003年在美國國立衛生研究院的資助下&am…

2024上海初中生古詩文大會倒計時4個半月:單選題真題示例和獨家解析

現在距離2024年初中生古詩文大會還有4個半月時間,我們來看10道選擇題真題和詳細解析,了解古詩文大會的考察方式和知識點,從而更好地備考。 以下題目截取自我獨家制作的在線真題集,都是來自于歷屆真題,去重、合并后&am…