Linux에서 Bluetooth 직렬 포트에 연결하고 데이터를 보내는 방법은 무엇입니까?

Linux에서 Bluetooth 직렬 포트에 연결하고 데이터를 보내는 방법은 무엇입니까?

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을 생성할 것입니다. 이런 일이 발생하면 큐트컴 같은 것을 이용해 연결된 기기와 메시지를 주고받고 싶습니다.

내 Android 장치에서 Bluetooth SPP 터미널(여러 개가 있고 몇 가지 다른 터미널을 시도했습니다)을 열고 연결을 시도합니다. 그들은 모두 실패했습니다.

성공적으로 페어링하고 문제 없이 파일을 보낼 수 있다는 점을 고려하면 Bluetooth 페어링 및 통신이 작동하고 있음을 알 수 있습니다.

내가 무엇을 더 시도할 수 있는지 잘 모르겠습니다. RFCOMM 채널 충돌이 없는지 확인하기 위해 로컬과 Android 장치 모두에서 "sdptool 브라우저"를 사용했습니다.

답변1

지금은 일을 하고 있는 것 같아요. 블루투스는 좀 까다로운 것 같습니다. 다른 사람이 유용하다고 생각할 경우를 대비해 전체 단계를 검토해 보겠습니다(비록 제가 처음에 시도한 것과 거의 비슷하지만). 이는 Nexus 4의 Android JB(4.2.2) 및 Arch Linux 3.6.7-1, Gnome 3.6의 bluez 4.101(gnome-bluetooth 포함)에서 작동합니다.

(이 단계는 아무 소용이 없을 수도 있습니다) Android에서 Bluetooth를 끄고 Linux 컴퓨터에서 USB/Bluetooth 어댑터를 분리합니다(또는 내장 어댑터가 있는 경우 hcitool devname 재설정으로 재설정).

Linux에서 Bluetooth 어댑터를 연결/켭니다. 어댑터가 표시되는지 확인하세요(gnome-bluetooth에서 설정할 수 있음 - Bluetooth 시스템 트레이 아이콘이 표시되어야 함).

Android 장치에서 Bluetooth를 켜십시오. Android를 사용하여 어댑터와 페어링합니다(Linux에서는 반대 방향으로 페어링할 수 없습니다). 키를 제공하라는 대화 상자가 나타납니다. 원하는 PIN을 입력하세요. Gnome은 이전에 입력한 것과 동일한 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

답변2

다음 단계가 나에게 효과적이었습니다.

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

먼저 서버를 설정해야 합니다. 서버 측(루트로):

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과 같습니다. ...들어오는 연결을 "수신"합니다. 이 명령은 연결이 끊어지면 새로운 "수신" 상태를 다시 시작합니다.

답변3

나는 Pris의 명령을 약간 수정하여 이 문제를 해결했습니다. rfcomm 연결을 설정하는 데 여전히 문제가 있는 경우 이 방법을 시도해 보십시오.

sudo service bluetooth restart

이렇게 하면 연결을 설정하려고 할 때마다 처음부터 다시 시작할 수 있습니다.

sdptool 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 터미널 에뮬레이터를 사용하여 모두 확인했습니다.

답변4

다양한 Bluetooth 도구를 사용해 보았지만 Bluetooth 모듈과 연결하고 데이터를 교환하기 위한 올바른 명령 순서를 찾는 데 문제가 있습니다. 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.";
}

Bluetooth 장치 검색:

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

rfcomm 바인딩 사용

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

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

그런 다음 sudo와 함께 minicom을 사용하고 전송 속도와 포트를 지정하는 구성을 저장합니다. 더 많은 정보를 확인하실 수 있습니다여기.

관련 정보