MosFlash 专注于为软件开发者提供稳定的商用物联网电控智能硬件,全部内置开放的指令接口
我们的设备基于 MQTT / TCP 协议建立可靠连接,实现您的代码与设备直接通信;
我们定义了统一标准、JSON 格式的开发者指令集,供您进行设备控制与数据采集;
我们支持公有云、私有云与本地私有化等多种部署方式,broker 由您自主掌控,无厂商锁定。
import json, paho.mqtt.client as mqtt DEVICE = "A0B1C2D3E4F5" # 设备 MAC,即 deviceId cli = mqtt.Client(); cli.connect("broker.yourdomain.com", 1883) # 下发合闸指令(与 TCP 同一套 JSON 信封) topic = f"/{tenantId}/{userId}/{productModel}/{DEVICE}/sub" cli.publish(topic, json.dumps({ "messageId": "m-001", "cmd": "switch.control", "deviceId": DEVICE, "data": {"key": 1}, # 1 通电 / 0 断电 }))
const mqtt = require("mqtt"); const cli = mqtt.connect("mqtt://broker.yourdomain.com:1883"); const DEVICE = "A0B1C2D3E4F5"; // 下发合闸指令(与 TCP 同一套 JSON 信封) cli.publish(`/${'${'}tenantId}/${'${'}userId}/${'${'}productModel}/${'${'}DEVICE}/sub`, JSON.stringify({ messageId: "m-001", cmd: "switch.control", deviceId: DEVICE, data: { key: 1 }, // 1 通电 / 0 断电 }));
import ( "encoding/json" mqtt "github.com/eclipse/paho.mqtt.golang" ) const deviceID = "A0B1C2D3E4F5" opts := mqtt.NewClientOptions().AddBroker("tcp://broker.yourdomain.com:1883") cli := mqtt.NewClient(opts); cli.Connect() // 下发合闸指令 cmd, _ := json.Marshal(map[string]interface{}{ "messageId": "m-001", "cmd": "switch.control", "deviceId": deviceID, "data": map[string]int{"key": 1}, }) cli.Publish("/{tenantId}/{userId}/{productModel}/"+deviceID+"/sub", 0, false, cmd)
String deviceId = "A0B1C2D3E4F5"; MqttClient cli = new MqttClient("tcp://broker.yourdomain.com:1883", "app-java"); cli.connect(); // 下发合闸指令 String cmd = "{\"messageId\":\"m-001\"," + "\"cmd\":\"switch.control\"," + "\"deviceId\":\"" + deviceId + "\"," + "\"data\":{\"key\":1}}"; cli.publish("/{tenantId}/{userId}/{productModel}/" + deviceId + "/sub", new MqttMessage(cmd.getBytes()));
import json, socket # 设备是 TCP Client:它主动连你,所以你的程序是服务端 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) srv.bind(("0.0.0.0", 9000)); srv.listen(8) conn, _ = srv.accept() # 等设备接入 f = conn.makefile("rwb") # 同一套 JSON 信封,与 MQTT 完全一致 f.write((json.dumps({ "messageId": "m-001", "cmd": "switch.control", "data": {"key": 1}, }) + "\n").encode()) print(f.readline().decode()) # {"messageId":"m-001","ok":true,"err":""}
/{tenantId}/{userId}/{productModel}/{deviceId}/sub · 上行主题 /{tenantId}/{userId}/{productModel}/{deviceId}/pub
统一信封:messageId / cmd / deviceId / ok / err / data
标准报文:TCP 与 MQTT 共用同一套报文
通过标准化开放指令,从固件层面全面开放智能硬件的全方位能力,无需自行烧录或改动底层固件,控制与采集能力直接以 JSON 指令调用。
支持 WiFi 与 4G Cat.1 两种联网方式,按现场网络条件选择,具体型号提供哪种版本详见产品页。无论哪种联网与配网方式,同一套指令统统解决,更多联网方式我们持续更新。
以商用物联网电控硬件为基线:通断控制、用电量统计、定时调节、配电保护、异常报警并拉闸等诸多电控能力全面覆盖商用/工业物联网电控场景。
专业软/硬件开发团队,多年物联网智能硬件经验加持,针对有OEM、ODM需求客户,可快速理解需求,定制方案,极大程度缩短工期,降低风险。
MosFlash 产品线同时具备 WiFi 与 4G Cat.1 两条联网路线:WiFi 版适合有稳定局域网的场所(家庭、楼控、机房);4G 版无需布线,卡插即用,适合跨区域、临时点位或没有网络的现场。两条路线指令与报文格式完全一致,切换不需改代码。
两种通信方式,同一套四层结构,区别只在服务层。报文格式完全一致,切换方式不需改代码。
供您进行设备控制与数据采集。全部指令共用同一套 JSON 信封,字段名与语义全系产品一致——学会一次,全型号通用。
{
"messageId": "m-001",
"cmd": "switch.control",
"data": {
"key1": 1
}
}
{
"messageId": "m-001",
"deviceId": "A0B1C2D3E4F5",
"cmd": "switch.control",
"ok": true,
"err": ""
}
{
"messageId": "m-001",
"cmd": "energy.info"
}
{
"messageId": "m-001",
"deviceId": "A0B1C2D3E4F5",
"cmd": "energy.info",
"ok": true,
"err": "",
"data": {
"voltageV": 220.3,
"powerW": 99.6
}
}
{
"messageId": "m-001",
"cmd": "config.keyLock.set",
"data": {
"lockState": 1
}
}
{
"messageId": "m-001",
"deviceId": "A0B1C2D3E4F5",
"cmd": "config.keyLock.set",
"ok": true,
"err": "",
"data": {
"lockState": 1
}
}
{
"messageId": "m-001",
"cmd": "timer.set",
"data": {
"taskId": 1,
"type": "day",
"time": "07:30"
}
}
{
"messageId": "m-001",
"deviceId": "A0B1C2D3E4F5",
"cmd": "timer.set",
"ok": true,
"err": ""
}
{
"messageId": "rpt-001",
"deviceId": "A0B1C2D3E4F5",
"cmd": "device.report",
"ts": 1759123200000,
"cause": "localKey",
"source": "localKey",
"data": {
"key1": 0
}
}
各产品指令数以固件版本为准 · 完整文档见文档中心
没有私有 SDK,没有封闭 DSL。一个通用 MQTT 客户端 + 一段 JSON,就是全部接入成本;下行指令与上行数据走同一套统一信封:messageId 请求-响应匹配,device.report 主动上报事件驱动业务。
import json, paho.mqtt.client as mqtt TENANT, USER, MODEL = "t-001", "u-001", "MFSW-2KS" DEVICE = "A0B1C2D3E4F5" # WiFi 设备 = MAC;4G 设备 = IMEI SUB = "/{tenantId}/{userId}/{productModel}/{deviceId}/sub" PUB = "/{tenantId}/{userId}/{productModel}/{deviceId}/pub" # ① 连接你自己的 Broker(QoS 0,全系一致) cli = mqtt.Client(); cli.connect("broker.yourdomain.com", 1883) cli.loop_start() # ② 订阅下行主题 —— 设备指令从这里进来 cli.subscribe(SUB) # ③ 下发指令(messageId 你生成,设备原样回显) mid = "m-001" cli.publish(PUB, json.dumps({ "messageId": mid, "cmd": "switch.control", "data": { "key1": 1 }, # 1 合闸 / 0 分闸 })) # ④ 按 messageId 匹配应答;device.report 是主动上报 def on_msg(cl, m, msg): d = json.loads(msg.payload) if d.get("cmd") == "device.report": print("[上报]", d["cause"], d["data"]) elif d.get("messageId") == mid: print("[应答]", d["ok"], d["err"]) cli.on_message = on_msg; cli.subscribe(SUB); cli.loop_forever()
const mqtt = require("mqtt"); const TENANT = "t-001", USER = "u-001", MODEL = "MFSW-2KS"; const DEVICE = "A0B1C2D3E4F5"; // WiFi=MAC,4G=IMEI const BASE = `/${TENANT}/${USER}/${MODEL}/${DEVICE}`; // ① 连接 + ② 订阅 const cli = mqtt.connect("mqtt://broker.yourdomain.com:1883"); const mid = "m-001"; cli.on("connect", () => cli.subscribe(`${BASE}/sub`)); // ③ 下发指令 cli.publish(`${BASE}/pub`, JSON.stringify({ messageId: mid, cmd: "switch.control", data: { key1: 1 }, })); // ④ 应答按 messageId 匹配;device.report 为主动上报 cli.on("message", (t, p) => { const d = JSON.parse(p.toString()); if (d.cmd === "device.report") console.log("[上报]", d.cause, d.data); else if (d.messageId === mid) console.log("[应答]", d.ok, d.err); });
import ( "encoding/json" mqtt "github.com/eclipse/paho.mqtt.golang" ) // ① 连接(QoS 0) c := mqtt.NewClientOptions().AddBroker("tcp://broker.yourdomain.com:1883").SetClientID("app-01") if tok := c.Connect(); tok.Wait() && tok.Error() != nil { panic(tok.Error()) } // ② 订阅下行主题 base := fmt.Sprintf("/t-001/u-001/MFSW-2KS/%s", deviceID) c.Subscribe(base+"/sub", 0, onMsg) // ③ 下发指令 mid := "m-001" body, _ := json.Marshal(map[string]any{ "messageId": mid, "cmd": "switch.control", "data": map[string]int{"key1": 1}, }) c.Publish(base+"/pub", 0, false, body) // ④ 应答按 messageId 匹配;device.report 为主动上报 func onMsg(_ mqtt.Client, m mqtt.Message) { var d map[string]any json.Unmarshal(m.Payload(), &d) fmt.Println(d["cmd"], d["cause"], d["err"]) }
import com.google.mqtt.client.MqttClient; import com.google.mqtt.client.MqttCallbackExtended; final String BASE = "/t-001/u-001/MFSW-2KS/" + deviceID; // WiFi=MAC,4G=IMEI // ① 连接 final MqttClient cli = new MqttClient( "tcp://broker.yourdomain.com:1883", "app-01"); cli.connect(); // ② 订阅下行主题 cli.subscribe(BASE + "/sub", 1, (t, m) -> onMsg(m.toString())); // ③ 下发指令 final String mid = "m-001"; final String body = "{\"messageId\":\"" + mid + "\",\"cmd\":\"switch.control\",\"data\":{\"key1\":1}}"; cli.publish(BASE + "/pub", body.getBytes(), 1, false); // ④ 应答按 messageId 匹配;device.report 为主动上报 cli.setCallback(new MqttCallbackExtended() { public void messageArrived(String t, MqttMessage m) { onMsg(m.toString()); } public void deliveryComplete(IMqttToken tok) {} public void connectionLost(Throwable cause) {} });
# TCP Client 模式:设备主动连你的服务器,无需 Broker,JSON 格式完全一致 # 你的角色 = 服务端(监听端口);设备的角色 = 客户端(主动连过来) # ① 你的服务器监听端口(端口自定,与设备侧 config.tcp.set 一致) srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) srv.bind(("0.0.0.0", 9000)) # 监听所有网卡 srv.listen(8) # ② 等待设备接入并识别它(消息自带 deviceId,WiFi=MAC / 4G=IMEI) conn, addr = srv.accept() f = conn.makefile("rwb") first = json.loads(f.readline()) # 设备上线的首条报文 dev_id = first["deviceId"] print("设备已接入:", dev_id) # ③ 下发指令(同一套信封,messageId 原样回显) f.write((json.dumps({ "messageId": "m-001", "cmd": "switch.control", "data": { "key1": 1 }, }) + "\n").encode()) # ④ 读取应答与主动上报(device.report 是设备自发上行) while True: d = json.loads(f.readline()) kind = "上报" if d.get("cmd") == "device.report" else "应答" print(kind, d.get("cause") or d.get("err"))
设备出厂即支持 MQTT / TCP 标准化 JSON 报文。Broker 与 TCP 服务器都由你自己搭建——数据点对点直传,不经厂商云端中转。
config.mqtt.set 指向你的 Broker(需重启生效)config.mqtt.set 指向内网 Broker(需重启生效)config.tcp.set 填服务器地址与端口(需重启生效)config.mqtt.set 切到你自己的服务器

对照接线图接好电源进线与负载出线,设备通电即进入工作状态

长按按键 6 秒进入配网模式,手机或电脑连接设备热点(默认密码 mf12345678)

浏览器打开 192.168.4.1,扫描或输入 WiFi 名称与密码,保存后设备自动重启联网


登录【木澜设备助手】绑定设备,远程合分闸、下发调试指令,功能即时验证