Используя фреймворк kura, как я могу указать тип адреса "случайный статический" при подключении к устройству BLE
Я пытаюсь создать пакет OSGi, который будет установлен на шлюз eurotech (reliagate 10 05). Этот пакет по существу соединит шлюз с устройством BLE.
Для этого я использую фреймворк, предоставленный eurotech, который называется Everyware™ Software Framework (ESF), который добавляет дополнительный слой поверх фреймворка kura v1.2.0.
Уловка в том, что устройство BLE принимает только случайный статический тип адреса.
Мне удалось вручную подключить шлюз к устройству BLE с помощью следующих команд в консоли:
hcitool -i hci0 lecc --random <BD_ADDR>
затем
gatttool -i hci0 -b <BD_ADDR> --interactive
Это отлично работает. Сложная часть - когда я пытаюсь сделать то же самое в коде, используя среду ESF/kura.
Вот фрагмент из примера, который я использую, который я нашел на этой странице
public boolean connect(String adapterName) {
this.bluetoothGatt = this.device.getBluetoothGatt();
boolean connected = false;
try {
connected = this.bluetoothGatt.connect(adapterName);
} catch (KuraException e) {
logger.error(e.toString());
}
if (connected) {
this.bluetoothGatt.setBluetoothLeNotificationListener(this);
this.isConnected = true;
return true;
} else {
// If connect command is not executed, close gatttool
this.bluetoothGatt.disconnect();
this.isConnected = false;
return false;
}
}
Вот список некоторых объектов, которые образец использует для сканирования и установления соединения:
org.eclipse.kura.bluetooth.BluetoothAdapter;
org.eclipse.kura.bluetooth.BluetoothDevice;
org.eclipse.kura.bluetooth.BluetoothGattSecurityLevel;
org.eclipse.kura.bluetooth.BluetoothGattService;
org.eclipse.kura.bluetooth.BluetoothLeScanListener;
org.eclipse.kura.bluetooth.BluetoothService;
org.eclipse.kura.bluetooth.BluetoothDevice;
org.eclipse.kura.bluetooth.BluetoothGatt;
org.eclipse.kura.bluetooth.BluetoothGattCharacteristic;
org.eclipse.kura.bluetooth.BluetoothLeNotificationListener;
Поэтому я искал через документацию, но ничего не нашел.
Тем не менее, один интересный пост SO упоминает код команды для отправки на устройство.
Я нашел метод в рамках Кура, который может помочь. Вот подпись:
void ExecuteCmd(java.lang.String ogf, java.lang.String ocf, java.lang.String parameter)
но я не смог выяснить поле группы OpCode (ogf), связанное с полем команды OpCode (ocf), в какой-либо документации (я просмотрел ~2300 страниц спецификации ядра Bluetooth 4.0). Если кто знает, где искать...:)
В конце концов, возникает вопрос: есть ли способ установить тип адреса случайным (как с помощью команды hcitool) с помощью фреймворка kura? Или я полностью введен в заблуждение?:/
В любом случае, я действительно новичок в kura и ble экосистемах, так что, извините, если это кажется очевидным, но я чувствую, что у меня заканчивается вдохновение и я могу полностью использовать руку!
PS: Поздравляю, если вы сделали это до конца!
2 ответа
Хорошо, так что для тех, кто в будущем окажется на моем месте, я только что получил ответ от службы поддержки Eurotech.
Уважаемый г-н Карнейру,
[...]
Что касается случайного BD_ADDR, это конфигурация устройства BLE. Итак, ваше устройство BLE объявляет адрес произвольного типа, а не общедоступный, и вы должны указать тип адреса в строке подключения, как вы уже сделали. К сожалению, текущий API-интерфейс Bluetooth Kura не позволяет указать тип адреса в строке подключения. Мы разрабатываем новый набор API для BLE, который будет доступен для предварительного просмотра в следующем выпуске Kura/ESF, но Reliagate 10-05 пока не будет их поддерживать.
Хаха лол. Кажется, что Kura просто запускает процесс gatttool, отправляет команды в тексте и анализирует вывод как его интерфейс...
Вот где это указано, используя адрес в качестве параметра: https://github.com/eclipse/kura/blob/0339ac787f90debdfc270c1dee0c16de16ea6f7e/kura/org.eclipse.kura.linux.bluetooth/src/main/java/org/eclipse/kura/linux/bluetooth/util/BluetoothUtil.java#L319. К сожалению, разработчики Kura, похоже, упустили из виду, что в стандарте BLE есть что-то под названием "случайный адрес", и я не вижу, как это можно обойти, используя текущий API.