ESP32는 Bluetooth 및 WiFi를 기본적으로 지원하는 강력한 IoT 장치입니다. ESP32는 RAM, ROM, GPIO 핀 등과 같은 추가 기능을 갖춘 이전 ESP8266의 고급 버전입니다. ESP32 모듈은 클래식 Bluetooth 및 BLE (Bluetooth Low Energy)를 모두 지원하며 클래식 Bluetooth를 사용하여 노래 또는 파일을 전송할 수 있으며 BLE 옵션은 Bluetooth 비콘, 피트니스 밴드, 근접 식 등과 같은 배터리 최적화 애플리케이션에 사용할 수 있습니다. 간단한 마이크로 컨트롤러 프로젝트를 위해 HC-05 또는 HC-06 모듈과 같은 직렬 Bluetooth로 ESP32를 사용할 수도 있습니다.
우리가 알고 있듯이 BLE는 서버 모드와 클라이언트 모드의 두 가지 모드로 작동 할 수 있습니다. 두 모드는 이전 ESP32 자습서 에서 논의되었습니다.
- ESP32 BLE 서버-배터리 수준 표시를위한 GATT 서비스
- ESP32 BLE 클라이언트 – 전구를 트리거하기 위해 피트니스 밴드에 연결
이 튜토리얼 에서는 ESP32가 서버로 작동하고 스마트 폰이 클라이언트로 작동하는 ESP32를 사용하여 BLE iBeacon을 빌드합니다. ESP32 튜토리얼로 돌아 가지 않는다면 Arduino IDE에서 ESP32 보드를 사용하는 방법에 대해 이미 익숙하다고 가정합니다.
Raspberry Pi 및 HM-10 BLE iBeacon을 사용하는 이전 Bluetooth iBeacon 프로젝트를 통해 Beacon / iBeacon 기술에 대해 더 많이 알 수 있습니다.
필요한 구성 요소
하드웨어:
- ESP32 개발 보드
- 마이크로 USB 케이블
소프트웨어:
- Arduino IDE
- Android 앱: 모바일 용 nRF Connect (Nordic Semiconductor 제공)
많은 BLE 스캐너 앱이 있으며 그중 하나는 이전 프로젝트에서 Arduino와 함께 HM-10 BLE 모듈을 사용하는 방법에 사용되었습니다. 이 BLE 스캐너 앱은 좋은 그래픽 인터페이스 (GUI)를 제공하지만 추가 정보가 부족 하므로이 프로젝트에서는 NRF Connect for Mobile 앱을 사용하고 있습니다.
ESP32 iBeacon 용 nRF Connect Android 앱 사용
1. Google Play 스토어에서 nRF Connect 앱을 다운로드하여 엽니 다.
2. 화면은 아래와 같습니다. 이 프로젝트의 유용한 옵션은 장치가 발견되면 '스캔', '스캐너'및 '정보'입니다.
'스캔' 옵션은 모두에게 가능한 iBeacons를 참조하는 데 사용됩니다. iBeacon 검색을 시작하려면 화면을 아래로 당기거나 화면 오른쪽 상단의 '스캔'옵션으로 이동하십시오. 사용 가능한 iBeacon 검색이 시작됩니다.
3. iBeacon을 검색하면 iBeacon의 RSSI, UUID, Major 및 Minor를 볼 수 있습니다. RSSI는 모바일 또는 iBeacon을 서로 멀리하면 변경됩니다. 이 화면에서 RSSI는 (-37)입니다. 이 외에도 더미 회사 이름, 장치 유형, 바이트 길이, ESP32의 로컬 이름과 같은 세부 정보가 있습니다. 여기에“ ESP32 as iBeacon ”이 있습니다. 스케치에서 로컬 이름을 변경할 수 있습니다.
4. iBeacon에서 스마트 폰을 분리하면 RSSI 값이 -37에서 -58로 변경됩니다. 이 값은 장치 중 하나를 이동해도 계속 변경됩니다.
RSSI 신호 허용 값은 다음과 같습니다.
신호 강도 | TL; DR | 필수 | |
---|---|---|---|
-30dBm | 놀랄 만한 | 달성 가능한 최대 신호 강도. 클라이언트는이를 달성하기 위해 AP에서 불과 몇 피트 거리에있을 수 있습니다. 현실 세계에서 일반적이거나 바람직하지 않습니다. | 해당 없음 |
-67dBm | 아주 좋아 | 매우 안정적이고 적시에 데이터 패킷을 전달해야하는 애플리케이션을위한 최소 신호 강도. | VoIP / VoWiFi, 스트리밍 비디오 |
-70dBm | 괜찮아 | 안정적인 패킷 전달을위한 최소 신호 강도. | 이메일, 웹 |
-80dBm | 안좋다 | 기본 연결을위한 최소 신호 강도. 패킷 전달이 불안정 할 수 있습니다. | 해당 없음 |
-90dBm | 쓸 수 없는 | 소음 층에 접근하거나 익사합니다. 모든 기능은 가능성이 거의 없습니다. | 해당 없음 |
BLE iBeacon으로 작동하도록 ESP32 프로그래밍
Arduino IDE에 ESP32 Board를 설치하면 사용할 수있는 ESP32 BLE iBeacon 샘플 프로그램이 있습니다. 그러나 우리는이 튜토리얼에서이 스케치를 약간 편집했고 , 샘플 프로그램 의 완전한 편집 버전은이 튜토리얼의 끝에 제공됩니다.
ESP32 BLE_iBeacon 의 샘플 프로그램을 열려면 아래 단계를 따르십시오.
- Arduino IDE를 열고 "ESP32 Dev Module"을 선택합니다. (이 보드를 찾지 못한 경우 ESP32 보드 패키지를 설치했는지 확인하십시오)
- 이동 파일 > 예 > ESP32 BLE 아두 이노 > BLE_iBeacon
- “BLE_iBeacon”스케치를 엽니 다.
이제이 튜토리얼에서 수행되는 코드에 약간의 수정이 있습니다. ESP32 이름도이 스케치에서 업데이트됩니다. 따라서 BLE 서버 및 iBeacon 생성에 사용될 필요한 라이브러리를 포함하는 것으로 시작하십시오.
#include "sys / time.h"
이것은 현재 시스템 시간을 가져 오는 시간 라이브러리입니다. 여기에는 tv_sec, gettimeofday () 등과 같은 함수가 포함되어 있습니다 . 자세한 내용은 ' sys / time.h' 의 공식 UNIX 릴리스를 참조하십시오.
그런 다음 BLE Client 또는 BLE Server와 같은 다양한 구성에서 ESP32를 만드는 데 사용되는 많은 기능을 포함하는 ESP32 BLE 라이브러리가 포함됩니다.
#include "BLEDevice.h" #include "BLEUtils.h" #include "BLEServer.h"
아이 비콘 라이브러리가 포함되어 아이 비콘과 ESP32를 설정한다. 이와 함께 ESP32 용 딥 슬립 라이브러리가 포함되어 있습니다. 라이브러리는 정의 된 기간 동안 ESP32를 딥 슬립 모드로 전송하는 데 사용됩니다.
#include "BLEBeacon.h" #include "esp_sleep.h"
ESP32의 절전 기간을 정의합니다. 여기에서 ESP32는 10 초 동안 딥 슬립 상태에 있으며 광고를 한 다음 다시 10 초 동안 딥 슬립 상태로 전환됩니다.
#define GPIO_DEEP_SLEEP_DURATION 10
여기서 RTC_DATA_ATTR 이 정의됩니다. RTC_DATA_ATTR 속성으로 전역 변수를 정의하면 변수는 RTC_SLOW_MEM 메모리에 배치됩니다. 따라서 구조가 RTC_DATA_ATTR로 선언되고 딥 슬립 전에 동적 메모리를이 구조에 복사하면 깨어 난 후이를 동적 메모리로 복구하는 데 도움이됩니다. 간단히 말해서, 우리는 딥 슬립 후에 다시 복구하기 위해 동적 메모리의 정적 메모리에 시간을 절약하고 있습니다. 여기에 두 개의 변수가 정의되어 있습니다. ' last '는 ESP32가 딥 슬립 상태가되었을 때 마지막 시간을 가져 오는 데 사용되며 bootcount 는 재설정 횟수를 계산하는 데 사용됩니다.
RTC_DATA_ATTR 정적 time_t 마지막; RTC_DATA_ATTR 정적 uint32_t bootcount;
그런 다음 BLE 광고 유형을 정의합니다. 정의는 다음과 같이 수행됩니다.
BLEAdvertising * pAdvertising;
timeval 형은 현재 시간을 액세스하는 구성으로 정의된다.
지금 struct timeval;
또한 UUID가 정의됩니다. UUID는이 링크 에서 생성 할 수 있습니다 .
#define BEACON_UUID "87b99b2c-9XXd-11e9-bXX2-526XXXX64f64"
이제 UUID, Major, Minor 등과 같은 iBeacon 속성을 포함 할 함수를 만듭니다.이 함수에서 BLE에 대한 인스턴스를 iBeacon으로 만들고 ESP32에 대한 가짜 제조업체 ID, UUID, major 및 minor를 iBeacon으로 설정합니다.
void setBeacon () { BLEBeacon oBeacon = BLEBeacon (); oBeacon.setManufacturerId (0x4C00); oBeacon.setProximityUUID (BLEUUID (BEACON_UUID)); oBeacon.setMajor ((bootcount & 0xFFFF0000) >> 16); oBeacon.setMinor (bootcount & 0xFFFF);
플래그를 0x04로 설정하여 스캐너에서 BrEdrNotSupported 를 출력 합니다.
oData.setFlags (0x04);
게시 할 광고 데이터를 설정합니다.
std:: string strServiceData = "";
광고 할 문자열을 하나씩 추가합니다.
strServiceData + = (문자) 26; // Len strServiceData + = (char) 0xFF; // 유형 strServiceData + = oBeacon.getData (); oData.addData (strServiceData);
데이터를 게시하여 광고를 시작하십시오.
pAdvertising-> setData (oData); pAdvertising-> setScanResponseData (oScanResponseData);
115200 전송 속도로 직렬 모니터를 시작하고 시간을 확인합니다. 또한 리셋 횟수를 저장하기 위해 bootcount 를 증가시킵니다.
Serial.begin (115200); gettimeofday (& now, NULL); Serial.printf ("start ESP32 % d \ n", bootcount ++);
현재 시간을 정적 메모리에 저장합니다.
마지막 = now.tv_sec;
BLE 장치를 만들고 원하는 이름을 지정합니다. 여기서 ESP32의 이름은“ ESP2 as iBeacon ”입니다. 이름은 길 수 있지만이 버전의 코드는 긴 이름에 대한 지원을 시작했습니다.
BLEDevice:: init ("ESP32 as iBeacon");
광고하고 시작할 BLE 서버를 만듭니다.
BLEServer * pServer = BLEDevice:: createServer (); pAdvertising = BLEDevice:: getAdvertising (); BLEDevice:: startAdvertising ();
그런 다음 iBeacon 모드에서 ESP32를 설정하십시오.
setBeacon ();
광고를 시작한 다음 광고를 중지하고 10 초 동안 딥 슬립 모드로 전환합니다.
pAdvertising-> start (); pAdvertising-> stop (); esp_deep_sleep (1000000LL * GPIO_DEEP_SLEEP_DURATION);
마지막으로 마이크로 USB 케이블을 사용하여 ESP32 개발 보드를 랩톱에 연결하고 Arduino IDE를 사용하여 코드를 ESP32에 업로드합니다. 그런 다음 스마트 폰에서 nRF Connect Android 앱 을 열고 스캔을 시작합니다. 아래 그림과 같이 iBeacon 브로드 캐스트로 ESP32를 찾을 수 있습니다.
이것이 ESP32를 BLE Beacon으로 사용하여 UUID, Major 및 Minor를 광고 하는 방법 입니다. iBeacon에 대해 더 알고 싶다면 iBeacon으로 HM10에 대한 이전 튜토리얼을 따르십시오. 또한 의심스러운 점이 있으면 아래에 댓글을 달거나 포럼에서 질문하십시오.
작동하는 비디오 가 포함 된 완전한 코드 는 다음과 같습니다.
/>