2024年7月25日 星期四

ANDROID STUDIO & BLE

ANDROID STUDIO & KT(連結)
ANDROID STUDIO & BLE(連結)

文章說明( 連結 ) 程式( 連結 ) 進度為:用KT連結PIXART,

log 1 2 3 4 5  這邊已經進行 device.connectGatt 完畢

log 10 BluetoothProfile.STATE_CONNECTED 進入這個狀態

從log看狀況

Timber.i("Connected to GATT server.")

Timber.i("Attempting to start service discovery: %s", bluetoothGatt?.discoverServices())  這會自動進行後面動作

log 50 52 BluetoothGatt.GATT_SUCCESS  應該可以繼續發展,傳送資料 但是因為沒有後續,之後就進入 log 11 BluetoothProfile.STATE_DISCONNECTED

log 10 > 後面重複循環 (應是系統自行connect)

過程中基礎知識薄弱,又參考(連結 github位置)

write的功能已經驗證,write完畢會收到onXXX,但是只是結果正確與否,而不是BLE裝置送出的項目
取得部分方式一read,只是BLE這邊沒有對應程式,先跳過
取得部分方式二notification
A.先設定enableIndicateNotification(APP自行設計 setCharacteristicNotification)
會啟動系統gatt.writeDescriptor
B.這裡應該是會收到訊息的地方
override fun onCharacteristicChanged(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
        val content = ByteUtils.bytesToHexString(characteristic.value)
        uiCallback.state("特性改变: 收到内容:$content")
}




DeviceListFragment

BluetoothAdapter.startDiscovery() -> 掃描經典藍芽和BLE藍芽兩種(  目前範例使用這個 )
BluetoothAdapter.startLeScan() -> 用來掃描低功耗藍芽 —- 已被棄用
BluetoothLeScanner.startScan() -> 新的BLE掃描方法
理論上,可以限定要搜尋的service,帶入代表該service的UUID
有四件事情
1.繼承一個BroadcastReceiver 然後使用receiver type的形式返回結果bleDevice
private val receiver = DeviceListBoardCast { bleDevice ->deviceViewModel.addDevice(bleDevice)}
這個在下一個
2.註冊監聽BluetoothDevice.ACTION_FOUND
val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
    requireContext().registerReceiver(receiver, filter)
掃描的結果會返回DeviceListBoardCast {}內,根據專案調整
3.private val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
4.bluetoothAdapter!!.startDiscovery()

DeviceListBroadcast

取得資料的運作
val device: BluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)!!
val rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE).toInt()
val uuidExtra = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID)

BlueToothLEService

找到藍芽裝置
建好service,當跟藍芽綁定時,就能互相溝通,並建立Binder,用來onBind時返回實例給fragment去調用。
準備幾個返回的callback
onConnectionStateChange新的連接狀態改變
onServicesDiscovered新的服務被發現
onCharacteristicRead新的東西讀到後
重要功能是啟動connect
進入點是前面DeviceListFragment
執行service中的connect
要跟裝置內的GATT Server連線mBluetoothGatt = device.connectGatt(this, false, mGattCallback);這會連線到藍芽裝置host的GATT Server。
bluetoothGatt = device.connectGatt(this, false, gattCallback)
把要連線的adress丟進去
拿到想要連線的BluetoothDevice
再用device內的方法connectGatt去綁定Gatt裝置
當然同時要丟入前面寫好的gattCallback

讀取資料

displayGattServices
藍芽最重要的就是終端之間的通訊
所以如果想要收送資料
必需要找出service與characteristic
這個範例並沒有提到如何讀取資料,如果真的要進行
gattServices.forEach { gattService ->
    取得各個charxxxx  有sample但實際code沒看到
fun readCharacteristic(characteristic: BluetoothGattCharacteristic) {
        bluetoothGatt?.let { gatt ->
            gatt.readCharacteristic(characteristic)
    這是取得characteristic內容 
private val bluetoothGattCallback = object : BluetoothGattCallback() {
        override fun onCharacteristicRead(
            gatt: BluetoothGatt,
            characteristic: BluetoothGattCharacteristic,
            status: Int
            ) {
                if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(BluetoothService.ACTION_DATA_AVAILABLE, characteristic)
            }
        }
    }
其他類似範例(連結)

其他

理論:Android BT API(連結)。

基本character:範例

  1. 對應ADAFRUIT IOS 有幾個不同的  連結 連結
  2. 落落長非常專業說明 連結 連結

進階HID:PIXART的範例聚集在HID(連結  連結)。


沒有留言:

張貼留言