Chocolate Chip Cookie
본문 바로가기
아두이노, IOT

라즈베리파이 + 스마트폰 블루투스 통신하기

by Khookie 2021. 10. 29.

 

페어링 과정

1 휴태폰의 블루투스 를 켜고 검색한다

 

2. 파이 명령어 ( GUI 에서는 블루투스 아이콘을 이용하기)

 

pi@raspberrypi:~ $ bluetoothctl

3. 폰의 블루투스 모듈 맥어드레스를 검색

[bluetooth]# scan on

 

5. 폰의 블루투스 모듈 맥어드레스를 확인했으면 검색을 중지하고 에이전트를 활성화 합니다.

[bluetooth]# scan off


[bluetooth]# agent on

[bluetooth]# default-agent

6. 안드로이드폰과 페어링을 진행하기 위해  pair 명령과 안드로이드 폰의 블루투스 모듈 맥어드레스를 같이 적어주면 페어링이 진행됩니다.

 

[bluetooth]# pair D0:13:FD:EE:43:2E
Attempting to pair with D0:13:FD:EE:43:2E
[CHG] Device D0:13:FD:EE:43:2E Connected: yes
Request confirmation
[agent] Confirm passkey 020589 (yes/no):

화면에 보이는 passkey를 확인하고.. 안드로이드에서 키값을 입력

(yes/no): yes

라즈베리파이에서도 yes 입력

 

7. 페어링 완료후 트러스트명령 해주기

[bluetooth]# trust D0:13:FD:EE:43:2E
[CHG] Device D0:13:FD:EE:43:2E Trusted: yes
Changing D0:13:FD:EE:43:2E trust succeeded

8. . quit 명령으로 bluetoothctl를 종료

 

[bluetooth]# quit

 

 

통신과정

Raspberry Pi 3의 블루투스 에코 서버와 Android앱 간의 통신 테스트

1. C/C++ 컴파일러와 관련 라이브러리, make 같은 도구들이 포함되어 있는 build-essential 패키지를 설치해줍니다. 

다음처럼 이미 설치되어 있을 수도 있습니다. 

 

pi@raspberrypi:~ $ sudo apt-get install build-essential
Reading package lists... Done
Building dependency tree
Reading state information... Done
build-essential is already the newest version (12.3).
0 upgraded, 0 newly installed, 0 to remove and 73 not upgraded.




2. 예제 코드를 컴파일 해줍니다. 코드는 다음 포스트 마지막에 있습니다. 

 

Raspberry Pi 3 블루투스 페어링 방법(bluetoothctl) 및 C언어 블루투스 서버 예제

https://webnautes.tistory.com/1137 

 

pi@raspberrypi:~ $ gcc bluetooth_server.c -o bluetooth_server -lbluetooth  -lpthread



컴파일시 다음과 같은 에러가 나면  libbluetooth-dev 패키지가 설치 안되어 있어서 입니다.

 

pi@raspberrypi:~ $ gcc bluetooth_server.c -o bluetooth_server -lbluetooth  -lpthread
bluetooth_server.c:6:33: fatal error: bluetooth/bluetooth.h: No such file or directory
#include <bluetooth/bluetooth.h>
                                ^
compilation terminated.



libbluetooth-dev 패키지에는 블루투스 프로그래밍을 하기 위해 필요한 라이브러리가 포함되어 있습니다. 설치 해주고 나서 ..

 

pi@raspberrypi:~ $ sudo apt-get install libbluetooth-dev



다시 컴파일해보면 문제 없이 완료됩니다.

 

pi@raspberrypi:~ $ gcc bluetooth_server.c -o bluetooth_server -lbluetooth  -lpthread
pi@raspberrypi:~ $




3. 실행시켜 보면 세그멘테이션 폴트(Segmentation Fault)가 발생합니다. 

 

pi@raspberrypi:~ $ ./bluetooth_server
Registering UUID 00001101-0000-1000-8000-00805f9b34fb
Segmentation fault




에러를 해결하기 위해서는 SDP Server를 활성화시켜 줘야합니다.

dbus-org.bluez.service 파일을 편집기로 열어서 

 

pi@raspberrypi:~ $ sudo nano /etc/systemd/system/dbus-org.bluez.service



아래 부분을 찾아서 빨간색 부분을 추가해줍니다.

 

ExecStart=/usr/lib/bluetooth/bluetoothd --compat




4. 재부팅해줘야 설정이 적용됩니다. (데몬 재시작으로는 반영이 안됩니다.)

 

pi@raspberrypi:~ $ sudo reboot




5. 재부팅 완료 후,  퍼미션 문제를 해결하기 위해 다음 한줄을 실행합니다.

재부팅할때 마다 실행시켜 주어야 세그멘테이션 폴트가 나지 않습니다. 

 

pi@raspberrypi:~ $ sudo chmod 777 /var/run/sdp



부팅할때 마자 실행되도록   홈디렉토리에 있는 .bashrc 파일 끝에 추가해두어도 됩니다. 

 

pi@raspberrypi:~ $ sudo nano ~/.bashrc

 



페어링은 한번 해주면  다시 할 필요가 없습니다.



6. Raspberry Pi에서 블루투스 서버를 실행시킵니다.

 

pi@raspberrypi:~ $ ./bluetooth_server




7. 안드로이드앱을 실행시킨 후,  페어링된 디바이스 목록에서 raspberrypi를 선택합니다.

 



테스트에 사용한 Android 앱 소스코드는 다음 포스팅에 있습니다.

 


Android와 PC JAVA 프로그램 간 블루투스 통신 예제
http://webnautes.tistory.com/849 




8. Raspberry Pi에서 실행중인 서버에 연결되면 앱 상단에 다음과 같은 메시지가 보입니다.

connected to raspberrypi

 




9. Raspberry Pi의 터미널에서 폰의 블루투스 모듈 맥어드레스를 보여주며 접속되었다는 것을 알려줍니다. 

 




10. 폰에서 문자열을 입력 한 후, SEND를 터치하면...

 




11. Raspberry Pi의 터미널에서 수신한 문자와 다시 에코에서 보낸 문자를 보여줍니다. 

 




12. 폰에서도 전송한 문자(Me:)와 Raspberry Pi로부터 수신 받은 문자열(raspberrypi:)을 확인 할 수 있습니다. 

 




13. 앱에서 백버튼을 눌러서 종료하면  서버도 같이 종료됩니다. 

 

 

 

 

https://webnautes.tistory.com/995

댓글