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,
};