×

安全工作区开源分享

消耗积分:2 | 格式:zip | 大小:0.07 MB | 2022-11-04

张艳

分享资料个

描述

什么是安全工作区

安全工作区旨在创建一个点对点网络,其中一堆AWS IoT EduKit将共享一个通用接口。该接口将由 BLE(Bluetooth LOW ENERGY) UART 协议创建。这些设备可以一次在它们之间共享一个消息。

当一个设备(Sender)想要发送消息时,它会与其他设备(Recipient)连接并收集它的GATT属性。这些属性是由接收设备提供的服务和特性。收集这些属性后,发送方设备可以在该接口上读取/写入数据,接收方设备将监听这些数据。

一个 android 应用程序将作为管理设备也与该界面相关联。如果任何设备想要向管理应用程序发送消息,它也是可能的。

为什么选择安全工作区

近来,自然灾害的加剧已成为大多数国家的可怕局面。这些自然灾害包括地震、暴雨造成的山体滑坡、海啸对人口地区造成巨大损失,尤其是附近有工作场所的情况下。此外,我们不能否认与这些事件有关的死亡对社会造成沉重打击的事实。

有时办公室和工作场所不承认情况的严重性。即使是天气预报也无法预测影响的确切时间和情况的严重程度。以下是地震造成可怕情况的一些案例。6.4级地震使建筑物倒塌| 来源以及因大地震而导致14人死亡的倒塌建筑| 来源

在大多数情况下,被困在倒塌建筑物瓦砾下的人可以存活一段时间,但他们无法通知外面的人或他们的代表当局他们的存在。虽然救援队及时赶到并尽了最大努力,但问题是,他们不知道去哪里寻找还活着的人。结果,那些仅仅幸存下来的人无法从倒塌的建筑物中活着逃脱。

即使不仅是办公室或工作场所,在 Covid-19 期间,许多员工也不得不在家工作。但它也不安全,因为当任何自然灾害来袭时,住宅区或住宅区可能会受到影响。

此外,人为的有缺陷的建筑物和结构故障、建筑物着火而找不到逃生门的问题可能会导致与地震或任何自然灾害相同的麻烦。拉纳广场事件造成1134人死亡,数千人受伤| 来源过去十年以来,采矿作业中发生的事故也夺走了很多人的生命| 来源

这就是 Secure Workspace 发挥作用的地方。在物联网的现代时代,蓝牙/低功耗蓝牙 (BLE) 等高级连接选项使通信选项变得简单可靠。小型集成设备,例如:AWS IoT EduKit具有 IoT 云访问和 BLE UART 通信协议。因此,可以构建通信网络并将消息从一个设备传递或接收到另一个设备。

每当有人陷入不稳定的情况或遇到问题时,他/她可以通过向最近的与 BLE 连接的AWS IoT EduKit设备发送 SOS 消息来通知。此外,还将有一个管理员 android 应用程序,它可以搜索活动设备并与之连接并监听响应。

安全工作区的特点

  • 个性化注册:注册过程包括提供姓名、密码和信息。
  • 每个用户一台设备:Secure Workspace 旨在在工作场所建立一个网络,每个员工都有一个AWS IoT EduKit,他/她可以在紧急情况下发送 SOS 消息。为此,必须为每个用户提供经过身份验证的登录名和用户配置文件。
  • 管理应用程序和主动搜索:用户有权将 SOS 消息直接发送到管理应用程序。此外,在发生灾难或威胁事件后,管理员可以搜索活动设备并与之连接。
  • 点对点连接:一个设备可以使用与管理应用程序相同的 BLE UART 协议向另一台设备发送消息。

用于安全工作区的技术堆栈

  • AWS IoT Core:AWS IoT Core 用于侦听来自设备的 MQTT 消息并采取相应措施。
  • AWS DynamoDB:AWS DynamoDB 用于存储用户配置文件,例如名称、密码和消息。
  • AWS Lambda函数:AWS Lambda 函数用作与 AWS IoT Core 事件绑定的无服务器计算机。当 MQTT 消息到达时,我们可以通过 lambda 函数触发一些事件,例如:从 DynamoDB 获取数据并发送到设备。
  • BLE UART:通用异步接收器/发送器 (UART) 是最流行的协议,用于通过串行端口与计算机设备通信。我们将使用的是 BLE over UART 协议。集成和侦听数据更改或通过端口写入数据很容易。

在继续之前阅读

  • AWS 账户:本项目教程强烈建议拥有一个 AWS 账户。我们可以在老师的帮助下使用 AWS Educate 帐户。或者,我们可以使用 gmail 地址创建自己的地址,就像我使用 rahulmohoto.icpc@gmail.com 创建的一样,然后启动AWS 免费套餐包。该项目与 AWS 免费套餐兼容。
  • 设置角色和策略:在使用 AWS 服务之前,有必要知道我们正在使用它做什么。角色和策略需要根据我们的需要来设置。否则,把所有事情都做对不会得到我们想要的结果。
  • 管理员应用:通过“关于管理员应用的一些注意事项”部分对应用程序有一个简要的了解。
  • 关于代码:AWS IoT EduKit 和 Android 应用程序的代码可在附加的 GitHub 存储库中找到。

环境设置

在我们继续之前,我们需要为AWS IoT EduKit设备设置环境。需要关注的一些关键点:

  • 该应用程序使用 UIFlow MicroPython 固件 1.12 构建。构建版本 1.8.1。
  • 对于这个项目,我将使用Microsoft Visual Studio Code作为我的代码编辑器。软件下载链接
  • 我们必须为Microsoft Visual Studio Code 安装一个插件,它的名称是vscode-m5stack-mpy。按照此链接获取该插件。
  • 我的环境设置如何 -
poYBAGNkf4WAGwMsAAGit3YoEG4372.png
Visual Studio 代码编辑器上的环境设置
 
  • 为了在AWS IoT EduKit设备中闪存和烧录固件,使用了另一个名为M5 Burner的软件按照此链接获取该软件。
  • 要了解有关 UIFlow 和 MicroPython 库的更多信息,请参阅它们的官方文档。按照这个链接将直接到他们的官方文件。

安全工作区如何工作

为了便于理解,我们可以将系统分为两部分。

  • 如果我们发现数据库中不存在用户数据 ->注册过程(第 1.1 节)
  • 如果我们发现数据库中存在用户数据 -> Dashboard Operations(Section:1.2)

1.1 未找到用户数据时的注册流程

 
 
 
pYYBAGNkf4mAT76nAAD5uFMWR4w383.png
 
1 / 6流程图:注册(向右滚动查看分段视图)
 

注册背后发生了什么:

  • 第 1.1.1 节:检查现有用户数据
  • 第 1.1.2 节:在完成键盘输入姓名、密码和消息后进行注册

1.1.1 如何检查用户数据是否存在于 DynamoDB

要检查 DynamoDB 上是否存在用户数据,我们需要创建一个可以调用触发器的事件。作为回报,我们将获得来自 DynamoDB 的记录。对于我们需要执行的任务,没有可用的操作,例如:在“AWS IoT Core 规则”部分从 DynamoDB 获取数据。

为此,我们可以做的是创建一个AWS Lambda 函数。 Lambda 函数用作无服务器计算机,它可以在触发某种事件时执行任务。对于我们的案例,我们将使用格式化的 MQTT 消息来触发事件。在输出中,我们还将获得一个 MQTT 响应,但加载了我们想要从 DynamoDB 获得的记录的 JSON 数据。

让我们关注列出的 lambda 函数中的“SendMQTTtoCORE2AWS”函数。

poYBAGNkf4yAaipRAAEWKiSMRbo209.png
AWS 上的 Lambda 函数
 
# SendMQTTtoCORE2AWS Lambda Function
# Python 3.8 
...
# TODO implement
client = boto3.resource("dynamodb")
table = client.Table("Save_User_Data")
data = table.scan()["Items"]
client = boto3.client('iot-data', region_name='us-west-2', endpoint_url='https://a25wmxf9jzsaoa-ats.iot.us-west-2.amazonaws.com')
# Change topic, qos and payload
response = client.publish(
topic='env/core',
qos=0,
payload=json.dumps(data[0]["User_Data"])
)
...

不仅是一个 lambda 函数,我们还需要一个IoT 规则,它可以作为触发器来调用该函数。这是我的 IoT 规则“Fetch_Data”来调用“ SendMQTTtoCORE2AWS” lambda 函数。

pYYBAGNkf46AG6pjAAEZmwa1pk8882.png
AWS IoT Core 上的 IoT 规则
 

“Fetch_Data”规则是什么:

  • 关于规则:该规则的作用是调用 lambda 函数“SendMQTTtoCORE2AWS”,从 DynamoDB 中获取数据并作为 MQTT 消息发送到设备。
  • 事件触发:
SELECT Tag FROM 'env/msg' WHERE Tag = "Fetch_Data"
  • 行动:调用 lambda 函数。
poYBAGNkf5KAPK2IAAFVlNqOD0Y328.png
AWS IoT Core 上的 Fetch_Data 规则
 

AWS IoT EduKit发生了什么

# UiFlow MicroPython 1.12 Firmware
# .. Dictionary["Tag"]="Fetch_Data" this is must otherwise, SQL query won't match
...
aws = AWS(things_name='AWS_CORE2', host='a25wmxf9jzsaoa-ats.iot.us-west-2.amazonaws.com', port=8883, keepalive=60, cert_file_path="/flash/res/certificate.pem.crt", private_key_path="/flash/res/private.pem.key")
aws.start()
aws.publish(str('env/msg'),str((json.dumps((Dictionary)))))
...

**请参阅此处了解如何设置 DynamoDB 表和存储设备数据

**请参阅此处了解如何使用 python 创建 Lambda 函数

**请参阅此处了解如何在 AWS 上发布和订阅 MQTT

这样,我们可以从 dynamoDB 获取数据并将其作为 MQTT 消息发送到AWS IoT EduKit。

搜索现有数据并在设备部分获取结果已完成。现在,我们可以进入下一部分,即将数据插入数据库,我们刚刚通过键盘提供。

1.1.2 当我们完成姓名、密码和留言的数据输入时

在我们完成名称、消息和密码的输入后,将使用该名称、消息和密码创建一个字典[一个保存键和值对的 python 数据结构]。

# Uiflow MicroPython 1.12 Firmware
...
DictionaryOfSendingInfo={"Name_Data":listOfInputs[0],"Password":listOfInputs[1],"Message":listOfInputs[2],"Tag":"Send_Data"}

...

稍后,字典被发送到 AWS DynamoDB 并作为记录存储在表下Save_User_Data.但是,要在 DynamoDB 上存储数据这样的操作,必须触发一些事件。因此,我们需要在AWS IoT Core 中为此制定规则。

这些是我的物联网规则。目前,我们只关注“Save_Data”规则。

poYBAGNkf5eAA3U9AAFOEeZ_e-c426.png
AWS IoT Core 上的 IoT 规则
 

什么是“Save_Data”规则:

  • 关于规则:此规则的功能是在 DynamoDB 上插入设备数据(MQTT 消息),从AWS IoT EduKit 发送。
  • 事件触发:
SELECT Name_Data, Password, Message, Tag FROM 'env/msg' WHERE Tag = "Send_Data"
  • 行动:在 DynamoDB 表中插入一条消息。
poYBAGNkf5qAGd8sAAFt6AFq1GY510.png
AWS IoT Core 上的 Save_Data 规则
 
pYYBAGNkf52AD_bdAAEcoPX8oE4691.png
User_Data 作为记录存储在 AWS DynamoDB 上
 

**请参阅此处了解如何设置 DynamoDB 表和存储设备数据

AWS IoT EduKit发生了什么:

# UiFlow MicroPython 1.12 Firmware
# .. Dictionary["Tag"]="Send_Data" this is must otherwise, SQL query won't match
...
aws = AWS(things_name='AWS_CORE2', host='a25wmxf9jzsaoa-ats.iot.us-west-2.amazonaws.com', port=8883, keepalive=60, cert_file_path="/flash/res/certificate.pem.crt", private_key_path="/flash/res/private.pem.key")
aws.start()
aws.publish(str('env/msg'),str((json.dumps((Dictionary)))))
...

这样,字典数据(名称、密码和消息)将作为 MQTT 消息(JSON 有效负载)传输并存储在 DynamoDB 上。如果没有找到现有数据,这就是用户注册部分的全部内容。

**请参阅此处了解如何在 AWS 上发布和订阅 MQTT

1.2 找到用户数据时的仪表板操作

 
 
 
poYBAGNkf6KAVpNmAAC3jj6AkXQ924.png
 
1 / 4流程图:仪表板操作(向右滚动查看分段视图)
 

仪表板背后发生了什么

  • Profile view and edit button:

与之前一样,使用“SendMQTTtoCORE2AWS” Lambda 函数从 AWS DynamoDB 获取数据。如果按下配置文件视图按钮,则可以在“配置文件视图页面”上看到输出。如有必要,我们可以从这里编辑注册的数据。要编辑数据,我们需要另一个事件,这与我们之前在 DynamoDB 中所做的插入操作不同。现在,我们将不得不创建另一个规则,可以编辑之前保存的数据。

为了达到我们的目的,我们将使用这个 lambda 函数“EditFunctionDynamoDB”。

poYBAGNkf6aALHSrAAERzOqe1UY693.png
AWS 上的 Lambda 函数
 
# EditFunctionDynamoDB Lambda Function
# Python 3.8 
...
client = boto3.resource("dynamodb")
table = client.Table("Save_User_Data")
response = table.update_item(
Key={
'Record_Time': data[0]["Record_Time"],
},
UpdateExpression="set User_Data.Name_Data=:n, User_Data.Message=:m, User_Data.Password=:p,  User_Data.Tag=:t",
ExpressionAttributeValues={
':n': event["Name_Data"]
':m': event["Message"],
':p': event["Password"],
':t': event["Tag"]
},
ReturnValues="UPDATED_NEW"
)
...

但要调用该函数,必须有一条关于“AWS IoT Core”的规则。在这里,我们将使用“Edit_Data”规则。

pYYBAGNkf6mAYdWUAADMuyLAAoE284.png
AWS IoT Core 上的 IoT 规则
 

什么是“Edit_Data”规则:

  • 关于规则:此规则的功能将更新AWS DynamoDB 上的现有数据。
  • 事件触发:
SELECT Name_Data, Password, Message, Tag FROM 'env/msg' WHERE Tag = "Edit_Data"
  • 行动:调用 lambda 函数“EditFunctionDynamoDB”。
pYYBAGNkf6yARbYaAAF1RE9HL2A047.png
AWS IoT Core 上的 Edit_Data 规则
 

有了这个,我们可以更新之前保存在 AWS DynamoDB 上的记录。现在,我们进入下一节。

  • SOS button:

在紧急情况下,我们可以使用此按钮将之前存储的 SOS 消息直接发送到附近的设备。将使用BLE UART 进行通信。

# UiFlow Micropython 1.12 Firmware

...
uart_ble = ble_uart.init(user_info["Name_Data"])
uart_ble.write(message)
...

等待!!

我们已经到了可以向AWS IoT EduKit设备或管理应用程序发送 SOS 消息的地步。所以,我们分成两个部分。

  • 发送到另一个AWS IoT EduKit设备(第 2.1 节)
  • 发送给管理员android 应用程序(第 2.2 节)

虽然,在这两种情况下,通过 BLE UART 发送消息是相同的,但接收设备不同。这就是为什么区分它们,将使我们更好地理解。

2.1 两台 AWS IoT EduKit 设备之间的点对点通信

来自发件人:

# Sample Code Snippet
# UiFlow Micropython 1.12 Firmware
# From Sender

from ble import ble_uart
...
uart_ble = ble_uart.init("Device 1")
uart_ble.write(message)
...

致收件人:

# Sample Code Snippet
# UiFlow Micropython 1.12 Firmware
# Receive data on recipient

from ble import ble_uart

label0 = M5Label('Received Data', x=133, y=99, color=0x000, font=FONT_MONT_14, parent=None)
...
def on_recv():
  # global params
  global label0
  # Show the received text and make an alarm
  speaker.playWAV("res/Alarm.wav")
  label0.set_text(str(uart_ble.read()))

...
pYYBAGNkf7OAE2u2AABw3dszVKU726.png
流程图:使用 BLE-UART 的点对点通信
 

2.2 向管理应用程序发送 SOS 消息

来自发件人:

# UiFlow Micropython 1.12 Firmware
# From Sender

from ble import ble_uart
...
uart_ble = ble_uart.init(user_info["Name_Data"])
uart_ble.write(message)
...

致收件人:

// Java 8 Android API - 23
// On recipient
...
if(Read.equals(characteristic.getUuid().toString()))
{
    value = characteristic.getStringValue(0);
    Log.w(TAG, "Value--> "+ value); 
// receives data when GATT characteristics match with device service UUID

...
 
 
 
poYBAGNkf7aAKVjCAAB_OKjhJVQ097.png
 
1 / 3流程图:与 Android 管理应用程序的点对点通信
 

关于管理员申请的一些注意事项

  • 在仪表板部分,我们可以添加设备以立即连接和监听数据变化。
poYBAGNkf7iAUkMuAABe5yHo8s4881.png
仪表板用户界面
 
  • 搜索后单击可用设备列表中的特定设备,将弹出一个对话框。在那里可以看到两个选项。选择连接:立即连接设备。添加到收藏夹:这会将设备添加到收藏夹列表。所有这些数据都将存储在Firebase 实时数据库中。
 
 
 
pYYBAGNkf7uAI4HGAABO62AY4Wg838.png
 
1 / 2选择特定设备时
 
  • 应用程序如何与 FireBase 交互:
pYYBAGNkf76AA8nLAAB2B3WM8jY766.png
流程图:显示应用程序和 FireBase 之间的交互。
 
  • 现在,我的AWS IoT EduKit设备的 GATT 特性 - “READ”已硬编码在 android 项目中(我们需要为另一台设备更改它)因此,现在只能使用该特定设备读取/接收消息。当我们想通过 BLE 与某个设备连接时,我们必须知道该设备提供了哪些 GATT(通用属性配置文件)服务,以及确认了哪些特征。由于现在这是硬编码的,它将适用于一对一的连接,但对于多个设备,这种方法必须是动态的。

视频演示

在这里,重要的讨论主题将是:

  • “安全工作区”应用程序如何在AWS IoT EduKit 上运行。
  • 管理应用程序如何在 Android 设备上运行。
  • BLE over UART 协议如何建立通信并将消息从AWS IoT EduKit发送到 android 设备。
 

为什么我们如此专注于 BLE 连接

BLE,或者简单来说,低功耗蓝牙连接提供了两个设备之间的短距离通信协议。连接后,两个设备都可以共享数据。它们中的任何一个都可以充当发送者(服务器),而另一个可以充当接收者(客户端)。而且它不需要任何集中式服务器来相互连接。

直到两个设备都有足够的电池来打开它们的 BLE 模块,它们才能进行通信。当任何自然灾害发生时,首先断开的是互联网连接。出于这个原因,我们无法与他人交流并告知他们我们正在经历的绝境。但是有了BLE,就可以寻求帮助。

这就是为什么 BLE 是 Secure Workspace 的支柱。

未来的工作

目前,Secure Workspace已通过一对一设备(与另一台 AWS IoT EduKit设备或管理应用程序)进行测试和运行,以传输 SOS 消息。但是,网络范式中会有很多这样的AWS IoT EduKit设备。所以,应该有一些操作来知道哪一个要发送数据。

因此,构建轮询操作将是成功实施 Secure Workspace 的下一个任务。

结论

对于建筑基础设施脆弱的第三世界国家来说,像安全工作空间这样的项目非常需要,以应对不断增加的自然灾害/灾难,因为它可以对寻找幸存者产生良好的影响,并且当这些灾难发生在工作场所或家。

试图使项目文档尽可能详细,并在每个部分之后附加有用的链接。希望能帮助到你 :)

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !