|
从基于Trusted Objects-AvnetTO136 SE的安全LoRaWAN节点到AWS IoT,使用STM32 Nucleo板,Kerlink网关和Actility服务器。
在这个项目中使用的东西
介绍 可信对象提供LoRaWAN安全堆栈。该堆栈可以轻松集成到任何LoRaWAN项目中。 该项目展示了如何使用受信任对象-Anetnet TO136安全元素,Kerlink网关,Actility服务器和AWS IoT后端来保护LoRaWAN节点。
注意:屏幕截图值是示例 网关设置 KerlinkiFemtoCell网关安装和配置记录在Kerlink Wiki上。 网关需要通过DHCP服务器连接到IP网络。 按照本指南设置网关。 网关配置 登录ActilityThingPark通过点击登录在标题栏。 在仪表板上,单击左列中的“ 网络管理器 ”以配置网关。 单击左列中的基站。单击“ 添加基站”部分中的“ 创建”按钮以执行此操作。 使用为“灵活性”预先配置的网关信息填写表单。如果未预先配置网关,请按照以下步骤进行配置: · 连接到您的Actility ThingPark 帐户 · 打开FAQ · 选择您的网关标签 · 打开部分如果没有为partners.thingpark.com预先配置GW,该怎么办? · 按照网关的步骤进行操作 该过程应该为您提供表单信息。(LRR ID是网关MAC地址的最后4个字节)。 单击顶部的“ 创建” 按钮以创建网关。
服务器配置 在仪表板上,单击左列中的“ 设备管理器 ”以配置应用程序和设备。
点击设备在左栏注册你的设备。在“ 添加设备”部分中,单击“ 创建”按钮以创建新设备。使用设备信息填充所有字段(使用可信对象-Anetnet TO136 SE中配置的DevEUI)。 在“ 网络参数”部分中选择连接计划(使用DEV Connectivity供应商进行测试)。在Applicationlayer handling部分中选择应用服务器路由配置文件。 单击顶部的“ 创建”按钮以创建设备。
后端配置 AWS IoT是物联网设备的后端,与所有其他AWS服务连接。 按照ActilityThingPark DX AWS配置指南配置AWS以允许来自Actility ThingParkDX API的连接。您可以忽略最后一部分,因为我们将使用WebSocket将Actility ThinkPark DX安全地连接到AWS IoT。 使用您的凭据连接到ActilityThingPark DX 。连接后,将生成令牌。选择DXDataflow API的Swagger-UI链接。
打开POST /bridgeDataflows部分,并使用followingdata注册桥数据流(用AWS中的数据替换值): { "id": "<unique id of your choice>", "name": "Dataflow for AWS IoT", "bidirectional": true, "binder": { "classRef": "LRC_HTTP", "properties": { "deviceEUIList": "<comma separated device EUIs>" } }, "driver": { "classRef": "ASCII" }, "connectors": [ { "classRef": "AWSIoT", "properties": { "accountPrefix": "<account prefix>", "region": "<region>", "protocol": "WSS", "deviceType": "<device type>", "accessKeyId": "<access key ID>", "secretAccessKey": "<secret access key>" } } }
服务器必须返回代码201(成功)。注意ref值作为响应,它将用于引用您的数据流。 打开GET /bridgeDataflows / {bridgeDataflowRef}部分,在bridgeDataflowRef字段中填写你的ref,然后选择Try it out!获取数据流状态。
您需要等待状态为READY。它将在几个小时内通过Actility进行更新。现在我们需要将上行链路消息路由到ThingPark DX。在Actility ThingPark DX中,选择DX Core API的Swagger-UI链接。 打开GET /设备部分,填写您的devEUI在deviceEUI领域,并选择试试吧!获取您的设备信息。
注意ref值作为响应,它将用于引用您的设备。
打开PUT / devices / {deviceRef}部分,填写你的ref in deviceRef字段,设备字段中的以下JSON ,然后选择Try it out!更新您的设备信息。 { "processingStrategyId": "DATAFLOW" }
您的设备现已配置为将其上行链路消息发送到AWS IoT。 IDE设置 我们需要为我们的STM32平台交叉编译源代码。下载并安装Eclipse的C / C ++版本。在OpenSTM32网站上创建一个帐户。按照本指南从Eclipse安装System Workbench for STM32。 设备设置 由于服务器现已完全配置,我们最终需要设置设备。
下载档案并解压缩。源代码已包含Eclipse(和其他IDE)项目文件。打开Eclipse,然后选择File,Import ...,打开General选项卡并选择Existing Projects into Workspace。
在Select root directory中,选择Browse,然后导航到Projects / Multi / Applications /LoRa / End_Node / SW4STM32 / STM32L073RZ-Nucleo / sx1272mb2das /。
选择“ 完成”以完成项目的导入。将带有SX1272护罩的ST L073RZ通过USB端口插入计算机。
应该出现一个新的串行设备(Linux上的/ dev / ttyACM0)。打开串行控制台以查看输出日志: sudo picocom -b115200 --imap lfcrlf,crcrlf --omap delbs,crlf /dev/ttyACM0 选择“运行”,“运行”以编译源并运行项目。 该程序应该正常启动。加入过程可能不会成功,因为AppEUI,DevEUI和AppKey是STM32CubeExpansion默认值。我们现在可以忽略,因为我们将使用安全元素配置。
安全的设备 一切正常,但安全级别较低。 我们需要通过集成Trusted Objects-Avnet TO136 SE来保护设备。 将受信任对象的库(libTO)添加到新项目Drivers / BSP /TO136文件夹中。必须在之前的项目中创建此文件夹。 不得导入受信任对象库示例和包装器(stm32_hal.c除外)。 必须添加文件夹驱动程序/ BSP / TO136 / libTO / src和Drivers / BSP / TO136 / libTO /include以包含项目的路径以允许包含新标题: 选择Project,Properties并打开C / C ++ General选项卡。单击路径和符号,包含选项卡和GNU C语言。按添加...,工作区...,然后浏览项目文件以选择要添加的文件夹。 首先,我们需要在堆栈初始化期间初始化Trusted Objects库。为此,请使用以下命令应用补丁libto-init.patch: cd <project root directory>patch -p1 < <patch directory>/libto-init.patch然后我们需要修改加密层。STM32CubeExpansion LRWAN源已经提供了默认软件LoRa MAC加密层实现。它位于STM32CubeExpansion源树的Middlewares / Third_Party / Lora /Mac目录中。 我们将使用Trusted Objects-Avnet TO136 SE加密层实现而不是此默认实现。将提供的文件(LoRaMacCrypto_TO.c/ h)导入Middlewares /Third_Party / Lora / Mac目录。 LoRaMacCrypto_TO.c 文件实现了LoRaMacCrypto_TO.h中描述的新API 。 必须添加文件夹中间件/ Third_Party /Lora / Mac以包含项目的路径以允许包含新标头。使用与以前相同的步骤。 当我们更改加密API时,我们需要通过更改对旧API的所有调用来调整代码。 为此,请使用以下命令应用补丁new-cryptography-layer.patch: cd <project root directory>patch -p1 < <patch directory>/new-cryptography-layer.patch需要在构建过程中添加以下预处理器定义: · TO_SE:使用可信对象-Avnet TO136 SE LoRa MAC加密层而不是软件实现(请参阅可信对象LoRa MAC加密层) · TO_ENABLE_LORA:启用libTO LoRa API · TO_ENABLE_LORA_OPTIMIZED:启用libTO LoRa优化API 选择Project,Properties并打开C / C ++ General选项卡。单击路径和符号,符号选项卡和GNU C语言。按添加...,然后输入符号名称和值(可选)。 单击确定,然后单击应用并关闭以进行验证。 将可信对象屏蔽插入电路板和SX1272屏蔽层之间。
选择“运行”,“运行”以编译已修改的源并运行该项目。 该程序应该正常启动。现在,加入过程将成功,因为AppEUI,DevEUI和AppKey是受信任对象-Anetnet TO136 SE配置值。 数据定制 默认情况下,STM32CubeExpansion端节点在LoRa端口2上发送包含一些传感器值的有效负载。 您可以通过编辑文件Projects / Multi / Applications /LoRa / End_Node / src / main.c的发送功能来更改此设置。 在本演示中,我们将保留默认值。 AWS中的数据 该项目的最初目的是在AWS IoT中获取LoRaWAN设备数据。可以使用AWS IoT MQTT客户端查看设备数据。您需要订阅主题才能查看数据(使用#topic查看所有内容)。主题可以是特定于应用程序服务器,也可以是AWS特定的(此处列出)
任何连接到AWS的MQTT客户端都可以订阅设备主题并处理数据。 代码如下: Fromef0ac1a61090cabf26197dfd676ef99d42402555 Mon Sep 17 00:00:00 2001 From: Ugo RENNER <u.renner@trusted-objects.com> Date: Tue, 14 Nov 2017 14:04:57 +0100 Subject: [PATCH 1/2] libTO initialization --- Middlewares/Third_Party/Lora/Core/lora.c | 18 ++++++++++++++ .../Multi/Applications/LoRa/End_Node/src/main.c | 28 ++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --gita/Middlewares/Third_Party/Lora/Core/lora.cb/Middlewares/Third_Party/Lora/Core/lora.c index 78a0a34..53b52aa 100644 ---a/Middlewares/Third_Party/Lora/Core/lora.c +++ b/Middlewares/Third_Party/Lora/Core/lora.c @@ -51,6 +51,11 @@ #include "lora.h" #include"lora-test.h" +#ifdef TO_SE +#include "TO.h" +#include "TO_defs.h" +#endif + /*! *Join requests trials duty cycle. */ @@ -266,12 +271,23 @@ void LORA_Init (LoRaMainCallback_t *callbacks,LoRaParam_t* LoRaParam ) LoRaMainCallbacks->BoardGetUniqueId( DevEui ); #endif +#ifdef TO_SE + if(TO_lora_get_app_eui(AppEui) != TORSP_SUCCESS) { + PRINTF("TO_lora_get_app_eui failed\n"); + } + if (TO_lora_get_dev_eui(DevEui)!= TORSP_SUCCESS) { + PRINTF("TO_lora_get_app_eui failed\n"); + } +#endif + #if( OVER_THE_AIR_ACTIVATION != 0 ) PRINTF("OTAA\n\r"); PRINTF("DevEui= %02X", DevEui[0]) ;for(int i=1; i<8 ; i++) {PRINTF("-%02X", DevEui); }; PRINTF("\n\r"); PRINTF("AppEui= %02X", AppEui[0]) ;for(int i=1; i<8 ; i++) {PRINTF("-%02X", AppEui); }; PRINTF("\n\r"); +#ifndef TO_SE PRINTF("AppKey= %02X", AppKey[0]) ;for(int i=1; i<16; i++) {PRINTF("%02X", AppKey); }; PRINTF("\n\n\r"); +#endif #else #if (STATIC_DEVICE_ADDRESS != 1) @@ -283,9 +299,11 @@ void LORA_Init (LoRaMainCallback_t *callbacks,LoRaParam_t* LoRaParam ) PRINTF("ABP\n\r"); PRINTF("DevEui= %02X", DevEui[0]) ;for(int i=1; i<8 ; i++) {PRINTF("-%02X", DevEui); }; PRINTF("\n\r"); PRINTF("DevAdd= %08X\n\r", DevAddr) ; +#ifndef TO_SE PRINTF("NwkSKey= %02X", NwkSKey[0]) ;for(int i=1; i<16 ; i++) {PRINTF("%02X", NwkSKey); }; PRINTF("\n\r"); PRINTF("AppSKey= %02X", AppSKey[0]) ;for(int i=1; i<16 ; i++) {PRINTF("%02X", AppSKey); }; PRINTF("\n\r"); #endif +#endif LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm; LoRaMacPrimitives.MacMcpsIndication = McpsIndication; LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm; diff --git a/Projects/Multi/Applications/LoRa/End_Node/src/main.cb/Projects/Multi/Applications/LoRa/End_Node/src/main.c index 64db291..9598c9b 100644 ---a/Projects/Multi/Applications/LoRa/End_Node/src/main.c +++b/Projects/Multi/Applications/LoRa/End_Node/src/main.c @@ -53,6 +53,10 @@ #include "vcom.h" #include "version.h" +#ifdef TO_SE +#include <TO.h> +#endif + /* Private typedef-----------------------------------------------------------*/ /* Private define------------------------------------------------------------*/ @@ -184,6 +188,26 @@ int main( void ) /* Configure the hardware*/ HW_Init( ); +#ifdef TO_SE + int ret, i; + uint8_t sn[TO_SN_SIZE]; + ret = TO_init(); + if (ret == TO_OK) { + PRINTF("TO initialized\n"); + ret = TO_get_serial_number(sn); + if (ret ==TORSP_SUCCESS) { + PRINTF("TO serial number : "); + for (i = 0; i <TO_SN_SIZE; i++) + PRINTF("%02X ", sn); + PRINTF("\n"); + } else { + PRINTF("Error: unable to get TO serial number\n"); + } + } else { + PRINTF("Error: unable to initialize TO\n"); + } +#endif + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ @@ -214,6 +238,10 @@ int main( void ) /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ } + +#ifdef TO_SE + TO_fini(); +#endif } static void LORA_HasJoined(void ) -- 2.11.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
微信公众号
手机版