RaspberryPi에서 ESP32 데이터를 BLE로 읽습니다.

목표, 목적



우리 집은 단열 성능이 상당히 높아서 방심해서 밖으로 나오면 굉장히 추웠다는 일이 있었고, 집안에서 밖의 기온을 아는 수단이 필요해졌다. 하지만, 그런 제품은 나름의 가격이므로, 전에 사서 방치하고 있던 ESP32로 만들어 보기로 했다.
wifi라면 환경 있는 바로 할 수 있을 것 같지만, 모처럼이므로 BLE로 놀아보기로 했다.



하드웨어



RaspberryPi 3에 Bluetooth USB 어댑터를 꽂아 사용하기로 했다.
htps //w w.ぁ네 x. 이. jp / p 로즈 cts / bt - c 4 /
Model B+라면 Bluetooth 내장으로 물욕이 한순간 솟아오르지만, 이것만을 위해서 바꾸는 것도... 라고 생각 그대로.

패키지 또는 준비



raspbian에 apt-get로 bluez를 설치하기 만하면됩니다.
버전은 이런 식으로 되어 있었다.
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.4 (stretch)
Release:    9.4
Codename:   stretch
pi@raspberrypi:~ $ dpkg -l | grep bluez
ii  bluez                           5.43-2+rpt2+deb9u2           armhf        Bluetooth tools and daemons
ii  bluez-firmware                  1.2-3+rpt5                   all          Firmware for Bluetooth devices
ii  bluez-hcidump                   5.43-2+rpt2+deb9u2           armhf        Analyses Bluetooth HCI packets
pi@raspberrypi:~ $

우선 무언가 데이터를 보냅니다.



Arduino IDE에서 파일> 스케치 예제> ESP32 BLE Arduino> BLE_server를 선택하고 그대로 씁니다.
server = 센트럴의 이미지이지만, 여기에서는 server = 주변 장치가 되는 것 같다.



raspi에서 ESP32의 Bluetooth 주소 확인
pi@raspberrypi:~ $ sudo hcitool lescan
LE Scan ...
24:0A:C4:0C:9C:EA MyESP32
24:0A:C4:0C:9C:EA MyESP32
24:0A:C4:0C:9C:EA MyESP32
^Cpi@raspberrypi:~ $

MyESP32가 타겟. gatttool로 연결해보기
pi@raspberrypi:~ $ gatttool -b 24:0A:C4:0C:9C:EA -I
[24:0A:C4:0C:9C:EA][LE]> connect
Attempting to connect to 24:0A:C4:0C:9C:EA
Connection successful
[24:0A:C4:0C:9C:EA][LE]>

했어!
다음은 데이터를 취득해 보자. 우선 서비스 일람을 취득한다.
[24:0A:C4:0C:9C:EA][LE]> characteristics
handle: 0x0002, char properties: 0x20, char value handle: 0x0003, uuid: 00002a05-0000-1000-8000-00805f9b34fb
handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0017, char properties: 0x02, char value handle: 0x0018, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0019, char properties: 0x02, char value handle: 0x001a, uuid: 00002aa6-0000-1000-8000-00805f9b34fb
handle: 0x0029, char properties: 0x0a, char value handle: 0x002a, uuid: beb5483e-36e1-4688-b7f5-ea07361b26a8
[24:0A:C4:0C:9C:EA][LE]>

코드로 지정하고 있는 UUID 는 beb5483e-36e1-4688-b7f5-ea07361b26a8 이므로, char value handle 이다 0x002a 를 읽어 본다.
[24:0A:C4:0C:9C:EA][LE]> char-read-hnd 0x002a
Characteristic value/descriptor: 48 65 6c 6c 6f 20 57 6f 72 6c 64 20 73 61 79 73 20 4e 65 69 6c
[24:0A:C4:0C:9C:EA][LE]>

ascii 코드를 변환해 보면,
% python3
Python 3.6.5 (default, May 24 2018, 07:40:25)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> a='48 65 6c 6c 6f 20 57 6f 72 6c 64 20 73 61 79 73 20 4e 65 69 6c'.split()
>>> [chr(i) for i in map(lambda x: int(x, 16), a)]
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', ' ', 's', 'a', 'y', 's', ' ', 'N', 'e', 'i', 'l']

그래서 무사 데이터를 수신할 수 있었다.

그리고는 온도 센서를 ESP32에 연결하고, raspi로 표시할 수 있도록 해 완성. 지금의 곳 노가드이니까, 인증과 암호화도 생각하지 않으면.

좋은 웹페이지 즐겨찾기