Technology

JSON-RPC contract × MQTT transport

Falcon does not invent a new protocol. It translates serial PLC ↔ HMI traffic into JSON-RPC 2.0 messages engineers already know, and moves them over plain MQTT publish / subscribe.

Communication interfaces

One side of Falcon sits on the field serial link; the other hands the data to your systems over MQTT.

WhereSupport
Field side: PLC ↔ HMISerial: RS-232, RS-422, RS-485
System side: Falcon → MES / SCADA / cloudMQTT with JSON-RPC 2.0 messages
PLC and HMI connected over EthernetNot supported yet

Tell us your PLC / HMI models and wiring via the quote form and we will confirm the matching protocol and cabling.

Why JSON-RPC + MQTT

A clear call contract

JSON-RPC 2.0 defines method, params, id, result and error. Requests map to responses one-to-one, with standard error codes.

The lingua franca of IIoT

MQTT is lightweight, supports QoS and retained messages, and is the most common transport in AIoT and Industry 4.0 — nearly every platform speaks it.

Language- and platform-agnostic

Python, Node.js, C#, Go, Node-RED or cloud IoT services — if it can send JSON over MQTT, it can integrate.

One broker for everything

Monitoring data, remote commands and system status all share one MQTT broker: a simple architecture with centralized permissions.

MQTT topic layout

Each Falcon uses its gateway ID as the topic prefix, split by purpose into requests, responses, events and status.

TopicDirectionPurpose
falcon/{gw}/rpc/reqClient → FalconJSON-RPC requests (read / write tags, control, replay)
falcon/{gw}/rpc/res/{client}Falcon → ClientJSON-RPC response matching the request id
falcon/{gw}/eventFalcon → SubscribersObserved PLC ↔ HMI traffic (JSON-RPC notifications)
falcon/{gw}/statusFalcon → SubscribersOnline / offline state (retained + LWT)

Requests and responses

Clients publish requests to rpc/req with a reply_to topic. Falcon executes and returns a result or error carrying the same id.

Request: write a tagjson
// Topic: falcon/line-01/rpc/req
{
  "jsonrpc": "2.0",
  "id": "c7f2-0001",
  "method": "tag.write",
  "params": {
    "tag": "D100",
    "value": 1250,
    "reply_to": "falcon/line-01/rpc/res/mes-01"
  }
}
Response: successjson
// Topic: falcon/line-01/rpc/res/mes-01
{
  "jsonrpc": "2.0",
  "id": "c7f2-0001",
  "result": {
    "tag": "D100",
    "value": 1250,
    "ts": "2026-11-04T08:15:02.481Z"
  }
}
Response: error (standard JSON-RPC codes)json
{
  "jsonrpc": "2.0",
  "id": "c7f2-0002",
  "error": {
    "code": -32602,
    "message": "Invalid params",
    "data": { "tag": "D9999", "reason": "out of range" }
  }
}

Monitoring events

Whenever Falcon observes traffic between HMI and PLC, it publishes a JSON-RPC notification (no id) to the event topic, available to every subscriber in real time.

JSON-RPC notificationjson
// Topic: falcon/line-01/event   (JSON-RPC notification, no id)
{
  "jsonrpc": "2.0",
  "method": "traffic.observed",
  "params": {
    "direction": "hmi->plc",
    "op": "read",
    "tags": { "D100": 1200, "M20": true },
    "ts": "2026-11-04T08:15:01.937Z"
  }
}

Methods (illustrative)

Methods are named domain.action so their purpose is obvious at a glance.

MethodDescription
tag.readRead the current value of one or more PLC tags
tag.writeWrite a PLC tag (control intervention)
monitor.subscribeChoose which tag ranges are monitored and published
log.recordStart / stop recording a traffic log
log.replayReplay a log to reproduce field traffic
system.infoGateway version, health and connection info

Python integration example

Subscribe to events and read tags in under 30 lines with paho-mqtt.

client.pypython
import json, uuid
import paho.mqtt.client as mqtt

GW = "falcon/line-01"
ME = "mes-01"

def on_message(client, userdata, msg):
    print(msg.topic, json.loads(msg.payload))

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=ME)
client.on_message = on_message
client.connect("broker.local", 1883)
client.subscribe(f"{GW}/event")
client.subscribe(f"{GW}/rpc/res/{ME}")

req = {
    "jsonrpc": "2.0",
    "id": str(uuid.uuid4()),
    "method": "tag.read",
    "params": {"tags": ["D100", "M20"], "reply_to": f"{GW}/rpc/res/{ME}"},
}
client.publish(f"{GW}/rpc/req", json.dumps(req), qos=1)
client.loop_forever()

Security and reliability

  • MQTT username / password authentication and TLS-encrypted connections
  • Per-topic ACLs separate read-only monitoring clients from clients allowed to write
  • Writes go through explicit JSON-RPC methods and can be fully logged
  • QoS 1 and LWT keep command delivery and connection state observable

Topic names, method names and fields on this page are illustrative. Refer to the product technical documentation for the actual specification.

Supported PLC

Supported PLC brands

Falcon works with the Japanese and Taiwanese PLCs common on factory floors over serial (RS-232 / RS-422 / RS-485), with no need to replace existing equipment.

  • Mitsubishi Electric
  • Omron
  • Delta
  • Keyence
  • Panasonic
  • Toshiba
  • Vigor
  • Yamatake (azbil)
  • RKC
  • Ebara

Support varies by series and protocol within each brand. Tell us your model through the quote form for a compatibility check. Brands not listed here are welcome too. Request a Quote →

Get your line speaking MQTT today

Tell us your PLC / HMI models and site requirements. Our sales team replies with an integration assessment and quote within one business day.

Request a Quote