PubSub
PubSub은 클라이언트-서버와 다른 통신 모델입니다. 게시자(publisher)는 값의 묶음을 네트워크 메시지로 보내고, 구독자(subscriber)는 관심 있는 메시지를 골라 받습니다. 둘 사이에 세션이 없으므로 하나의 메시지를 여러 구독자가 동시에 받을 수 있습니다. PubSub은 Part 14에서 정의합니다.
구성 요소
섹션 제목: “구성 요소”Publisher Subscriber+--------------------------------------+ +--------------------------------+| PubSubConnection (PublisherId) | | PubSubConnection || WriterGroup (WriterGroupId) | NetworkMessage | ReaderGroup || DataSetWriter (DataSetWriterId) ---+-----------------> | DataSetReader || PublishedDataSet (fields) | UDP or broker | filter: PublisherId, |+--------------------------------------+ | WriterGroupId, WriterId | +--------------------------------+| 구성 요소 | 역할 |
|---|---|
| PublishedDataSet | 게시할 필드 목록과 값의 원천(source) |
| DataSetWriter | DataSet을 DataSetMessage로 인코딩합니다. DataSetWriterId로 구분합니다. |
| WriterGroup | 여러 DataSetWriter의 메시지를 NetworkMessage 하나로 묶고 게시 주기를 정합니다. WriterGroupId로 구분합니다. |
| PubSubConnection | 전송 주소와 게시자 ID(PublisherId)를 가집니다. |
| DataSetReader | 구독자 쪽에서 PublisherId, WriterGroupId, DataSetWriterId로 메시지를 고르고 필드를 해석합니다. |
| DataSetMetaData | 필드 이름과 타입, 구성 버전(ConfigurationVersion: major·minor) |
메시지
섹션 제목: “메시지”NetworkMessage는 헤더와 하나 이상의 DataSetMessage로 이루어집니다.
- NetworkMessage 헤더: PublisherId, 그룹 헤더(WriterGroupId, GroupVersion, NetworkMessageNumber, SequenceNumber), 담긴 DataSetWriterId 목록, 보안 헤더
- DataSetMessage: 시퀀스 번호, 상태, 구성 버전, 시각, 필드. 모든 필드를 담는 키 프레임(key frame), 바뀐 필드만 담는 델타 프레임(delta frame), 이벤트, keep-alive가 있습니다.
메시지 매핑은 두 가지입니다.
| 매핑 | 형식 | 특징 |
|---|---|---|
| UADP | 이진 | 작고 빠릅니다. 헤더 필드를 비트 플래그로 켜고 끕니다. |
| JSON | 텍스트 | 사람이 읽기 쉽고 IT 시스템과 연동하기 좋습니다. |
| 전송 | 주소 | 특징 |
|---|---|---|
| UDP | opc.udp://호스트:포트, 기본 포트 4840 |
브로커가 없습니다. 유니캐스트 또는 멀티캐스트로 보냅니다. |
| MQTT | 브로커 주소와 토픽(topic) | 브로커가 메시지를 구독자에게 전달합니다. QoS로 전달 보장 수준을 정합니다. |
| AMQP | 브로커 주소와 큐 | 브로커 기반 전송입니다. |
보안과 SKS
섹션 제목: “보안과 SKS”PubSub 메시지는 대칭 키로 서명하거나 서명하고 암호화합니다. 게시자와 구독자는 같은 보안 그룹(security group)의 키를 공유해야 합니다. 키는 보안 키 서비스(Security Key Service, SKS)가 배포합니다. 게시자와 구독자는 SKS 서버의 GetSecurityKeys 메서드를 호출해 현재 키와 다음 키를 받고, 키 수명이 끝나면 새 키로 바꿉니다. 메시지의 보안 헤더에는 보안 토큰 ID와 논스(nonce)가 들어갑니다.
브로커 전송에서는 브로커 연결 자체를 TLS로 보호할 수도 있습니다. 이 보호는 메시지 보안과 별개입니다.
PDComm 시뮬레이터의 PubSub
섹션 제목: “PDComm 시뮬레이터의 PubSub”PDComm 시뮬레이터의 PubSub 작업 공간은 다음 설정으로 동작합니다.
| 항목 | 값 |
|---|---|
| 메시지 매핑 | UADP |
| 전송 | UDP 유니캐스트, MQTT 5(QoS 1) |
| 역할 | 게시자와 구독자(같은 프로세스에서 되돌려 받기), 게시자, 구독자 |
| DataSetMessage | 키 프레임. 필드는 Variant 값입니다. |
| 식별자 | PublisherId(UInt16, 기본 77), WriterGroupId(기본 1), DataSetWriterId(기본 17) |
| 받은 메시지 보관 | 최대 256개. pubsub_received로 꺼냅니다. |
시뮬레이터는 서명과 암호화가 없는(보안 모드 None) UADP 메시지를 주고받습니다.
UDP PubSub 튜토리얼과 MQTT PubSub 튜토리얼에서 실행합니다.
다음 단계
섹션 제목: “다음 단계”배경 지식을 모두 읽었습니다. 빠른 시작으로 첫 연결을 만듭니다.