NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Bluetooth reproduktory - automatické připojení po startu systému

Aktivity
Avatar
nalimleinad
Člen
Avatar
nalimleinad:14.6.2017 9:48

Zdravím, snažím se nastavit automatické připojení a následné přehrávání hudby do bluetooth reproduktorů v Raspberry Pi.

Nainstaloval jsem si tyto balíčky:

apt-get install pi-bluetooth -y
apt-get install pulseaudio -y
apt-get install pulseaudio-module-bluetooth -y
apt-get install bluez -y

a přidělil skupiny přes

usermod -a -G lp pi
gpasswd -a pi bluetooth

Poté spustím

pulseaudio --start

a následně jdu do rozhraní bluetoothctl, kde zadám tyto příkazy

power on
agent on
default-agent
scan on

Najde mi to mé reproduktory a následuje

pair 1A:03:26:B1:04:00
trust 1A:03:26:B1:04:00
connect 1A:03:26:B1:04:00

nakonec ještě dodám

pacmd set-default-sink bluez_sink.1A_03_26_B1_04_00

Vše při ručním zadání funguje.

Nyní to potřebuji zautomatizovat po startu systému a tak jsem si do /etc/rc.local dal toto:

sleep 5

pulseaudio --start

sleep 5

bluetoothctl <<EOF
power on
agent on
default-agent
connect 1A:03:26:B1:04:00
EOF

sleep 5

pacmd set-default-sink bluez_sink.1A_03_26_B1_04_00

Bohužel vždy dostanu chybu viz. screenshot, že není zaregistrován žádný agent.
Od reproduktorů slyším hlášku "Bluetooth paired", avšak zařízení připojené není.

Napadá vás nějaké řešení ?

 
Odpovědět
14.6.2017 9:48
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na nalimleinad
Adam Ježek:14.6.2017 10:46

Nemělo by se to pustit až po ukončení bootování?

Nahoru Odpovědět
14.6.2017 10:46
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
mkub
Tvůrce
Avatar
Odpovídá na nalimleinad
mkub:14.6.2017 12:46

mozno ti v tomto scriptiku chyba:

pair 1A:03:26:B1:04:00
trust 1A:03:26:B1:04:00

a na zaciatok by som este pridal:

#!/bin/sh

e este vy som ten script upravil tak, aby pri spustani by zaviedol vsetko potrebne a pri vypinani a restarte aby saq vypinal (cize aby sa daol pouzit /init.d/script.sh start|stop|restart
viac na tvirbu initd scriptov najdes v niektorom z ukazkovych skriptikoch a doplnil by som zavislosti na inych demonoch, ktore tento script spusta

 
Nahoru Odpovědět
14.6.2017 12:46
Avatar
nalimleinad
Člen
Avatar
Odpovídá na mkub
nalimleinad:14.6.2017 12:59

Na začátku samozřejmě mám

#!/bin/sh

postoval jsem sem jen výřezy kódu.

A trust stačí dát jen jednou, pokud se jedná o stále to samé zařízení, ne ?
Pak by dle mého mělo stačit právě jen to "connect". A takto mi to i funguje při ručním spuštění. S init.d scriptama umím, jen to nijak potom nebudu potřebovat, jde mi jen o prvotní spuštění při startu, nijak se to potom ovládat nebude.

Závislosti na jiných daemonech myslíš něco konkrétního ? Nebo víš jak tyto závislosti zjistit ?

 
Nahoru Odpovědět
14.6.2017 12:59
Avatar
mkub
Tvůrce
Avatar
Odpovídá na nalimleinad
mkub:14.6.2017 13:23

mam na mysli zavislost na pulseaudio, bluetoothd, bluez, aby sa tvij script spustil az po spusteni vsetkych tych demonov, ktore tvoj script vyuziva
je mozne, ze tvoj script sa spusta este skor, nez su spustene vsetky potrebne demony

 
Nahoru Odpovědět
14.6.2017 13:23
Avatar
nalimleinad
Člen
Avatar
Odpovídá na mkub
nalimleinad:14.6.2017 13:32

A máš nějakou konkrétní radu, co si kde ohlídat ? Netuším, které věci mám kde hledat a hlídat.

 
Nahoru Odpovědět
14.6.2017 13:32
Avatar
nalimleinad
Člen
Avatar
Odpovídá na Adam Ježek
nalimleinad:14.6.2017 13:55

Co jsem četl, tak rc.local by se měl spouštět ať na konci zavedení všeho. Takže se v podstatě spouští až na konci bootování.

 
Nahoru Odpovědět
14.6.2017 13:55
Avatar
nalimleinad
Člen
Avatar
nalimleinad:14.6.2017 14:09

Každopádně teď jsem si zkusil spustit rc.local ručně a opět mi píše chybu že není k dispozici žádný agent a když jsem si poté spustil rozhraní bluetoothctl ručně, všiml jsem si, že po zadání příkazů ručně dostávám nějakou odpověď, kdežto při spuštění scriptu s příkazy za sebou to nic nevypíše, proto má otázka teď zní:
Jsou ty příkazy vůbec odeslány/potvrzeny ? Nebo popř. můžu je nějak nechat odeslat ? (něco jako "prikaz \n")

Editováno 14.6.2017 14:10
 
Nahoru Odpovědět
14.6.2017 14:09
Avatar
nalimleinad
Člen
Avatar
nalimleinad:14.6.2017 14:10

Viz. screen.

 
Nahoru Odpovědět
14.6.2017 14:10
Avatar
mkub
Tvůrce
Avatar
Odpovídá na nalimleinad
mkub:14.6.2017 23:21

podla apt sprvcu balikov odhadujem, ze ficis na deb based Linuxe...
vytvor si spustaci script podla nejakeho ukazkoveho scriptu v danom adresari, hod ho do /etc/init.d, v adresari /etc/rc3.d vytvot nan link vo formate SXXscript, kde XX nahradis poradovym cislom vacsim, nez su sluzby, ktore potrebujes k svojmu scriptu (kludne moze byt vo formate S99script
S znaci, ze sa spusti pri starte v danom runleveli, 99 znaci poradie scriptu (cize po spusteni vsetkych predchadzajucich scriptov, cize niekedy na konci) a script je nazov tvojho vlastneho scriptu

alebo, ak pouzivas SystemD bazed distribuciu, tak odporucam vytvorit script pre SystemD, totiz SystemD svoje scripty nespusti, kym nie su vsetky demony spustene, na ktorych dany script zavisi, az po ich spusteni sa spusti dany script

 
Nahoru Odpovědět
14.6.2017 23:21
Avatar
mkub
Tvůrce
Avatar
Odpovídá na nalimleinad
mkub:14.6.2017 23:26

a takisto odporucam aj sa pozriet do /var/log, kde sa loguje beh sluzieb

 
Nahoru Odpovědět
14.6.2017 23:26
Avatar
nalimleinad
Člen
Avatar
Odpovídá na mkub
nalimleinad:15.6.2017 11:02

Zkusil jsem tedy ještě způsob přes init.d, avšak nemám z toho žádný output kromě:

root@3GL0874:~# systemctl | grep btconnect
btconnect.service                                                                                       loaded active running   LSB: Connects to the bluetooth speakers

A samozřejmě chová se to stejně jako přes rc.local. Jak jsem psal výše - nemůže být problém v tom, že se ty příkazy neodešlou přes ten script, když se podíváš na screenshot ?

 
Nahoru Odpovědět
15.6.2017 11:02
Avatar
nalimleinad
Člen
Avatar
nalimleinad:15.6.2017 12:50

Tak jsem ještě zkusil journalctl a dostal jsem:

Jun 15 10:43:53 3GL0874 btconnect[430]: Starting btconnect
Jun 15 10:44:14 3GL0874 btconnect[430]: W: [pulseaudio] main.c: This program is not intended to be run as root (unless --system is specified).
Jun 15 10:44:15 3GL0874 pulseaudio[633]: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Jun 15 10:44:15 3GL0874 pulseaudio[633]: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Jun 15 10:44:15 3GL0874 pulseaudio[633]: org.bluez.Manager.GetProperties() failed: org.freedesktop.DBus.Error.UnknownMethod: Method "GetProperties" with signature "" on interface "org.bluez.Manager" doesn't exist
Jun 15 10:44:25 3GL0874 btconnect[430]: [105B blob data]
Jun 15 10:44:25 3GL0874 btconnect[430]: [77B blob data]
Jun 15 10:44:25 3GL0874 btconnect[430]: [bluetooth]# power on
Jun 15 10:44:25 3GL0874 btconnect[430]: [bluetooth]# agent on
Jun 15 10:44:25 3GL0874 btconnect[430]: [bluetooth]# default-agent
Jun 15 10:44:25 3GL0874 btconnect[430]: No agent is registered
Jun 15 10:44:25 3GL0874 btconnect[430]: [bluetooth]# connect 1A:03:26:B1:04:00
Jun 15 10:44:25 3GL0874 btconnect[430]: Attempting to connect to 1A:03:26:B1:04:00
Jun 15 10:44:25 3GL0874 btconnect[430]: [61B blob data]
Jun 15 10:44:25 3GL0874 btconnect[430]: [91B blob data]
Jun 15 10:44:25 3GL0874 btconnect[430]: [26B blob data]
Jun 15 10:44:25 3GL0874 btconnect[430]: (bluetoothctl:675): GLib-CRITICAL **: Source ID 26 was not found when attempting to remove it

Takže v podstatě opět to samé.

 
Nahoru Odpovědět
15.6.2017 12:50
Avatar
mkub
Tvůrce
Avatar
Odpovídá na nalimleinad
mkub:15.6.2017 13:27

scripty pre SystemD su uplne ine, nez pre init.d, aj ked dokaze spracovat aj init.d scripty

na roote, abclinuxu, ci linuxexprese by mal byt k systemd aj serialik

 
Nahoru Odpovědět
15.6.2017 13:27
Avatar
nalimleinad
Člen
Avatar
Odpovídá na mkub
nalimleinad:15.6.2017 18:05

Tím chceš říct, že pokud to nefunguje přes službu (init.d) nebo přes rc.local, tak by to přes systemd fungovat mohlo ? Nebo to chápu špatně ?

 
Nahoru Odpovědět
15.6.2017 18:05
Avatar
mkub
Tvůrce
Avatar
Odpovídá na nalimleinad
mkub:16.6.2017 1:59

rc.locval je cast z InitD a InitD zavadza sluzby a spusta init scripty rad za radom, najprv pri spustani sa spustia linky KXX..., az potom sa spustaju SXX...
a pokial nemas SXX pre dane procesy v poradi, podla daneho cisla, cize podla abecedy

ale SystemD k spustaniu sluzieb pristupuje uplne inac, on sa pozrie pri spusteni sluzby, na zavislosti, ak je dana sluzba zavisla od inej sluzby a nie je este spustena, tak pocka, kym sa vsetky sluzby nespustia, na ktorych je zavisla a az potom spusti ju a zaroven SystemD umoznuje paralelne spustanie sluzieb

trosku som to zjednodihsil, viac o tom najdes v clankoch na serveroch, co som ti odkazal, tsam sa viac venuju init procesom

 
Nahoru Odpovědět
16.6.2017 1:59
Avatar
nalimleinad
Člen
Avatar
Odpovídá na mkub
nalimleinad:19.6.2017 14:24

Zkusil jsem tedy nastavit autostart přes systemd a chová se to úplně stejně jako v předchozích případech přes rc.local nebo init.d.

Systemd service file, které využívám je:

[Unit]
Description=Connect to the bluetooth speaker
After=dbus-org.bluez.service sound.taget bluetooth.target bluetooth.service pulseaudio.socket

[Service]
Type=oneshot
ExecStart=/home/btconnect

[Install]
WantedBy=multi-user.target

Výstup z journalctl:

root@3GL0874:~# journalctl | grep btconnect
Jun 19 14:17:21 3GL0874 systemd[1]: [/etc/systemd/system/btconnect.service:3] Fa                                                                                                                                                             iled to add dependency on sound.taget, ignoring: Invalid argument
Jun 19 14:17:27 3GL0874 btconnect[431]: W: [pulseaudio] main.c: This program is                                                                                                                                                              not intended to be run as root (unless --system is specified).
Jun 19 14:17:51 3GL0874 btconnect[431]: [105B blob data]
Jun 19 14:17:51 3GL0874 btconnect[431]: [77B blob data]
Jun 19 14:17:51 3GL0874 btconnect[431]: [bluetooth]# power on
Jun 19 14:17:51 3GL0874 btconnect[431]: [bluetooth]# agent on
Jun 19 14:17:51 3GL0874 btconnect[431]: [bluetooth]# default-agent
Jun 19 14:17:51 3GL0874 btconnect[431]: No agent is registered
Jun 19 14:17:51 3GL0874 btconnect[431]: [bluetooth]# connect 1A:03:26:B1:04:00
Jun 19 14:17:51 3GL0874 btconnect[431]: Attempting to connect to 1A:03:26:B1:04:                                                                                                                                                             00
Jun 19 14:17:51 3GL0874 btconnect[431]: [bluetooth]# quit
Jun 19 14:17:51 3GL0874 btconnect[431]: [61B blob data]
Jun 19 14:17:51 3GL0874 btconnect[431]: [91B blob data]
Jun 19 14:18:01 3GL0874 btconnect[431]: [26B blob data]

Stále si myslím, že by to chtělo spíš přijít na to, zda-li se ty příkazy, které se snažím odeslat opravdu do bluetoothctl odesílají, protože mi přijde že ne. Ale jak jinak tomu interfacu ty příkazy předat než přes pipe nebo EOF ?

 
Nahoru Odpovědět
19.6.2017 14:24
Avatar
nalimleinad
Člen
Avatar
nalimleinad:19.6.2017 14:41
root@3GL0874:~# echo -e "power on \nquit" | bluetoothctl
[NEW] Controller B8:27:EB:2F:B3:52 3GL0874 [default]
[NEW] Device 1A:03:26:B1:04:00 JPM2021
[bluetooth]# power on
[bluetooth]# quit
[DEL] Controller B8:27:EB:2F:B3:52 3GL0874 [default]
root@3GL0874:~# bluetoothctl
[NEW] Controller B8:27:EB:2F:B3:52 3GL0874 [default]
[NEW] Device 1A:03:26:B1:04:00 JPM2021
[bluetooth]# power on
Changing power on succeeded
[bluetooth]# exit
[DEL] Controller B8:27:EB:2F:B3:52 3GL0874 [default]

I když to napíšu takto a) přes automatické odeslání příkazu, b) ručně, je zde vidět při ručním odeslání ta odpověď a to si myslím, že je hlavní kámen úrazu, ale co s tím ?

 
Nahoru Odpovědět
19.6.2017 14:41
Avatar
nalimleinad
Člen
Avatar
nalimleinad:19.6.2017 15:11

Zrovna jsem narazil na jeden post, kde to někomu také nefungovalo a někdo na to napsal toto:

@Lukas1 - I guess this is really because bluetoothctl works asynchronously. In order to script something more complex you need to somehow wait for each command to complete.

Nějaký nápad ? :)

 
Nahoru Odpovědět
19.6.2017 15:11
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na nalimleinad
Adam Ježek:19.6.2017 15:17

Zkus použít wait po každém příkazu, měl by počkat na dokončení.
A nebo to zprasit přes sleep

Nahoru Odpovědět
19.6.2017 15:17
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
nalimleinad
Člen
Avatar
Odpovídá na Adam Ježek
nalimleinad:19.6.2017 15:31

A to ? Do bluetoothctl interfacu wait dát nemůžu.

[bluetooth]# wait
Invalid command

A jakmile "vylezu" z interfacu, tak se ukončí a s tím to i killne právě probíhající příkaz. Takže moc nepřipadá v úvahu napsat to ve stylu

bluetoothctl <<EOF
power on
EOF

sleep 5

bluetoothctl <<EOF
agent on
EOF

sleep 5

bluetoothctl <<EOF
default-agent
EOF
 
Nahoru Odpovědět
19.6.2017 15:31
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na nalimleinad
Adam Ježek:19.6.2017 23:14

Funguje to když interfacs spustíš, zadáš jeden příkaz, počkáš, interface ukončíš, opět spustíš, zadáš druhý atd.?
Tohle by se v bashi mělo dát načasovat.

Teď mě ještě napadá, jestli si dobře pamatuju, v pythonu se dá připojit k terminálu a sypat do něj příkazy nezávisle na tom co terminál dělá, zítra se na to kouknu.

Nahoru Odpovědět
19.6.2017 23:14
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
nalimleinad
Člen
Avatar
Odpovídá na Adam Ježek
nalimleinad:20.6.2017 8:13

No já nemám přes script jak počkat... kdybych jak počkat měl, tak by to nejspíš fungovalo, ale pokud napíšu do interfacu script a ukončím ho, tak to nepočká ani na splnění toho příkazu a hned se ukončí.

 
Nahoru Odpovědět
20.6.2017 8:13
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 23 zpráv z 23.