title: “ 基于阿里云构建物联网Serverless架构\t\t”
tags:

  • server
    url: 1032.html
    id: 1032
    categories:
  • 后端
    date: 2018-03-16 23:56:01

介绍

今日,应项目需求,需要构建一个物联网平台。 要求硬件设备可以长连接用于报告自身状态和接收远程控制。手机端可以远程临时租用某设备获取设备信息及控制设备。手机端可远程查看所有设备位置用于快速寻找设备。完整需求类似于共享单车,实现短期租赁服务。 由于以往没有高并发、长连接服务器建设经验,故进行Serverless架构的研究,以成熟的云服务提供商保证设备的长连接稳定性及大量设备的负载均衡。由于对阿里云较为了解,故基于阿里云系列服务进行了调研。 基于阿里云构建物联网Serverless架构 - 图1

各服务功能

MQTT服务器:使用“阿里云物联网套件”,实现大量设备的连接,及消息发布、订阅、转发。按照消息量进行收费。 API网关:api调用的过滤,将正确调用转发至函数计算。按照API调用量进行收费。 函数计算:Faas,实现Severless,只需要根据业务需要定义不同的函数,主要是实现API网关定义的接口。按照占用内存及运行时间计费,对于外网流量单独计费。 云数据库或Table store:实现数据存储,关系型数据库或nosql。 注意:

  • api网关与数据库、函数计算与数据库、api网关与函数计算之间均进行内网通讯,可以避免通信流量费。
  • api网关会将请求的所有内容整合为一个变量(event)传递到函数计算。文档
  • 函数计算基于事件进行触发,也就是event,函数除了支持api网关触发,还可以定时启动,用于实现网站的定期、定时行为。文档
  • 于文档撰写日18.3.16,函数计算的python语言在云数据库和Table store中只提供了Table store的内置模块,当然也可以自行打包其他自定义模块。文档

几种物联网类型的实现方案

长期绑定(长期占用、个人设备)

长期绑定物联网,如用户买了路由器、用户买了智能家电,此设备只属于固定用户使用(单人或多人,不会频繁变动,也不要求变动过程的立即响应)。 对于此方案,可以将设备、手机均连入mqtt服务器。设备提供topic,手机订阅即可时刻知道设备状态,可以将一切行为都在mqtt服务器完成。甚至不需要后续的api网关、函数计算等。

短期租用(租赁)

比如单车、充电桩、共享按摩椅等现有的短期租用、占用的方案,长期绑定方案将无法适用,因为订阅和取消订阅需要10秒等待(文档)。当然让用户等十秒如果可以满足需求,那可以使用上述方案,如对于按摩椅可能能够接受不到10秒的等待时间。但是共享单车等快节奏需求,在扫码以后站着等十秒不太现实。 要保证实时的动态租用,不能进行最直接的订阅方案,要使用topic消息转发的方法: 设备发送状态到自己的topicA,mqtt服务器转发topicA到topicB,topicB是用户手机订阅的topic,这样就能保证收到信息。而设备长久订阅自己的topicA,用户长久订阅topicB,进而避免订阅和取消订阅的延迟时间。但需要借助转发规则实现实时的绑定通讯,(案例),要求两个topic中均要有目标设备id的字段,否则将无法指定转发到具体设备。 一个topic可以对应无数个设备,每个设备具有固定的id,在topic转发时需要通过sql表达式判断设备。(转发文档) 如手机绑定按摩椅。按摩椅id:AAA,订阅topicA,手机id:BBB,订阅topicB。

  1. 手机先发送消息“phone_id”:”BBB”,”device_id”:”AAA”
  2. 服务器接收到消息,转发到topicA,注意根据device_id指定转发规则值转发给此设备。
  3. 设备接收到后,根据“phone_id”:”BBB”可以知道下次要发送信息的目标,同时接到这个消息。 这也意味着,设备暂时被BBB租用了,在解除租用前拒绝其他设备,设备内的逻辑就不再描述。

其他

  1. mqtt服务器的所有消息均可转发到数据库进行存储,实现永久记录。
  2. 设备的动态绑定,最简单的办法是用户扫码,二维码中的字符串直接存储当前设备id,此时手机端可直接通过mqtt服务器实现对此设备的控制,但是感觉这样不够安全。也无法做是否允许使用设备的验证,所以将二维码内容先传递到api网关,通过内容解析出设备id,同时判断用户账户情况和设备状态,进而返回成+设备id或失败+不可用原因。
  3. mqtt的消息也可以直接转发到函数计算,那么用户的登陆等行为及上述绑定行为也可以直接通过mqtt服务器进行转发,即将api网关的调用转换为长连接下的mqtt服务调用。这样客户端只需要使用websocket连接到mqtt服务器即可,但这个前提是用户已经成功进行了一次登陆,经过初次登陆逻辑使客户端暂存用户账号对应的设备id,否则将无法成功connect。