Mongoose OS + ESP8266 + AWS IoT 制作智能加热器

这里所说的『智能加热器』(Smart Heater)是指:加热器设备能报告当前温度、响应状态请求以及接受开关加热器的命令。

步骤0:材料准备

在这个玩法里,我们所需要的东西有:

  • 硬件,一个 ESP8266 NodeMCU
  • Amazon AWS 账户
  • Amazon 的 aws 管理实用程序(请参见https://aws.amazon.com/cli)
  • Mongoose OS( www.mongoose-os.com )

系统架构

系统架构如下图所示:

ESP8266 AWS IoT Mongoose 系统架构

其数据流如下所示:

  • 一个设备使用 I2C 温度传感器,并定期向 AWS IoT 发送数据
  • 一个 AWS IoT 规则(rule)拦截温度数据,并将其存储到 DynamoDB 表中
  • 一个设备与其 AWS IoT Shadow同步
  • 使用 OAuth 授权的前端,运行在AWS S3上运行;与 Device Shadow 通讯以获取设备状态,或设置设备状态(打开/关闭)

构建指南(Mac/Linux)

首先,您需要创建 Google 和者 Facebook OAuth2 客户端,以便用户能够登录到加热器应用程序。

对于使用 Google 来说:请访问 Google Cloud Console,单击创建凭据(credentials) -> OAuth Client ID -> Web 应用程序,然后输入名称,如 “AWS Heater”,然后单击 “Create”。它将显示您的客户端 ID 和密钥(secret); 请复制一下客户端 ID,因为它很快会用到。暂不要关闭标签:当您的栈(stack)被实例化时,您需要返回到此处,并输入 Authorized JavaScript origin。

对于使用 Facebook 来说:访问 Facebook Apps,点击 “Add a New App”,然后输入应用名称,如 “My Heater”,选择一个分类,然后点击 “Create App ID”。应用创建完成后,您将在应用程序信息中心看到。暂时不要关闭标签:当您的栈(stack)被实例化时,您需要返回此处,并输入网站URL。

现在,按下面的步骤执行:

1.克隆代码

git clone https://github.com/mongoose-os-apps/aws-iot-heater  # Clone repo
cd aws-iot-heater

2.编译、安装、配置 Mongoose OS

mos flash aws-esp8266                           # Install Mongoose OS
DEVICE_ID=$(mos config-get device.id)           # Get device ID
mos put init.js                                 # Copy init.js on the device
mos config-set mqtt.enable=true                 # Enable MQTT
mos wifi WIFI_SSID WIFI_PASSWORD                # Setup WiFi
mos aws-iot-setup --aws-iot-policy=mos-default  # Provision on AWS IoT

3.安装 helpers/cloudformation-helpers

npm --prefix helpers/cloudformation-helpers install helpers/cloudformation-helpers

4.创建 AWS S3 Bucket

# We'll also need to create a separate S3 bucket for helper functions:
aws s3 mb s3://my-cf-helpers

5.获取端口地址

# Get the endpoint address for your AWS account, you'll need to provide it as
# a parameter for your stack:
AWS_IOT_ENDPOINT=$(aws iot describe-endpoint --output text)

6.“打包”模板。打包包含 helper 的源代码,从本地机器复制到上面创建的 s3 bucket,并适当地调整模板。这一切都在一步完成:

aws cloudformation package \
    --template-file aws_iot_heater_template.yaml \
    --s3-bucket my-cf-helpers \
    --output-template-file packaged_template.yaml

# Generate Oauth IDs on Google and Facebook
GOOGLE_CLIENT_ID=YOUR_GOOGLE_CLIENT_ID
FACEBOOK_CLIENT_ID=$YOUR_FACEBOOK_CLIENT_ID

STACK_NAME=my-heater

# The command above has created a new template file: packaged-template.yaml.
# Now, instantiate AWS stack using this template. Feel free to choose another
# stack name.
aws cloudformation create-stack \
    --stack-name $STACK_NAME \
    --parameters \
        ParameterKey=DeviceID,ParameterValue=$DEVICE_ID \
        ParameterKey=EndpointAddress,ParameterValue=$AWS_IOT_ENDPOINT \
        ParameterKey=GoogleClientID,ParameterValue=$GOOGLE_CLIENT_ID \
        ParameterKey=FacebookClientID,ParameterValue=$FACEBOOK_CLIENT_ID \
    --capabilities CAPABILITY_IAM \
    --template-body file://packaged_template.yaml

# Wait until the stack creation is completed (it may take a few minutes).
aws cloudformation wait stack-create-complete --stack-name my-heater

# Alternatively, you can use the web UI to check the status and read event
# details: https://console.aws.amazon.com/cloudformation/home

# When the stack is created, get the name of the created S3 bucket:
aws cloudformation describe-stacks --stack-name $STACK_NAME

# look for the following:
#  ...
#  {
#      "Description": "Name of the newly created S3 bucket", 
#      "OutputKey": "S3BucketName", 
#      "OutputValue": "S3_BUCKET_NAME"
#  },
#  {
#      "Description": "URL of the s3 bucket", 
#      "OutputKey": "S3BucketWebsite", 
#      "OutputValue": "APP_URL"
#  }
#  ...

S3_BUCKET_NAME=GENERATED_S3_BUCKET_NAME
APP_URL=GENERATED_APP_URL


# $S3_BUCKET_NAME is the name of the bucket, and $APP_URL is the URL at
# which your files can be accessed.
#
# Copy the actual value of "$APP_URL", and then enter it in the Google and/or
# Facebook app settings: For Google: go back to the Google Console, and add the
# URL as an Authorized JavaScript origin.  For Facebook: go back to the app's
# dashboard, click "Settings" in the sidebar, then click "Add Platform" at the
# bottom, select "Website", and enter Site URL.
#
# Then, copy the actual value of "$S3_BUCKET_NAME" (from the describe-stacks
# output), and use it to put two files on the S3 bucket:
aws s3 cp bucket/index.html s3://$S3_BUCKET_NAME --acl public-read
aws s3 cp bucket/index.js s3://$S3_BUCKET_NAME --acl public-read

# Download two files of Cognito SDK, and also put them on the S3 bucket:
curl -O https://raw.githubusercontent.com/aws/amazon-cognito-identity-js/master/dist/aws-cognito-sdk.min.js
curl -O https://raw.githubusercontent.com/aws/amazon-cognito-identity-js/master/dist/amazon-cognito-identity.min.js
aws s3 cp aws-cognito-sdk.min.js s3://$S3_BUCKET_NAME --acl public-read
aws s3 cp amazon-cognito-identity.min.js s3://$S3_BUCKET_NAME --acl public-read

# Now, navigate to the index page of your app $APP_URL.

您将看到从设备上传的温度,当前加热器状态(开/关)、开关的最新图表。只有经认证和授权的用户才能切换加热器; 点击“ Sign in with Google”。

注意:如果它 "抱怨"(报错) 重定向的URI不匹配,只需要等待几分钟:Google Console 中的设置可能需要一些时间才能生效。

如果您尝试切换加热器状态,您将收到消息说:你没有授权这样做。现在,您需要授权您的用户,来管理加热器。

为此,需要导航到 AWS Cognito Console,单击 “Manage Federated Identities”,选择 “identity_pool_for_DEVICE_ID”,单击 “Edit identity pool”,展开 “Authentication providers”,点击“Google+”标签,并在 “Authenticated role“ 区域,将 ”Use default role“ ”"Choose role with rules"“。

在这里,你可以使用你想要的任何规则。 例如,为了授权一些特定用户,您可以指定 Claim 为:“email”,匹配类型为 “Equals”,值:“addr@domain.com”,并选择一个角色 “my-heater-myHeaterAdminRole-XXXXXXXX”。

之后,您可以从加热器应用程序中注销,登录后,切换加热器将导致更改状态。

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.