aws-samples/aws-iot-core-for-amazon-sidewalk-sample-app
GitHub: aws-samples/aws-iot-core-for-amazon-sidewalk-sample-app
亚马逊Sidewalk示例物联网应用,实现边缘设备与云后端安全通信。
Stars: 45 | Forks: 16
# 亚马逊Sidewalk示例物联网应用
这是一个演示基于Sidewalk的简单物联网用例的应用程序:传感器监控、命令控制和警报。该示例应用程序通过安全的Sidewalk网络与云后端进行通信。
亚马逊Sidewalk示例物联网应用由边缘设备(运行嵌入式应用的硬件开发套件)和应用服务器(具有Web UI的云后端)组成。
边缘设备在初始设置并在Sidewalk网络中注册后,会定期将温度测量数据发送到后端。后端将数据以图表的形式可视化在图形UI上。
用户可以在边缘设备上操作按钮,这将在Web UI中反映相应的按钮图标(上行链路通信)。
用户可以在UI视图中切换LED按钮,然后将其传播到边缘设备中相应的LED(下行链路通信)。
可以添加多个边缘设备(传感器)与单个应用服务器一起工作。在这种情况下,UI将每个边缘设备表示为视图中单独的瓷砖。
每个传感器都必须刷入适用于所有设备的通用应用程序二进制文件和一个特定于设备的映像(包含每个设备的序列号、加密密钥和授权数据的二进制文件)。
云后端根据设备特定二进制文件中存在的数据识别/授权每个边缘设备,这确保了端到端加密和高度安全的通信通道。
## 覆盖范围
Sidewalk网络在美国运行。通过在https://coverage.sidewalk.amazon/填写您的地址来检查您是否有覆盖范围。
如果您不确定是否有覆盖范围,我们建议您开启一个可用的操作Sidewalk网关(例如,亚马逊Echo第4代)。Sidewalk网关是一种具有主要功能(例如,智能扬声器或门铃)并充当边缘设备(传感器)与云后端之间桥梁的设备。要开启亚马逊Echo第4代设备上的Sidewalk,请参阅以下内容:https://www.amazon.com/gp/help/customer/display.html?nodeId=GZ4VSNFMBDHLRJUK
|警告:Sidewalk仅在位于美国的网关上激活 |
|---|
## 前提条件
- 下载并安装Python 3.6或更高版本(https://www.python.org/)
- 创建AWS账户(https://aws.amazon.com/)
- 设置AWS用户及其凭证:
- 在AWS IAM服务中创建用户([创建IAM用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console))
- 配置用户的认证凭证([管理访问密钥 -> 创建访问密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey))
- 在您的本地机器上配置*credentials*文件([Boto3 -> 快速入门 -> 配置](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#configuration))
- 向用户添加创建资源的权限:
- 如果您的用户具有管理员权限,则前提条件已满足,您可以跳过此点
- 否则,您需要为您的用户分配具有适当权限的策略:
- 运行`python ApplicationServerDeployment/policies/generate_policy.py`脚本,该脚本将在*ApplicationServerDeployment/policies/*目录中生成个性化的策略文档
- 前往IAM控制台,使用*DeployStackPolicy.json*内容创建策略
- 将创建的策略分配给您的用户
有关进一步指导,请参阅[IAM教程:创建并附加您的第一个客户管理策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_managed-policies.html)。
- 安装用于构建和刷写MCU的特定工具:
- Nordic
- 刷写驱动程序:*Segger JLink*(https://www.segger.com/downloads/jlink/)
- 刷写工具:*Nordic nRF Connect*(https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-Desktop/Download)
- TI:
- 刷写工具:*UniFlash*(https://www.ti.com/tool/UNIFLASH)
- SiLabs:
- 刷写驱动程序:*Segger JLink*(https://www.segger.com/downloads/jlink/)
- 刷写工具:*Simplicity Commander*(https://community.silabs.com/s/article/simplicity-commander)
确保*Simplicity Commander*(对于SiLabs)存在于您的系统PATH环境变量中。
--> 在终端中尝试调用`commander --version`以确认Simplicity Commander可用
## 入门
### 1. 安装虚拟环境
1. 打开命令行终端并导航到项目的顶级目录。
2. 安装virtualenv和所需软件包。只需将命令复制粘贴到终端即可。
您可能需要使用`python`或`python3`别名,具体取决于您的配置。
- Linux / MacOS:
```
python3 -m pip install --user virtualenv
python3 -m venv sample-app-env
source sample-app-env/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -r requirements.txt
python3 -m pip install pyjwt -t ./ApplicationServerDeployment/lambda/authLibs
```
- Windows:
```
python -m pip install --user virtualenv
python -m venv sample-app-env
sample-app-env\Scripts\activate.bat
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip install pyjwt -t .\ApplicationServerDeployment\lambda\authLibs
```
### 2. 填写配置文件
填写[config](./config.yaml)文件,输入您的详细信息(或保留默认值)。
|您需要提供WebApp的用户名和密码。|
|---|
|字段 |默认值 |描述
| --- | --- | ---
| *AWS_PROFILE* | *default* |在堆栈创建期间使用的配置文件。如果您在AWS CLI配置文件中有一个自定义命名的配置文件,请将'default'替换为您的配置文件名称。通常,您只有一个名为'default'的配置文件。
| *DESTINATION_NAME* | *SensorAppDestination* |用于上行链路流量路由的Sidewalk目的地。可以是任何字符串。
| *HARDWARE_PLATFORM* | *ALL* |*NORDIC*或*TI*或*SILABS*(或*ALL*,如果您想为所有三个平台生成个性化数据)
| *USERNAME* | *null* **(需要覆盖)** |WebApp的用户
| *PASSWORD* | *null* **(需要覆盖)** |用户的密码
| *INTERACTIVE_MODE* | *True* |启用交互模式(确认提示)。
在此阶段,您可能想运行辅助*env_check.py*脚本来对您的环境进行常见错误的检查。
```
python3 env_check.py
```
### 3. 部署云基础设施
为了使示例应用程序正常工作,您需要将必要资源部署到您的AWS账户中。
**在运行脚本之前,请确保您有足够的权限来创建资源**
(请参阅:[前提条件](#Prerequisites))。
|所有资源都需要在*us-east-1*区域中创建。如果*config*文件指定了另一个区域,则将其忽略。
|---|
|警告:您将为此应用程序创建的AWS资源的使用付费。 |
|---|
1. 运行部署脚本:
python3 ApplicationServerDeployment/deploy_stack.py
当被询问是否继续时,键入`y`。
等待部署完成(通常需要约5分钟)。
2. 前往控制台打印的URL。它也存储在[config](./config.yaml)下的*WEB_APP_URL*中。
使用配置文件中的*USERNAME*和*PASSWORD*登录WebApp。
一旦嵌入式应用发送第一条上行链路消息,您的设备将出现在Web应用中。
|警告:Web应用是公开可用的。任何拥有正确URL和凭证的人都可以与您的设备交互。 |
|---|
### 4. 配置边缘设备
此步骤为边缘设备创建单个个性化数据。
它与AWS交互,在后台创建WirelessDevice,下载创建的数据,并编译可以刷写到开发套件上的二进制blob。
1. 运行设备配置脚本:
python3 EdgeDeviceProvisioning/provision_sidewalk_end_device.py
2. 在*EdgeDeviceProvisioning*目录中,您现在应该看到一个*DeviceProfile*目录,其中包含*WirelessDevice*子目录。
每个_WirelessDevice_子目录代表一个单独的边缘设备。
个性化数据,以可编程二进制文件的形式提供,位于其中。
EdgeDeviceProvisioning \
- DeviceProfile_102d750c-e4d0-4e10-8742-ea3698429ca9 \
- DeviceProfile.json
- WirelessDevice_5153dd3a-c78f-4e9e-9d8c-3d84fabb8911\
-- Nordic_MFG.bin
-- Nordic_MFG.hex
-- SiLabs_MFG.nvm3
-- Silabs_xG21.s37
-- Silabs_xG24.s37
-- TI.bin
-- TI_P1_MFG.hex
-- TI_P7_MFG.hex
-- WirelessDevice.json
您应该能够使用针对您所选平台特定的刷写工具将其刷写到开发套件上。
3. 您可以通过再次调用`provision_sidewalk_end_device.py`或使用`--instances`参数生成多个设备
python3 EdgeDeviceProvisioning/provision_sidewalk_end_device.py --instances 5
### 5. 刷写边缘设备
在此步骤中,您将在您的开发套件上编程二进制文件。
有两个主要文件需要刷写:来自*EdgeDeviceProvisioning*的特定于设备的日期(此程序序列号和授权密钥)和来自*EdgeDeviceBinaries*的应用程序二进制文件(此程序应用程序逻辑)
编程设备取决于使用的硬件平台。在以下路径下查找专门的如何操作:
--> [如何编程Nordic板](./EdgeDeviceBinaries/nordic/doc/_How_to_program.md)
--> [如何编程SiLabs板](./EdgeDeviceBinaries/silabs/doc/_How_to_program.md)
--> [如何编程TI板](./EdgeDeviceBinaries/ti/doc/_How_to_program.md)
有关编程板子的详细说明,请参阅给定硬件平台的官方文档。
### 6. 享受应用程序
边缘设备将向应用服务器发送欢迎消息,从而通知应用服务器其存在。
一旦边缘设备从应用服务器收到确认,它将开始向后台发送周期性的温度测量数据。接收到的数据将在前端UI中表示。
您可以在边缘设备的终端中打开终端以查看日志流(例如,定期发生的数据传输)。
您可以在Web应用程序的URL中打开以查看UI中您的边缘设备的图形表示。
使用[config](./config.yaml)中定义的*username*和*password*登录。

您可以在边缘设备上按按钮,并看到Web UI中的按钮状态变化。
您可以在Web UI中按LED按钮,并看到您的边缘设备上的LED切换。
您可以在您的房间中打开窗户(或根据您的喜好开启供暖)并观察Web UI中的温度读数如何变化。
这是在服务器和边缘设备开始通信后您在Web应用中应该看到的内容:

## 传感器监控应用 - 实现细节
传感器监控应用程序由AWS基础设施组成,能够接收、处理和存储来自Sidewalk启用设备的消息。
它还提供了一个Web应用,允许用户与其开发板交互。
### 云基础设施
应用程序的组件由以下图表表示。它们通过箭头连接,箭头代表数据流。
颜色表示消息类型:
- 绿色 --> 上行链路
- 橙色 --> 下行链路
- 蓝色 --> 通知
- 红色 --> 错误
- 黑色 --> 应用程序特定数据
|  |
| --- |
| *示例应用程序 - 资源和数据流* |
*SidewalkSampleApplicationStack* CloudFormation堆栈提供了处理来自Sidewalk启用设备消息的资源。
它还创建了必要的角色和权限,这些权限不包括在图表中。
其主要组件包括:
- *SIDEWALK_DESTINATION* - 将设备消息映射到MQTT主题。
每个Sidewalk设备都需要定义其目的地,以便AWS IoT知道将消息重定向到何处。
您可以使用AWS IoT Wireless API的*UpdateDestination*方法更改设备的目的地。
所有来自*SIDEWALK_DESTINATION*的上行消息都重定向到*sidewalk/app_data*主题。
- *SidewalkUplinkRule* - 从*sidewalk/app_data*主题接收上行消息。
它将传入的上行链路转发到*SidewalkUplinkLambda*,在那里进一步处理。
如果发生错误,错误消息将存储在*SidewalkRuleError*日志组中。
- *SidewalkNotificationRule* - 接收Sidewalk资源的通知事件。
它将传入的通知转发到*SidewalkUplinkLambda*。
如果发生错误,错误消息将存储在*SidewalkRuleError*日志组中。
- *SidewalkUplinkLambda* - 处理传入的上行链路和通知。记录传入的事件。
上行链路被解码,根据有效负载,可能采取以下操作:
- 将设备数据存储在SidewalkDevices表中
- 将传感器数据存储在Measurements表中
- 调用*SidewalkDownlinkLambda*以响应下行链路消息
- *SidewalkDownlinkLambda* - 处理向无线设备发送命令的请求。
将命令编码
标签:AWS Sidewalk, UI设计, 二进制编程, 云平台, 传感器监测, 加密通信, 命令控制, 安全通信, 应用服务器, 数据采集, 智能家居, 漏洞利用检测, 物联网, 硬件开发套件, 网络覆盖, 警报系统, 设备认证, 边缘计算, 逆向工具