안드로이드 Bluetooth app 으로 라즈베리파이 3 B+ 에 연결
아녕하세요 라이프온룸 호르그 입니다. ㅋㅋㅋ
라즈베리파이 3 B+ 를 구매했어요 !!!! 저는 2014 년에 출시된 라즈베리파이 1 B+를 쓰고 있었답니다… pip 설치, 가상환경 잡기 등을 하는데 어찌나 시간이 많이 걸리던지… 짜증나서 하나 샀어요
라즈베리파이 3 B+ 는 아래와 같은 재원을 가지고 있습니다.
- CPU : ARM Cortex-A53 64bit 1.4GHz
- RAM : 1GB LPDDR2 SDRAM
- WI-FI: 2.4GHz, 5GHz
- Ethernet : 300Mbps, PoE(이더넷으로 전력 공급해 주는 기술) 지원
- Bluetooth : Bluetooth 4.2, Bluetooth Low Energy (BLE)
pi 1 의 CPU 700Mhz, RAM 512 에 비하면 정말 많이 좋아졌고 pi 3 B 모델과 비교해서 WI-FI 5GHz 를 추가로 지원하고 이더넷 속도도 300Mbps 로 빨라졌습니다. 저도 3 B+ 로 세팅을 해봤는데요 체감적으로 엄청빨라 졌음을 느낄 수 있었습니다. 혹시 더 자세한 스펙이 보고 싶으시면 아래 내용을 참조하세요 !!!
https://www.raspberrypi.org/magpi/raspberry-pi-3bplus-specs-benchmarks/
그럼 이 빠른 라즈베리파이의 내장기능인 Bluetooth 기능을 이용해 보겠습니다. 그리고 Python 코드로 안드로이드의 연결을 받아볼게요
혹시 WIFI 세팅법이 궁금하시다면 아래 블로그를 참조해 주세요 !!! 저는 raspi-config 로 해도 된다고 하는데요 주의 할 점은 국가를 선택하라는 화면이 나오는데 그냥 US 를 선택하세요 .. KR 을 선택하면 WiFi 가 안 잡히는 것 같습니다.
1. 라즈베리파이 블루투스 서버로 세팅하기
세팅법이 좀 복잡합니다. 천천히 따라와 보세요 ! 팔로팔로 팔로 미
sudo apt-get install bluez sudo rfkill unblock all
패키지 설치후 터미널에 아래와 같이 입력합니다.
sudo bluetoothctl [bluetooth]# power on [bluetooth]# discoverable on [bluetooth]# pairable on [bluetooth]# scan on # 주변 Bluetooth 기기들의 MAC 이 출력됨 [bluetooth]# pair <연결하려는 MAC> [CHG] Device <연결하려는 MAC> Paired: yes Pairing successful [CHG] Device <연결하려는 MAC> Trusted: yes [bluetooth]# trust <연결하려는 MAC>
일단 위 작업을 하면 페어링이 완료 될 것입니다.
그럼 안드로이드 폰과 같은 블루투스 기기에서 라즈베리파이로 연결을 해야하는데요 이 과정은 아래와 같이 하면 됩니다.
sudo sdptool add SP sudo vim /etc/systemd/system/dbus-org.bluez.service # 파일이 열리면 아래내용을 수정 ExecStart=/usr/lib/bluetooth/bluetoothd ---> ExecStart=/usr/lib/bluetooth/bluetoothd -C # 그리고 아래 내용을 바로 아래 추가 ExecStartPost=/usr/bin/sdptool add SP sdptool add SP sudo 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: 1 Language Base Attr List: code_ISO639: 0x656e encoding: 0x6a base_offset: 0x100 Profile Descriptor List: "Serial Port" (0x1101) Version: 0x0100
위 작업이 끝난 후에는 아래 명령어를 입력합니다.
sudo rfcomm watch hci0
그럼 아래 문구가 나올 텐데요 !
Waiting for connection on channel 1
이때 안드로이드 폰에서 블루투스 연결 어플로 연결을 해봅시다. (저는 Bluetooth app pro, BT Controller를 사용했습니다. 다른 APP 들도 잘 동작 하리라 믿습니다. ..) 연결에 성공하게 되면 아래와 같이 됩니다.
2. 파이썬 코드로 안드로이드에게 연결 당하기
부재목이 매우 이상한데요 .. ㅡㅡ 즉 위에서 설명했던 리눅스 기반의 기능을 파이썬에서 해본다고 생각하시면 됩니다.
우선 python 에서 Bluetooth 사용하려면 아래와 같은 패키지를 설치해야 합니다.
sudo apt-get install libbluetooth-dev sudo apt-get install python-dev pip install pybluez
설치를 하셨으면 아래 코드를 입력한 뒤 돌려보세요
from bluetooth import * server_sock=BluetoothSocket( RFCOMM ) server_sock.bind(("",PORT_ANY)) server_sock.listen(1) port = server_sock.getsockname()[1] uuid = "00001801-0000-1000-8000-00805f9b34fb" advertise_service( server_sock, "SampleServer", service_id = uuid, service_classes = [ uuid, SERIAL_PORT_CLASS ], profiles = [ SERIAL_PORT_PROFILE ], # protocols = [ OBEX_UUID ] ) print "Waiting for connection on RFCOMM channel %d" % port client_sock, client_info = server_sock.accept() print "Accepted connection from ", client_info try: while True: data = client_sock.recv(1024) if len(data) == 0: break print "received [%s]" % data except IOError: pass print "disconnected" client_sock.close() server_sock.close() print "all done"
Waiting for connection on RFCOMM channel 1 문구가 나올 겁니다.
그럼 안드로이드에서 블루투스를 연결하고 데이터를 전송해 보세요 !!
Terminal에 그 내용이 표시되고 안드로이드가 연결을 해지 하면 프로그램이 종료 될 것입니다.
넵 오늘은 여기까지 하구요 다음에는 아두이노에 HC-06 을 달아서 라즈베리파이3 B+ 에서 HC-06 로 BT 연결을 해보겠습돠
시간이 벌써 새벽이네요 ㅜㅜ 좋은 밤 되세요 ㅋㅋㅋ
sdptool add SP를 집어넣어야 되는건 알겠는데
파일에 해당 내용이 추가되면 블루투스가 작동이 안되는 버그가 있습니다.
해당 명령어를 자동적으로 실행되는 다른 방법이 있나요?
음 혹시 파일 내용을 올려주실 수 있나요 ???
[Unit]
Description=Bluetooth service
Documentation=man:bluetoothd(8)
ConditionPathIsDirectory=/sys/class/bluetooth
[Service]
Type=dbus
BusName=org.bluez
ExecStart=/usr/lib/bluetooth/bluetoothd -C
ExecStartPost=/usr/bin/sdptool add SP
NotifyAccess=main
#WatchdogSec=10
#Restart=on-failure
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
LimitNPROC=1
ProtectHome=true
ProtectSystem=full
[Install]
WantedBy=bluetooth.target
Alias=dbus-org.bluez.service
이 부분을 말씀하시는건가요?
이렇게 하고 파이 재시작을 할때는 적용이 안됬다가 켜고나서 블루투스 재시작을 해줘야 적용되는 현상이 있습니다.
ExecStartPost=/usr/bin/sdptool add SP로 자동적으로 추가되는 명령어인건 확인했고 넣었는데
재부팅을 할때 실행이 안되는것을 확인했습니다. 재부팅을 하는게 아니라 블루투스를 재시작을 해줘야 그제야 되더군요
재부팅이나 부팅을 할때 해당 명령어가 실행되는 방법이 있을까요?
음 보통 sudo vim /etc/rc.local 파일을 수정 해서 부팅 시 실행할 명령을 지정할 수 있는데요 !
해당 파일을 열어서 실행 시키고 싶은 명령을 exit 0 바로 위에 써보시겠어요 ??
아래 글 마지막 쯤에 해당 내용 참고해 보세요 ㅎㅎ
https://lifeonroom.com/diy/remote-computer-on-2/
왜 sudo rfkill unblock all 과 sudo sdptool add SP 명령어가 안먹지요ㅠ
혹시 에러 메시지가 어떻게 나오나요 ? ㅎㅎsudo rfkill list 했을 때 아래와 같이 나오면 정상입니다.
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
1: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
sudo sdptool add SP 명령의 경우는 에러가 어떻게 나오시나요 ?
왠지 블루투스 데몬이 안살아 있는 느낌 같은데
sudo systemctl start bluetooth 하고 해보시겠어요 ??
라즈베리파이 c++ 지니에디터로 하는법도 올려주실수 있으신가요~~~??
제가 사실 c++ 은 많이 몰라서요 ㅠㅠ 라즈베리안도 데비안 계열 리눅스이니 apt-get 으로 설치하면 되지 않을까 싶습니다 ㅎㅎ
혹시 코드에 UUID는 변경하지 않아도 되는건가여??