라즈파이와 BlueTooth로 통신 할 때까지의 이야기

어떤 것을 만들고 싶어서 거기에 라즈파이와 블루투스로 통신시키는 것이 필요할 것 같다. 라즈파이와 PC를 BlueTooth로 통신시키는 곳까지 해 보았으므로 메모해 둔다.

1. 라즈파이와 페어링



1) 라즈파이의 Bluetooth를 ON



SSH에서 다음 명령을 두드려 페어링할 수 있는 상태로 한다.
sudo bluetoothctl
[bluetooth] power on
[bluetooth] discoverable on
[bluetooth] agent on
[bluetooth] default-agent

2) PC와 페어링



여기 Windows10. 액션 센터 → 연결을 선택하고 표시되는 라즈파이를 선택하여 페어링합니다.


페어링 완료 상태


2. SDP 서버 준비



통신 테스트는 직렬 통신으로 수행됩니다. 이를 위해 직렬 포트를 추가 한 상태에서 SDP 서버를 시작합니다.

서버 사용 가능 여부 확인
Raspberry Pi에서 SDP 서버를 사용할 수 있는지 확인합니다.
pi@rapi:~ $ sdptool browse local
Failed to connect to SDP server on FF:FF:FF:00:00:00: No such file or directory

위의 오류가 표시되면,
/etc/systemd/system/dbus-org.bluez.service 설정을 변경합니다.

변경 전
ExecStart=/usr/lib/bluetooth/bluetoothd

변경 후
ExecStart=/usr/lib/bluetooth/bluetoothd --compat

변경 후 bluetoothd를 다시 시작합니다.
pi@rapi:~ $ sudo systemctl daemon-reload
pi@rapi:~ $ sudo systemctl restart bluetooth

일단 bluetooth 서비스를 중지합니다.
pi@rapi:~ $ sudo systemctl stop bluetooth

bluetooth를 데몬으로 올린다.
pi@rapi:~ $ sudo bluetoothd -C &

SDP 서비스가 이용 가능하면 다음과 같은 응답이 돌아온다.
pi@rapi:~ $ sdptool browse local
Browsing FF:FF:FF:00:00:00 ...
Service RecHandle: 0x10000
Service Class ID List:
 "PnP Information" (0x1200)
Profile Descriptor List:
 "PnP Information" (0x1200)
  Version: 0x0103

Browsing FF:FF:FF:00:00:00 ...
Service Search failed: Invalid argument
Service Name: Generic Access Profile
Service Provider: BlueZ
Service RecHandle: 0x10001
Service Class ID List:
 "Generic Access" (0x1800)
Protocol Descriptor List:
 "L2CAP" (0x0100)
  PSM: 31
 "ATT" (0x0007)
  uint16: 0x0001
  uint16: 0x0008

Service Name: Generic Attribute Profile
Service Provider: BlueZ
Service RecHandle: 0x10002
Service Class ID List:
 "Generic Attribute" (0x1801)
Protocol Descriptor List:
 "L2CAP" (0x0100)
  PSM: 31
 "ATT" (0x0007)
  uint16: 0x0010
  uint16: 0x0010

Service Name: AVRCP CT
Service RecHandle: 0x10003
Service Class ID List:
 "AV Remote" (0x110e)
 "AV Remote Controller" (0x110f)
Protocol Descriptor List:
 "L2CAP" (0x0100)
  PSM: 23
 "AVCTP" (0x0017)
  uint16: 0x0103
Profile Descriptor List:
 "AV Remote" (0x110e)
  Version: 0x0105

Service Name: AVRCP TG
Service RecHandle: 0x10004
Service Class ID List:
 "AV Remote Target" (0x110c)
Protocol Descriptor List:
 "L2CAP" (0x0100)
  PSM: 23
 "AVCTP" (0x0017)
  uint16: 0x0103
Profile Descriptor List:
 "AV Remote" (0x110e)
  Version: 0x0104

어쩌면 Service Name: Serial Port라는 서비스가 없기 때문에 추가한다.
pi@rapi:~ $ sudo sdptool add --channel=22 SP
Serial Port service registered

다시 확인하면 Service Name: Serial Port가 추가되었다고 생각합니다.
pi@rapi:~ $ sdptool browse local
(省略)
Service Name: Serial Port
Service Description: COM Port
Service Provider: BlueZ
Service RecHandle: 0x10005
Service Class ID List:
 "Serial Port" (0x1101)
Protocol Descriptor List:
 "L2CAP" (0x0100)
 "RFCOMM" (0x0003)
  Channel: 22
Language Base Attr List:
 code_ISO639: 0x656e
 encoding:  0x6a
 base_offset: 0x100
Profile Descriptor List:
 "Serial Port" (0x1101)
  Version: 0x0100

백그라운드에서 실행하고 있던 bluetooth 데몬을 중지하고 bluetooth 서비스를 시작합니다.
같은 명령을 사용하여 SerialPort를 추가합니다.

3. 통신하자



1) RFCOMM 설정



다음 명령으로 rfcomm을 청취 상태로 만듭니다.
pi@rapi:~ $ sudo rfcomm listen /dev/rfcomm0 22
Waiting for connection on channel 22

이것으로 시리얼 통신의 청취 대기 상태가 된다. 시리얼 통신이 확립되면,/dev/rfcomm0 디바이스로 데이터 송수신을 할 수 있게 된다.

2) 시리얼 통신 접속



페어링한 Windows 7의 PC와 시리얼 통신해 본다.
Windows 측의 준비로서, 페어링한 상태로 이하를 연다.
제어판 > 하드웨어 및 사운드 > 장치 및 프린터
장치에서 페어링된 Raspberry Pi 장치의 속성을 엽니다.

서비스 탭의 시리얼 포트 (SPP) 'Serial Port'를 체크하면 가상 포트가 할당됩니다.
할당 된 포트 (여기서 COM5)는 때때로 변동한다.


Tera Term을 열고 "직렬"연결합니다. 포트는 상기의 「COM5」를 선택할 수 있으므로, 그것을 지정한다.


의 시점에서 Rasbperry Pi의 청취 상태였던 rfcomm에 Connection이라고 표시되어 정상적으로 접속할 수 있었던 것을 확인할 수 있다.
pi@rapi:~ $ sudo rfcomm listen /dev/rfcomm0 22
Waiting for connection on channel 22
Connection from28:C2:DD:XX:XX:XX to /dev/rfcomm0
Press CTRL-C for hangup

3) Windows PC에서 Raspberry Pi로 데이터 전송



Tera Term에서 적당히 문자열을 입력해 본다.
시리얼 통신은 한 문자씩의 송신이므로 특히 Enter라든지하지 않고도 메시지는 송신된다.


Raspberry Pi 측에서 메시지를 확인하기 위해/dev/rfcomm0을 cat한다.
pi@rapi:~ $ sudo cat /dev/rfcomm0
1234

Tera Term에서 입력한 문자가 출력됩니다.

4) Raspberry Pi에서 Windows PC로 데이터 전송



이번에는 Raspberry Pi에서/dev/rfcomm0 장치에 메시지를 echo 해보자.
pi@rapi:~ $ sudo echo abcd > /dev/rfcomm0

그러면 Tera Term 화면에 echo 된 문자열이 표시됩니다.


이상입니다! 다음은 스마트 폰과 블루투스로 통신하고 싶습니다.

좋은 웹페이지 즐겨찾기