Как создать экземпляр сокета L2Cap в Android?
Я вижу, что сокет Bluetooth может иметь тип TYPE_L2CAP, но конструктор для BluetoothSocket кажется закрытым, и я могу найти только способ создания экземпляра сокета типа RFCOMM. Как я могу получить и использовать сокет L2CAP? Это на самом деле поддерживается Android?
1 ответ
ОБНОВЛЕНИЕ 10/2018
Получил информацию, что L2CAP CoC будет поддерживаться начиная с Android Q.
К сожалению, я не могу привести официальные источники для этого.
СТАРЫЙ ОТВЕТ
Я опубликую свои результаты, надеясь помочь другим и, возможно, получу подсказки, если что-то упустил.
TL; DR: похоже, я не могу
Нет способа получить сокет L2CAP CoC с открытым API
На этой странице документации Android утверждается, что "каналы, ориентированные на подключение LE" (каналы l2cap) доступны начиная с Android 8.0. В Android API есть BluetoothSocket
класс, который может иметь тип L2_CAP
, Но нет способа получить экземпляр BluetoothSocket с таким типом из-за частной видимости элементов этого класса. Вот и все для публичного API Java Java: застрял.
Так?
Копаем под поверхностью общедоступного java API. Исходный код для Android версии 8+ предлагает способ получить сокет l2cap, который развивается во времени:
createL2capSocket
метод в андроид 8 ( источник)createL2capCoCSocket
метод в андроид 9 ( источник)createL2capChannel
в ветке master проекта android (будущий выпуск, наверное?) ( источник)
Но в каждой выпущенной версии этот код помечен @hide
аннотация, что означает, что ни один из этих методов на самом деле не доступен для использования.
До Android 9 скрытые методы были, по крайней мере, доступны, на некоторых устройствах, с отражением Java. Вот как мы смогли протестировать на Android 8, с ужасными результатами.
Начиная с 9-й версии ОС, это больше не возможно: платформа активно блокирует попытки неправомерного доступа к API.
Более того..
Помимо того, что методы создания экземпляра сокета не видны, есть свидетельства незрелости API, а также отсутствия методов настройки параметров соединения l2cap.
Собираетесь родным?
У меня нет опыта работы с NDK, но я думаю, что было бы возможно написать код на c, чтобы использовать те же функции низкого уровня, которые используются скрытыми методами. Если android не блокирует такого рода использование, что вполне вероятно. Также это использование будет противоречить обычному использованию стека bluetooth на телефоне: обычное использование обычно фильтруется службой Android. Обход этого сервиса может привести к непредсказуемым последствиям, и он не подходит для продуктивного приложения.
Заверните
Тестирование на Android 8.1 с отражением привело к очень неудовлетворительным результатам. Заявление о том, что "LE-ориентированные каналы" доступны начиная с Android 8.0, не может быть подтверждено, несмотря на все усилия.
В более новых версиях скрытые методы создания каналов l2cap развиваются, и недавно скрытая аннотация была удалена. Трудно сказать, что это значит с точки зрения времени, прежде чем мы сможем иметь в руках устройство, поддерживающее этот API. Вполне вероятно, что пройдут годы, прежде чем каналы l2cap станут надежными и доступными для значительной части пользователей Android.