小程式藍芽BLE——自動連線裝置(手環)
瞭解小程式藍芽API:
/** *藍芽API: * 1.初始化藍芽(判斷藍芽是否可用);openBluetoothAdapter * 2.獲取藍芽裝置狀態(藍芽是否開啟);getBluetoothAdapterState * 3.監控藍芽開啟/關閉的動作;onBluetoothAdapterStateChange * 4.開始搜尋周圍是否有裝置;startBluetoothDevicesDiscovery * 5.獲取周圍裝置列表;getBluetoothDevices * 6.停止搜尋周圍裝置,減少消耗資源;stopBluetoothDevicesDiscovery * 7.過濾目標裝置; * 8.是否已經連線藍芽裝置: * a.獲取已經連線的藍芽裝置;getConnectedBluetoothDevices * b.建立新的低功耗藍芽裝置連線deviceId;createBLEConnection * 9.獲取裝置的資訊 * a.獲取藍芽裝置的服務碼;getBLEDeviceServices * b.獲取藍芽裝置的特徵值;getBLEDeviceCharacteristics * c.獲取藍芽裝置的write和notify服務;readBLECharacteristicValue * 10.向藍芽裝置寫入指令;writeBLECharacteristicValue * 11.只有,開啟藍芽裝置的notify提醒功能;notifyBLECharacteristicValueChange * 12.才能,監聽接受藍芽裝置返回的資料;onBLECharacteristicValueChange * 13.斷開低功耗的藍芽連線;closeBLEConnection * 14.關閉藍芽,釋放資源:closeBluetoothAdapter * * */
程式設計邏輯步驟:
/** * 第一部分:藍芽設配器 * 1.微信小程式:是否支援 * 2.手機藍芽:是否可用; * 3.手機藍芽:是否開啟 * 4.監聽開啟手機藍芽狀態的事件 * */ /** * 第二部分:開啟搜尋、過濾、連線、關閉搜尋 * 1.搜尋裝置; * 2.獲取裝置列表; * 3.連線裝置,成功後關閉實時搜尋; * * */ /** * 第三部分:服務值、特徵、write和notify服務 * 1.獲取服務值; * 2.特徵; * 3.write和notify服務 * * */ /** * 第四部分:向藍芽寫入指令、監控接受資料 * 1.寫入指令; * 對應命令轉為16進位制的形式 * START = [83, 84, 65, 82, 84]+時間戳 * STOP = [83, 84, 79, 80] * REQDATA = [82, 69, 81, 68, 65, 84, 65] * AUTO_ACC= [ ...] * 2.監控接收資料; * * */ /** * 第五部分:斷開連線 * 1.斷開藍芽; * 2.清楚快取 * */
斷開後、自動連線(半成熟):
wx.onBluetoothAdapterStateChange();//監聽藍芽介面卡狀態變化事件,判斷連線狀態;
wx.getConnectedBluetoothDevices();//是否有已連線裝置,否根據安卓deviceId||蘋果uuid唯一識別符重新: wx.getBLEDeviceServices()-->....-->wx.createBLEConnection() 重新自動連線;
附錄:藍芽裝置的硬體的知識點:
硬體位元組:
ArrayBuffer
ArrayBuffer作為記憶體區域,可以存放多種型別的資料。不同資料有不同的儲存方式,這就叫做“檢視”。目前,JavaScript提供以下型別的檢視:
Int8Array:8位有符號整數,長度1個位元組。
Uint8Array:8位無符號整數,長度1個位元組。
Int16Array:16位有符號整數,長度2個位元組。
Uint16Array:16位無符號整數,長度2個位元組。
Int32Array:32位有符號整數,長度4個位元組。
Uint32Array:32位無符號整數,長度4個位元組。
Float32Array:32位浮點數,長度4個位元組。
Float64Array:64位浮點數,長度8個位元組。
parseInt(s, 16)//十六進位制字串轉位元組陣列
str.toString(16)//位元組陣列轉十六進位制字串
float:浮點數
unsigned:無符號
int :向下取整
char:字元
客戶端要產生一個唯一的識別符號:deviceId、MAC地址、AndroidId:
AndroidId:
獲取AndroidId是不需要許可權的但是AndroidId是可能變的,AndroidId是在使用者第一次啟用這個裝置時產生的所以當用戶重置手機時AndroidId會產生變化,理論上這個AndroidId是可以接受的畢竟重置手機這個事發生也不會太頻繁;
MAC地址:
可以使用WIFI的MAC地址來作為識別符號,感覺現階段這種方式比較可靠總結如下:Mac地址是唯一的,直接產生在硬體上基本上不會變更;
DeviceId:
區別裝置唯一裝置ID。
其他:
1、profile
profile可以理解為一種規範,一個標準的通訊協議,它存在於從機中。藍芽組織規定了一些標準的profile,例如 HID OVER GATT ,防丟器 ,心率計等。每個profile中會包含多個service,每個service代表從機的一種能力。藍芽裝置可以包括多個Profile,一個Profile中有多個Service,
2、service服務
service可以理解為一個服務,在ble從機中,通過有多個服務,例如電量資訊服務、系統資訊服務等,每個service中又包含多個characteristic特徵值。每個具體的characteristic特徵值才是ble通訊的主題。比如當前的電量是80%,所以會通過電量的characteristic特徵值存在從機的profile裡,這樣主機就可以通過這個characteristic來讀取80%這個資料;一個Service中有多個Characteristic,
3、characteristic特徵
characteristic特徵值,例如:read、notify、write等特徵…;ble主從機的通訊均是通過characteristic的read、write來實現,可以 理解為一個標籤,通過這個標籤可以獲取或者寫入想要的內容。
4、UUID
UUID,統一識別碼,我們剛才提到的service和characteristic,都需要一個唯一的uuid來標識
每個從機都會有一個叫做profile的東西存在,不管是上面的自定義的simpleprofile,還是標準的防丟器profile,他們都是由一些列service組成,然後每個service又包含了多個characteristic,主機和從機之間的通訊,均是通過characteristic來實現。
實際產品中,每個藍芽4.0的裝置都是通過服務和特徵來展示自己的,服務和特徵都是用UUID來唯一標識的。一個裝置必然包含一個或多個服務,每個服務下面又包含若干個特徵。特徵是與外界互動的最小單位。藍芽裝置硬體廠商通常都會提供他們的裝置裡面各個服務(service)和特徵(characteristics)的功能,比如哪些是用來互動(讀寫),哪些可獲取模組資訊(只讀)等。比如說,一臺藍芽4.0裝置,用特徵A來描述自己的出廠資訊,用特徵B來與收發資料等。
參考:
藍芽核心技術瞭解(藍芽協議、架構、硬體和軟體筆記)
實戰分享,教你藍芽在小程式中的應用