Skip to main content

System Architecture

Device → Go → Node → Vue. No skipping layers. Plugins swap. Same boundaries from a single host to a cluster.

Architecture is not decoration for architects. It serves the two ledgers on the home page: fewer human days, data you dare use.
Principles: Design Philosophy. Problem framing: What we solve.

Why this split is mandatory​

If the architecture allows…The field becomes…Lingdian hard rule
UI talks to Go / BrokerAuth chaos, version lock, no remote clarityNo cross-layer calls
Protocols baked into coreEvery device patches the kernelHot-plug protocols
Only “cleaned” numbers storedTriage needs a packet capture on siteRaw + normalized dual-track
Config scattered on the data planeTenant/OTA SSOT unclearConfig/auth only on Node
One design for single host, another for clusterScale = rewriteSame boundaries when scaling

One line: Device → Go → Node → Vue — talk only to neighbors.

Overview​

Open full-screen diagram

Who does what​

LayerComponentDoesDoes not
EdgeDevice / gatewayCollect, execute downlink—
MessagegmqttMQTT ingress, topicsBusiness decode, authz
Data planeGo serverSubscribe, decode, rules/OTA exec, dual-track persist, event busMulti-tenant UI, orchestration SSOT
Control planeNodeHTTP APIs, realtime push, config/OTA, auth, open APIsOwn device long connections
PresentationVue / mini programUX & field jobsCall Go or Broker
Edge proxyNginxReverse proxy + staticBusiness logic
StorageTD / PG / Redis / Manticore (optional)TS+full uplink / business SSOT / hot / search—

Hard rules: Go is Broker Client only (connects to gmqtt); config/firmware/jobs/auth live only on Node; no skipping layers.

How messages move​

Topic: {PK}/{GW}/self/{module}/{u|d}. Plugins emit a standard device envelope. Uplink: ingress → decode → dual-track → rules/forward → event bus → realtime push. Downlink: admin/API → Node → Go encode → gmqtt d.

Field meaning: vendors plug in; ops read raw+normalized remotely; UI never touches Broker.

How data flows​

Adapter (gmqtt) → Uplink → Processor → Storage (TD / Redis / PG) / Forwarder; Downlink via Node → Go → gmqtt.

Codec & plugin load​

Node protocol repo publishes → Go server fetches active pack → hot-load. New protocols as modules — Vue unchanged.

Where it lives: dual-track​

TD (telemetry + full uplink) · PG (business/OTA/index) · Redis (hot/shadow/rules) · optional Manticore.
Without a data team, raw for audit + normalized for compute + standard parameters beats another “governance” poster.

How humans connect​

HTTP APIs via Node · realtime push via Node · Vue admin + mini program on the same APIs.

Phase-1: single-host start​

Same logical layers; processes may co-locate (gmqtt, Go server, Node, Nginx, TD/PG/Redis). Scale later without changing no-skip / dual-track rules.

Capacity: Performance.

Architecture ↔ yardsticks & field stories​

YardstickLanding
First-passPlugins / AI onboard, standard envelope, Topic contract
Remote clarityDual-track, tracing, full uplink, realtime push
Data you dare useStandard parameters, thing-model-only business, no dirty dump
Field storyHow architecture holds it
Plant under controlNear-realtime rules on Go; auth/orchestration on Node
Campus ledgerBusiness modules on Node; mini program same API
OEM white-labelProtocol repo + private deploy, same boundaries
Integrator less on-siteRemote dual-track + localizable faults from no-skip

Next​

Scenarios · Features · Design Philosophy · Device Access