、低功耗藍牙的使用
Android中關(guān)于藍牙的開發(fā)文檔,可以參考Google提供的官方藍牙文檔:https://developer.android.google.cn/guide/topics/connectivity/bluetooth.html
在Android開發(fā)中,應(yīng)用可通過官方提供的藍牙API執(zhí)行以下操作:
一個近距離無線通信技術(shù),最早是由愛立信研發(fā)出來。藍牙 Bluetooth 這個詞是一個丹麥的國王的綽號,當(dāng)時研發(fā)它的工程師正在看一個關(guān)于這個國王的書,就起了這個名字。藍牙的技術(shù)特點是:
藍牙從被發(fā)明到目前,經(jīng)過了幾個版本的變化:
低功耗藍牙全稱為Bluetooth Low Energy,簡稱為BLE,最大特點就是低功耗,另外低功耗藍牙還具備成本低,連接速度快,安全性高的特點。當(dāng)然,低功耗藍牙也相應(yīng)的會有一些不足,比如說:低功耗對應(yīng)的是低傳輸效率,因此低功耗藍牙主要用來傳輸少量數(shù)據(jù),結(jié)合低功耗的特點,非常適合用在移動智能設(shè)備上。
低功耗藍牙分為兩種模式:單模和雙模。
注意:需要在Android 4.3及以上版本才能支持具備低功耗功能的藍牙4.0。
首先來看一下使用藍牙的基本流程:
先簡單來了解一下低功耗藍牙的協(xié)議框架,在BLE協(xié)議棧中,大致分為三個部分,從下到上依次為:控制器(Controller) 、主機(Host)、應(yīng)用(Applications)。
協(xié)議層從下往上,依次包含如下協(xié)議:
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一樣。
開發(fā)BLE應(yīng)用,主要有兩大類:
本篇文章中,我們來討論面向連接的通信的情況。如果要與另外一個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ī)范),就是這么一個過程,比較簡單。
每個移動智能設(shè)備幾乎都帶有WIFI連接功能,在Android系統(tǒng)中,同樣也提供了WIFI開發(fā)的相關(guān)的API。
Android系統(tǒng)提供的WIFI API,主要包含在兩個包中:
和wifi相關(guān)的核心API主要有以下幾個內(nèi)容:
public void addNetworkAndConn(WifiConfiguration wcg) {
int netId=mWifiManager.addNetwork(wcg);
mWifiManager.enableNetwork(netId, true);
}
public void disconnectWifi(int netId) {
mWifiManager.disableNetwork(netId);
mWifiManager.disconnect();
}
public void startScan() {
mWifiManager.startScan();
// 得到掃描結(jié)果
List<ScanResult> wifiList=mWifiManager.getScanResults();
// 得到配置好的網(wǎng)絡(luò)連接
List<WifiConfiguration> wifiConfigList=mWifiManager.getConfiguredNetworks();
}
在進行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 Direct 意為通過 WIFI 直接建立連接。允許無線網(wǎng)絡(luò)中的設(shè)備無須通過無線路由器即可相互連接。這種標(biāo)準(zhǔn)支持 WIFI 的無線設(shè)備像藍牙那樣以點對點的形式互連,但是在傳輸速度與傳輸距離方面都比藍牙有大幅提升。
WIFI Direct 提供 WifiP2pManager 類,其功能主要分為以下三部分:
WifiP2pManager的核心API用法說明如下所示:
在WifiP2pManager使用時,同樣支持使用各種監(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)核層。
Android傳感器框架放在android.hardware包中,核心的API如下所示:
無論如何變化,其實通過上面的描述和介紹,我們看到,傳感器是底層系統(tǒng)提供的,數(shù)據(jù)也是相關(guān)的API返回獲取的。因此,在涉及到傳感器開發(fā)時,開發(fā)者的核心操作只有兩個:
因此,Android中的傳感器部分的應(yīng)用開發(fā),重點不是在于傳感器的使用,是開發(fā)者自己特定的應(yīng)用,在獲取到數(shù)據(jù)后,對數(shù)據(jù)的處理和挖掘,是重中之重。
Android中支持的傳感器分為很多類別,主要有:
經(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是系統(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,比如:
除此以外,還有很多很多,以上這些管理者,其實背后都是有一個系統(tǒng)服務(wù)SystemService。
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
注意以下幾點:
體驗網(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)限
因為網(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
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。