В последнее время я использую Trouble, работающий на HCI. Я новичок в этой области, но я обнаружил, что btvirt включен в bluez-test-tools. Это позволяет вам запускать виртуализированную среду BLE. Это может быть полезно для CI, тестирования и локальной разработки.
Я пробовал настроить это на своем MacOS сначала через QEMU (без опыта), а затем через Vagrant + Virtualbox. Я настроил виртуальную машину Ubuntu 24.x, на которую установил bluez и bluez-test-tools
Я написал себе README после вышеупомянутых шагов.
После этого вы можете перейти --provider=virtualbox .. это загрузит машину с Ubuntu 24.x
Вы можете войти в систему через vagrant ssh
После того, как вы вошли в систему, запустите sudo apt-get update и sudo apt-get install bluez bluez-test-tools
При этом должны быть установлены инструменты тестирования, такие как btvirt
Чтобы это работало, вам также понадобится sudo modprobe hci_vhci
Чтобы иметь правильные права доступа к файлам, вам потребуется sudo chmod 666 /dev/vhci. Используйте ls -l /dev/vhci, чтобы убедиться, что у него правильные разрешения.
Далее вы можете создать виртуальное устройство с помощью btvirt -l2 &
Проверить его активность hciconfig -a
Чтобы оно работало с нашими программами Rust (центральными и периферийными), вам необходимо отключить sudo hciconfig hci{X} down
Я скомпилировал примеры ble_bas_peripheral и ble_bas_central в папке example/linux и запустил их
sudo systemd-run --pty --uid=$(id -u) --gid=$(id -g) --same-dir --setenv RUST_LOG=info --setenv PATH --property "AmbientCapabilities=CAP_NET_ADMIN" ~/ble_bas_peripheral 0
Running as unit: run-u171.service
Press ^] three times within 1s to disconnect TTY.
[2025-12-23T12:38:01Z INFO trouble_example_apps::ble_bas_peripheral] Our address = Address { kind: AddrKind(1), addr: BdAddr([255, 143, 26, 5, 228, 255]) }
[2025-12-23T12:38:01Z INFO trouble_example_apps::ble_bas_peripheral] Starting advertising and GATT service
[2025-12-23T12:38:01Z INFO trouble_host::host] [host] using packet pool with MTU 251 capacity 16
[2025-12-23T12:38:01Z INFO trouble_host::host] [host] filter accept list size: 16
[2025-12-23T12:38:01Z INFO trouble_host::host] [host] setting txq to 1, fragmenting at 192
[2025-12-23T12:38:01Z INFO trouble_host::host] [host] configuring host buffers (1 packets of size 255)
[2025-12-23T12:38:01Z INFO trouble_host::host] [host] initialized
[2025-12-23T12:38:01Z INFO trouble_host::host] [host] Device Address 00:AA:01:00:00:00
[2025-12-23T12:38:01Z INFO trouble_example_apps::ble_bas_peripheral] [adv] advertising
sudo systemd-run --pty --uid=$(id -u) --gid=$(id -g) --same-dir --setenv RUST_LOG=info --setenv PATH --property "AmbientCapabilities=CAP_NET_ADMIN" ~/ble_bas_central 1
Running as unit: run-u173.service; invocation ID: fbd88e8204a649c6825b3e6bfdd4568b
Press ^] three times within 1s to disconnect TTY.
[2025-12-23T12:38:14Z INFO trouble_example_apps::ble_bas_central] Our address = Address { kind: AddrKind(1), addr: BdAddr([255, 143, 27, 5, 228, 255]) }
[2025-12-23T12:38:14Z INFO trouble_example_apps::ble_bas_central] Scanning for peripheral...
[2025-12-23T12:38:14Z INFO trouble_example_apps::ble_bas_central] Connecting
[2025-12-23T12:38:14Z INFO trouble_host::host] [host] using packet pool with MTU 251 capacity 16
[2025-12-23T12:38:14Z INFO trouble_host::host] [host] filter accept list size: 16
[2025-12-23T12:38:14Z INFO trouble_host::host] [host] setting txq to 1, fragmenting at 192
[2025-12-23T12:38:14Z INFO trouble_host::host] [host] configuring host buffers (1 packets of size 255)
[2025-12-23T12:38:14Z INFO trouble_host::host] [host] initialized
[2025-12-23T12:38:14Z INFO trouble_host::host] [host] Device Address 00:AA:01:01:00:01
[2025-12-23T12:38:14Z WARN trouble_host::host] Error connection complete event: Connection Failed to be Established / Synchronization Timeout
thread 'main' panicked at /Users/markdejong/Projects/trouble/examples/apps/src/ble_bas_central.rs:44:51:
called `Result::unwrap()` on an `Err` value: BleHost(Timeout)
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Ещё, что я пробовал
Подключитесь через sudo hcitool -i hci0 lecc 00:AA:01:01:00:01 .. это работает
Измените с AddrKind::RANDOM на AddrKind::PUBLIC .. без эффекта
Настройка параметров подключения и сканирования в центральном коде:
В последнее время я использую Trouble, работающий на HCI. Я новичок в этой области, но я обнаружил, что btvirt включен в bluez-test-tools. Это позволяет вам запускать виртуализированную среду BLE. Это может быть полезно для CI, тестирования и локальной разработки. Я пробовал настроить это на своем MacOS сначала через QEMU (без опыта), а затем через Vagrant + Virtualbox. Я настроил виртуальную машину Ubuntu 24.x, на которую установил bluez и bluez-test-tools Я написал себе README после вышеупомянутых шагов. [list] [*]После этого вы можете перейти --provider=virtualbox .. это загрузит машину с Ubuntu 24.x [*]Вы можете войти в систему через vagrant ssh [*]После того, как вы вошли в систему, запустите sudo apt-get update и sudo apt-get install bluez bluez-test-tools [*]При этом должны быть установлены инструменты тестирования, такие как btvirt [*]Чтобы это работало, вам также понадобится sudo modprobe hci_vhci [*]Чтобы иметь правильные права доступа к файлам, вам потребуется sudo chmod 666 /dev/vhci. Используйте ls -l /dev/vhci, чтобы убедиться, что у него правильные разрешения. [*]Далее вы можете создать виртуальное устройство с помощью btvirt -l2 & [*]Проверить его активность hciconfig -a [*]Чтобы оно работало с нашими программами Rust (центральными и периферийными), вам необходимо отключить sudo hciconfig hci{X} down [/list] Я скомпилировал примеры ble_bas_peripheral и ble_bas_central в папке example/linux и запустил их [code]sudo systemd-run --pty --uid=$(id -u) --gid=$(id -g) --same-dir --setenv RUST_LOG=info --setenv PATH --property "AmbientCapabilities=CAP_NET_ADMIN" ~/ble_bas_peripheral 0 Running as unit: run-u171.service Press ^] three times within 1s to disconnect TTY. [2025-12-23T12:38:01Z INFO trouble_example_apps::ble_bas_peripheral] Our address = Address { kind: AddrKind(1), addr: BdAddr([255, 143, 26, 5, 228, 255]) } [2025-12-23T12:38:01Z INFO trouble_example_apps::ble_bas_peripheral] Starting advertising and GATT service [2025-12-23T12:38:01Z INFO trouble_host::host] [host] using packet pool with MTU 251 capacity 16 [2025-12-23T12:38:01Z INFO trouble_host::host] [host] filter accept list size: 16 [2025-12-23T12:38:01Z INFO trouble_host::host] [host] setting txq to 1, fragmenting at 192 [2025-12-23T12:38:01Z INFO trouble_host::host] [host] configuring host buffers (1 packets of size 255) [2025-12-23T12:38:01Z INFO trouble_host::host] [host] initialized [2025-12-23T12:38:01Z INFO trouble_host::host] [host] Device Address 00:AA:01:00:00:00 [2025-12-23T12:38:01Z INFO trouble_example_apps::ble_bas_peripheral] [adv] advertising [/code] [code]sudo systemd-run --pty --uid=$(id -u) --gid=$(id -g) --same-dir --setenv RUST_LOG=info --setenv PATH --property "AmbientCapabilities=CAP_NET_ADMIN" ~/ble_bas_central 1 Running as unit: run-u173.service; invocation ID: fbd88e8204a649c6825b3e6bfdd4568b Press ^] three times within 1s to disconnect TTY. [2025-12-23T12:38:14Z INFO trouble_example_apps::ble_bas_central] Our address = Address { kind: AddrKind(1), addr: BdAddr([255, 143, 27, 5, 228, 255]) } [2025-12-23T12:38:14Z INFO trouble_example_apps::ble_bas_central] Scanning for peripheral... [2025-12-23T12:38:14Z INFO trouble_example_apps::ble_bas_central] Connecting [2025-12-23T12:38:14Z INFO trouble_host::host] [host] using packet pool with MTU 251 capacity 16 [2025-12-23T12:38:14Z INFO trouble_host::host] [host] filter accept list size: 16 [2025-12-23T12:38:14Z INFO trouble_host::host] [host] setting txq to 1, fragmenting at 192 [2025-12-23T12:38:14Z INFO trouble_host::host] [host] configuring host buffers (1 packets of size 255) [2025-12-23T12:38:14Z INFO trouble_host::host] [host] initialized [2025-12-23T12:38:14Z INFO trouble_host::host] [host] Device Address 00:AA:01:01:00:01 [2025-12-23T12:38:14Z WARN trouble_host::host] Error connection complete event: Connection Failed to be Established / Synchronization Timeout
thread 'main' panicked at /Users/markdejong/Projects/trouble/examples/apps/src/ble_bas_central.rs:44:51: called `Result::unwrap()` on an `Err` value: BleHost(Timeout) note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace [/code] Ещё, что я пробовал [list] [*]Подключитесь через sudo hcitool -i hci0 lecc 00:AA:01:01:00:01 .. это работает
[*]Измените с AddrKind::RANDOM на AddrKind::PUBLIC .. без эффекта
[*]Настройка параметров подключения и сканирования в центральном коде:
[/list] [code] let config = ConnectConfig { connect_params: ConnectParams { min_connection_interval: Duration::from_millis(80), max_connection_interval: Duration::from_millis(100), max_latency: 0, min_event_length: Duration::from_secs(0), max_event_length: Duration::from_secs(0), supervision_timeout: Duration::from_secs(8), }, scan_config: ScanConfig { active: true, timeout: Duration::from_secs(10), filter_accept_list: &[(target.kind, &target.addr)], phys: PhySet::M1, interval: Duration::from_millis(100), window: Duration::from_millis(100), }, }; [/code] Даже при таких довольно высоких настройках таймаута он напрямую возвращается с BleHost(Timeout)