banner
NEWS LETTER

嵌入式 Linux 系列 06:设备服务、MQTT 协议和配置持久化

Scroll down

很多嵌入式 Linux 产品的核心不是驱动,而是设备服务。它负责联网、接收云端或其他设备的控制协议、保存配置、上报状态、处理升级和自恢复。设备服务写得稳不稳,直接影响产品现场表现。

一、设备服务负责什么

常见职责:

  • 加载本地配置。
  • 建立 MQTT 或 HTTP 连接。
  • 上报设备状态。
  • 接收控制命令。
  • 写入持久化配置。
  • 控制本地外设或业务进程。
  • 记录日志。
  • 异常退出后恢复。

典型目录:

1
2
3
4
/usr/bin/device_agent
/data/config/device.json
/data/log/device_agent.log
/etc/init.d/S50device_agent

二、MQTT topic 设计

可以按设备 ID 组织:

1
2
3
4
device/{device_id}/cmd
device/{device_id}/ack
device/{device_id}/state
device/{device_id}/log

示例命令:

1
2
3
4
5
{
"cmd": "set_timezone",
"request_id": "20260626214854001",
"timezone": "Asia/Shanghai"
}

ack:

1
2
3
4
5
{
"cmd": "set_timezone_ack",
"request_id": "20260626214854001",
"result": "ok"
}

request_id 很重要。没有它,重试、超时和重复消息会很难处理。

三、命令处理流程

收到 MQTT 命令后建议按顺序处理:

  1. 解析 JSON。
  2. 校验 cmdrequest_id
  3. 校验参数白名单。
  4. 执行业务动作。
  5. 持久化配置。
  6. 通知相关服务。
  7. 发布 ack。
  8. 记录日志。

不要先 ack 再执行。否则上层以为成功,设备实际失败。

四、配置持久化

配置建议放在:

1
/data/config/device.json

写入时使用临时文件和原子替换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int save_config_atomic(const char *path, const char *content)
{
char tmp[256];
snprintf(tmp, sizeof(tmp), "%s.tmp", path);

FILE *fp = fopen(tmp, "w");
if (!fp) {
return -1;
}

fputs(content, fp);
fflush(fp);
fsync(fileno(fp));
fclose(fp);

return rename(tmp, path);
}

异常断电时,这种方式比直接覆盖原文件安全。

五、服务自恢复

最简单的 supervisor 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh

APP=/usr/bin/device_agent
LOG=/data/log/device_agent.log

mkdir -p /data/log

while true; do
"$APP" >> "$LOG" 2>&1
echo "device_agent exited, restart after 2s" >> "$LOG"
sleep 2
done

真实项目还需要:

  • 防止频繁崩溃导致刷日志。
  • 和硬件 watchdog 配合。
  • 支持优雅退出。
  • 区分升级重启和异常重启。

六、以设置时区为例

MQTT 收到时区修改后:

  1. 校验时区是否在白名单。
  2. 写入 /data/config/timezone
  3. 优先 bind mount 到 /etc/localtime
  4. 失败时设置 TZ 并重启依赖本地时间的服务。
  5. 发布 ack。

这类命令不要只改内存状态。设备重启后必须能恢复。

七、日志要能定位现场问题

日志至少包含:

  • 时间。
  • 模块。
  • request_id。
  • 命令名称。
  • 参数摘要。
  • 结果。
  • 错误码。

示例:

1
2026-06-26 21:48:54 mqtt cmd=set_timezone request_id=... timezone=Asia/Shanghai result=ok

现场排查时,日志比口头描述可靠。

其他文章
目录导航 置顶
  1. 1. 一、设备服务负责什么
  2. 2. 二、MQTT topic 设计
  3. 3. 三、命令处理流程
  4. 4. 四、配置持久化
  5. 5. 五、服务自恢复
  6. 6. 六、以设置时区为例
  7. 7. 七、日志要能定位现场问题
请输入关键词进行搜索