Linux에서 블루투스 직렬 포트에 데이터를 어떻게 연결하고 전송합니까?


30

Linux에서 USB-Bluetooth 어댑터를 통해 가상 직렬 포트를 설정하고 Android 장치를 통해 메시지를 보내려고합니다. 커널 3.6에 있습니다. gnome-bluetooth를 사용하여 장치에 성공적으로 페어링 할 수 있으며 파일을 보낼 수도 있습니다.

직렬 포트를 설정하려면 먼저 SP 프로파일이있는 채널을 어댑터에 추가하십시오.

sdptool add --channel=22 SP

그런 다음 rfcomm으로 'listen'을 호출합니다.

rfcomm listen /dev/rfcomm0 22

어느 블록에

Waiting for connection on channel 22

rfcomm은 성공적으로 연결되면 / dev / rfcomm0을 만듭니다. 그런 일이 생기면 cutecom과 같은 것을 사용하여 연결된 장치로 메시지를주고받습니다.

내 안드로이드 장치에서 Bluetooth SPP 터미널을 열고 (여러 가지가 있지만 몇 가지 다른 것을 시도했습니다) 연결하려고합니다. 그들은 모두 실패합니다.

문제없이 페어링하고 파일을 보낼 수 있다고 가정하면 블루투스 페어링 및 통신이 작동한다는 것을 알고 있습니다.

다른 것을 시도해 볼 수 있는지 잘 모르겠습니다. 로컬 장치와 Android 장치에서 'sdptool browse'를 사용하여 RFCOMM 채널 충돌이 없는지 확인했습니다.

답변:


21

나는 지금이 일을 얻은 것 같습니다. 블루투스는 조금 까다로운 것 같습니다. 다른 사람이 유용하다고 생각하는 경우를 대비하여 내 단계를 완전히 다시 작성하고 있습니다 (처음에는 시도한 것이 많지만). 이는 Nexus 4 및 Arch Linux 3.6.7-1의 Android JB (4.2.2) 용이며 Gnome 3.6 (gnome-bluetooth 포함)의 bluez 4.101과 함께 제공됩니다.

(이 단계는 유용하지 않을 수 있습니다.) Android에서 Bluetooth를 끄고 Linux 시스템에서 USB / Bluetooth 어댑터를 분리하십시오 (또는 내장 된 시스템이있는 경우 hcitool devname reset을 사용하여 재설정하십시오).

Linux에서 블루투스 어댑터를 연결 / 켜십시오. 어댑터가 보이는지 확인하십시오 (gnome-bluetooth에서 설정 가능-블루투스 시스템 트레이 아이콘이 표시됨).

Android 기기에서 블루투스를 켭니다. 안드로이드를 사용하여 어댑터와 페어링하십시오 (Linux와는 다른 방식으로 페어링 할 수 없었습니다). 키를 묻는 대화 상자가 나타납니다. 원하는 PIN을 입력하십시오. 그놈은 키를 요구하는 알림을 팝업해야합니다. 이전에 입력 한 것과 동일한 PIN을 입력하십시오. 이 시점에서 Android 기기와 키가 페어링되어 있어야합니다.

Linux에서 터미널을 열고 다음을 입력하여 사용 가능한 Bluetooth 서비스를 확인하십시오.

sdptool browse local

이미 직렬 포트 서비스가 있다면 어떤 채널인지 기록하십시오. 그렇지 않은 경우 서비스를 추가 할 수 있습니다.

sdptool add --channel=22 SP

이제 rfcomm을 사용하여이 채널을 듣습니다.

sudo rfcomm listen /dev/rfcomm0 22

rfcomm은 차단하고 다음과 같은 메시지와의 연결을 수신합니다

Waiting for connection on channel 22

Android에서 비슷한 응용 프로그램이 작동하지만 BlueTerm 응용 프로그램 ( http://pymasde.es/blueterm/ , Google Play 스토어에서 무료로 사용 가능)을 사용했습니다. BlueTerm을 열고 옵션> 장치 연결로 이동하여 페어링 된 어댑터를 선택하십시오.

다행히도 응용 프로그램을 연결할 수있었습니다. 터미널에서 다음과 같은 메시지 수신을 차단 한 추가 확인이 표시됩니다.

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

BlueTerm 앱에 입력하는 것은 / dev / rfcomm0으로 이동해야합니다. 새 터미널을 열고 다음과 같은 작업을 수행하면 입력 할 때 내용이 표시됩니다.

cat /dev/rfcomm0

1
좋은 대답입니다. 나는 Ubuntu 16 / Bluez 5 와이 정보를 얻었 습니다 : bbs.archlinux.org/viewtopic.php?id=201672 .
wojciii

10

다음 단계는 나를 위해 일했습니다.

먼저 장치를 페어링해야합니다. 페어링은 비교적 쉽습니다. 클라이언트 (대화를 시작한 사람)와 서버 (응답 한 사람)에게 전화하겠습니다.

서버 쪽 (루트로)을 설정하기 전에 서버를 설정해야합니다.

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

클라이언트 측 (루트로) :

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

이제 클라이언트에서 직렬 터미널을 열려면 :

screen /dev/rfcomm0 115200

코멘트:

클라이언트에서 마지막 명령 rfcomm connect ...를 호출하면 장치 /dev/rfcomm0가 생성되어 서버에 연결됩니다 /dev/recomm0. 이것은 둘 사이의 직렬 링크를 나타냅니다

마지막 서버 명령 : rfcomm watch....은 들어오는 연결을 '듣습니다'. 연결이 끊어지면 명령은 새로운 '듣기'상태를 다시 시작합니다.


1
ismaia가 제공하는 답변은 거의 당신을 거기에 도착시킵니다. 최신 bluez 스택에는 특별한 --compat옵션이 필요하지만 SP 추가에 실패 할 수 있다는 점을 기억해야합니다 . 여기를 참조 하십시오 . 따라서 systemd / initd 시작 시작 스크립트를 조정 / 수정하십시오 --compat.
blacktofu

5

Pris의 명령을 약간 변형 하여이 문제를 해결했습니다. rfcomm 연결을 설정하는 데 여전히 문제가있는 경우이 샷을 제공하십시오.

sudo service bluetooth restart

^ 연결을 설정할 때마다 깨끗한 슬레이트로 시작합니다.

rfcomm add --channel=<a_channel_#> SP

이 채널 번호는 현재 할당 된 채널과 달라야합니다.

(선택 사항) 채널을 확인하려면 :

sdptool browse local | grep Channel

이 다음 명령이 왜 필요한지 잘 모르겠지만 저에게 효과적이었습니다.

rfcomm release 0

그런 다음 들어오는 연결을 청취하십시오.

rfcomm watch 0 <a_channel_#>

참고 : /etc/bluetooth/rfcomm.conf의 bt MAC 주소는 전화의 bt MAC입니다. 또한이 파일의 채널은 a_channel_ #에서 선택한 채널과 같아야합니다.

이 모든 작업을 수행 한 후에는 전화기에서 bt 터미널 에뮬레이터를 사용하여 모두 확인했습니다.


0

다른 블루투스 도구를 사용해 보았으며 블루투스 모듈과 데이터를 연결하고 교환하는 올바른 명령 시퀀스를 찾기가 어려웠습니다. rfcomm 및 minicom을 사용해보십시오.

이것은 내 /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.";
}

블루투스 기기 검색 :

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

rfcomm을 사용하여 바인딩

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

NB : 바인드 0은 장치 번호 0 (rfcomm0)을 나타내고 1은 채널입니다.

그런 다음 sudo와 함께 minicom을 사용하고 전송 속도와 포트를 지정하는 구성을 저장하십시오. 자세한 내용은 여기를 참조 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.