整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          低功耗藍牙(BLE)和傳感器的使用

          低功耗藍牙(BLE)和傳感器的使用

          、低功耗藍牙的使用

          Android中關(guān)于藍牙的開發(fā)文檔,可以參考Google提供的官方藍牙文檔:https://developer.android.google.cn/guide/topics/connectivity/bluetooth.html

          在Android開發(fā)中,應(yīng)用可通過官方提供的藍牙API執(zhí)行以下操作:

          • 掃描其他藍牙設(shè)備
          • 查詢本地藍牙適配器的配對藍牙設(shè)備
          • 建立 RFCOMM 通道
          • 通過服務(wù)發(fā)現(xiàn)連接到其他設(shè)備
          • 與其他設(shè)備進行雙向數(shù)據(jù)傳輸
          • 管理多個連接

          藍牙

          一個近距離無線通信技術(shù),最早是由愛立信研發(fā)出來。藍牙 Bluetooth 這個詞是一個丹麥的國王的綽號,當(dāng)時研發(fā)它的工程師正在看一個關(guān)于這個國王的書,就起了這個名字。藍牙的技術(shù)特點是:

          • 近距離通信:典型距離是 10 米以內(nèi);
          • 傳輸效率:傳輸速度最高可達 24 Mbps
          • 多連接:藍牙技術(shù)支持多設(shè)備連接、安全性高

          藍牙從被發(fā)明到目前,經(jīng)過了幾個版本的變化:

          • 1.0版本:99年發(fā)布
          • 2.1版本:使用范圍最廣泛,經(jīng)典藍牙
          • 3.0版本:高速藍牙,最高傳輸速度達到24Mbps
          • 4.0/4.1版本:新增低功耗藍牙
          • 5.0版本:物聯(lián)網(wǎng)

          低功耗藍牙

          低功耗藍牙全稱為Bluetooth Low Energy,簡稱為BLE,最大特點就是低功耗,另外低功耗藍牙還具備成本低,連接速度快,安全性高的特點。當(dāng)然,低功耗藍牙也相應(yīng)的會有一些不足,比如說:低功耗對應(yīng)的是低傳輸效率,因此低功耗藍牙主要用來傳輸少量數(shù)據(jù),結(jié)合低功耗的特點,非常適合用在移動智能設(shè)備上。

          低功耗藍牙分為兩種模式:單模和雙模。

          • 單模:只能執(zhí)行低功耗協(xié)議棧,即只支持BLE。
          • 雙模:既支持傳統(tǒng)藍牙又支持BLE藍牙。

          注意:需要在Android 4.3及以上版本才能支持具備低功耗功能的藍牙4.0。

          BLE協(xié)議棧

          首先來看一下使用藍牙的基本流程:

          先簡單來了解一下低功耗藍牙的協(xié)議框架,在BLE協(xié)議棧中,大致分為三個部分,從下到上依次為:控制器(Controller) 、主機(Host)、應(yīng)用(Applications)。

          • 控制器:協(xié)議棧的最底層,直接與硬件相關(guān),由廠商直接實現(xiàn)。
          • 主機:硬件層的抽象層,與具體的硬件和常見無關(guān),可以理解為接口。
          • 應(yīng)用層:使用Host層提供的API,進而開發(fā)的應(yīng)用。

          協(xié)議層從下往上,依次包含如下協(xié)議:

          • Attribute Protocol:簡稱為 ATT,屬性協(xié)議,Host層的一個協(xié)議,是BLE通信的基礎(chǔ)。ATT 把數(shù)據(jù)封裝,向外暴露為“屬性”,提供“屬性”的為服務(wù)端,獲取“屬性”的為客戶端。ATT 是專門為低功耗藍牙設(shè)計的,結(jié)構(gòu)非常簡單,數(shù)據(jù)長度很短。每個屬性都有一個唯一的UUID,屬性以characteristics and services的形式傳輸。
          • Generic Attribute Profile:簡稱為GATT,通用屬性配置文件,建立在前面說的 ATT 的基礎(chǔ)上,對 ATT 進行進一步的邏輯封裝,定義數(shù)據(jù)的交互方式和含義。GATT 按照層級定義了三個概念:
            • Service:服務(wù),一個 Service 包含若干個 Characteristic。
            • Characteristic:特征,一個 Characteristic 可以包含若干 Descriptor。
            • Descriptor:描述,數(shù)據(jù)的讀寫操作。
          • Generic Access Profile:簡稱為GAP,通用訪問控制配置文件,用來控制設(shè)備連接和廣播,GAP使你的設(shè)備被其他設(shè)備可見,并決定了你的設(shè)備是否可以或者怎樣與合同設(shè)備進行交互。

          Android BLE API

          • Android SDK 中 BLE 相關(guān)的 API 都在 android.bluetooth.* 中。
          • 5.0版本中:android.bluetooth.le*

          權(quán)限

          • 要在 APP 中使用藍牙功能,需要在 Manifest 中申請藍牙相關(guān)的權(quán)限。
          • Android 6.0及以上版本:藍牙 + 定位權(quán)限。為什么會有定位權(quán)限?BLE有定位的功能和能力。

          BLE核心API

          • BluetoothManager:藍牙管理服務(wù)。在Android基本框架中可以發(fā)現(xiàn)藍牙屬于最底層的驅(qū)動模塊中,可以公國context.getSystemService(Context.BLUETOOTH_SERVICE) 來進行獲取。
          • BluetoothAdapter:本地設(shè)備藍牙適配器。BluetoothAdapter可以完成:啟動設(shè)備發(fā)現(xiàn),查詢已綁定(配對)設(shè)備的列表,使用已知MAC地址實例化 BluetoothDevice,并創(chuàng)建一個 BluetoothServerSocket 以監(jiān)聽來自其他設(shè)備的連接請求,并啟動掃描藍牙LE設(shè)備等操作,該類屬于核心中的核心。
          • BluetoothAdapter.LeScanCallback:BLE掃描結(jié)果回調(diào)接口,在 Android 5.0以上 使用抽象類 ScanCallback。
          • BluetoothLeScanner:藍牙LE設(shè)備執(zhí)行掃描相關(guān)操作類,使用該API要求Android 5.0(API21)以上。
          • BluetoothDevice:遠程藍牙設(shè)備,BluetoothDevice允許創(chuàng)建與相應(yīng)設(shè)備的連接或關(guān)于它的查詢信息,例如名稱,地址,類和綁定狀態(tài)等。
          • BluetoothProfile:配置文件代理。每個公共配置文件實現(xiàn)這個接口。它有幾個直接子類,每個子類再不同場景中使用,如 BluetoothA2dp, BluetoothGatt, BluetoothGattServer, BluetoothHeadset, BluetoothHealth。在當(dāng)前例子中使用到的是 BluetoothGatt。
          • BluetoothGatt:提供藍牙GATT功能,以實現(xiàn)與藍牙智能或智能就緒設(shè)備的通信。使用該類做連接、斷開、關(guān)閉等操作。
          • BluetoothGattCallback:設(shè)備連接時的回調(diào)接口。

          UUID

          UUID 是全局唯一標(biāo)識,是128bit的值,為了便于識別和閱讀,一般標(biāo)示成:8-4-4-12 的16進制格式。

          Android 中提供了 UUID.randomUUID() 來生成一個隨機的 UUID。

          在低功耗藍牙中,長度為128bit的UUID數(shù)據(jù)長度是受限的,因此藍牙中又產(chǎn)生出來了16bit和32bit的UUID,本質(zhì)上和128bit的UUID一樣。

          Android 中BLE的操作步驟

          • ① 獲取到BluetoothAdapter:代表設(shè)備自己的藍牙適配器,整個系統(tǒng)只有一個藍牙適配器,應(yīng)用程序可以使用此對象與其交互。獲取方法是通過 BluetoothManager 獲取。
          • ② 啟用藍牙設(shè)備:isEnable() 查看是否啟用,通過 BluetoothAdapter.ACTION_REQUEST_ENABLE 來啟動
          • ③ 查找BLE設(shè)備:通過startLeScan(callBack); 方法來開啟掃描;另外還可以使用BluetoothLeScanner來掃描。

          與Android BLE設(shè)備通信

          開發(fā)BLE應(yīng)用,主要有兩大類:

          • 基于非連接的通信應(yīng)用:使用的是BLE的廣播機制,又稱作是Beacon。共有兩個角色:發(fā)送方負(fù)責(zé)發(fā)送廣播,稱之為Boradcaster,另外一方為監(jiān)聽方,監(jiān)聽廣播信號,稱之為Observer。
          • 基于連接的通信應(yīng)用:基于連接的通信是通過建立GATT連接,讓后進行數(shù)據(jù)的收發(fā)。也有兩個角色:連接發(fā)起方,稱之為中心設(shè)備(Central),另外一方是被連接的設(shè)備,稱之為外設(shè)Peripheral。

          本篇文章中,我們來討論面向連接的通信的情況。如果要與另外一個BLE設(shè)備進行通信,需要經(jīng)過連接,確認(rèn)狀態(tài),然后再通信的過程。首先是開啟連接,然后會觸發(fā)對應(yīng)的連接回調(diào),然后發(fā)現(xiàn)服務(wù),觸發(fā)發(fā)現(xiàn)服務(wù)回調(diào),獲取服務(wù)內(nèi)部的特征值,對其讀寫命令(和 BLE 共同約束的規(guī)范),就是這么一個過程,比較簡單。

          • 連接到GATT服務(wù)器:如果要與BLE進行通信,第一步就是要連接到該設(shè)備的 GATT 服務(wù)。使用connectGatt方法鏈接,有三個參數(shù),最后一個參數(shù)為連接的回調(diào)函數(shù),表是處理鏈接的狀態(tài),所有交互均從回調(diào)中進行處理。
          • 讀 BLE 屬性:一旦Android設(shè)備連接到GATT的服務(wù)器并且發(fā)現(xiàn)了BLE服務(wù),則可以讀取或者寫入相關(guān)的屬性,執(zhí)行相關(guān)的操作了。
          • 釋放GATT:當(dāng)操作完成后,要記得關(guān)閉設(shè)備bluetoothGatt.close()。

          二、WIFI的使用

          每個移動智能設(shè)備幾乎都帶有WIFI連接功能,在Android系統(tǒng)中,同樣也提供了WIFI開發(fā)的相關(guān)的API。

          WIFI API

          Android系統(tǒng)提供的WIFI API,主要包含在兩個包中:

          • android.net.wifi包
          • android.net.wifi.p2p包

          和wifi相關(guān)的核心API主要有以下幾個內(nèi)容:

          • WifiManager:提供管理WiFI連接的大部分API
          • ScanResult:已經(jīng)檢測出的接入點(包括接入點的地址、名稱、身份認(rèn)證、頻率、信號強度)
          • WifiConfiguration:WiFi連接的網(wǎng)絡(luò)配置(包括安全配置等)
          • WifiInfo:WiFi無線連接的描述,主要包括接入點、網(wǎng)絡(luò)連接狀態(tài)、隱藏的接入點、IP地址、連接速度、MAC地址、網(wǎng)絡(luò)ID、信號強度等等信息。
          • WifiManager.WifiLock:通常情況下當(dāng)用戶在一段時間內(nèi)沒有任何操作的時候,WiFi網(wǎng)絡(luò)會自動關(guān)閉。我們使用WifiLock來鎖定WiFi網(wǎng)絡(luò),使其一直保持連接,直到這個鎖被釋放。多個應(yīng)用程序可能有多個鎖,當(dāng)多有的應(yīng)用程序的鎖都被釋放的時候,WiFi才被關(guān)閉。

          WIFI 使用說明

          • WifiManager:context.getSystemService(Context.WIFI_SERVICE);
          • 打開WiFi:mWifiManager.setWifiEnabled(true); 關(guān)閉wifi為false
          • 創(chuàng)建一個WifiLock:mWifiManager.createWifiLock("lock_name");
          • 鎖定WifiLock:mWifiLock.acquire();
          • 釋放WifiLock:mWifiLock.release();
          • WiFi連接:
          public void addNetworkAndConn(WifiConfiguration wcg) {
              int netId=mWifiManager.addNetwork(wcg);
              mWifiManager.enableNetwork(netId, true);
          }
          • 斷開一個指定ID的WiFi:
          public void disconnectWifi(int netId) {
              mWifiManager.disableNetwork(netId);
              mWifiManager.disconnect();
          }
          • 掃描可接入的WiFi:
          public void startScan() {
              mWifiManager.startScan();
              // 得到掃描結(jié)果
              List<ScanResult> wifiList=mWifiManager.getScanResults();
              // 得到配置好的網(wǎng)絡(luò)連接
              List<WifiConfiguration> wifiConfigList=mWifiManager.getConfiguredNetworks();
          }

          WIFI 權(quán)限

          在進行wifi開發(fā)時,既要用到網(wǎng)絡(luò),也要用到硬件資源,因此需要申請一些必要的權(quán)限,而且涉及到的還比較的多,主要的權(quán)限如下:

          <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
          <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"></uses-permission> 
          <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> 
          <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
          <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
          <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"></uses-permission>

          WIFI直連

          WIFI Direct 意為通過 WIFI 直接建立連接。允許無線網(wǎng)絡(luò)中的設(shè)備無須通過無線路由器即可相互連接。這種標(biāo)準(zhǔn)支持 WIFI 的無線設(shè)備像藍牙那樣以點對點的形式互連,但是在傳輸速度與傳輸距離方面都比藍牙有大幅提升。

          WIFI Direct 提供 WifiP2pManager 類,其功能主要分為以下三部分:

          • WifiP2pManager 類提供相關(guān) API 用于發(fā)現(xiàn)可連接的點,并進行請求和建立連接。
          • 每個 WifiP2pManager 的方法都要求傳入對應(yīng)的監(jiān)聽器,用于監(jiān)聽對該方法是否成功運行。
          • 當(dāng)檢測到特定事件,如可連接的點減少或者發(fā)現(xiàn)了新的可連接的點,WIFI Direct 框架會通過 Intent 通知用戶。

          WifiP2pManager的核心API用法說明如下所示:

          • initialize:為應(yīng)用程序注冊 WIFI 框架。該方法必須在任何其他 WIFI Direct 方法被調(diào)用前調(diào)用,常放在Application中調(diào)用。
          • connect:與具有指定配置的 WIFI 設(shè)備建立點對點連接
          • cancelConnect:斷開連接
          • requestConnectInfo:獲取設(shè)備的連接信息
          • createGroup:以當(dāng)前設(shè)備為擁有者創(chuàng)建一個點對點組
          • removeGroup:刪除當(dāng)前的點對點組
          • requestGroupInfo:獲取點對點組的信息
          • discoverPeers:初始化發(fā)現(xiàn)對等點設(shè)備服務(wù)
          • requestPeers:獲取當(dāng)前已發(fā)現(xiàn)的對等點設(shè)備列表

          在WifiP2pManager使用時,同樣支持使用各種監(jiān)聽回調(diào)接口:

          • ActionListener:Wifi連接過程中的某個動作監(jiān)聽。主要包括:connect、cancelConnect、createGroup、removeGroup、discoverPeers等回調(diào)函數(shù)
          • ChannelListener:initialize初始化的回調(diào)
          • ConnectionInfoListener:請求連接的回調(diào),回傳連接信息
          • GroupInfoListener:點對點組的監(jiān)聽信息
          • PeerListListener:點對點設(shè)備的監(jiān)聽回調(diào)接口

          三、傳感器

          Android 傳感器屬于虛擬設(shè)備,可提供來自以下各種物理傳感器的數(shù)據(jù):

          • 加速度計
          • 陀螺儀
          • 磁力計、
          • 氣壓計
          • 濕度傳感器
          • 壓力傳感器
          • 光傳感器
          • 近程傳感器
          • 心率傳感器

          以上的這些均可以歸納為傳感器類別,在Android中,這些傳感器有一個相同的定義文件,存在一個 sensors.h文件,其中定義了Android系統(tǒng)支持的每一種傳感器。格式為:ENSOR_TYPE_傳感器名稱。


          該圖為Android系統(tǒng)中傳感器的的架構(gòu)和分層。可以看出,幾乎和Android系統(tǒng)整體的架構(gòu)一樣。從上層到下層,從應(yīng)用層到底層內(nèi)核層。

          傳奇器核心API

          Android傳感器框架放在android.hardware包中,核心的API如下所示:

          • SensorManager:用于創(chuàng)建傳感器服務(wù)實例。該類提供了訪問和羅列傳感器的各種方法,用于注冊和注銷傳感器事件監(jiān)聽器并獲取方向信息。該類也提供了幾個常量,用于報告?zhèn)鞲衅鞯木取?shù)據(jù)獲取率和校正傳感器。
          • Sensor:用作創(chuàng)建某個特定傳感器的實例。該類提供了用于確定傳感器能力的各種方法。
          • SensorEvent:創(chuàng)建傳感器事件對象。傳感器事件對象包含傳感器事件的相關(guān)信息,包括原始的傳感器數(shù)據(jù)、傳感器類型、產(chǎn)生的事件、事件精度以及事件發(fā)生的時間戳等。
          • SensorEventListener:是一個接口,包含兩個回調(diào)方法。當(dāng)傳感器的值發(fā)生改變或者傳感器的精度發(fā)生改變時,相關(guān)方法就會自動被調(diào)用。

          傳感器核心操作

          無論如何變化,其實通過上面的描述和介紹,我們看到,傳感器是底層系統(tǒng)提供的,數(shù)據(jù)也是相關(guān)的API返回獲取的。因此,在涉及到傳感器開發(fā)時,開發(fā)者的核心操作只有兩個:

          • 分析需求,明確使用哪個一個類別的傳感器,明確要獲取的傳感器數(shù)據(jù)。
          • 調(diào)用系統(tǒng)的API方法,監(jiān)聽傳感器的的回調(diào)時間,獲取數(shù)據(jù)。

          因此,Android中的傳感器部分的應(yīng)用開發(fā),重點不是在于傳感器的使用,是開發(fā)者自己特定的應(yīng)用,在獲取到數(shù)據(jù)后,對數(shù)據(jù)的處理和挖掘,是重中之重。

          Android傳感器分類

          Android中支持的傳感器分為很多類別,主要有:

          • TYPE_ACCELEROMETER:運動探測傳感器,硬件傳感器
          • TYPE_AMBIENT_TEMPERATURE:環(huán)境溫度傳感器,硬件傳感器
          • TYPE_GRAVITY:運動探測,軟件或者硬件傳感器
          • TYPE_GYROSCOPE:旋轉(zhuǎn),硬件傳感器
          • TYPE_LIGHT:屏幕亮度傳感器,屬于硬件傳感器
          • TYPE_LINEAR_ACCELERATION:加速度傳感器,軟件或者硬件都有
          • TYPE_ORIENTATION:方向傳感器,屬于軟件傳感器
          • TYPE_PRESSURE:空氣壓力傳感器,屬于硬件傳感器
          • TYPE_PROXIMITY:距離傳感器,用于監(jiān)測打電話時手機與耳朵的距離,屬于硬件傳感器

          四、SystemService

          經(jīng)過本篇文檔的介紹,結(jié)合之前的課程內(nèi)容,我們可以總結(jié)出一個規(guī)律。在Android開發(fā)時,很多情況下我們都可以直接通過某個上下文,獲取xxxManager,往往是某個管理者。這些管理者是Android系統(tǒng)提供的系統(tǒng)服務(wù),我們可以統(tǒng)稱為SystemService,現(xiàn)在我們了解一下SystemService有關(guān)的內(nèi)容,并做個總結(jié)。

          SystemService

          SystemService是系統(tǒng)提供給開發(fā)者的調(diào)用系統(tǒng)層的控制接口,應(yīng)用層的開發(fā)者只需要了解這些接口的使用方式,就可以非常方便的進行系統(tǒng)控制,完成自己想要的功能操作,獲取系統(tǒng)的相關(guān)信息,而不需要了解接口的具體內(nèi)部實現(xiàn)方式。這些SystemManager是在framework層或者更底層進行實現(xiàn)的。

          相反的對于Framework層的開發(fā)者而言,需要了解XXXManager服務(wù)的實現(xiàn)細節(jié)和方式,并維護Manager接口,擴展或者實現(xiàn)新接口等。

          我們可以列舉一下我們在學(xué)習(xí)過程中遇到的Manager,比如:

          • WindowManager:窗口操作的窗口管理服務(wù)
          • NotifacationManager:通知管理
          • AudioManager:Android系統(tǒng)的音頻管理者
          • LocationManager:GPS定位服務(wù)管理
          • StatusBarManager:狀態(tài)欄的管理者

          除此以外,還有很多很多,以上這些管理者,其實背后都是有一個系統(tǒng)服務(wù)SystemService。

          getSystemService

          getSystemService是Android很重要的一個API,它是Activity的一個方法,根據(jù)傳入的NAME來取得對應(yīng)的Object,然后轉(zhuǎn)換成相應(yīng)的服務(wù)對象。

          O.1前置準(zhǔn)備

          電腦端Chrome瀏覽器在地址欄打開以下網(wǎng)址,修改配置

          chrome://flags/

          把以下4個屬性開啟

          找不到的話可以在頂部搜索欄搜索關(guān)鍵字

          Experimental Web Platform features

          Bluetooth


          NO.2Web Bluetooth

          Web Bluetooth文檔

          https://developer.mozilla.org/zh-CN/docs/Web/API/Bluetooth

          注意以下幾點:

          1. chrome版本需要>=53
          2. 需要部署到HTTPS的網(wǎng)頁進行測試和使用
          3. 需要用戶手勢出發(fā),也就是真實的鼠標(biāo)點擊之類的操作,才能出發(fā)藍牙掃描和連接

          體驗網(wǎng)站Demo效果,需要對應(yīng)的ESP32代碼

          https://bluetooth.dsx2020.com/

          效果如圖

          ESP32會收到對應(yīng)的測試字符串

          網(wǎng)頁代碼

          那其中的service_uuid和receive_uuid換成你自己的藍牙廣告ID就可以了

          如果不確定,就繼續(xù)參考ESP32藍牙廣播對應(yīng)的代碼

          
          
          
          
          <html lang="en">
              <head>
                  <meta charset="UTF-8" />
                  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
                  <title>BL</title>
              </head>
              <body>
                  <!-- 只有通過真實點擊才能連接藍牙 -->
                  <div onclick="blList()">blue</div>
              </body>
              <script>
                  // let uuid=// 定義連接藍牙方法
                  async function blList() {  
                      navigator.bluetooth
                          .requestDevice({
                              // 藍牙名稱前綴
                              filters: [{ name: "ESP32" }],
                              // 藍牙uuid
                               optionalServices: ["ae25a5c1-4601-143c-12bb-8bc45a18749c"], 
                          })
                          .then(async (device)=> {
                              console.log("Name: " + device.name, device);
                              // 連接設(shè)備
                              let server=await device.gatt.connect();
                              console.log(`server`, server);
                              // 獲取藍牙uuid相關(guān)內(nèi)容
                              let service=await server.getPrimaryService("ae25a5c1-4601-143c-12bb-8bc45a18749c");
                              console.log(`service`, service);
                              // 獲取可以讀寫字符流的服務(wù)
                              let characteristic=await service.getCharacteristic(
                                  "ae25a5c2-4601-143c-12bb-8bc45a18749c"
                              );
                              // 寫入字節(jié)(括號中的方法為把字符串轉(zhuǎn)為字符流,傳輸給藍牙)
                              characteristic.writeValue(
                                  new Uint8Array(
                                      new TextEncoder("utf-8").encode("str")
                                  )
                              );
                              alert("已發(fā)送字符")
                          })
                          .catch(function (error) {
                              // 監(jiān)聽錯誤
                              console.log("Something went wrong. " + error);
                              alert(error)
                          });
                  }
                  // blList();
          </script>
          </html>
          
          
          
          

          NO.3ESP32 Bluetooth

          參考上一篇文章

          《MicroPython[ESP32]物聯(lián)網(wǎng)開發(fā)-Bluetooth藍牙通信-002》

          這里貼上完整的代碼

          # 引入依賴
          import ubluetooth
          # 實例化藍牙
          class BLE():
              def __init__(self, name):   
                  # 藍牙名稱
                  self.name=name
                  # 創(chuàng)建藍牙實例
                  self.ble=ubluetooth.BLE()
                  # 開啟藍牙
                  self.ble.active(True)
                  # 藍牙事件回調(diào)
                  # 參考文檔
                  # https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq
                  self.ble.irq(self.ble_irq)
                  # 配置藍牙UUID
                  self.register()
                  # 特征和描述符的默認(rèn)最大大小為 20 個字節(jié),修改允許為100個字節(jié)(藍牙數(shù)據(jù)的發(fā)送和接收字節(jié)大小限制)
                  self.ble.gatts_write(self.rx, bytes(100))
                  # 藍牙廣播
                  self.advertiser()
                  print("已開啟藍牙廣播")
                  
              # 藍牙連接成功后回調(diào)
              def connected(self):        
                  print("connected")
              # 藍牙斷開連接后回調(diào)
              def disconnected(self):        
                  print("disconnected")  
          
          
              # 藍牙事件回調(diào)函數(shù)
              def ble_irq(self, event, data):
                  #藍牙已連接
                  if event==1:
                      print("藍牙已連接")
                      # 連接后的執(zhí)行函數(shù)
                      self.connected()
                  #藍牙已斷開連接
                  elif event==2:
                      print("藍牙已斷開連接")
                      # 斷開連接后的執(zhí)行函數(shù)
                      self.advertiser()
                      self.disconnected()
                  #藍牙已發(fā)送數(shù)據(jù)
                  elif event==3 :
                      print("藍牙已接收到數(shù)據(jù)")        
                      # 讀取二進制數(shù)據(jù)
                      buffer=self.ble.gatts_read(self.rx)
                      # 使用UTF-8格式把二進制數(shù)據(jù)轉(zhuǎn)為字符串
                      message=buffer.decode('UTF-8').strip()
                      # 打印收到的字符數(shù)據(jù)
                      print("message",message)    
                      # 對指定的數(shù)據(jù)做處理并藍牙返回數(shù)據(jù)        
                      if message=='test':
                          print('test')
                          ble.send('test')
                      if message=='str':
                          print('str')
                          ble.send('str')
              # 注冊藍牙UUID
              def register(self):        
                  # 自定義UUID
                  # 藍牙服務(wù)UUID service_uuid(后續(xù)藍牙建議連接會用到)
                  NUS_UUID='AE25A5C1-4601-143C-12BB-8BC45A18749C'
                  # 藍牙接收特征UUId receive_uuid
                  RX_UUID='AE25A5C2-4601-143C-12BB-8BC45A18749C'
                  # 藍牙發(fā)送特征UUId transmit_uuid
                  TX_UUID='AE25A5C3-4601-143C-12BB-8BC45A18749C'
                  # UUID組合(一個包含UUID和特征列表的二元元組)
                  BLE_NUS=ubluetooth.UUID(NUS_UUID)
                  BLE_RX=(ubluetooth.UUID(RX_UUID), ubluetooth.FLAG_WRITE)
                  BLE_TX=(ubluetooth.UUID(TX_UUID), ubluetooth.FLAG_NOTIFY)
                  BLE_UART=(BLE_NUS, (BLE_TX, BLE_RX,))
                  SERVICES=(BLE_UART, )
                  # 使用指定的服務(wù)配置外圍設(shè)備
                  # 文檔地址:
                  # https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq#peripheral-role
                  ((self.tx, self.rx,), )=self.ble.gatts_register_services(SERVICES)
              # 發(fā)送數(shù)據(jù)
              def send(self, data):
                  # 向連接的客戶端發(fā)送通知請求
                  # 文檔地址:
                  # https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq#gatt-client
                  self.ble.gatts_notify(0, self.tx, data + '\n')
              # 藍牙廣播配置
              def advertiser(self):
                  name=bytes(self.name, 'UTF-8')
                  # 以指定的時間間隔(以微秒為單位)開始廣播
                  # 文檔地址
                  # https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq#broadcaster-role-advertiser
                  self.ble.gap_advertise(100, bytearray('\x02\x01\x02') + bytearray((len(name) + 1, 0x09)) + name)
                  
          # 創(chuàng)建一個名為ESP32的藍牙廣播
          ble=BLE("ESP32")
          
          

          NO.4Tips

          目前Web Bluetooth只支持安卓和Windows上的Chrome瀏覽器

          不支持MacOS和Iphone上Chrome瀏覽器

          使用安卓手機Chrome瀏覽器同樣可以測試網(wǎng)頁藍牙通信,但是也要設(shè)置前置權(quán)限

          手機權(quán)限

          1. 在系統(tǒng)設(shè)置中打開藍牙
          2. 應(yīng)用設(shè)置中允許開啟或者關(guān)閉藍牙
          3. 允許桌面快捷方式
          4. 允許鎖屏顯示
          5. 允許后臺彈出界面
          6. 允許常駐通知
          7. 允許讀寫手機存儲

          因為網(wǎng)頁藍牙掃描和配對時,會以彈框的形式展示,所以需要一些顯示和通知的應(yīng)用權(quán)限,確保能展示藍牙提示彈框

          相比APP和微信小程序的藍牙開發(fā)和調(diào)試,顯然網(wǎng)頁相對方便一些

          可以用來測試簡單的字符通信,測試藍牙廣播是否被正常掃描,以及特定字符的發(fā)送和接收邏輯處理等

          本文的網(wǎng)頁藍牙UUID默認(rèn)是固定的,后期有時間再改為動態(tài)輸入

          END.

          35藍牙模塊升級款B35S首發(fā)上架,B35S不僅支持BLE5.2藍牙+2.4G WiFi,還支持低功耗模式,功耗最低200uA。


          B35S資料文檔:

          https://h.hlktech.com/Mobile/download/fdetail/267.html



          藍牙WiFi模塊優(yōu)勢


          藍牙技術(shù)大多用來做短距離的設(shè)備間通信,例如無線耳機和智能手環(huán)等產(chǎn)品,WiFi技術(shù)則為產(chǎn)品提供了相對更高速的長距離數(shù)據(jù)傳輸能力,適用于連接互聯(lián)網(wǎng)和局域網(wǎng)。


          在各種場景的實際應(yīng)用中,會經(jīng)常出現(xiàn)需要多個設(shè)備之間進行快速連接以及數(shù)據(jù)傳輸,因而用戶經(jīng)常要同時使用藍牙和WiFi,這可能使得頻繁多次、資源浪費和用戶體驗不佳等問題的出現(xiàn)。


          為了解決上述問題,藍牙WiFi二合一的概念正式產(chǎn)生。藍牙WiFi模塊由于在實際應(yīng)用中可以給用戶提供更便利的無線連接選項,被廣泛使用。



          產(chǎn)品功能特點


          01

          BLE5.2藍牙+2.4G WiFi二合一

          HLK-B35S藍牙模塊支持WiFi 802.11b/g/n 和 BLE5.2 基帶/MAC 設(shè)計,主頻支持從 1MHz 到 160MHz,內(nèi)置 32 位 CPU,288KB RAM,2M 嵌入式 Flash 閃存。


          HLK-B35S藍牙模塊支持BLE 協(xié)助實現(xiàn) Wi-Fi 快速配網(wǎng),支持 AP/STA 和 BLE 共存模式,其中 WiFi 安全支持:WPS/WEP/WPA/WPA2 Personal/WPA2。B35S輸出功率 0~10dBm,接收靈敏度 -98dBm。


          (串口轉(zhuǎn) WIFI STA)


          (串口轉(zhuǎn) WIFI AP)



          02

          微安級超低功耗

          B35S藍牙模塊相較于B35藍牙模塊,不僅僅將BLE5.0藍牙協(xié)議升級為BLE5.2,更重要在低功耗方案上的再進化。B35S藍牙模塊接收模式30mA,低功耗待機模式功耗低至200uA。


          B35S微安級的超低功耗,再加上模塊體積小巧,尺寸僅24x16x2mm,非常適用于水電水表以及可穿戴產(chǎn)品等對模塊體積和功耗有嚴(yán)苛要求的產(chǎn)品。



          03

          傳輸距離40-100米

          B35S藍牙模塊自帶BLE5.2藍牙,傳輸距離更遠,傳輸距離可達40-100米。相比藍牙4,藍牙5.2協(xié)議的覆蓋范圍將是它的4倍。


          同時,B35S藍牙模塊傳輸速率 9600-921600bps,傳輸速率相比BLE4.0藍牙協(xié)議提高2倍,傳輸速度更快。




          04

          測試簡單性價比高

          B35S藍牙模塊支持直插安裝,安裝簡單易拆卸。首次使用B35S可購買配套測試底板,便于快速測試驗證。


          與此同時,超低功耗藍牙模塊B35S,支持BLE5.2藍牙+2.4G WiFi二合一,性能優(yōu)越,單價低至個位數(shù),低功耗低成本,應(yīng)用場景廣泛。


          應(yīng)用場景

          在工業(yè)、智能家居等領(lǐng)域中,藍牙WiFi模塊的作用大多用來控制某個智能設(shè)備或者被放置在某個智能設(shè)備內(nèi),一般用紐扣電池供電,然后通過無線端進行數(shù)據(jù)傳輸和數(shù)據(jù)控制。這些智能設(shè)備往往需要有長時間續(xù)航能力,因而對功耗有著較為嚴(yán)苛的要求,B35S這類低功耗的藍牙WiFi模塊正好滿足其需求。


          01

          超低功耗藍牙在工業(yè)自動化中的應(yīng)用

          在工業(yè)自動化中,傳感器網(wǎng)絡(luò)對于實時監(jiān)測和控制生產(chǎn)過程至關(guān)重要。


          B35S這類低功耗藍牙模塊用于工業(yè)自動化場景中,主要是為了讓傳感器節(jié)點之間的數(shù)據(jù)傳輸更加高效,實現(xiàn)實時采集和傳遞數(shù)據(jù),進而在一定程度上提高了工業(yè)系統(tǒng)應(yīng)對不同生產(chǎn)環(huán)境變化的靈敏度。




          02

          超低功耗藍牙在儀器儀表中的應(yīng)用

          B35S應(yīng)用于可穿戴醫(yī)療設(shè)備中,可以讓醫(yī)療設(shè)備實現(xiàn)與手機或者其他智能終端的實時連接,進而實時輸出數(shù)據(jù),更好地監(jiān)控患者的健康情況。心率監(jiān)測、睡眠追蹤等數(shù)據(jù)可以實時傳輸?shù)结t(yī)療專業(yè)人士,支持遠程監(jiān)測和診斷。


          常見的醫(yī)療健康設(shè)備有:藍牙手環(huán)、血糖計、血壓計、活動傳感器等產(chǎn)品。



          03

          超低功耗藍牙在穿戴產(chǎn)品中的應(yīng)用


          B35S這類低功耗藍牙WiFi模塊是很多智能設(shè)備的配件之一,通過藍牙模塊實現(xiàn)數(shù)據(jù)的傳輸和交換。


          常見是的智能運動手環(huán)、智能眼鏡以及智能項鏈,通過藍牙模塊以低成本低功耗實現(xiàn)短距離的通信,提高產(chǎn)品的使用壽命和運行時間。


          B35S模塊數(shù)據(jù)

          無線子系統(tǒng)包含 2.4G 無線電,Wi-Fi 802.11b/g/n 和 BLE5.2 基帶/MAC 設(shè)計

          主頻支持從 1MHz 到 160MHz

          內(nèi)置 32 位 CPU,288KB RAM,2M 嵌入式 Flash 閃存

          工作電壓 支持 2.7-3.6V,典型值為 3.3V

          BLE 協(xié)助實現(xiàn) Wi-Fi 快速配網(wǎng)

          支持 AP/STA 和 BLE 共存模式,其中 WiFi 安全支持:WPS/WEP/WPA/WPA2 Personal/WPA2

          集成 balun,PA/LNA

          豐富的外設(shè)接口,1*SPI 主/從,2*UART,6*PWM,18*GPIO,1*IIC 主/從

          廣泛應(yīng)用于物聯(lián)網(wǎng)

          接收模式:30mA,低功耗待機模式:200uA


          主站蜘蛛池模板: 人妻互换精品一区二区| 国产成人无码AV一区二区| 国产一区二区三区在线2021 | 日韩电影一区二区| 99精品国产高清一区二区三区| 亚洲熟妇av一区二区三区漫画| 亚洲AV午夜福利精品一区二区| 色窝窝无码一区二区三区色欲 | 亚洲日韩国产欧美一区二区三区 | 精品无码国产AV一区二区三区| 丝袜美腿一区二区三区| 精品一区二区三区AV天堂| 国产精品亚洲产品一区二区三区 | 秋霞日韩一区二区三区在线观看 | 日韩一区二区在线观看视频| 亚洲国产AV无码一区二区三区| 国产伦精品一区二区三区无广告| 四虎永久在线精品免费一区二区 | 福利一区二区在线| 任你躁国产自任一区二区三区| 久久精品国产一区二区三区肥胖| 无码人妻一区二区三区一| 福利一区二区在线| 亚洲国产精品一区二区久| 日韩a无吗一区二区三区| 日本一区精品久久久久影院| 精品无码国产一区二区三区51安| 成人国内精品久久久久一区| 国产精品一区二区久久| 国产激情一区二区三区| 亚洲欧美成人一区二区三区| 久久国产午夜精品一区二区三区| 亚洲乱码av中文一区二区 | 制服丝袜一区二区三区| 精品人妻无码一区二区色欲产成人 | 一区二区三区高清| 国产品无码一区二区三区在线蜜桃 | 亚洲乱码国产一区网址| 日韩中文字幕精品免费一区| 熟女大屁股白浆一区二区| 国产精品一区二区久久沈樵|