嵌入式/后端开发中,进程间通信和远程通信到底用什么数据格式?

📅 2026/7/12 3:56:41
嵌入式/后端开发中,进程间通信和远程通信到底用什么数据格式?
文章目录一、本机进程间通信IPC用什么二、远程通信网络用什么三、嵌入式设备通信串口/总线用什么四、为什么要多种格式——核心考量五、回到我的项目——为什么用了两种六、为什么不能直接传 C 结构体1. 结构体内存布局不确定2. 字节序和对齐不同3. 不能调试七、实际开发中怎么选——TL;DR八、关键的面试话术最近在学一个嵌入式 Linux 项目它用到了两种不同的通信格式——进程间 IPC 用 JSON串口通信用自定义二进制帧。这让我开始思考实际开发中不同场景到底该用什么数据格式花了一下午查资料 结合项目经验整理如下。一、本机进程间通信IPC用什么数据格式特点适用场景实际案例JSON纯文本、人可读、调试方便、跨语言消息频率不高、需要可调试我项目里的 IPC、Linux 桌面 D-BusProtobuf二进制、强类型、高效、需要代码生成高频通信、微服务Google 内部、gRPC 底层FlatBuffers零拷贝不需要反序列化、极快游戏引擎、实时性要求高的系统Unity、Cocos2d-xmsgpack比 JSON 小 30%、比 Protobuf 灵活不需要预定义 schemaIoT 设备、轻量场景Redis 可选格式自定义二进制带宽最低、完全定制化带宽极低、协议固定的场景我项目的 ODU 串口帧二、远程通信网络用什么数据格式特点适用场景实际案例JSON HTTP最通用、跨语言、生态完善REST API、前后端交互99% 互联网应用Protobuf gRPC强类型、高性能、支持流微服务间通信Google 云、腾讯MQTT JSON轻量、发布订阅、适合不可靠网络IoT 设备上报、智能家居阿里云 IoT、小米MQTT 二进制更省流量、省电电池供电的 IoT 设备共享单车、远程抄表WebSocket JSON长连接、双向推送实时应用、在线游戏网页聊天、行情推送XML/SOAP老标准、自描述性强金融/政务老系统银行、社保系统三、嵌入式设备通信串口/总线用什么数据格式特点适用场景实际案例Modbus RTU二进制帧工业标准、广泛兼容PLC、传感器、变频器工厂自动化CAN 总线帧高可靠性、实时汽车电子车载 ECU 通信自定义二进制帧最省带宽、完全定制带宽极低、需高实时性我项目的 ODU 帧、无人机遥控AT 命令文本简单、可人机交互调试、简单控制4G/WiFi 模块I2C/SPI 寄存器读写硬件级通信板级芯片间通信MCU ↔ 传感器四、为什么要多种格式——核心考量抉择时主要看 5 个维度维度JSONProtobuf自定义二进制体积大有 key 名冗余小只有字段编号最小你说了算速度慢文本解析快二进制直接解析最快无解析开销可读性✅ 人眼直接看懂❌ 二进制看不懂❌ 二进制看不懂跨语言✅ 任何语言都有库✅ 需代码生成❌ 自己写编解码带宽适用中/高中/低极低五、回到我的项目——为什么用了两种IPC 层webd ↔ commd ↔ odud用 JSON 理由6 个进程消息频率低每秒几条JSON 可调试、开发快 sendFrame 把 IpcMessage → JSON 字符串 → socket recvFrame 读回来再解析 ODU 串口层odud ↔ ODU 设备用自定义二进制帧 理由串口带宽有限、协议固定、一次只传几字节 encodeOduFrame7E 长度 地址 命令 序号 数据 CRC 7F decodeOduFrame校验 解析同一个项目、两种格式——格式跟着场景走没有银弹。六、为什么不能直接传 C 结构体有人问“IPC 的时候直接memcpy结构体再write不就行了”不行三个原因1. 结构体内存布局不确定structIpcMessage{std::string type;// string 内部是堆指针不是连续内存std::string src;// memcpy 结构体 → 只拷了 8 字节的指针};// 实际字符串内容在堆上没拷到对端用不了2. 字节序和对齐不同ARM 大端 vs x86 小端直接传二进制 → 解析出来的数字全乱。3. 不能调试JSON 可以用strace/tcpdump直接看到内容二进制帧只能看到乱码。七、实际开发中怎么选——TL;DR你做什么 用什么 ───────────────────────────────────────────────────── 写 Web 后端 API → JSON HTTP 写微服务之间通信高并发 → Protobuf gRPC 写 IoT 设备上报数据 → MQTT JSON/Protobuf 写工厂 PLC/传感器对接 → Modbus RTU 写汽车电子 → CAN 总线帧 写带宽极低的嵌入式通信 → 自定义二进制帧 写简单的串口指令 → AT 命令文本 过渡方案/快速原型 → JSON到处都能用八、关键的面试话术“IPC 通信格式选择需要权衡带宽、性能、可维护性和跨平台需求。高带宽下 JSON 开发效率最高、可读可调试高频通信用 Protobuf 等二进制格式减少序列化开销嵌入式串口场景带宽有限多用自定义二进制帧如 Modbus。同一个项目、不同通信层可能用不同格式——比如我的项目 IPC 层用 JSONODU 设备层用自定义二进制帧。”