안드로이드 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로 자동적으로 추가되는 명령어인건 확인했고 넣었는데
      재부팅을 할때 실행이 안되는것을 확인했습니다. 재부팅을 하는게 아니라 블루투스를 재시작을 해줘야 그제야 되더군요

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

  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는 변경하지 않아도 되는건가여??

댓글 남기기

이메일은 공개되지 않습니다.