<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                本文是對已實現的藍牙防丟器項目的總結,闡述藍牙防丟器的原理、實現與android客戶端的藍牙BLE接口編程。在這里重點關注如何利用BLE接口來進行工程實現,對于BLE的協議、涉及到JNI的BLE接口內部源碼實現,筆者以后再詳細剖析。但要求讀者對BLE協議有一定的認識,如GAP、GATTprofile在BLE中的角色和作用,如何使用Service、Characteristic等。 >一、藍牙防丟器原理和產品需求 藍牙防丟器的核心原理是根據接收到的藍牙設備端的無線信號強度(RSSI)來估算距離。其計算公式是: ![](https://box.kancloud.cn/2016-01-12_5694d4a3b7935.jpg) d是計算距離,RSSI是信號強度,A為發射端和接收端相隔1米時的信號強度,n是環境衰減因子。對于不同的藍牙設備該值是不一樣的,同樣的設備在不同的發射功率的情況下其信號強度也是不一樣的,而且對于同是1米的情況下,環境對于信號強度也是有影響的。n是環境衰減因子,自然跟環境有關。所以在確切發射功率的情況下,A和n對于同一款設備來說,也是一個經驗值。 在實際的防丟器產品中,一般有以下功能: 1\. 當手機(接收端)檢測到發射端設備的距離超過一定距離時,發出告警提示,設備根據告警級別進行相應的指示,如發出不同頻率的音頻或者閃燈。 2\. 當發射設備端發現和手機端建立的鏈路斷開(意味著距離已經超過連接范圍)時,其會自動發出某種形式的警告。 >二、藍牙防丟profile 筆者以業界目前功耗最低的藍牙單芯片(Dialog公司的DA14580)來說明。針對DA14580,Dialog公司有提供開發SDK(以后會對該SDK框架進行分析,以指導開發),其中就有實現防丟profile,命名是Proximity。???? 該profile針對以上防丟的功能提供的Characteristic如下: 1.TXP(txpower) Characteristic, 設備端需要通過主機控制接口HCI來獲得發射功率參數,并以read屬性提供給master。 2.IAS(**immediate alter service**), write屬性,供master寫告警級別。當master寫入新的值時,設備端會收到write的回調,其根據告警級別進行相應告警。 3\. LLS(link loss service),write/read屬性,供master設置鏈路斷開情況下默認的告警級別。 RSSI通過接收端的接口來獲得,并不需要設備端提供service。 以上Characteristic都通過GATT profile提供服務,在藍牙通信協議上,每個Characteristic都會對應一個UUID。 >三、android藍牙BLE接口編程 androidBLE接口在android4.3版本以上提供。 **1.判斷當前系統是否支持BLE** getPackageManager().hasSystemFeature(PackageManager.*FEATURE_BLUETOOTH_LE*) 返回真表示支持。 **2.獲得藍牙適配器類** 用戶通過統一的藍牙適配器類BluetoothAdapter來使用BLE API。 先獲得藍牙管理器: BluetoothManagerbluetoothManager =?getSystemService(Context.*BLUETOOTH_SERVICE*); 再獲得藍牙適配器實例(單體對象): BluetoothAdaptermBluetoothAdapter = bluetoothManager.getAdapter(); **3.啟動手機藍牙硬件功能(相當于在設置界面開啟藍牙功能)** mBluetoothAdapter.enable(); **4.開始掃描** BluetoothAdapter.startLeScan(android.bluetooth.BluetoothAdapter.LeScanCallbackcallback) callback是當掃描到藍牙設備時的回調接口。實現callback中的onLeScan接口: @Override **public void**?onLeScan(**final**BluetoothDevice device,?**int**?rssi,?**byte**[] scanRecord) 其中,device代表掃描到的設備,可以獲得其MAC地址、設備名等等;rssi即信號強度,這是未連接時獲取RSSI的方法;scanRecord代表掃描設備得到的響應參數,ibeacon即通過該參數來獲得廣播內容。 假設String bluetoothAddress = device.getAddress(),獲取藍牙48位MAC地址 **5.連接GATT,獲取設備端的UUID服務,并進行數據通信交互** 通過MAC地址獲得代表設備端的藍牙設備類 BluetoothDevicedevice = mBluetoothAdapter.getRemoteDevice(bluetoothAddress); 連接GATT BluetoothGatt mBluetoothGatt = device.connectGatt(android.content.Context context, booleanautoConnect, android.bluetooth.BluetoothGattCallback callback); Callback是連接GATT之后,所有數據交互的回調入口。分別包括: 1)設備服務發現 @Override **publicvoid**onServicesDiscovered(BluetoothGatt gatt,?**int**?status) mBluetoothGatt.getServices()代表設備服務集合, **for**?(BluetoothGattService gattService : mBluetoothGatt.getServices()) 對于每個服務service,用getUuid()可以獲得服務的UUID,getCharacteristics()代表該服務的Characteristic集合。 **for**(BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) 對于每個Characteristic,getUuid()獲得UUID,getPermissions()獲得屬性權限,getValue()獲得屬性值。 在該回調中我們只提取感興趣的三個Characteristic的UUID,對于其他的如電池、設備服務等UUID可以不管。 *gattCharacteristic_char5_TXP=*gattCharacteristic; 2)連接狀態改變 @Override **public void**onConnectionStateChange(BluetoothGatt gatt,?**int**?status,**int**newState) 有兩種狀態,BluetoothProfile.*STATE_CONNECTED*代表連接,BluetoothProfile.*STATE_DISCONNECTED*代表斷開連接。 3)讀回調 @Override **public void**onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristiccharacteristic,?**int**status) 其對應手機端發出讀請求后,當收到設備端的數據時的回調。如 mBluetoothGatt.readCharacteristic(*gattCharacteristic_char5_TXP*) 4)設備端數據變化回調 這里對應設備的characteristic的屬性是notify或者indication,即相當手機端訂閱這個characteristic的值變更服務,當設備端的characteristic發生變化時,設備端會主動發出通知給手機端。 @Override **public void** onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristiccharacteristic) 在回調中獲得新的值characteristic.getValue()。 5)獲取到RSSI值的回調 RSSI在掃描時可以通過掃描回調接口獲得,但是在連接之后要不斷地使用 mBluetoothGatt.readRemoteRssi()向底層驅動發出讀取RSSI請求,當底層獲取到新的RSSI后會進行以下回調: @Override **public void**onReadRemoteRssi(BluetoothGatt gatt,?**int**?rssi,?**int**?status) rssi即是新的信號強度值。 連接后,由于手機和設備端的距離在發生變化,因此要不斷地讀取RSSI,實時計算兩者之間的距離才能保證防丟功能的實現。 Android 4.3之后的SDK有提供BLE接口使用的樣例,可以通過研讀源碼進行理解。對防丟器的藍牙設備端和android客戶端的開發感興趣者可以關注 微信公眾號:嵌入式企鵝圈 進行交流。謝謝!嵌入式企鵝圈分享嵌入式Linux和物聯網原創技術經驗,敬請關注: ![](https://box.kancloud.cn/2016-01-12_5694d4a143a64.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看