1. 程式人生 > >小程式藍芽BLE——自動連線裝置(手環)

小程式藍芽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

:型別化陣列,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:字元

ArrayBuffer:型別化陣列

客戶端要產生一個唯一的識別符號: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來與收發資料等。

 

參考:

藍芽核心技術瞭解(藍芽協議、架構、硬體和軟體筆記)
實戰分享,教你藍芽在小程式中的應用