IoT Platform
Container Diagram
%%{init: {"theme":""}}%%
C4Container
Person(admin, "Administrator")
System_Ext(keycloak, "Keycloak", "Open ID Connect compliant identity and access management")
SystemQueue_Ext(mqtt, "MQTT", "Message bus to interact with underlying IoT platform")
Container(dev-mgmt-web, "Device Management UI", $techn="JavaScript, React", "Presents devicemanagement capabilities to users.")
System_Ext(cip-p, "City Information Platform", "Stores and provides current and
historical city information") Container_Boundary(c1, "IoT Platform") { Container(iot-dev-mgmt, "iot-device-mgmt", $techn="Go", "Backend service for device management") Container(iot-agent, "iot-agent", $techn="Go", "Decodes and translates incoming messages") Container(iot-tr-fw, "iot-transform-fiware", $tech="Go", "Transforms accepted messages into
corresponding datamodels known
to the City Information Platform") Container(iot-events, "iot-events", $tech="Go", "Publishing events to UI, cloudevents and more") Container(iot-core, "iot-core", $tech="Go", "Decorates received messages and accepts
them for further processing") ContainerDb_Ext(pgsql, "PostgreSQL Database", "SQL Database", "To be used for storing information
about device types and tenants.") SystemQueue_Ext(rmq, "RabbitMQ", "Message bus used for internal
publish/subscribe between services.") } Rel(admin, dev-mgmt-web, "Uses", "https") Rel(admin, keycloak, "Login", "OAuth2, Code+PKCE") UpdateRelStyle(admin, dev-mgmt-web, $offsetX="-50", $offsetY="-10") UpdateRelStyle(admin, keycloak, $offsetX="-40", $offsetY="20") Rel(dev-mgmt-web, keycloak, "Get JWT access token", "OAuth2") Rel(dev-mgmt-web, iot-dev-mgmt, "Manage devices", "https, REST") Rel(dev-mgmt-web, iot-events, "Live updates", "https, SSE") UpdateRelStyle(dev-mgmt-web, keycloak, $offsetX="30", $offsetY="-20") UpdateRelStyle(dev-mgmt-web, iot-dev-mgmt, $offsetX="-110", $offsetY="-50") Rel(iot-agent, mqtt, "subscribe to incoming
message payloads", "amqp") Rel(iot-agent, iot-dev-mgmt, "validate and
identify device", "https, OAuth2") Rel(iot-agent, iot-core, "event:
message.received", "queue: iot-core") Rel(iot-events, iot-core, "event:
message.received", "queue: iot-core") Rel(iot-events, iot-dev-mgmt, "event:
#", "queue: #") Rel(iot-events, iot-agent, "event:
device-status", "queue: iot-agent") UpdateRelStyle(iot-agent, mqtt, $offsetX="50", $offsetY="-50") UpdateRelStyle(iot-agent, iot-dev-mgmt, $offsetX="-40", $offsetY="-50") UpdateRelStyle(iot-agent, iot-core, $offsetX="10", $offsetY="-10") Rel(iot-core, iot-dev-mgmt, "fetch enrichment
details from", "https, OAuth2") Rel(iot-core, iot-tr-fw, "publish", "topic: message.accepted") UpdateRelStyle(iot-core, iot-dev-mgmt, $offsetX="-90", $offsetY="10") Rel(iot-tr-fw, cip-p, "Updates", "https, NGSI-LD") UpdateRelStyle(iot-tr-fw, cip-p, $offsetX="50", $offsetY="-30") UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1")
historical city information") Container_Boundary(c1, "IoT Platform") { Container(iot-dev-mgmt, "iot-device-mgmt", $techn="Go", "Backend service for device management") Container(iot-agent, "iot-agent", $techn="Go", "Decodes and translates incoming messages") Container(iot-tr-fw, "iot-transform-fiware", $tech="Go", "Transforms accepted messages into
corresponding datamodels known
to the City Information Platform") Container(iot-events, "iot-events", $tech="Go", "Publishing events to UI, cloudevents and more") Container(iot-core, "iot-core", $tech="Go", "Decorates received messages and accepts
them for further processing") ContainerDb_Ext(pgsql, "PostgreSQL Database", "SQL Database", "To be used for storing information
about device types and tenants.") SystemQueue_Ext(rmq, "RabbitMQ", "Message bus used for internal
publish/subscribe between services.") } Rel(admin, dev-mgmt-web, "Uses", "https") Rel(admin, keycloak, "Login", "OAuth2, Code+PKCE") UpdateRelStyle(admin, dev-mgmt-web, $offsetX="-50", $offsetY="-10") UpdateRelStyle(admin, keycloak, $offsetX="-40", $offsetY="20") Rel(dev-mgmt-web, keycloak, "Get JWT access token", "OAuth2") Rel(dev-mgmt-web, iot-dev-mgmt, "Manage devices", "https, REST") Rel(dev-mgmt-web, iot-events, "Live updates", "https, SSE") UpdateRelStyle(dev-mgmt-web, keycloak, $offsetX="30", $offsetY="-20") UpdateRelStyle(dev-mgmt-web, iot-dev-mgmt, $offsetX="-110", $offsetY="-50") Rel(iot-agent, mqtt, "subscribe to incoming
message payloads", "amqp") Rel(iot-agent, iot-dev-mgmt, "validate and
identify device", "https, OAuth2") Rel(iot-agent, iot-core, "event:
message.received", "queue: iot-core") Rel(iot-events, iot-core, "event:
message.received", "queue: iot-core") Rel(iot-events, iot-dev-mgmt, "event:
#", "queue: #") Rel(iot-events, iot-agent, "event:
device-status", "queue: iot-agent") UpdateRelStyle(iot-agent, mqtt, $offsetX="50", $offsetY="-50") UpdateRelStyle(iot-agent, iot-dev-mgmt, $offsetX="-40", $offsetY="-50") UpdateRelStyle(iot-agent, iot-core, $offsetX="10", $offsetY="-10") Rel(iot-core, iot-dev-mgmt, "fetch enrichment
details from", "https, OAuth2") Rel(iot-core, iot-tr-fw, "publish", "topic: message.accepted") UpdateRelStyle(iot-core, iot-dev-mgmt, $offsetX="-90", $offsetY="10") Rel(iot-tr-fw, cip-p, "Updates", "https, NGSI-LD") UpdateRelStyle(iot-tr-fw, cip-p, $offsetX="50", $offsetY="-30") UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1")