게시글 상세
목록으로ESP32 BLE HID 기반 PET RFID 리더 구현
조회수: 16ESP32 + BLE(HID) 기반으로 PET RFID 태그를 읽는 시스템을 소개합니다.
이 방식의 핵심은 다음입니다:
-
RFID 리더가 BLE HID(키보드) 형태로 데이터를 전송
-
ESP32가 이를 키보드 입력처럼 받아 처리
-
최종적으로 RFID 값을 JSON 형태로 출력
👉 즉, 별도의 RFID 프로토콜 없이도 태그 읽기 가능
🧠 동작 구조
전체 흐름은 아래와 같습니다:
RFID 태그 스캔
↓
BLE HID (키보드 입력 형태)
↓
ESP32 수신
↓
스캔코드 → 문자 변환
↓
문자열 완성 (Enter 기준)
↓
JSON 출력
⚙️ 주요 기능 요약
|
기능 |
설명 |
|
BLE 스캔 |
HID 장치 자동 탐색 |
|
자동 연결 |
TAG 또는 HID 서비스 감지 시 연결 |
|
HID 파싱 |
키보드 입력을 문자로 변환 |
|
태그 조립 |
Enter 기준으로 하나의 ID 완성 |
|
출력 |
{"id":"태그값"} 형태 |
🔑 핵심 코드 설명
1️⃣ HID 스캔코드 → 문자 변환
static char scancodeToChar(uint8_t code)
👉 BLE HID 키보드에서 오는 데이터는 ASCII가 아니라 스캔코드
예:
-
0x04 → A
-
0x1E → 1
📌 역할:
-
스캔코드를 사람이 읽을 수 있는 문자로 변환
2️⃣ HID 데이터 처리
static void processHIDReport(const uint8_t *data, int len)
👉 핵심 로직 (가장 중요)
동작:
-
HID 데이터 수신
-
문자 변환
-
버퍼에 저장
-
Enter(\n) 오면 출력
if (c == '\n') {
Serial.printf("{\"id\":\"%s\"}\n", tagBuffer);
}
✔ 결과 예시:
{"id":"1234567890"}
3️⃣ BLE HID 서비스 탐색
svcDiscCB()
👉 UUID 0x1812 = HID 서비스
-
HID 장치인지 확인
-
해당 서비스 범위 저장
4️⃣ HID Report Characteristic 찾기
charDiscCB()
👉 중요한 UUID:
-
0x2A4D → HID Report
-
0x2A22 → Boot Keyboard
✔ Notify 가능한 것만 저장
5️⃣ Notification 활성화
enableNotification()
👉 CCCD(0x2902)에 write해서
데이터를 실시간으로 받도록 설정
6️⃣ BLE 이벤트 처리 (핵심 상태 머신)
gapEventHandler()
주요 이벤트:
|
이벤트 |
설명 |
|
CONNECT |
연결 성공 |
|
DISCONNECT |
연결 해제 |
|
NOTIFY_RX |
데이터 수신 |
|
ENC_CHANGE |
암호화 완료 |
|
PASSKEY |
페어링 처리 |
✔ 여기서 실제 데이터 들어옴:
case BLE_GAP_EVENT_NOTIFY_RX:
processHIDReport(buf, len);
7️⃣ BLE 스캔 필터
if (name.indexOf("TAG") >= 0 || dev->isAdvertisingService("1812"))
👉 조건:
-
이름에 TAG 포함
-
또는 HID 서비스 광고
✔ 즉, RFID 리더 자동 탐색
8️⃣ 전체 루프 흐름
loop()
동작:
-
스캔 완료 → 연결 시도
-
실패 → 재스캔
-
끊어짐 → 재연결
👉 완전 자동 시스템
📡 실제 출력 결과
시리얼 모니터:
[BLE] Connected
[BLE] Ready! Scan a pet tag...
{"id":"A123456789"}
💡 활용 아이디어
이 구조는 생각보다 강력합니다 👇
🐶 반려동물 관리 시스템
-
RFID 등록
-
병원 기록 조회
-
출입 관리
🍽️ 반려동물 출입 식당
-
NFC/RFID 찍으면
-
건강 기록 확인
👉 네가 말한 아이디어랑 딱 맞음
🏭 산업용 출입 인증
-
카드 대신 BLE HID 리더 사용
🚀 장점
✔ UART/RS485 필요 없음
✔ 드라이버 필요 없음
✔ HID 표준이라 호환성 좋음
✔ 구현 난이도 낮음
⚠️ 주의사항
-
HID 장치마다 스캔코드 다를 수 있음
-
특수문자 처리 추가 필요
-
대소문자 (Shift) 처리 없음 → 필요 시 추가
✍️ 마무리
이번 프로젝트는 단순한 RFID 리더가 아니라
👉 BLE HID 기반 입력 시스템
으로 확장 가능한 구조입니다.
특히 ESP32 하나로:
-
BLE 스캔
-
HID 파싱
-
데이터 처리
까지 다 가능하다는 점이 핵심입니다.
📌 결론
👉 “RFID 리더를 키보드처럼 쓰는 구조”
이거 하나 이해하면
IoT 시스템 설계 난이도 확 내려갑니다.
아래와같은 방식으로 식당 POS기기에 도입하여 사용중입니다.
강아지 NFC가 입력되면 JSON 데이터가 Serial로 들어오기 때문에 해당 데이터를 읽은 POS기기에서
"건강한 강아지네요" 신규등록 음성알림
"단골 댕댕이네요" 재방문 음성알림
위 와같이 제가 개발한 포스시스템이 붙여서 현재 사용중입니다.
서버도 별도로 개발 하여 강아지 동물코드도 별도로 관리하고 있습니다.
반려견 문화가 좋은 쪽으로 많이 발전하였으면 좋겠습니다. ^^