Можно ли создать канал, ориентированный на соединение L2CAP, между приложением Android и периферийным устройством BLE беAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Можно ли создать канал, ориентированный на соединение L2CAP, между приложением Android и периферийным устройством BLE бе

Сообщение Anonymous »

Я использую стандартный проект EmptyActivity в Android Studio со следующим кодом, добавленным в MainActivity.kt:

Код: Выделить всё

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val manager = getSystemService(BLUETOOTH_SERVICE) as BluetoothManager
adapter = manager.adapter

startScan()
}

private fun startScan() {
val scanner = adapter.bluetoothLeScanner

scanner.startScan(scanCallback)
}

private val psm: Int = 0x0081

private val scanCallback = object : ScanCallback() {
override fun onScanResult(type: Int, result: ScanResult) {
val device = result.device
val name = device.name ?: return

if (name == "L2CAP_COC_DEMO") {
Timber.i("FOUND device: $name  @ ${device.address}")
adapter.bluetoothLeScanner.stopScan(this)

l2capconnect(device)
}
}

override fun onScanFailed(errorCode: Int) {
Timber.e("Scan failed: $errorCode")
}
}

private fun l2capconnect(device) {
val socket = device.createL2capChannel(psm)
socket!!.connect()
listenLoop() // custom method, but not yet relevant, this is never called
}
Я полностью контролирую периферийное устройство BLE, поэтому нет необходимости в обнаружении PSM, поскольку я могу жестко запрограммировать его на обоих концах. Я использую GAP для рекламы/обнаружения и базового соединения.
В настоящее время программа выходит из строя/время ожидания в сокете!!.connect(), вот упрощенная версия моих журналов:

Код: Выделить всё

- FOUND device: test
- Creating L2CAP CoC socket
- Connecting to socket...
а затем выдает исключение IOException, сообщающее:

Код: Выделить всё

Failed to connect L2CAP channel
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
На моем периферийном устройстве BLE я регистрируюсь каждый раз, когда получаю событие BLE, и поэтому кажется, что Android даже не отправляет сообщение на мое периферийное устройство BLE. вот журналы моего периферийного устройства BLE (и да, я использую SDK nrf5):

Код: Выделить всё

 app: STARTING ADVERTISING
 app: BLE EVT: BLE_GAP_EVT_CONNECTED, EVT CODE: 16
 app: Connected
 app: BLE EVT: BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, EVT CODE: 35
 app: BLE EVT: BLE_GAP_EVT_DATA_LENGTH_UPDATE, EVT CODE: 36
 app: BLE EVT: BLE_GAP_EVT_PHY_UPDATE_REQUEST, EVT CODE: 33
(здесь есть задержка, как и в приложении для Android)

Код: Выделить всё

 app: BLE EVT: BLE_GAP_EVT_DISCONNECTED, EVT CODE: 17
 app: Disconnected
Я думаю, что проблема внутри стека Android API/BL, но где-то не указано, что это запрещено или не может сделать.


Подробнее здесь: https://stackoverflow.com/questions/798 ... an-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»