Jak podłączyć i wysłać dane do portu szeregowego Bluetooth w systemie Linux?

30

Próbuję skonfigurować wirtualny port szeregowy za pośrednictwem adaptera USB-Bluetooth w systemie Linux i wysłać do niego wiadomość za pośrednictwem urządzenia z systemem Android. Jestem na jądrze 3.6. Jestem w stanie sparować się z urządzeniem z powodzeniem za pomocą gnome-bluetooth, a także mogę wysyłać do niego pliki.

Aby skonfigurować port szeregowy, najpierw dodaję kanał z profilem SP do mojego adaptera:

sdptool add --channel=22 SP

Następnie nazywam „Listen” za pomocą rfcomm:

rfcomm listen /dev/rfcomm0 22

który się blokuje

Waiting for connection on channel 22

Najwyraźniej rfcomm utworzy / dev / rfcomm0 po udanym połączeniu. Gdy to nastąpi, chciałbym użyć czegoś takiego jak cutecom do wysyłania wiadomości tam i z powrotem na podłączone urządzenie.

Na moim urządzeniu z Androidem otwieram terminal Bluetooth SPP (jest ich kilka, próbowałem kilka różnych) i próbuję się połączyć. Wszystkie zawodzą.

Biorąc pod uwagę, że mogę z powodzeniem sparować i wysłać pliki bez żadnych problemów, wiem, że parowanie i komunikacja Bluetooth działa.

Nie jestem zbyt pewien, co jeszcze mogę spróbować. Użyłem „sdptool Browse” na moim urządzeniu lokalnym i urządzeniu z Androidem, aby upewnić się, że nie ma żadnych konfliktów kanałów RFCOMM.

Pris
źródło

Odpowiedzi:

21

Wydaje mi się, że teraz to działa. Bluetooth wydaje się nieco wybredny. W pełni podsumowuję moje kroki, na wypadek gdyby ktoś inny uznał to za przydatne (chociaż w zasadzie to, co próbowałem na początku). To jest dla Androida JB (4.2.2) na Nexus 4 i Arch Linux 3.6.7-1, z bluez 4.101 na Gnome 3.6 (w / gnome-bluetooth).

(ten krok może nic nie zrobić) Wyłącz Bluetooth na Androidzie i odłącz adapter USB / Bluetooth od komputera z systemem Linux (lub jeśli masz wbudowany, zresetuj go za pomocą hcitool devname reset)

Podłącz / włącz adapter Bluetooth w systemie Linux. Upewnij się, że twój adapter jest widoczny (można go ustawić w gnome-bluetooth - powinna pojawić się ikona zasobnika systemowego bluetooth).

Włącz bluetooth na swoim urządzeniu z Androidem. Użyj Androida, aby sparować z adapterem (nie byłem w stanie sparować odwrotnie z Linuksem). Pojawi się okno dialogowe z prośbą o klucz. Wprowadź dowolny PIN. Gnome powinien wyświetlić powiadomienie z prośbą o klucz; wprowadź ten sam PIN, który podałeś wcześniej. W tym momencie należy sparować urządzenie z Androidem i klucz.

W systemie Linux otwórz terminal i sprawdź, jakie usługi Bluetooth są dostępne, wpisując

sdptool browse local

Jeśli masz już usługę portu szeregowego, zanotuj, jaki to kanał. Jeśli nie, możesz dodać usługę:

sdptool add --channel=22 SP

Teraz słuchaj na tym kanale za pomocą rfcomm:

sudo rfcomm listen /dev/rfcomm0 22

rfcomm zablokuje się, nasłuchując połączenia z komunikatem typu

Waiting for connection on channel 22

W systemie Android korzystałem z aplikacji BlueTerm ( http://pymasde.es/blueterm/ , dostępnej również bezpłatnie w sklepie Google Play), ale każda podobna aplikacja powinna działać. Otwórz BlueTerm, przejdź do opcji> Podłącz urządzenie: wybierz sparowany adapter.

Mamy nadzieję, że aplikacja była w stanie się połączyć. Zobaczysz dodatkową weryfikację w terminalu, w którym zablokowałeś słuchanie z komunikatem:

Waiting for connection on channel 22
Connection from 22:22:22:22:22:22 to /dev/rfcomm0
Press CTRL-C for hangup

Wszystko, co wpiszesz w aplikacji BlueTerm, powinno być w katalogu / dev / rfcomm0. Podczas pisania możesz wyświetlać różne rzeczy, otwierając nowy terminal i wykonując coś takiego:

cat /dev/rfcomm0
Pris
źródło
1
Dobra odpowiedź. Mam go do pracy z Ubuntu 16 / Bluez 5 i ta informacja: bbs.archlinux.org/viewtopic.php?id=201672 .
wojciii
10

Poniższe kroki dla mnie zadziałały:

Najpierw musisz sparować urządzenia. Parowanie jest stosunkowo łatwe. Zadzwonię do klienta (który zaczyna mówić) i serwera (który odpowiada)

Musisz skonfigurować serwer wcześniej: po stronie serwera (jako root):

sdptool add --channel=3 SP
mknod -m 666 /dev/rfcomm0 c 216 0
rfcomm watch /dev/rfcomm0 3 /sbin/agetty rfcomm0 115200 linux

Po stronie klienta (jako root):

sdptool add --channel=3 SP
rfcomm connect /dev/rfcomm0 [SERVER_ADDR] 3

Teraz, aby otworzyć terminal szeregowy na kliencie:

screen /dev/rfcomm0 115200

Komentarze:

Po wywołaniu ostatniego polecenia rfcomm connect ... na kliencie urządzenie /dev/rfcomm0zostanie utworzone i powiązane z serwerem /dev/recomm0. To reprezentuje połączenie szeregowe między nimi

Ostatnie polecenie serwera: rfcomm watch.... „nasłuchuje” połączeń przychodzących. W przypadku utraty połączenia polecenie uruchomi ponownie nowy stan „nasłuchiwania”.

ismaia
źródło
1
Odpowiedź udzielona przez ismaia prawie cię tam prowadzi. Musisz jednak pamiętać, że nowszy stos bluez wymaga specjalnej --compatopcji, w przeciwnym razie dodanie SP może się nie powieść. Zobacz tutaj . Więc dostosuj / popraw skrypty startowe systemd / initd, aby --compattam były.
blacktofu
5

Rozwiązałem to z niewielką zmianą poleceń Pris. Daj im szansę, jeśli ktoś nadal ma problemy z ustanowieniem połączenia rfcomm.

sudo service bluetooth restart

To ^ zapewnia, że ​​zaczynasz z czystym kontem za każdym razem, gdy próbujesz skonfigurować połączenie.

rfcomm add --channel=<a_channel_#> SP

Ten numer kanału powinien być inny niż jakikolwiek aktualnie przypisany kanał.

(OPCJONALNIE) Aby sprawdzić kanały:

sdptool browse local | grep Channel

Nie jestem pewien, dlaczego to następne polecenie jest potrzebne, ale zadziałało dla mnie.

rfcomm release 0

Następnie nasłuchuj nadchodzących połączeń:

rfcomm watch 0 <a_channel_#>

UWAGA: adres bt MAC w /etc/bluetooth/rfcomm.conf, ale adres MAC bt telefonu. Również kanał w tym pliku musi być taki sam, jak kanał wybrany dla a_channel_ #.

Kiedy to wszystko zrobiłem, użyłem emulatora terminali bt w telefonie, aby to wszystko sprawdzić.

Ethan Plummer
źródło
0

Próbowałem różnych narzędzi bluetooth i trudno było znaleźć prawidłową sekwencję poleceń do łączenia i wymiany danych z modułem bluetooth. Spróbuj użyć rfcomm i minicom:

To jest mój /etc/bluetooth/rfcomm.conf

rfcomm0 {
  # Automatically bind the device at startup
  bind no;
  # Bluetooth address of the device
  device 11:22:33:44:55:66;
  # RFCOMM channel for the connection
  channel 3;
  # Description of the connection
  comment "This is Device 1's serial port.";
}

Wyszukaj urządzenia Bluetooth:

hcitool scan
Scanning ...
    20:15:12:08:62:95   HC-06

Powiązanie za pomocą rfcomm

sudo rfcomm bind 0 20:15:12:08:62:95 1

NB: Powiązanie 0 odnosi się do urządzenia o numerze 0 (rfcomm0), a 1 oznacza kanał.

Następnie użyj minicom z sudo i zapisz konfigurację, w której określisz szybkość transmisji i port. Więcej informacji znajdziesz tutaj .

UżytkownikK
źródło