Microsoft Build 下一站:中国👉6月15日12:30开启! 了解详情
写点什么

物联网设备全球部署架构方案

  • 2019-10-23
  • 本文字数:3982 字

    阅读完需:约 13 分钟

物联网设备全球部署架构方案

AWS IoT 物联网系列博客

当前物联网环境中,设备类型多种多样,连接方式不一而足。为了帮助读者更好的理解并运用 AWS IoT 相关服务,我们提供了一个完整的 IoT 起步指南,包含设备的注册及上线、设备管理、用户身份及权限管理以及成本控制,通过这一系列的起步指南,也可以快速了解到 AWS IoT 服务如何与 Amazon Alexa 语音助手进行集成。AWS IoT 物联网系列共 8 篇,本篇是该系列的第一篇,其他篇链接请在本文结尾处查看。



背景介绍

物联网场景中,终端设备的生产者和销售者往往并不是同一个,而产品的最终使用地点也可能因为销售路径的不同而有差异。为了在全球区域提供相同的使用体验,设备应该能够根据其所在的区域进行自发性的连接选择,并通过这种方式提供更低的网络时延。作为 IoT 服务提供者,需要设计部署一套跨区域的合理架构从而满足这样的需求。


本文将根据以上的场景,探讨如何利用 AWS 的服务进行架构设计和业务逻辑设计。

必备知识

这篇文章将着重于架构和业务逻辑的设计,整个方案会使用到如下 AWS 的相关服务,建议读者先了解其相关功能,便于理解整个方案。


  • IoT Core: 用于设备连接,设备管理,设备认证,消息转发。

  • Lambda: 提供设备配置信息,调用 AWS IoT Core API, DynamoDB API。

  • API Gateway: 管理维护 Restful API,并且触发 Lambda。

  • DynamoDB: 存放用户和设备的绑定关系。

  • STS: 获得 AWS 临时授权,用于设备连接至 IoT Core。

  • CloudFormation: 帮助用户在不同地区快速部署相同的架构、服务。

应用场景业务逻辑分析

在常见的 IoT 场景中,用户通常使用手机 APP 来对设备进行初始化操作,在初始化的过程中设备决定连接到哪个地区的 AWS。下面是一套常见的设备初始化业务流程:


  1. 启动设备, 并进入 WIFI Hotspot 状态

  2. 手机连接设备 WIFI,启动 App, 并进入配置状态

  3. 用户在配置页面输入家庭 WIFI 的 SSID、密码

  4. 用户在配置页面手动或自动选择设备所在的地区(重要)

  5. 用户点击配置完成,设备自动连接至家庭 WIFI

  6. 手机切换连接至家庭 WIFI

  7. 手机端显示配置完成


这里值得注意的是:


  • 在上述步骤 2 中,手机连接的是设备 WIFI。这样才能使得 APP 和设备处于同一个网络中,才能把家庭 WIFI 的配置信息下发给设备。

  • 在步骤 4 中,用户在配置的过程中可以手动选择设备所在地区,如所在国家、所在省、州(以下称为 region code)。当然,我们也可以通过判断设备 IP 地址所在地区或者手机 GPS 等方式获取所在地区的信息,但这样的方式也存在弊端。譬如通过 IP 地址查询的方式依赖于其查询的数据源是否准确;通过手机 GPS 的方式可能在室内并不精准。在本文中,我们将使用手动选择的地区的方式进行配置。

业务逻辑解决方案

上一章节中,我们了解了用户的使用场景,那么设备又如何连接到云端呢?云端又如何做身份识别的呢?


AWS IoT 提供了 MQTT, MQTT over WebSocket, HTTP 三种接入方式,以及 X.509 设备证书和 HTTP SigV4 两种认证方式。下表给出了几种接入方式的对比:


   col 1        |    col 2    |     col 3     |                            col 4                            |                                col 5                                
复制代码


:-------------------:|:-----------:|:-------------:|:-----------------------------------------------------------:|:--------------------------------------------------------------------:


接入协议 | 认证方式 | 推荐场景 | SDK | SDK 支持语言/平台


MQTT | 设备证书 | 设备接入 | AWS IoT Device SDKs | C, C++, Java, JavaScript, Python


MQTT over WebSocket | SigV4 | Web 接入


移动端接入 | AWS IoT Device SDKs | JavaScript(node.js)


iOS


Android


HTTP | 设备证书


SigV4 | REST API 接入 | AWS SDKs | Java, .NET, Node.js, PHP, Python, Ruby, Browser(JavaScript), Go, C++


AWS IoT 接入的方法有很多,用户可以根据自己的业务场景,选择适合的接入协议和认证方式。这里需要注意的是 MQTT 或 MQTT over WebSocket 支持云端主动向客户端发送消息,而 HTTP 则不能。


在本文中,设备端通过 MQTT + 设备证书 的方式接入,手机端通过 MQTT over WebSocket + SigV4 的方式接入。那么设备的证书又如何下方给设备呢?


AWS 提供了多种证书下发的方式,如果使用您自己的 CA 签发的设备证书,您可以通过 JITR(Just-In-Time-Registration)JITP(Just-In-Time-Provision) 的方式将设备连接至云端并指定相关控制策略;如果使用 AWS IoT Core 签发的设备证书,您可以通过 CVM(Certificate Vendor Machine) 的方式将设备连接至云端并控制相关控制策略;当然,用户也可以根据自己的需求使用 AWS IOT API 定制自己的身份认证过程。


col 1col 2col 3
证书下发方式Root 证书出厂时预置设备证书
JITR用户 CAYes
JITP用户 CAYes
CVMAWS CANo


在本文中,我们假定设备出厂时已经预置了设备证书和 CA 证书。


当用户首次拿到一台设备的时候,需要对设备进行初始化配网设置,在配网过程中,我们使用 AWS IoT API Programmatic Provisioning 自定义证书的激活流程。结合在配网过程中,用户的实际操作流程,每一步的具体技术实现细节如下:



在上图中,实现步骤可以参考如下说明:


  1. 将设备变成 WIFI 热点模式,设备设置为静态 IP 地址,并监听配置命令

  2. 手机连接至设备 WIFI(非家庭 WIFI)

  3. 进入 APP, 输入家庭 WIFI 的 SSID, password,并选择地区信息(标注 1)

  4. APP 将配置信息发送到设备的静态 IP,设备返回 MAC 地址

  5. 设备退出 WIFI 热点模式,连接至家庭 WIFI, 并且进入初始化状态

  6. 设备从服务配置 Endpoint 获得该地区的配置信息,并存储到本地。此时需要将地区信息作为参数传给服务配置 Endpoint. 服务配置 Endpoint 全球只需部署一份(标注 2)

    上图中的 country 和 state 组成了服务端所需的地区信息。服务端收到地区信息后返回该地区对应的配置信息。配置信息中至少包含两个地址,一个是证书激活的地址,另外一个是 AWS IoT 的连接地址。

  7. 设备向云端发起设备注册请求,云端调用 RegisterThing API 注册设备,并返回注册结果。(标注 3)

    设备在发起请求时,上传 ThingName 和设备证书,ThingName 这里取设备的 MAC 地址。云端在调用 API 时传入的参数如下:

  8. template-body:


  9. Python


   {     "Parameters" : {       "ThingName" : {         "Type" : "String"       },       "DevicePem" : {         "Type" : "String"       },       "CaPem": {         "Type" : "String"       }     },     "Resources" : {       "thing" : {         "Type" : "AWS::IoT::Thing",         "Properties" : {           "ThingName" : {"Ref" : "ThingName"}         }       },       "certificate" : {         "Type" : "AWS::IoT::Certificate",         "Properties" : {           "CACertificatePem": {"Ref" : "CaPem"},           "CertificatePem" : {"Ref" : "DevicePem"}         }       },
"policy" : { "Type" : "AWS::IoT::Policy", "Properties" : { "PolicyDocument" : "{ \"Version\": \"2012-10-17\", \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }" } } } }
复制代码


#### parameters:
Python
复制代码


   {     "ThingName": "<MAC address>",     "DevicePem": "<Device Certificate String>",     "CaPem": "<CA Certificate String>"   }
复制代码


这里,设备并没有上传 CA 证书,是因为在出厂时所有的设备均使用同一个 CA 签发的设备证书。  _Tips: 相同的 CA 证书上传到不同的 AWS region, 返回的 CA ID 相同,方便使用 CloudFormation 部署。_
复制代码


  1. 设备在获得成功注册的返回值后,通过 MQTT 连接至 AWS IoT(标注 4)

  2. APP 向云端查询设备是否注册成功,如果已经注册成功,则在数据库中建立用户和设备的绑定关系。(标注 5)

  3. APP 向云端发起请求,申请接入 AWS IoT 的临时授权 (标注 6)

  4. 步骤 3 处 Lambda 先查询用户和设备的绑定关系,然后再向 STS 申请临时授权。

  5. APP 获得临时授权之后,连接到 AWS IoT Device Gateway, 初始化完成(标注 7)

总结

我们在设备初始化的过程中,使用设备的位置作为参数向云端申请属于该地区的配置信息,然后根据配置信息连接到不同的 AWS region。在此基础上,我们再通过 CloudFormation,将服务部署到不同的 AWS region。


此外,在全球范围内,我们只需要维护一个服务配置 Endpoint 来提供配信信息。我们只需要修改该 Endpoint 的代码来增加或修改配置参数。


作者介绍:


施乔
AWS 解决方案架构师,毕业于 RMIT University。现负责 AWS 架构咨询及设计优化,同时致力于 AWS IoT 在国内和全球企业客户的应用和推广。加入 AWS 之前,有过一段创业经历,对制造业,物联网,Saas 领域的技术方案有深入研究。


### AWS IoT 物联网系列其他博客目录如下:
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-1/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-2/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-3/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-4/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-5/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-6/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-7/)
[](https://amazonaws-china.com/cn/blogs/china/aws-iot-series-8/)
复制代码


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/aws-iot-series-6/


2019-10-23 08:00627

评论

发布
暂无评论
发现更多内容

Java中的深拷贝和浅拷贝

Ayue、

深拷贝

阿里云王志坤:强劲可靠、无处不在的云,为创新保驾护航

阿里云弹性计算

弹性计算 年度峰会

迷雾中的自动化测试体系建设

CODING DevOps

自动化测试 接口测试 业务驱动测试

不用任何框架,Java 就能实现定时任务的 3 种方法!

CRMEB

一年又要过去了!盘点2021年区块链的6个关键词

CECBC

腾讯云分布式数据库TDSQL在东吴证券新一代核心交易系统中成功落地

腾讯云数据库

tdsql 国产数据库

『SphereEx 年终贺礼』专注为用户提供更好的使用体验

SphereEx

开源 ShardingSphere 一键部署 SphereEx-Boot 开源公司

设计消息队列存储消息数据的MySQL 表格

Steven

架构实战营

有趣的灵魂万里挑一:从智能座舱看汽车进化史

脑极体

ARMS 应用安全-你的应用运行时的隐形安全卫士

阿里巴巴中间件

云原生 中间件 RASP Arms

首个国产分布式数据库调研:TDSQL产品技术及服务能力排名

腾讯云数据库

tdsql 国产数据库

RocketMQ Streams:将轻量级实时计算引擎融合进消息系统

阿里巴巴中间件

阿里云 RocketMQ 云原生 中间件

Spring Cloud Alibaba 2.2.7 版本正式发布

阿里巴巴中间件

云计算 开源 微服务 中间件 spring cloud ali

KubeCon China 2021 阿里云专场来了!这些首日亮点不容错过

阿里巴巴中间件

阿里云 云原生 中间件 cncf KubeCON

Cube 技术解读 | Cube 小程序技术详解

阿里巴巴终端技术

小程序 ios android 移动开发 客户端

突破底层基础架构瓶颈,揭秘TDSQL存储核心技术

腾讯云数据库

tdsql 国产数据库

架构实战营 - 模块 3 - 作业

Pyel

「架构实战营」

作业帮检索服务基于 Fluid 的计算存储分离实践

阿里巴巴中间件

云计算 云原生 中间件 存储分离 Fluid

为什么说绿色区块链是未来金融范式的必要底层?

CECBC

TDengine在水电厂畸变波形分析及故障预判系统中的应用

TDengine

数据库 大数据 tdengine 物联网 时序数据库

中科柏诚:加速银行数字化转型的新引擎

联营汇聚

游戏用户LTV预测实践

bilibili游戏技术

百度智能云产业智能化新生态,新在哪里?

百度开发者中心

人工智能

开源社庄表伟:开源要出圈了,推坑文化、沉浸式养鱼塘,社区建设心法了解一下 I OpenTEKr 大话开源 Vol.5

OpenTEKr

大话开源

以 Kubernetes 的方式来运行极狐GitLab Runner

极狐GitLab

使用Kubernetes部署应用

Rayzh

Kubernetes 云原生

性能工具之代码级性能测试工具ContiPerf

zuozewei

单元测试 性能测试 测试工具 12月日更

最近火热的web3到底是什么?

石云升

区块链 28天写作 12月日更 web3

LabVIEW图像增强算法(基础篇—5)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 图像增强算法

高效工作?畅快游戏?来开发者Meetup探索AI技术新玩法

OpenI启智社区

人工智能 飞桨领航团

一周信创舆情观察(12.20~12.26)

统小信uos

物联网设备全球部署架构方案_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章