안드로이드 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 연결을 해보겠습돠 

시간이 벌써 새벽이네요 ㅜㅜ 좋은 밤 되세요 ㅋㅋㅋ 

 

You may also like...

11 Responses

  1. Raseu 댓글:

    sdptool add SP를 집어넣어야 되는건 알겠는데

    파일에 해당 내용이 추가되면 블루투스가 작동이 안되는 버그가 있습니다.

    해당 명령어를 자동적으로 실행되는 다른 방법이 있나요?

    • 호그 댓글:

      음 혹시 파일 내용을 올려주실 수 있나요 ???

      • Raseu 댓글:

        [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
        이 부분을 말씀하시는건가요?

        • Raseu 댓글:

          이렇게 하고 파이 재시작을 할때는 적용이 안됬다가 켜고나서 블루투스 재시작을 해줘야 적용되는 현상이 있습니다.

    • Raseu 댓글:

      ExecStartPost=/usr/bin/sdptool add SP로 자동적으로 추가되는 명령어인건 확인했고 넣었는데
      재부팅을 할때 실행이 안되는것을 확인했습니다. 재부팅을 하는게 아니라 블루투스를 재시작을 해줘야 그제야 되더군요

      재부팅이나 부팅을 할때 해당 명령어가 실행되는 방법이 있을까요?

      • 호그 댓글:

        음 보통 sudo vim /etc/rc.local 파일을 수정 해서 부팅 시 실행할 명령을 지정할 수 있는데요 !
        해당 파일을 열어서 실행 시키고 싶은 명령을 exit 0 바로 위에 써보시겠어요 ??

        아래 글 마지막 쯤에 해당 내용 참고해 보세요 ㅎㅎ
        https://lifeonroom.com/diy/remote-computer-on-2/

  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 하고 해보시겠어요 ??

  3. FELEX 댓글:

    라즈베리파이 c++ 지니에디터로 하는법도 올려주실수 있으신가요~~~??

    • 호그 댓글:

      제가 사실 c++ 은 많이 몰라서요 ㅠㅠ 라즈베리안도 데비안 계열 리눅스이니 apt-get 으로 설치하면 되지 않을까 싶습니다 ㅎㅎ

  4. Good 댓글:

    혹시 코드에 UUID는 변경하지 않아도 되는건가여??