Bluez 5 - инициировать подключение avrcp к iPhone от Bluez

Bluez 5.28

Цель - управлять пропуском треков iOS и программным путем инициировать соединение с Bluez. Не хочу a2dp.

Все работает нормально, если я инициирую соединение с iPhone/iPad (зайдите в настройки BT, нажмите на устройство Pi), чего я хочу избежать и не нужно возиться с телефоном. (настройка машины с Пи). У меня есть контроль, отслеживать метаданные и т. Д.

Делать connect xx:xx:xx:xx:xx:xx в bluetoothctl дает:

 a2dp-source profile connect failed for 6C:70:9F:7E:EF:A8: Protocol not available

Хорошо. Нужны модули pulseaudio +. Я установил это, и теперь я могу подключиться из Bluez. Однако теперь он добавляет и автоматически выбирает Bluez в качестве устройства вывода звука. Не хотите этого и придется снова возиться с телефоном. Только хочу контроль. Хотя я предпочитаю это, если вообще ничего, так как я могу изменить устройство вывода из любой точки ОС и не переходить к настройкам.

Что ж, позвольте мне отключить a2dp все вместе и посмотреть.

/usr/libexec/bluetooth/bluetoothd -d -C -n --noplugin=a2dp

или же

/usr/libexec/bluetooth/bluetoothd -d -C -n --plugin=avrcp

Одинаковый результат для обоих вышеперечисленных

bluetoothd[14176]: src/device.c:connect_profiles() /org/bluez/hci0/dev_6C_70_9F_7E_EF_A8 (all), client :1.57
bluetoothd[14176]: src/device.c:connect_profiles() Resolving services for /org/bluez/hci0/dev_6C_70_9F_7E_EF_A8
bluetoothd[14176]: src/adapter.c:connected_callback() hci0 device 6C:70:9F:7E:EF:A8 connected eir_len 19
bluetoothd[14176]: src/device.c:search_cb() 6C:70:9F:7E:EF:A8: No service update
bluetoothd[14176]: src/device.c:device_svc_resolved() /org/bluez/hci0/dev_6C_70_9F_7E_EF_A8 err 0
bluetoothd[14176]: src/device.c:connect_profiles() /org/bluez/hci0/dev_6C_70_9F_7E_EF_A8 (all), client :1.57
bluetoothd[14176]: src/adapter.c:dev_disconnected() Device 6C:70:9F:7E:EF:A8 disconnected, reason 3
bluetoothd[14176]: src/adapter.c:adapter_remove_connection() 
bluetoothd[14176]: plugins/policy.c:disconnect_cb() reason 3
bluetoothd[14176]: src/adapter.c:bonding_attempt_complete() hci0 bdaddr 6C:70:9F:7E:EF:A8 type 0 status 0xe
bluetoothd[14176]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
bluetoothd[14176]: src/device.c:device_bonding_failed() status 14
bluetoothd[14176]: src/adapter.c:resume_discovery() 

Опять же, все работает именно так, как я хочу, если я захожу в настройки Bluetooth и нажимаю на устройство на iPhone. Проблема в том, что соединение с Bluez происходит.

Мне кажется, что iOS запрашивает a2dp, и я не уверен, как заставить Bluez обойти это или остановить рекламу, которая доступна. Я знаю, что есть варианты jaibreak для отключения профилей, но я стараюсь держать его в чистоте.

Я также экспериментировал с настройкой HID, которая работала, чтобы посылать нажатия клавиш, но затем она скрывала экранную клавиатуру.

Спасибо!

1 ответ

Решение

Должен сделать то, что я хочу, с 5.28, построенным из исходного кода, но пришлось немного отредактировать.

Не уверен ни в каких побочных эффектах, но моя цель довольно узка, поэтому мне все равно.

редактировать profiles/audio/avrcp.c

ДОБАВЛЯТЬ

.auto_connect = true,в

static struct btd_profile avrcp_target_profile = { @ line 3863

а также

static struct btd_profile avrcp_controller_profile = { @ line 3946

make && make install

Завершить блоки

static struct btd_profile avrcp_target_profile = {
        .name           = "audio-avrcp-target",
        .remote_uuid    = AVRCP_TARGET_UUID,
        .device_probe   = avrcp_target_probe,
        .device_remove  = avrcp_target_remove,
        .auto_connect   = true,
        .connect        = avrcp_connect,
        .disconnect     = avrcp_disconnect,
        .adapter_probe  = avrcp_target_server_probe,
        .adapter_remove = avrcp_target_server_remove,
};

...

static struct btd_profile avrcp_controller_profile = {
        .name           = "avrcp-controller",
        .remote_uuid    = AVRCP_REMOTE_UUID,
        .device_probe   = avrcp_controller_probe,
        .device_remove  = avrcp_controller_remove,
        .auto_connect   = true,
        .connect        = avrcp_connect,
        .disconnect     = avrcp_disconnect,
        .adapter_probe  = avrcp_controller_server_probe,
        .adapter_remove = avrcp_controller_server_remove,
};
Другие вопросы по тегам