了解小程序藍牙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:類型化數組,JavaScript操作二進制數據的一個接口。 WebGL,指瀏覽器與顯卡之間的通信接口,為了滿足JavaScript與顯卡之間大量的、實時的數據交換,它們之間的數據通信必須是二進制的,而不能是傳統的文本格式。 比如,以文本格式傳遞一個32位整數,兩端的JavaScript腳本與顯卡都要進行格式轉化,將非常耗時。這時要是存在一種機制,可以像C語言那樣,直接操作字節,然后將4個字節的32位整數,以二進制形式原封不動地送入顯卡,腳本的性能就會大幅提升。 類型化數組(Typed Array)就是在這種背景下誕生的。它很像C語言的數組,允許開發者以數組下標的形式,直接操作內存。有了類型化數組以后,JavaScript的二進制數據處理功能增強了很多,接口之間完全可以用二進制數據通信。
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來與收發數據等。
參考: