MosFlash · 开放的物联网商用智能硬件

用您的代码
掌控我的设备

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 通信版本按需选择

支持 WiFi 与 4G Cat.1 两种联网方式,按现场网络条件选择,具体型号提供哪种版本详见产品页。无论哪种联网与配网方式,同一套指令统统解决,更多联网方式我们持续更新。

商用/工业全场景覆盖

以商用物联网电控硬件为基线:通断控制、用电量统计、定时调节、配电保护、异常报警并拉闸等诸多电控能力全面覆盖商用/工业物联网电控场景。

OEM / ODM按需定制

专业软/硬件开发团队,多年物联网智能硬件经验加持,针对有OEM、ODM需求客户,可快速理解需求,定制方案,极大程度缩短工期,降低风险。

WiFi 与 4G 两条联网路线,按型号与现场条件选择

MosFlash 产品线同时具备 WiFi 与 4G Cat.1 两条联网路线:WiFi 版适合有稳定局域网的场所(家庭、楼控、机房);4G 版无需布线,卡插即用,适合跨区域、临时点位或没有网络的现场。两条路线指令与报文格式完全一致,切换不需改代码。

WiFi 版全系均有 · 仅 2.4GHz
设备层 MosFlash 智能设备 开关 / 温控 / 断路器 / 插座 ↓ 指令 · ↑ 数据 本地网络 WiFi 路由器 仅支持 2.4GHz MQTT BROKER 你的 MQTT Broker 公有云 / 私有化部署 或 官方免费测试服务器 无需自建 · 即开即用 应用层 你的业务系统 订阅 / 发布数据 TCP 模式
4G 版通断器等型号提供 · MFCB 系列暂不提供
设备层 MosFlash 智能设备 内置 Cat.1 蜂窝模组 ↓ 指令 · ↑ 数据 蜂窝网络 4G 基站 / SIM 卡 运营商蜂窝网络 · 全网通 MQTT BROKER 你的 MQTT Broker 公有云 / 专网 APN 接入 或 官方免费测试服务器 无需自建 · 即开即用 应用层 你的业务系统 订阅 / 发布数据

设备基于 MQTT / TCP 协议建立可靠连接
实现您的代码与设备直接通信 告别厂商捆绑

两种通信方式,同一套四层结构,区别只在服务层。报文格式完全一致,切换方式不需改代码。

基于 MQTT经 Broker 中转
应用层 · APPLICATION 你的业务系统 能源 / 楼宇 / 运维 SaaS MosFlash控制台 可选 ↓ 指令 · ↑ 数据 服务层 · SERVICE MQTT Broker(你自己部署) 公有云 / 私有云 / 免费测试 /{tenantId}/…/{deviceId}/pub /{tenantId}/…/{deviceId}/sub 网络层 · NETWORK 2.4GHz WiFi 4G Cat.1 蜂窝 配网通道 · BLE / AP 同一套 JSON 报文 设备层 · DEVICES MosFlash 智能设备 …… 开关 温控器 断路器 插座 红外遥控 Broker 部署在你的云或私有环境 · 数据不经厂商云端中转 适用:多设备 / 大批量 / 远程控制
基于 TCP设备主动连你的服务器
应用层 · APPLICATION 你的上位机 / 本地服务器 你部署的 TCP 服务器 MosFlash控制台 可选 ↓ 指令 · ↑ 数据 服务层 · SERVICE 你的 TCP 服务器(端口自定) 你监听端口 · 设备接入即可 设备主动连接 · 无需 Broker TCP Client 模式 · 长连接 网络层 · NETWORK 2.4GHz WiFi 以太网 / 局域网 配网通道 · BLE / AP 同一套 JSON 报文 设备层 · DEVICES MosFlash 智能设备 …… 开关 温控器 断路器 插座 红外遥控 无需 Broker 与云端 · WiFi 版适用 适用:单设备 / 联调 / 不经云端的私有部署

统一标准、JSON 格式的开发者指令集

供您进行设备控制与数据采集。全部指令共用同一套 JSON 信封,字段名与语义全系产品一致——学会一次,全型号通用。

switch.control
通断控制
下行 · 您的代码发出
{
  "messageId": "m-001",
  "cmd": "switch.control",
  "data": {
    "key1": 1
  }
}
↑ 设备应答
{
  "messageId": "m-001",
  "deviceId": "A0B1C2D3E4F5",
  "cmd": "switch.control",
  "ok": true,
  "err": ""
}
energy.info
电量采集 · 字段自带单位后缀
下行 · 您的代码发出
{
  "messageId": "m-001",
  "cmd": "energy.info"
}
↑ 设备应答
{
  "messageId": "m-001",
  "deviceId": "A0B1C2D3E4F5",
  "cmd": "energy.info",
  "ok": true,
  "err": "",
  "data": {
    "voltageV": 220.3,
    "powerW": 99.6
  }
}
config.keyLock.set
按键锁 · 远程控制不受影响
下行 · 您的代码发出
{
  "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
  }
}
timer.set
定时任务 · 本地执行,断网照常生效
下行 · 您的代码发出
{
  "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": ""
}
device.report
主动上报 · 订阅即接入,无需轮询
↑ 设备主动上报(无下行请求)
{
  "messageId": "rpt-001",
  "deviceId": "A0B1C2D3E4F5",
  "cmd": "device.report",
  "ts": 1759123200000,
  "cause": "localKey",
  "source": "localKey",
  "data": {
    "key1": 0
  }
}
查看完整指令合集 →

各产品指令数以固件版本为准 · 完整文档见文档中心

用您熟悉的语言,进行设备控制和数据采集

没有私有 SDK,没有封闭 DSL。一个通用 MQTT 客户端 + 一段 JSON,就是全部接入成本;下行指令与上行数据走同一套统一信封:messageId 请求-响应匹配,device.report 主动上报事件驱动业务。

你的业务系统 MQTT Broker MosFlash 设备 下行 应答 上报 1 publish 指令 · /…/sub 2 投递 JSON 信封 ③ 本地执行 合闸 / 调温 / 保护 4 应答 { ok, err } messageId 原样回显 5 按 messageId 匹配请求 刷新设备状态 6 device.report 主动上报 cause / source 标明来源 7 事件驱动您的业务逻辑 下行指令与上行数据共用同一套 JSON 信封 messageId 做请求-响应匹配与幂等去重
指令时序 —— 下发指令 → 本地执行 → 应答匹配 → 主动上报
// 主题 = /{tenantId}/{userId}/{productModel}/{deviceId}/sub | pub
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"))
QoS 0无私有 SDK三通道同一套 JSON

支持公有云、私有云、本地私有化等多种部署方式

设备出厂即支持 MQTT / TCP 标准化 JSON 报文。Broker 与 TCP 服务器都由你自己搭建——数据点对点直传,不经厂商云端中转。

公有云 MQTT
Broker 部署在阿里云 / 腾讯云等你的云上
适合云端 SaaS、跨区域多项目、需弹性扩容的业务
优势运维交给云厂商,容量随需扩展;设备天然可远程访问
怎么配config.mqtt.set 指向你的 Broker(需重启生效)
私有化 MQTT
Broker 部署在本地机房 / 园区内网
适合园区内网、政企项目,数据不允许出内网的场景
优势数据全程不出园区,链路自主可控;与内网系统同网段互访
怎么配config.mqtt.set 指向内网 Broker(需重启生效)
TCP Client
设备主动连接你自建的 TCP 服务器
适合单设备 / 少量设备、联调、局域网运维与上位机对接
优势完全不需要 Broker 与云端;设备无需固定 IP,端口你自定
怎么配config.tcp.set 填服务器地址与端口(需重启生效)
免费测试 MQTT 项目前期联调直接接入,无需自建 Broker;联调通过后再用 config.mqtt.set 切到你自己的服务器
调试平台 报文实时调试、日志查看、批量设备管理,可选接入

5分钟完成设备调试,进入开发

01
2P 接线图(电源进线 / 负载出线)
接线通电

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

02
手机连接设备热点 MosFlash-xxxxxx
连接设备热点

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

03
浏览器 192.168.4.1 WiFi 配置页
WiFi 配网

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

04
木澜设备助手登录页小程序快捷指令调试
绑定设备,验证功能

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

// 终身免费基础技术支持 · 暂不提供免费样品,支持商用批量采购与项目定制对接