IoT Pi Pro LoRaWAN 设备开发
本章将介绍如何使用 MS-RTOS 的 LoRaWAN 组件在 IoT Pi Pro 上开发一个能接入到 EdgerOS 的 LoRa 温度监测设备。它通过 LoRaWAN 协议将数据传输到 EdgerOS,用户可以使用该设备远程监测温度。
硬件准备
SX1278 模块
SX1278 是 Semtech 公司在 2013 年推出的一款远距离、低功耗、高性能的物联网无线收发器,具备特殊的 LoRa 调制方式,在一定程度上增加了通信距离。
本实验使用的是翼辉信息的 IoT Pi Pro 开发板和安信可科技 AI-Thinker 的 SX1278 模块(型号为 Ra-02):
连接 SX1278 模块到 IoT Pi Pro
使用杜邦线将 SX1278 模块的引脚与 IoT Pi Pro 对应的引脚连接,SX1278 模块的引脚与 IoT Pi Pro 引脚的对应关系如下表所示:
SX1278 模块引脚 | IoT Pi Pro 引脚 | 功能 |
---|---|---|
3.3v | 3v3 | 3.3V供电 |
RST | PA2 | 复位 |
DIO0 | PE8 | 数字 IO0 |
DIO1 | PE4 | 数字 IO1 |
DIO2 | PB12 | 数字 IO2 |
DIO3 | PA12 | 数字 IO3 |
DIO4 | PD4 | 数字 IO4 |
NSS | PA5 | SPI 片选输入 |
MOSI | PC3 | SPI 数据输入 |
MISO | PC2 | SPI 数据输出 |
SCK | PB13 | SPI 时钟输入 |
GND | GND | 接地 |
需要在 SX1278 模块的 I-PEX 接口接入弹簧天线,实物连接如下图所示:
软件准备
IoT Pi Pro 开发环境搭建
参考《IoT Pi Pro 快速入门》,完成以下步骤:
完成 MS-RTOS 开发工具下载和安装
在 MS-RTOS 云开发平台上完成
msrtos_base_sdk
配置和下载,配置 MS-RTOS 时,需要手动勾选 libmsdriver、esp_at_net、fatfs、littlevgl、st_touchgfx、cjson、mbedtls、libsddc 这几个组件,如下图所示:在 IoT studio 上完成
msrtos_base_sdk
工程导入和编译在 IoT studio 上完成
bspstm32h7xx
工程的下载、导入和编译在 IoT studio 上完成
bootstm32h7xx
工程的下载、导入和编译,如下图所示:
开发应用
获取 LoRaWAN 组件
进入 msrtos_base_sdk
根目录,使用 git 工具从 MS-RTOS github 社区 下载 LoRaWAN 组件,命令如下:
git clone https://github.com/ms-rtos/lorawan.git
下载完成后右键 msrtos_base_sdk
工程选择 Refresh
菜单项刷新工程,刷新完成后将出现 lorawan 组件,如下图所示:
在 msrtos_base_sdk
根目录下的 Makefile
中添加 lorawan
,如下图所示:
配置入网参数
msrtos_base_sdk\lorawan\src\ms_lora_config.h
文件为 lorawan 组件的配置头文件,相关配置如下所示:
#define ACTIVE_REGION LORAMAC_REGION_CN470
#define LORA_CFG_DEV_EUI {0x47, 0x36, 0x54, 0x9f, 0x00, 0x31, 0x00, 0x05}
#define LORA_CFG_JOIN_EUI {0x52, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x48, 0x46}
#define LORA_CFG_APP_KEY {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,\
0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c}
#define LORA_CFG_SE_PIN {0xFF, 0x00, 0x00, 0xE5}
#define LORA_CFG_CHAN_MASK {MS_BIT(0), 0, 0, 0, 0, 0}
通过修改配置宏的值来修改相应的入网和工作参数,配置宏的解析如下表所示:
配置宏 | 描述 |
---|---|
ACTIVE_REGION | 有效区域,中国区使用 CN470 频段,故定义为 LORAMAC_REGION_CN470 |
LORA_CFG_DEV_EUI | 设备的 DevEUI,由长度为 8 的 uint8_t 型数组构成 |
LORA_CFG_JOIN_EUI | 设备的 JoinEUI,由长度为 8 的 uint8_t 型数组构成 |
LORA_CFG_APP_KEY | 设备的 AppKey,由长度为 16 的 uint8_t 型数组构成 |
LORA_CFG_CHAN_MASK | 信道掩码,由长度为 6 的 uint16_t 型数组构成 96 位的位图,第 0 位为 1,即使用 0 号信道 |
除了使用配置宏 ACTIVE_REGION
配置区域外,还需要分别在 msrtos_base_sdk\lorawan\iblorawan.mk
和 msrtos_base_sdk\lorawan\classa_test.mk
文件中添加预定义宏 REGION_CN470
,如下图所示:
配置端口号
在 msrtos_base_sdk\lorawan\src\classa_test.c
文件中修改宏 LORAWAN_APP_PORT
的值来设置应用端口号,参考程序如下:
/*!
* LoRaWAN application port
*/
#define LORAWAN_APP_PORT 2
配置消息类型
上报消息时,如果需要接收者应答就把 msrtos_base_sdk\lorawan\src\classa_test.c
文件中的宏 LORAWAN_CONFIRMED_MSG_ON
设置为 true
, 如果不需要接收者应答则把 LORAWAN_CONFIRMED_MSG_ON
设置为 false
。设置为无需应答消息的参考程序如下:
/*!
* LoRaWAN confirmed messages
*/
#define LORAWAN_CONFIRMED_MSG_ON false
LoRaWAN 的消息类型及描述如下表所示:
消息类型 | 描述 |
---|---|
Unconfirmed-data message | 接收者无需应答的消息 |
Confirmed-data message | 接收者需要应答的消息 |
Multicast message | 多播消息 |
Proprietary messages | 专用消息 |
上传温度值
在 msrtos_base_sdk\lorawan\src\classa_test.c
文件中定义变量 temperatureValue
,用于保存温度传感器的值,代码如下:
/*!
* temperature value
*/
static float temperatureValue = 25.52;
在 msrtos_base_sdk\lorawan\src\classa_test.c
文件的函数 PrepareTxFrame
中,填充需要发送数据内容和数据长度,将要上传的温度值 temperatureValue
填充到应用数据缓冲区 AppDataBuffer
中,数据长度设置到应用数据大小变量 AppDataSize
中,参考代码如下所示:
/*!
* \brief Prepares the payload of the frame
*/
static void PrepareTxFrame( uint8_t port )
{
switch( port )
{
case 2:
{
/*
* 把温度值填充到应用数据缓冲区
*/
AppDataSizeBackup = AppDataSize = sizeof(temperatureValue);
memcpy1(AppDataBuffer, (uint8_t *)&temperatureValue, AppDataSize);
}
break;
case 224:
if( ComplianceTest.LinkCheck == true )
{
ComplianceTest.LinkCheck = false;
AppDataSize = 3;
AppDataBuffer[0] = 5;
AppDataBuffer[1] = ComplianceTest.DemodMargin;
AppDataBuffer[2] = ComplianceTest.NbGateways;
ComplianceTest.State = 1;
}
else
{
switch( ComplianceTest.State )
{
case 4:
ComplianceTest.State = 1;
break;
case 1:
AppDataSize = 2;
AppDataBuffer[0] = ComplianceTest.DownLinkCounter >> 8;
AppDataBuffer[1] = ComplianceTest.DownLinkCounter;
break;
}
}
break;
default:
break;
}
}
配置消息上传周期
在 msrtos_base_sdk\lorawan\src\classa_test.c
文件中修改宏 APP_TX_DUTYCYCLE
的值来设置消息的上传周期,参考代码如下:
/*!
* Defines the application data transmission duty cycle. 5s, value in [ms].
*/
#define APP_TX_DUTYCYCLE 5000
编译 LoRaWAN 组件
选中 msrtos_base_sdk
工程,点击编译按钮,将编译 msrtos_base_sdk
工程的组件,编译完成后,会在 lorawan/Debug
目录生成 classa_test.bin
文件,该文件就是 LoRaWAN CLASSA 模式的应用程序镜像,如下图所示:
烧写镜像
使用 MS-RTOS AutoTester 烧写镜像,请参考《IoT Pi Pro 快速入门》完成 bootstm32h7xx.bin
和 bspiotpipro.bin
及 classa_test.bin
镜像烧写,注意不同的镜像需要烧写到不同的地址,如下表所示:
镜像 | 烧写地址 |
---|---|
bootstm32h7xx.bin | 0x08000000 |
bspiotpipro.bin | 0x90000000 |
classa_test.bin | 0x90100000 |
验证功能
验证前,先在手机的爱智 App 上开启 EdgerOS 的 LoRa 服务,参考《LoRaWAN 协议介绍》完成以下步骤:
完成 EdgerOS LoRa 服务配置,通道 1 的信道需要与程序中的
LORA_CFG_CHAN_MASK
一致(如 0 号信道),如下图所示:完成 LoRaWAN 设备二维码生成,需要使用程序中指定的入网参数生成的二维码,如下图所示:
完成 LoRaWAN 设备添加,添加成功后如下图所示:
完成以上 3 个步骤后点击 MS-RTOS Auto Tester GO
按钮或对 IoT Pi Pro 进行复位,IoT Pi Pro 的 CPU 将开始运行,MS-RTOS 启动后,会自动运行 FLASH 0x90100000
地址处的 classa_test
应用程序,IoT Pi Pro 入网成功后会打印:JOINED
字样,同时会显示激活类型、设备地址和数据速率,如下图所示:
该程序中实现的功能及其相关描述如下表所示:
功能 | 端口 | 消息类型 | 消息数据 | 数据类型 | 消息周期 |
---|---|---|---|---|---|
温度监测 | 2 | Unconfirmed-data message | 温度值 | 浮点型 | 5s |