邻里互助项目开发实操
利用Silicon Labs产品和Amazon Sidewalk打造社区备援系统
图源:Crovik Media/Stock.adobe.com
发布日期:2024年2月28日
Amazon Sidewalk是亚马逊开发的一种低带宽、远距离无线网络技术,用于将智能设备的连接扩展到个体家庭或住宅范围之外,创建一个可覆盖邻里和社区等更大区域的共享网络。利用Amazon Sidewalk搭建的设备网络可帮助提高物联网设备的性能和信号覆盖范围,特别是对于门外的设备,如追踪系统、户外照明和喷灌系统,使这些设备即使在传统Wi-Fi®和其他家庭网络的范围之外也能连接到互联网。这样,产品开发人员就可以集中资源开发产品,而不必担心网络的搭建、保护和维护。
为实现这一目标,Amazon Sidewalk使用家中的一小部分Wi-Fi带宽连接支持Amazon Sidewalk的设备,包括家门外的设备或邻居的设备(如果它们也接入Amazon Sidewalk网络)。声控智能设备,如Amazon Echo或Ring摄像头,通过与Amazon Sidewalk网络共享一小部分家庭网络带宽来充当桥接器(图 1)。然后,这些桥接器可连接支持Amazon Sidewalk的设备,这些设备利用低功耗蓝牙(特别是900MHz频段)以及其他长距离通信频率,实现比标准Wi-Fi更远距离的通信。这样就可以将智能灯、宠物追踪器或智能灌溉系统等设备的通信距离延长至半英里。
图1:数字助理充当Amazon Sidewalk设备之间的网关。(图源:Mickael/stock.adobe.com)
在Wi-Fi或蜂窝网络连接受限或室外设备远离接入点的情况下,或者在家庭网络出现故障但必须将重要信息传送给房主的情况下,这项技术尤为有用。
我们将在本项目中探讨最后一种情况。接下来将创建一个水检测系统,它能感知水的存在,并通过Amazon Sidewalk将信息传递给房主。通过使用Sidewalk而不是家中的Wi-Fi,如果水渍导致连接到无线家庭路由器的断路器跳闸,则可以通过邻居的联网设备(如Echo设备或Ring门铃)发送紧急通知。
物料清单和工具
要构建使用Amazon Sidewalk的水检测系统,物料清单(BOM)如下所示:
Silicon Labs Pro Kit for Amazon Sidewalk
Amphenol Advanced Sensors冷却液泄漏/水侵入检测传感器
TE Connectivity / Holsworthy CFR16J10K 10KΩ固定电阻器,1/4W,5%
Adafruit连接线
Würth Elektronik WR-TBL接线端子
Displaytech Qb Global 5W电源
除了物料清单外,还需要或建议准备以下工具:
Amazon Echo(第四代或更新版本),充当Sidewalk网关
小型十字头和平头螺丝刀
剪线钳/剥线钳
剪刀
热缩管
小型尖嘴钳
数字万用表
运行Windows 10或更高版本的PC
高速互联网连接
资源
访问贸泽购物车。
访问GitHub存储库。
-
下载Silicon Labs Simplicity Studio。
关于Amazon Sidewalk Gateway的重要说明
按照Silicon Labs和亚马逊的说法,Sidewalk协议需要一个网关才能允许终端访问Amazon Web Services (AWS) 云。有多款亚马逊产品可以用作网关(图2)。这些产品具有不同的功能,对Amazon Sidewalk网络功能的支持也各不相同。本项目使用第四代Amazon Echo智能扬声器作为Amazon Sidewalk网关,因为Silicon Labs为其产品验证Amazon Sidewalk软件开发套件。
图2:Sidewalk技术支持多种无线协议,以便终端设备访问AWS。(图源:Allen Stoner/stock.adobe.com)
我们建议您使用自己的网关,因为这样可以在开发阶段实施最大程度的控制来提供一致的网络访问。不过您可能已经能够访问您所在位置的Amazon Sidewalk网络。要确认访问权限,请查看亚马逊的Sidewalk覆盖范围图。
最后,按照下面几个额外要求为您的网关配置Sidewalk支持:
Echo设备必须拥有美国原生IP地址。
设备上必须启用Amazon Sidewalk。
硬件准备
这个水检测项目使用了Silicon Labs Pro Kit for Amazon Sidewalk(图3)和Amphenol Advanced Sensors BAF147B002-00A0液体泄漏传感器。
Silicon Labs Pro Kit for Amazon Sidewalk
功能全面的Silicon Labs Pro Kit for Amazon Sidewalk开发套件提供了评估和开发大批量、可扩展的Amazon Sidewalk设备所需的全部硬件和软件工具。
图3:Silicon Labs提供适用于Amazon Sidewalk的专业套件,可用于为终端产品(如水检测设备)快速制作原型。(图源:Silicon Labs)
该套件包括以下组件:
KG100S无线电板:完整的参考设计,支持Amazon Sidewalk中使用的蓝牙、FSK和CSS协议。这也是我们将在本项目中使用的无线电板。
BG24无线电板:仅支持蓝牙的无线电板,适合需要独立设计的用户。
FSK/CSS适配器板:允许BG24无线电板与Amazon Sidewalk配合使用的电路板。
Wireless Pro Kit主板:包含板载J-Link调试器、数据包跟踪接口和虚拟COM端口,可通过扩展头对所连接的无线电板和外部硬件进行应用程序开发和调试。
-
Amazon Sidewalk SDK:一个软件开发套件,提供开发Amazon Sidewalk设备所需的库和工具。
我们将在本项目中使用Wireless Pro Kit主板和KG100S无线电板。确保将KG100S无线电板小心插入主板,仔细对齐两块电路板之间的细间距引脚。另外,确保主板的电源开关设置在AEM位置。这将允许在固件编程时通过USB为设备供电。您还可以使用CR2032纽扣电池为主板供电,这样就可以方便地实际使用设备。
Amphenol Advanced Sensors液体泄漏传感器
在本项目中,我们使用的是Amphenol Advanced Sensors BAF147B002-00A0液体泄漏传感器(图4)。该传感器集成了一个固定的510KΩ电阻器,用于连接两个电极。水在电极之间充当可变电阻,从而改变传感器的内阻。
图4:水传感器采用分压器拓扑结构,与主板ADC引脚相连。(图源:贸泽)
您需要再添加一个固定的外部10KΩ电阻器作为上拉电阻器。电阻器的一条引线连接水传感器的一条引线,另一条引线连接主板的3.3V电压源(图5)。
将主板的3V电压源引脚与外部10KΩ固定电阻器的一条引线相连。
将10KΩ固定电阻器的另一条引线连接至水传感器的一条引线。
将水传感器的第二条引线直接连到主板的GND引脚。
将开发板的ADC引脚与10KΩ电阻器的引线连接,该电阻器还与水传感器相连。不要将其连接到连接电压源的引线上。
-
给所有连接点套上热缩管,以帮助减少电线与水接触的问题。
图5:该图展示了水传感器与开发板的连接方式以及分压器的工作原理。(图源:Amphenol Advanced Sensors/贸泽电子)
注意:建议使用10KΩ电阻器作为起始值。如果无法获得可靠的传感器读数,可尝试增大电阻值。此外,如果使用不同的5V供电电压开发板,可尝试从100KΩ固定电阻器开始。
软件开发
这个水检测项目使用Simplicity Studio 5开发固件并将其上传到开发板。Silicon Labs Simplicity Studio 5 (SSv5) 是一个免费的集成开发环境 (IDE),用于在Silicon Labs设备上开发嵌入式应用。SSv5是基于Eclipse的IDE,适用于Windows、macOS和Ubuntu Linux,为软件开发、调试、配置和分析提供一套全面的工具。它旨在为各种经验水平的开发人员简化开发过程,具有直观的用户界面和丰富的功能,包括:
-
设备配置: 该平台提供用于配置微控制器外设和设置的工具。SSv5可自动识别您购买的电路板,并过滤掉不适用的示例应用程序,只显示与您选择的硬件相关的示例应用程序。这简化了设置过程,降低了使用硬件组件的复杂性。
-
无线开发:SSv5为无线开发提供广泛的支持,因此适用于物联网 (IoT) 应用。它包含使用蓝牙、Zigbee®和Thread等流行无线协议开发应用所需的库和工具。
-
能量分析器:在电池供电的嵌入式系统中,能效非常重要。Simplicity Studio中的能量分析器可帮助开发人员分析和优化功耗,这对延长设备的电池寿命至关重要。
-
软件栈和库:该平台提供一系列预置软件组件,包括协议栈、中间件和驱动程序。这些组件可以节省开发时间,简化嵌入式应用程序的构建过程。
-
内置的配置管理:Simplicity Studio可直接链接到私有GitHub存储库。
除Simplicity Studio外,我们还建议您下载并安装J-Link RTT Viewer来查看应用程序日志。该软件可在此处下载。要配置应用程序,请按以下步骤操作:
在“Configuration”窗口的“Connection to J-Link”部分,选择USB。
在“Specify Target Device”下拉列表中,选择连接的部件。对于EFR32xG24无线电板BRD4187C,选择EFR32MG24AxF1536。
在“Target Interface & Speed”下拉列表中,选择“SWD and 4000kHz”。
在“RTT Control Block”部分,选择“Auto Detection”。
-
单击“OK”。
Amazon Web Services
由于Sidewalk是亚马逊的一项服务,我们将使用AWS(图6)作为后台,将信息从嵌入式设备转发到云端。按照Silicon Labs的说法,您需要知道自己是根用户还是身份识别与访问管理 (IAM) 用户。 如果您是新手开发人员,我们建议您设置一个根用户帐户。如果您是有经验的开发人员,那么IAM用户帐户是更好的选择。在安装过程中,系统会提示您添加付款和账单详情。
图6:Amazon AWS IoT Core用作Sidewalk设备的后台。(图源:亚马逊)
您需要一个支持Amazon Sidewalk的桥接设备,才能使用Amazon Sidewalk连接到AWS。在本项目中,我们将使用第四代Amazon Echo。在本文撰写之时,亚马逊仅在美国境内的网桥上支持Sidewalk功能。要将您的设备接入AWS,您需要执行以下操作:
创建一个AWS帐户:
安装AWS命令行界面 (CLI):
您可以在Windows、macOS或Linux上安装AWS CLI。有关详细信息,请参阅《AWS CLI Installation Guide》。
重要提示:请确保使用1. X CLI版本。目前不支持使用2.X CLI版本。
通过输入aws configure并按Enter键,配置AWS CLI。
系统将提示您输入AWS帐户凭据。
亚马逊仅对弗吉尼亚州北部地区 ("us-east-1") 激活了Sidewalk。为支持Sidewalk开发(和运行),您的AWS CLI和AWS Web界面应设置为属于us-east-1区域。
安装Amazon Sidewalk SDK。
您可以从Silicon Labs网站安装Amazon Sidewalk SDK。
有关详细信息,请参阅《Amazon Sidewalk SDK Getting Started Guide》。
创建一个Amazon Sidewalk帐户。
在Amazon Sidewalk上注册Silicon Labs Pro Kit:
转至Amazon Sidewalk Developer Console并单击Manage Devices选项卡。
单击Register Device。
为设备制造商选择Silicon Labs,为设备型号选择Pro Kit。
单击Generate Registration Code。
在Silicon Labs Simplicity Studio IDE中输入注册码。
在AWS上配置Silicon Labs Pro Kit:
打开AWS IoT Core控制台。
单击Manage选项卡。
单击Things。
单击Create Thing。
为“Thing Type”选择Custom。
输入Thing名称并单击Next。
选择Connect your device directly to AWS IoT Core并单击Next。
单击Create Thing。
复制设备影子的亚马逊资源名称 (ARN)。
Amazon Sidewalk简介
Amazon Sidewalk是一种低带宽、长距离无线网络技术,使用900MHz频段的非授权频谱。亚马逊运营该网络不向终端客户收取任何费用。它被设计成一个安全的共享网络,这意味着多个设备可以共享相同的网络资源。这是通过一种被称为“信道化”的技术实现的,该技术将可用带宽划分为多个信道。每个设备都可以分配到一个特定的信道,这有助于防止设备之间的干扰。
网络上传输的所有数据都经过加密,并使用安全的握手协议对设备进行身份验证。这有助于保护网络免受未经授权的访问和数据盗窃。该技术还具有可扩展性,可支持众多设备,并可轻松扩展以覆盖新的区域。因此,对于需要低功耗、低数据速率和大面积覆盖的应用来说,它是一个不错的选择。Sidewalk支持高达100Kbps的数据传输速率和长达1英里的覆盖范围。以下是Amazon Sidewalk的其他技术细节:
调制:Amazon Sidewalk使用一种名为“啁啾扩频” (CSS) 的调制方案,这是一种设计用于抗干扰的扩频调制技术。
网络拓扑结构:Amazon Sidewalk采用网状网络拓扑结构。在网状网络中,设备之间可以直接通信,也可以与互联网通信。这使得网络可以自我修复,并允许设备扩展网络范围。Amazon Sidewalk由协议栈、应用层和标准物理层(特别是低功耗蓝牙、FSK和CSS无线技术)组成。
设备注册:设备必须在Amazon Sidewalk上注册后才能使用网络。这有助于确保只有经过授权的设备才能使用网络。
-
设备管理:Amazon Sidewalk提供一个设备管理平台,允许管理员管理连接到网络的设备, 包括查看设备状态、配置设备和更新设备固件。
代码概览
接下来,让我们在Silicon Labs的Simplicity Studio中快速看一下项目的关键文件(图7):
app_init.c,负责处理与配置开发板硬件(如网络设备和ADC)相关的功能。
app_cli.c,提供一种机制,让通过USB连接的开发计算机能与开发板进行交互。
app_process.c,包含负责处理通信和传感器交互的代码。
-
main.c,是连续运行的主循环,用于轮询水检测传感器并将数据传输到AWS IoT Core。
图7:Silicon Labs的Simplicity Studio 5是集编程器、调试器和上传器于一身的解决方案。(图源:Silicon Labs)
initADC函数启用时钟,并正确设置ADC硬件。除非另有说明,否则典型条件为ADCCLK=10MHz,OSR=2。
void initADC(void) {
// Enable ADC clock
CMU_ClockEnable(cmuClock_ADC0, true);
// Base the ADC configuration on the default setup.
ADC_Init_TypeDef init = ADC_INIT_DEFAULT;
ADC_InitSingle_TypeDef initSingle = ADC_INITSINGLE_DEFAULT;
// Modify the default ADC settings
init.timebase = ADC_TimebaseCalc(0);
init.prescale = ADC_PrescaleCalc(ADC_FREQ, 0);
ADC_Init(ADC0, &init);
// Set input to temperature sensor. Change this for your specific sensor
initSingle.acqTime = adcAcqTime16; // Acquisition time
initSingle.posSel = adcPosSelAPORT2XCH9; // Change to your ADC channel
ADC_InitSingle(ADC0, &initSingle);
}
readADC函数读取ADC引脚上的电压。
uint32_t readADC(void) {
ADC_Start(ADC0, adcStartSingle);
while (ADC0->STATUS & ADC_STATUS_SINGLEACT) {}
return ADC_DataSingleGet(ADC0);
}
要使用Simplicity Studio从Silicon Labs Pro Kit向AWS IoT Core发送消息,您需要设置设备、建立安全的MQTT连接并将消息发布到AWS IoT Core主题。如果尚未创建,请先创建一个AWS帐户。
在AWS IoT Core中注册Pro Kit并创建一个Thing。为您的设备生成并下载证书、私钥和根CA证书。
接下来,打开Simplicity Studio,为Pro Kit创建一个新项目。
确保项目中包含必要的SDK和网络及MQTT库。我们将使用安全MQTT连接向AWS IoT Core端点发布消息(安全MQTT连接将使用端口8883)。代码将执行两项功能:首先,通过网关在终端设备与AWS IoT Core之间建立MQTT连接。然后,向AWS IoT Core的特定主题发布定制消息。
#include "mqtt_client.h"
void initNetwork();
// Initialize MQTT and connect to AWS IoT
void connectToAwsIot() {
MQTTClient client;
Network network;
unsigned char sendbuf[512], readbuf[512];
NetworkInit(&network);
MQTTClientInit(&client, &network, 3000, sendbuf, sizeof(sendbuf), readbuf, sizeof(readbuf));
MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;
connectData.MQTTVersion = 4; // MQTT v3.1.1
connectData.clientID.cstring = "your_device_id"; // Set your device ID
connectData.username.cstring = "your_username_here";
connectData.password.cstring = "your_password_here";
// Use your AWS IoT endpoint
char* address = "your_aws_iot_endpoint";
int rc = NetworkConnect(&network, address, 8883);
// Error checking for rc (return code)
rc = MQTTConnect(&client, &connectData);
// Error checking for rc
}
// Publish a message to a topic
void publishMessage(MQTTClient* client, char* topic, char* payload) {
MQTTMessage message;
message.qos = QOS1;
message.retained = 0;
message.payload = payload;
message.payloadlen = strlen(payload);
int rc = MQTTPublish(client, topic, &message);
}
main函数将从一个持续运行的主循环中调用所有这些支持函数。main函数如下所示:
int main(void) {
char* topic = "/sidewalk/water/data";
initNetwork();
connectToAwsIot();
CHIP_Init();
// Initialize ADC
initADC();
while (1) {
uint32_t adcValue = readADC();
char* payload = adcValue;
publishMessage(&client, topic, payload);