Sparkplug B 토픽과 메시지 종류
Sparkplug B는 MQTT 위에 토픽 구조, 메시지 종류, Protobuf 페이로드, 상태 관리 규칙을 규정한다.
Sparkplug B의 필요성
MQTT는 토픽 이름의 구성 방식, 페이로드의 형식, 장비의 동작 여부를 알리는 방법을 규정하지 않는다. Sparkplug는 이 세 가지를 규정한 사양이다.
토픽 구조
namespace/group_id/message_type/edge_node_id/[device_id]
spBv1.0/plant1/NBIRTH/line1-gw
spBv1.0/plant1/DDATA/line1-gw/robot3
namespace: Sparkplug B에서는spBv1.0으로 고정된다.group_id: Edge Node(MQTT 세션을 수립하는 클라이언트) 그룹의 이름이다.edge_node_id: Edge Node의 이름이다.device_id: Edge Node 하위 장치의 이름이다. 장치 메시지에만 포함된다.
세 id에는 +, /, #을 사용할 수 없다.
메시지 종류
| 종류 | 의미 |
|---|---|
| NBIRTH, NDEATH | Edge Node의 시작과 종료 알림 |
| DBIRTH, DDEATH | 장치의 시작과 종료 알림 |
| NDATA, DDATA | Edge Node와 장치의 데이터 |
| NCMD, DCMD | Edge Node와 장치로 전송하는 명령 |
| STATE | 데이터를 수신하는 Host Application의 상태 |
Protobuf 페이로드
STATE를 제외한 메시지의 페이로드는 Protocol Buffers로 인코딩한 이진 데이터이다. 개별 값을 metric이라고 한다.
// 일부 필드만 옮긴다
message Payload {
optional uint64 timestamp = 1;
repeated Metric metrics = 2;
optional uint64 seq = 3;
}
상태 관리
- Edge Node는 NDEATH를 MQTT Will 메시지(연결이 단절되면 브로커가 대신 발행하는 메시지)로 등록하고, 연결되면 NBIRTH를 발행한다. 그 뒤에 장치마다 DBIRTH가 이어진다.
- NBIRTH에는 Edge Node가 이후에 전송할 모든 metric의 이름과 데이터 타입이 포함된다. 장치의 metric은 DBIRTH에 포함된다.
seq는 0에서 255까지 1씩 증가한 뒤 다시 0으로 돌아간다. 누락된 번호의 메시지가 대기 후에도 수신되지 않으면 Host Application이 NCMD로 BIRTH를 다시 요청한다.- Host Application은
spBv1.0/STATE/<host_id>에online과timestamp를 포함한 JSON을 QoS 1, retain으로 발행한다.