提问

#楼主# 2020-1-19

跳转到指定楼层
本帖最后由 社群技术交流 于 2020-1-19 13:18 编辑

1 简介
AWS IoT解决方案是一个全托管的云平台,使互联设备可以轻松安全地与云应用程序及其他设备交互。AWSIoT可以支持数十亿太设备和数万亿条消息,并且可以对这些消息进行处理并将其安全可靠地路由至AWS终端节点和其他设备。AWS IoT平台支持您将设备连接到AWS服务和其他设备,保证数据和交互的安全,处理设备数据并对其执行操作,以及支持应用程序与即便处于离线状态的设备进行交互。
使用AWS IoT的第一步是将设备连接到AWS IoT Core服务。AWS IoT支持多种接入协议,身份认证方法和授权策略。


2 AWS IoT支持的协议
设备要接入AWS IoT,首先要使用AWS IoT支持的协议来跟IoT平台交互。
2.1HTTP协议
http协议是互联网中最为常见的协议。http协议支持后面提到的所有认证和授权方式。但是在物联网的场景中,它也有协议开销比较大等确定,另外http只有请求响应的模式不支持物联网场景中非常重要的订阅模式,不能支持下行命令的下发。
2.2MQTT协议
MQTT协议是物联网场景中使用最为广泛的协议,具有协议开销小,支持发布订阅等所有模式的有点。
2.3MQTT over WEBSOCKET
MQTT over websocket是基于websocket上的MQTT协议,使用443端口,在网络环境可达性上比MQTT更有优势,但是也相对复杂一些。


3 AWS IoT支持的认证和授权方式
设备接入AWS IoT的时候,必须要进行认证,确认设备的合法身份。通过认证后,还需要对设备的请求进行鉴权,只有经过授权的请求才会被AWS IoT接受。不同的设备认证方式,其授权方式也可能有所不同。
AWS IoT支持的认证方式有4种,分别是IAM身份、Cognito身份、X.509证书和自定义身份验证。
AWS IoT支持的售前策略由2种,分别是IAM policy和IoT policy。
  
认证方式
  
授权策略
支持的协议
使用场景
IAM身份
IAM policy
http/mqtt over websocket
非正式场景
Amazon cognito身份
IAM policy/IoT policy
http/mqtt over websocket
移动端
x.509证书
IoT policy
http/mqtt
默认选择
自定义身份验证
IoT policy
http/mqtt over websocket
特殊场景

4 准备工作
4.1 创建操作环境
    在aws上创建一台EC2服务器,创建的过程中,需要创建一个角色来访问该ec2
    image1.png
  
  点击“创建新的IAM角色”
       image2.png

  点击“创建角色”
       image3.png

  选择“AWS产品”->EC2”,点击“下一步”
    image4.png

  选择“AdministratorAccess”,点击“下一步”,标签部分可以忽略,直接点击“下一步”
    image5.png

  输入指定角色名称,“创建角色”,再回到之前创建EC2的界面,刷新角色
       image6.png

  然后继续ec2相关配置,直至创建成功(具体步骤略)。

4.2 配置操作环境
    远程登录到创建的ec2服务器(具体过程略)
    image7.png

  因为操作通过AWS CLI进行,而我创建是ec2中没有安装好CLI,所以需要自己安装,安装的步骤参见https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/install-linux.html#install-linux-awscli,具体安装过程省略,可能会需要经过多次尝试,不同的操作系统版本会有微小差异,自己体会吧。最终CLI安装成功,如下图:
    image8.png

  配置AWS CLI,其中的区域我选择的是美东-弗吉尼亚,所以填us-east-1,输出格式通常为json
    image9.png

  准备操作目录,现在创建一个新的操作目录 awsiotaccessdemo
    image10.png

    然后下载aws iot的Root CA证书。设备连接应该优先选择ATS端点,使用ATS的CA文件,因为后面的自定义身份验证暂时不支持ATS端点,所以也需要下载VeriSign端点的CA证书。

    执行命令 wget https://www.amazontrust.com/repository/AmazonRootCA1.pem        image11.png

再执行命令 wget https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem   
image12.png

安装依赖的软件包,执行如下命令
  1. sudo yum install python-pip jq -y
  2. pip install boto3 --user
  3. pip install AWSIoTPythonSDK --user
  4. pip install flask --user
  5. pip install paho-mqtt --user
复制代码
然后获取Account Id,执行命令 account_id=`aws sts get-caller-identity | jq .Account|sed 's/"//g'`   

获取Account的IoT Endpoint前缀,执行命令 endpoint_prefix=`aws iot describe-endpoint \| jq .endpointAddress | sed 's/"//g'| awk -F . '{print $1}'`

再把刚刚获取的Account Id和Endpoint前缀配置到环境变量中,执行如下命令:
echo "export account_id=$account_id" >> ~/.bashrcecho "export endpoint_prefix=$endpoint_prefix" >> ~/.bashrc

4.3 配置IoT消息接收监控页面
登录AWS IoT控制台,点击“测试”条目,输入订阅主题“IoTDemo/#”
image13.png

点击“订阅主题”,后续所有IoT Core收到的消息都会在下方显示出来。


5使用IAM身份认证接入
前面已经列出了aws支持的设备接入认证方式,本文将尝试以不同的身份验证方式接入。
用户可以使用IAM提供身份来认证设备。设备需要预置或者通过其他方式获取security credential,在使用SigV4的签名算法对请求进行签名。AWS IoT服务则通过签名来认证设备的身份,通过身份认证后,IoT再根据身份拥有的IAM Policy来对请求进行鉴权。
IAM身份认证方式示意图如下:
image14.png

5.1 创建一个IAM用户,IoTDeviceUser
    输入命令 aws iam create-user --user-name IoTDeviceUser
  为IoTDeviceUser用户创建AccessKey
    输入命令 aws iam create-access-key \    --user-name IoTDeviceUser > /tmp/IoT_demo_access_key
  记录下AccessKeyIdSecretAccessKey,输入以下命令:
   AccessKeyId=`cat /tmp/IoT_demo_access_key| jq .AccessKey.AccessKeyId| sed 's/"//g'`   SecretAccessKey=`cat /tmp/IoT_demo_access_key| jq .AccessKey.SecretAccessKey| sed 's/"//g'`   登录到IAM控制台,查看刚刚创建的IAM 用户    image15.png
从上图可见成功创建了IoTDeviceUser用户,但是还没有指定策略。其实IAM用户的创建及策略操作等都可以在控制台进行,而且更方便,前面采用CLI只是为了体验一下操作。

5.2 设备使用HTTP协议接入
1)为设备创建IAM Policy,输入命令:

  1. device_IAM_http_policy_arn=`aws iam create-policy \
  2. --policy-name IoTDeviceIAMHttpPolicy \
  3. --policy-document "{
  4.     "Version": "2012-10-17",
  5.     "Statement": [
  6.         {
  7.             "Sid": "VisualEditor0",
  8.             "Effect": "Allow",
  9.             "Action": "iot:Publish",
  10.             "Resource": [
  11.                 "arn:aws:iot:us-east-1:${account_id}:topic/IoTDemo/device_IAM_http"
  12.             ]
  13.         }
  14.     ]
  15. }" | jq .Policy.Arn | sed 's/"//g'`
复制代码

2)将IAM Policy绑定到IAM用户,执行命令
  1. aws iam attach-user-policy --user-name IoTDeviceUser \
  2. --policy-arn ${device_IAM_http_policy_arn}
  3.     把IAM Policy绑定到IAM用户,执行命令 aws iam attach-user-policy --user-name IoTDeviceUser \
  4. --policy-arn ${device_IAM_http_policy_arn}
复制代码

3)生成模拟设备程序
执行如下命令:
  1. cat <<-EOF > ~/awsIoTAccessDemo/device_IAM_http.py
  2. #!/usr/bin/env python
  3. # -*- coding: utf-8 -*-
  4. import boto3
  5. import argparse
  6. import json
  7. #获取参数

  8. parser = argparse.ArgumentParser(description='Send data to IoT Core')
  9. parser.add_argument('--data', default="data from device_IAM_http",
  10.             help='data to IoT core topic')
  11. parser.add_argument('--AccessKeyId', required=True,
  12.             help='AccessKeyId')
  13. parser.add_argument('--SecretAccessKey', required=True,
  14.             help='SecretAccessKey')

  15. args = parser.parse_args()
  16. data = args.data
  17. access_key_id = args.AccessKeyId
  18. secret_access_key = args.SecretAccessKey

  19. device_name = 'device_IAM_http'
  20. region = 'us-east-1'
  21. topic = "IoTDemo/"+device_name

  22. iot_data_client = boto3.client('iot-data',region_name=region,aws_access_key_id=access_key_id,aws_secret_access_key=secret_access_key)

  23. response = iot_data_client.publish(
  24.     topic=topic,
  25.     qos=0,
  26.     payload=json.dumps({"source":device_name, "data":data})
  27. )
  28. EOF
复制代码
    注意:代码中的区域要填写正确。

4)运行模拟设备程序
   
  1. python device_IAM_http.py --data "data from device IAM http." \
  2. --AccessKeyId ${AccessKeyId} --SecretAccessKey ${SecretAccessKey}
复制代码

5)再去IoT控制台查看收到的消息
image16.png

由上图可见消息来自刚刚创建的.py文件,消息内容也正是文件中的字段,由此证明设备发送消息成功。
后续我将继续尝试用不同的身份认证和不同的协议接入。

    参考文档:





转播转播
回复

使用道具

联系楼主
*
*
客户公司所在区域:
*
产品:
*
简述客户的业务场景和需求
*
*
*

成为第一个回答人

B Color Link Quote Code Smilies
光环云社区 |京ICP备18044167号-13|

京公网安备 11010102003758号