认识MQTT(三):MQTT在业务中的应用

我们的系统连接着车辆和用户两端,车辆的个性化配置数据上报到云端,又或者用户登录后的账户信息下发给车端,车辆与云端之间的数据传输都是通过MQTT网关来实现的。

网关作为网络中间连接器、协议转换器,负责将车辆终端、众多业务后台复杂的网络连接场景、业务交互场景进行聚类转发。

  • 针对车端:MQTT网关实时、稳定的将车辆运行状态、用户交互等信息转发至对应后端业务平台,包括但不限于整车运行状态、零部件状态、用户操作指令等。
  • 针对平台:MQTT网关实时、稳定的将业务平台数据下发至车辆终端,包括但不限于整车实时运行状态、操作指令、复杂的内容类交互等。 业务架构图

作为MQTT网关的调用方,我们给车端下发数据,经常会遇到车辆不在线,导致下发失败的情况,这样就会导致云端和车端数据不一致。除了重试机制外,我们还会采用以下几种方案保证数据的准确性。

  1. 交互逻辑设计:云端先不更新,车端主动上报后再更新。可以参见之前写的 车辆激活(扫码激活)的实现
  2. 使用时间戳作为版本号:服务端的数据库表增加一个时间戳字段,此时间戳为作为版本号下发给车端。
  • 车端如果正常接收到云端下发的数据,就会与本地的版本号(时间戳)进行比对,接收到的时间戳大就更新。
  • 车端如果没有接收到云端下发的数据,在上电的时候,会主动请求获取云端的数据,并携带这个版本号。云端会将其与记录进行比对,如果该时间戳大于记录的时间戳,说明是在车端进行的操作,以车端为主,更新表里的时间戳;反之云端会将数据重新下发给车端。
graph TD A[服务端] -->|增加时间戳字段| B[时间戳作为版本号] B --> C[下发给车端] C --> D[车端接收时间戳] D -->|比对本地版本号| E{时间戳比较} E -->|接收到的时间戳大| F[车端更新本地数据] E -->|接收到的时间戳小或相等| G[车端保持本地数据不变] H[车端] -->|上电| I[主动请求云端数据] I -->|携带本地时间戳| J[云端接收请求] J --> K[云端比对时间戳] K -->|车端时间戳大于云端| L[以车端数据为主] L --> M[更新云端数据库时间戳] K -->|车端时间戳小于等于云端| N[云端将数据下发给车端] M --> O[同步完成] N --> O