HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

  • 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:00919

评论

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

测开之函数进阶· 第6篇《闭包》

清菡软件测试

测试开发

写出一手烂代码的19条准则

Java架构师迁哥

软件测试——网络协议知识(二)

测试人生路

软件测试 网络通信协议

北京一咖啡店启动数字人民币应用场景测试 店员:目前处于内测阶段

CECBC

数字人民币

百度京Fun生活节 双旦福利HIGH 翻全城

DT极客

LeetCode题解:239. 滑动窗口最大值,二叉堆,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

Linux基本操作命令

行者AI

Linux

ClickHouse利器—如何提高留存计算速度

行者AI

数据库

Rust布道者张汉东倾授,入门Rust初学者都要攻破哪些难点?

华为云开发者联盟

学习 rust 语言

架构师训练营大作业

Gosling

架构师训练营第 1 期

爆赞!P8架构师总结29篇多线程与高并发+设计模式核心笔记

Java架构追梦

Java 学习 架构 面试 多线程高并发

Java中的常量

cdhqyj

Java

Flink Forward Asia 2020 -- Keynote 总结

Apache Flink

flink

如何使用mock应对测试所需随机数据

华为云开发者联盟

测试 数据 Mock

仅4步,就可通过SQL进行分布式死锁的检测与消除

华为云开发者联盟

数据库 sql 死锁

送你一份迷你书,全面了解如何做好大促技术备战

京东科技开发者

DevOps

通达同城快递设计方案

garlic

架构师训练营第 1 期

跨年巨作!13万字!腾讯高工纯手写“JDK源码笔记”直接带你飙向实战

比伯

Java 编程 架构 面试 计算机

令数字起舞,让自然微笑:TECH4ALL的2020启示录

脑极体

破除数据垄断,数据上链或是关键

CECBC

区块链 大数据

云挖矿APP系统开发|云挖矿软件开发

系统开发

华为云·云享专家李万龙: IoT 梦想,从0到1的实现

华为云开发者联盟

技术 物联网 IoT

分享一个普通程序员的“沪漂”六年的历程以及感想

程序员老猫

回忆录 经历 年终总结 沪漂 上海买房

IPFS分布式存储矿机系统APP软件开发

系统开发

技术干货 | 六分钟学会使用 HBuilder 引入构建 mPaaS 小程序

蚂蚁集团移动开发平台 mPaaS

小程序 uni-app mPaaS

重新发现科技与人文的互动

脑极体

第一张区块链完税证明在深圳开出,区块链政务应用再获突破

CECBC

区块链 电子证明

架构师 3 期 3 班 -week6- 作业

zbest

作业 week6

RPC Demo(二) 基于 Zookeeper 的服务发现

Java zookeeper RPC 服务发现

实用流程工具,浅析LR.NET配置型工作流引擎

雯雯写代码

.net 工作流

近些年有哪些口碑炸裂的项目管理工具?各具特色的项目管理工具我们该如何选择?

爱吃小舅的鱼

项目管理 程序人生

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