开箱即用的数据缓存服务|EMQX Cloud 影子服务应用场景解析
在物联网业务高速迭代的今天,快速连接物联网设备与平台应用,实现业务快速落地与市场验证,是很多企业塑造核心竞争力、实现业务创新的关键。
EMQX Cloud 作为一站式运维代管的 MQTT 消息云服务,可以帮助用户在公有云环境中快速实现物联网应用对接。为了进一步帮助用户快速搭建物联网业务,EMQX Cloud 近期推出了影子服务功能。通过影子服务提供的平台数据缓存能力,用户可以更加便捷地实现各类场景应用,缩短研发周期。
什么是影子服务
在物联网设备与应用的消息交互场景中,设备侧网络不稳定、低功耗设备休眠、移动端应用不定期消费数据等情况十分常见。对于物联网应用开发者来说,更需要数据生产与消费解耦的数据交互模型。因此 MQTT 作为基于发布/订阅的异步通讯协议在物联网场景中被广泛应用。为了进一步保证数据交互的可靠性,在 MQTT 消息接入层提供对设备最新上报消息与应用下发配置等数据的缓存与持久化就成为物联网平台设计中的一个重要需求。
EMQX Cloud 基于已有的 MQTT消息接入服务,在增值服务中增加了影子服务(Shadow Service)功能,提供开箱即用的平台侧数据缓存服务。用户可以在 EMQX Cloud 内置服务中完成设备上报数据缓存、修改、查看,快速创建物模型、设备影子以及其他和数据上报及下发相关的应用,无需自己购买外部资源以及复杂的配置实现数据缓存服务。
- 用户可以在一个 EMQX Cloud 专业版实例中创建多个影子服务。每个影子服务创建后会生成一个全局唯一的 shadow_id,用户可以通过基于 shadow_id 的固定上下行 MQTT 主题以及 RestAPI 来创建、修改、删除不同缓存服务中的数据;
- 缓存数据以 JSON 文档的格式存储在影子服务中,用户在创建,修改缓存文档时,影子服务会自动为 JSON 文档添加创建/修改的时间戳以及更新文档版本,方便文档消费者确认信息。对每一个影子服务我们只保存最新的版本的数据;
- 影子服务提供 MQTT 与 RestAPI 两种接口来对缓存文档进行增删改查的操作,方便 MQTT 设备与应用服务调用;
- 影子服务提供的 MQTT 接口完全适配标准 MQTT 协议,客户端只要符合标准 MQTT 协议即可调用影子服务,无需定制化的 SDK,也没有平台绑定。
应用场景示例
我们以智能家居场景为例来详细解释如何使用影子服务。在智慧家居场景中,最常见的应用是通过智能家居设备-云端服务-个人移动 APP 之间的数据互动,实现 APP 设备状态的上报更新以及对设备的远程控制。利用影子服务,我们可以非常简单地实现一个智能设备控制应用,以智能空调为例:
空调温度状态上报
在 EMQX Cloud 中为智能空调设备创建一个影子服务,影子服务为此设备创建唯一的 shadow_id 和固定的发布订阅主题
智能空调设备通过 MQTT 协议将空调内置温度传感器数据定时上报到影子服务指定的发布主题 shadow/8suy0g7pp08ibdtc 中,首次上报数据 Payload 使用 PUT 操作:
{ "method": "PUT", "payload": { "status":{ "temp":26 } } }
这时在影子服务中就可以看到一个新的数据被缓存下来:
这里面我们可以看到除了设备上报的空调温度 JSON 文档以外,影子服务也为这份文档自动添加了:
- createAT:文档创建时间;
- lastTime:文档更新时间;
- version:文档版本号;
方便后续 APP 对比历史数据和展示数据;
智能空调可以以定时上报的方式持续更新影子服务中缓存的温度数据,在 MQTT payload 中使用 PATCH 方法进行数据更新:
{ "method": "PATCH", "payload": { "status":{ "temp":24 } } }
影子服务中的缓存数据即被更新为:
当用户打开手机 APP 想查看空调运行情况与室内温度时,APP 可以通过 MQTT 或 RestAPI 接口,从影子服务缓存中获取到最新的状态数据。以 MQTT 方式为例,APP 打开后会与 EMQX Cloud 服务建立一个 MQTT 连接,通过订阅主题 shadow/8suy0g7pp08ibdtc/reply 获取设备消息;
如果此时空调数据没有上报,可以通过向影子服务的发布主题 shadow/8suy0g7pp08ibdtc 发送一个 GET 指令来拉取缓存中的最新状态:
{ "method": "GET", "payload": { } }
影子服务收到此消息后,就会将缓存中的数据返回给 APP:
{ "data": { "status": { "temp": 24 } }, "createAt": 1661365033203, "lastTime": 1661365569334, "version": 2 }
如果 APP 持续在线,当有新的空调温度状态上报到影子服务中时,由于 APP 已经订阅了 shadow/8suy0g7pp08ibdtc/reply 主题,最新的状态数据就会推送到 APP 中。这样,一个动态更新的空调温度展示业务就可以轻松完成。
APP 远程调节空调温度
如果我们希望能从 APP 调节空调温度,同时保留空调设备状态上报功能。
我们需要在 JSON 文档中增加一个键值,如通过 PATCH 命令增加 desired:
{ "method": "PATCH", "payload": { "desired":{ } } }
此时 JSON 文档变为:
{ "data":{ "desired":{}, "status":{ "temp":24 } }, "createAt":1661365033203, "lastTime":1661366036466, "version":3 }
同时空调也需要订阅 shadow/8suy0g7pp08ibdtc/reply 主题来接收 APP 的调节指令(当然,也可以为指令下发建立一个新的影子服务,这样就有一个独立的控制下发主题通道);
然后我们就可以通过 APP 来下发控制指令:
{ "method": "PATCH", "payload": { "desired":{ "temp":27 } } }
此时 JSON 文档更新为:
{ "data": { "desired": { "temp": 27 }, "status": { "temp": 24 } }, "createAt": 1661365033203, "lastTime": 1661366053663, "version": 4 }
当空调通过订阅 shadow/8suy0g7pp08ibdtc/reply 主题收到上面更新的 JSON 文档后,空调客户端程序通过 desired 键内设置的值更新自身温度设定,实现远程 APP 温度控制。
更多应用可能
除了智能家居场景以外,我们还可以利用影子服务的数据缓存功能实现很多业务场景应用:
- 低功耗智能表计数据采集与远程配置:在实际生活中很多智能表计设备(如燃气表,水表等)由于依靠电池供电,为了延长电池供电寿命经常会采用休眠的方式来节电。比如入户燃气表一天可能只会唤醒 1-2 次,唤醒时间在几分钟内。通常我们会在唤醒阶段上报表计读数,并同时接收更新平台侧应用对表计的最新配置。此时,我们就可以利用影子服务将平台侧的配置缓存起来,当表计唤醒后拉取最新的配置数据进行更新。这样平台应用在下发配置的时候也不需要探察表计设备是否在线,简化了应用逻辑。
- 车联网车机消息推送:在车联网场景中,车机在熄火的情况下是处在休眠状态。而车联网平台部分消息通知(保养提醒、运营消息通知等)可以利用影子服务的缓存功能实现对离线车机设备的消息缓存。当车辆发动车机唤醒后,通过拉取影子服务中的缓存消息实现离线消息的同步更新。
结语
EMQX Cloud 提供的开箱即用的影子服务可以适配不同行业各类型业务场景对数据缓存的需求。通过 EMQX Cloud 提供的全托管 MQTT 消息云服务,结合影子服务功能,用户可以快速实现 MQTT 设备接入与消息缓存的一体化能力,大大加快物联网应用开发速度。同时,影子服务中灵活的消息缓存数据结构,也可以帮助用户轻松实现后期业务的扩展,为用户业务持续发展提供保障。