메시와 사물 인터넷
사무실 천장의 조명 300개를 벽 스위치 하나로 한꺼번에 끄고 싶다. 스위치에서 가장 먼 조명까지는 40 m, 벽도 몇 개 있다. 2장의 링크 버짓으로는 한 번에 닿지 않는다. 대형 마트의 전자 가격표 5,000개를 밤사이 모두 바꾸고 싶다. 6장의 연결을 하나씩 맺으면 몇 시간이 걸리고 가격표의 배터리가 남아나지 않는다. 이 장에서는 블루투스가 일대일 연결을 넘어 많은 기기를 다루는 두 가지 방법을 본다. 기기들이 서로 소문을 전하는 메시, 그리고 하나의 송신기가 시간표를 짜서 수천 기기와 주고받는 5.4의 PAwR이다.
- 블루투스 메시가 연결 없이 광고 패킷으로 메시지를 퍼뜨리는 관리된 플러딩과, TTL·메시지 캐시가 폭주를 막는 원리를 안다.
- 릴레이·프록시·프렌드·저전력 노드의 역할과 발행·구독, 그룹 주소의 쓸모를 이해한다.
- 릴레이 비율과 TTL이 도달률과 전송 횟수(공중 혼잡)를 어떻게 맞바꾸는지 시뮬레이터로 확인한다.
- 5.4의 응답 있는 주기적 광고(PAwR)의 서브이벤트·응답 슬롯 구조로 많은 기기를 관리하는 계산을 한다.
소문 퍼뜨리기: 관리된 플러딩
블루투스 메시(Bluetooth Mesh)는 Core 위에 얹힌 별도의 사양(Mesh Protocol)이다. 2017년 처음 나왔고, 기본 아이디어는 단순하다. 메시지를 광고 패킷에 실어 뿌리고(5장의 비연결 광고, 메시 메시지 전용 AD 구조), 그것을 들은 이웃 노드가 다시 뿌린다. 경로를 계산하지 않고 모두가 조금씩 중계하므로 이를 플러딩(flooding)이라 한다. 연결을 맺고 유지할 필요가 없어서 노드가 수백 개여도 구조가 단순하고, 노드 하나가 꺼져도 다른 길로 전해진다.
무작정 다시 뿌리면 메시지가 끝없이 돌며 공중을 가득 채운다(6장의 이더넷 브로드캐스트 폭풍과 같다). 그래서 “관리된” 플러딩이다.
- TTL(Time To Live): 메시지마다 7비트(0~127)의 남은 홉 수가 있다. 중계할 때마다 1씩 줄이고, 2 미만이면 더 중계하지 않는다.
- 메시지 캐시: 노드는 최근에 본 메시지(출발지 주소와 일련번호)를 기억해 두고, 같은 메시지를 다시 들으면 무시한다. 같은 소문을 두 번 전하지 않는다.
- 릴레이 선택: 모든 노드가 중계할 필요는 없다. 전원에 연결된 조명 같은 일부 노드만 릴레이 기능을 켠다. 너무 많으면 공중이 혼잡해지고, 너무 적으면 끊긴 곳이 생긴다.
카페 한쪽 끝에서 누가 “3번 테이블 손님, 주문 나왔어요!”라고 외친다. 반대쪽 끝까지는 안 들린다. 그래서 중간중간 앉은 몇몇 손님(릴레이)이 들은 말을 한 번씩만 다시 외쳐 준다. 이미 들은 말은 다시 전하지 않고(캐시), 너무 멀리 퍼지지 않도록 “앞으로 다섯 번만 전해 주세요”라는 꼬리표(TTL)를 단다. 모두가 다 외치면 카페가 시끄러워 오히려 아무것도 안 들린다.
메시 플러딩: 릴레이와 TTL로 사무실 전체에 닿기
노드의 역할과 주소: 발행과 구독
메시의 노드는 기능을 골라 켠다.
- 릴레이(relay): 위에서 본 중계 노드. 보통 전원이 있는 기기.
- 프록시(proxy): 메시 기능이 없는 휴대폰이 일반 GATT 연결(7장)로 메시에 메시지를 넣고 받게 해 주는 다리.
- 저전력 노드(LPN)와 프렌드(friend): 배터리로 도는 센서(LPN)는 늘 깨어 있을 수 없다. 이웃의 전원 노드(프렌드)가 LPN 앞으로 온 메시지를 대신 받아 두었다가, LPN이 가끔 깨어나 “내 것 있어?”라고 물으면 건넨다. 9장의 원리를 메시에 적용한 것이다.
메시지는 특정 노드가 아니라 주소로 보낸다. 노드마다 고유한 유니캐스트 주소가 있고, 여럿이 함께 듣는 그룹 주소가 있다. 스위치는 “3층 회의실 조명” 그룹 주소로 발행(publish)하고, 조명들은 그 그룹을 구독(subscribe)한다. 조명을 새로 달면 그 조명이 그룹을 구독하게 설정하기만 하면 되고, 스위치는 바꿀 필요가 없다.
새 기기를 메시에 들이는 과정은 프로비저닝이다. 휴대폰 같은 프로비저너가 기기와 ECDH(8장)로 키를 맺고 네트워크 키와 주소를 건넨다. 메시의 모든 메시지는 네트워크 키로 암호화되고 애플리케이션 키로 한 번 더 암호화되므로, 중계 노드는 메시지를 전달하되 내용(예: 도어락 명령)은 볼 수 없게 할 수 있다.
메시의 플러딩·TTL·역할·프로비저닝·키는 Core 밖의 Mesh Protocol 사양에 있다. 메시가 쓰는 Core 기능: 비연결 광고와 AD 구조([Vol 3] Part C §11), GATT([Vol 3] Part G), ECDH와 AES-CMAC([Vol 3] Part H §2.2)
스마트홈 표준 Matter는 기기가 Wi-Fi나 Thread로 동작하지만, 처음 설정할 때(커미셔닝) 휴대폰과 기기 사이의 통로로 블루투스 LE를 쓰는 경우가 많다. 아직 네트워크에 붙지 않은 기기도 LE 광고로 “설정 대기 중”을 알릴 수 있고, 휴대폰은 거의 모두 LE를 지원하기 때문이다. 블루투스는 여기서 메시가 아니라 5~7장의 광고·연결·GATT로 일한다.
5.4의 PAwR: 시간표로 수천 기기와 주고받기
전자 가격표(ESL)는 메시와 반대 문제다. 가격표끼리는 이야기할 필요가 없고, 천장의 송신기 하나가 수천 개에게 각자 다른 명령(“이 가격으로 바꿔”)을 보내고, 결과(“바꿨음, 배터리 70%”)를 받아야 한다. 연결을 수천 개 유지할 수는 없고, 그냥 방송하면 응답을 받을 수 없다.
5.4의 응답 있는 주기적 광고(PAwR, Periodic Advertising with Responses)는 5장의 주기적 광고에 서브이벤트와 응답 슬롯을 더했다.
- 주기적 광고 간격 하나(예: 몇 초)를 최대 128개 서브이벤트로 나눈다. 서브이벤트 간격은 7.5~318.75 ms다.
- 각 가격표는 자기에게 배정된 서브이벤트 하나만 깨어나 듣는다. 나머지 시간은 잔다.
- 서브이벤트마다 송신기가 AUX_SYNC_SUBEVENT_IND로 여러 가격표에게 명령을 보내고, 정해진 지연 뒤의 응답 슬롯에서 가격표들이 하나씩 AUX_SYNC_SUBEVENT_RSP로 답한다. 응답은 같은 채널에서 이루어진다.
- 필요하면 응답 슬롯 안에서 바로 연결을 맺을 수도 있다(AUX_CONNECT_REQ).
PAwR 간격 7.5 ms ~ 81.91875 s, 서브이벤트 간격 7.5 ~ 318.75 ms, 최대 128 서브이벤트, 응답 슬롯: [Vol 6] Part B §4.4.2.2.4 · 서브이벤트 채널은 알고리즘 #2(paEventCounter ⊕ paSubEventCounter): §4.4.2.1 · 5.4 새 기능: [Vol 1] Part C §13.1 · 전자 가격표 프로파일(ESL)은 Core 밖
가격표 5,000개 바꾸기: PAwR 시간표 계산
같은 일을 블루투스 메시로 하면 어떨까? 가격표 5,000개가 모두 메시 노드라면 무엇이 가장 문제일까?
메시는 메시지가 플러딩으로 퍼지고, 노드가 중계하려면 늘 듣고 있어야 한다.
핵심 정리
- 블루투스 메시(Core 밖의 Mesh Protocol)는 연결 없이 광고 패킷으로 메시지를 뿌리고 이웃이 다시 뿌리는 관리된 플러딩이다. TTL(7비트)과 메시지 캐시가 폭주를 막고, 일부 노드만 릴레이를 켠다.
- 역할: 릴레이, 프록시(GATT로 휴대폰 연결), 프렌드–저전력 노드(대신 받아 두기). 메시지는 유니캐스트·그룹 주소로 발행·구독한다. 프로비저닝은 ECDH, 메시지는 네트워크 키·애플리케이션 키로 두 번 암호화한다.
- 릴레이와 TTL은 도달률과 전송 횟수(혼잡)의 교환이다.
- 5.4의 PAwR은 주기적 광고 간격을 최대 128 서브이벤트(간격 7.5~318.75 ms)로 나누고 응답 슬롯을 두어, 송신기 하나가 수천 기기에게 각자 명령을 보내고 답을 받는다. 각 기기는 자기 서브이벤트만 깨어 듣는다.
확인 퀴즈
메시 메시지가 노드 사이를 끝없이 도는 것을 막는 두 장치는?
모든 노드에서 릴레이를 켜면 생기는 일로 가장 적절한 것은?
배터리로 동작하는 메시 센서가 자기 앞으로 온 메시지를 놓치지 않는 방법은?
Core 6.3에서 PAwR 주기적 광고 간격 하나에 둘 수 있는 서브이벤트의 최대 수는?
건물의 조명 300개를 스위치 하나로 동시에 켜는 일에 더 잘 맞는 구조는?