LoRa Edge LR1110 EVK 接入腾讯云物联网开发平台

背景

LoRa Edge 是 Semtech 在 2020 年推出的面向资产管理应用的产品系列,支持 GPS 及北斗卫星扫描、无源 Wi-Fi 扫描等多重定位技术,同时集成了远距离 LoRa 收发器。其中 LR1110 是该系列的第一款芯片,主打特色是超低的定位功耗以及极具吸引力的 BOM 成本。

据介绍,LR1110 在 GNSS 定位的功耗优势主要在于将传统的卫星解算流程进行优化,芯片本地只扫描空口的卫星导航电文,将导航电文上报到云平台进行详细位置解算,从而节省了芯片本地的工作时长和运算需求。因此,LR1110 需要配套云平台进行使用。国外用户可以使用 Semtech LoRa Cloud,但中国用户在使用体验上不大理想。

目前针对中国用户,腾讯云物联网开发平台已经支持 LoRa Edge LR1110 定位功能,用户还可以利用腾讯连连小程序、IoT Enable等功能快速开发特色应用。平台正在内测中,可以联系相应的 Semtech FAE 获取内测资格。

这篇文章先总体介绍 LoRa Edge 接入腾讯云物联网开发平台的系统架构,接着分别介绍各组件的具体开发细节,包含节点、网关、物联网平台及腾讯连连小程序的操作,让读者能熟悉整个开发链条。

腾讯云 IoT Explorer 是腾讯云主推的一站式物联网开发平台,IoT 小能手从设备侧开发、平台功能操作、应用侧开发三个部分来进行学习分享,另外还分享了一些动手实践作品,帮助读者更好地理解整个开发链路。详情可点此查看。

1 系统架构

一图胜千言。画这张图的时间,够再写一篇文章了。

2 LR1110 节点操作

这里 LR1110 节点先采用 Semtech LR1110 EVK,官方配套的软件采用的 GCC 编译器,需要在 Linux 环境下编译。后面 TencentOS tiny 也会开放一套 EVK,支持 MDK 编译器,Window 下的 Keil 就能编译了。

2.1 节点硬件准备

Semtech LR1110 EVK, 采用 STM32L476RG Nucleo 底板 + LR1110 shield 的形式,两个 shield 分别支持不同的天线:

• PCB_E592V01B does not have a LNA and connects to the long antenna

• PCB_E516V02B includes one LNA and can only use the short antenna.

我们采用 PCB_E592V01B,配套一根长长的无源天线,方便测试。

2.2 节点软件操作

basic modem 的软件已在github开源:https://github.com/lorabasics/lorabasicsmodem/tree/develop/

2.2.1 编译器安装

这个软件目前只能在 Linux 下使用 GCC ARM 编译器 进行编译。

访问上面编译器官网,找到你的编译机对应平台的安装包。

代码语言:txt
复制
# wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
# tar -jxvf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2 -C /usr/local

添加环境变量

代码语言:txt
复制
# vim ~/.bashrc

增加这么一行

代码语言:txt
复制
export PATH=$PATH:/usr/local/gcc-arm-none-eabi-10-2020-q4-major/bin/        

验证:

代码语言:txt
复制
# arm-none-eabi-gcc -v
2.2.2 代码修改

编译器安装完毕之后,可以着手代码修改。

1.修改DevEUI/AppKey

user_app/main_examples/example_options.h

代码语言:txt
复制
/**
 * @brief LoRaWAN User credentials
 * 
 */
#define USER_LORAWAN_DEVICE_EUI     { 0x20, 0x21, 0x08, 0x24, 0x20, 0x21, 0x08, 0x24 }
#define USER_LORAWAN_JOIN_EUI       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
#define USER_LORAWAN_APP_KEY        { 0x20, 0x21, 0x08, 0x24, 0x20, 0x21, 0x08, 0x24, \
                                      0x20, 0x21, 0x08, 0x24, 0x20, 0x21, 0x08, 0x24 }

2.修改通信频点

代码语言:txt
复制
The version 2.x of LoRa Basic Modem supports two kinds of frequency plan for CN470:
• CN470 RP_1B, supports 96 uplink and 48 downlink;
• Mono channel mode, supports only one channel. It is in fact a subset of CN470 RP_1B. This mode
can be used for the single channel demo gateway released together for demonstration purpose.

默认bin使用 CN470 RP_1B,使用了整个 96 上行和48下行信道。我们为了测试方便,调整为 单信道模式,使用 486.3 上行,506.7 下行。

单信道模式在编译时指定:

代码语言:txt
复制
make full HYBRID_CHINA=yes

修改文件 user_app/main_examples/main_geolocation.c 中 main_geolocation() 对应的频点及速率变量。

代码语言:txt
复制
void main_geolocation( void )
{
    ...
#if defined( HYBRID_CN470_MONO_CHANNEL )
    freq_tx_cn470_mono_channel_mhz = 486300000;
    for( uint8_t i = 0; i < 16; i++ )
    {
        custom_datarate[i] = 0x05;  // Force use of SF7
    }
    SMTC_MODEM_HAL_TRACE_INFO( "HYBRID China version will transmit at %d Hz\n", freq_tx_cn470_mono_channel_mhz );
#endif
    ...
}

3.修改辅助定位的经纬度

user_app/main_examples/example_options.h

如果使用辅助定位功能,辅助位置的经纬度不能和真实距离超过200KM,需要把这个辅助位置改成你当地的位置。经纬度信息可以使用腾讯位置服务_坐标拾取器来获取。

代码语言:txt
复制
#if defined( CHINA_RP_1_DEMO )
#define MODEM_EXAMPLE_ASSISTANCE_POSITION_LAT  (31.185)
#define MODEM_EXAMPLE_ASSISTANCE_POSITION_LONG  (121.4238)
#define MODEM_EXAMPLE_ASSISTANCE_POSITION_TEXT  "Shanghai, CHINA"
#else
#define MODEM_EXAMPLE_ASSISTANCE_POSITION_LAT  (45.181454)
#define MODEM_EXAMPLE_ASSISTANCE_POSITION_LONG  (5.720893)
#define MODEM_EXAMPLE_ASSISTANCE_POSITION_TEXT  "Grenoble, FRANCE"
#endif

4.手动更新卫星历书

历书更新是 GNSS 扫描正常工作所必需的,因此通常需要在LR1110固件升级后至少更新一次。好消息是 Demo 中 Tracker 已经实现了手动历书更新和 OTA 历书更新。如果历书超过3个月,OTA历书将自动更新。

用户也可以在代码中更新历书,采用python脚本,代码位于 main_examples/geolocation_utilities/gnss.h,有一段被注释掉的python代码。

代码语言:txt
复制
import base64
import requests

YOUR_TOKEN = 'Type your token, available at https://www.loracloud.com/portal/geolocation/token_management'

url = 'https://gls.loracloud.com/api/v3/almanac/full'
my_header = {'Ocp-Apim-Subscription-Key': YOUR_TOKEN}
res = requests.get(url, headers=my_header)
raw_bytes = bytes(base64.b64decode(res.json()["result"]["almanac_image"]))
my_almanac_in_hex = "static const lr1110_gnss_almanac_full_update_bytestream_t full_almanac = { "
my_almanac_in_hex += ", ".join("0x{:02X}".format(byt) for byt in raw_bytes)
my_almanac_in_hex += " };"
print(my_almanac_in_hex)

将这段代码保存成 lr1110_almanac_manual_update.py 文件,替换其中的 token 即可。token 需要到注释里的网址去注册获取。

代码语言:txt
复制
$ python --version
Python 3.7.3

$ python lr1110_almanac_manual_update.py

python脚本运行的结果可以保存为一个头文件,例如 user_app/main_examples/geolocation_utilities/almanac_2021_08_24.h,伪代码如下:

代码语言:txt
复制
#include "lr1110_gnss.h"

// Almanac loaded from loracloud at 2021-08-24 with python script
static const lr1110_gnss_almanac_full_update_bytestream_t full_almanac = { 0x80, 0x64, 0x03,
....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 };

配套修改下文件包含关系,user_app/main_examples/geolocation_utilities/gnss.h

代码语言:txt
复制
//#include "almanac_2021_04_06.h"
#include "almanac_2021_08_24.h"

5.另外一些修改,可能后续不用处理

a. linkadr

目前这版代码在 ChannelMask 的处理感觉不是很合适,NS 下发使能对应的 8 信道时会出现应答拒绝,导致 NS 持续下发 LinkADR 命令。

代码语言:txt
复制
0 - Cmd link_adr_parser = 51 ff 00 51
0 - MULTIPLE LINK ADR REQ , channel mask = 0xff , ChMAstCntl = 0x5
ChCtrl = 0x5, ChMask = 0x00ff
unwrapped channel tx mask = 0xff ff ff ff ff ff ff ff ff ff ff 00
[0;33mWARN : Not acceptable data rate in mobile mode
[0;33mWARN : INVALID CHANNEL MASK in Mobile Mode

修改文件:lr1mac/src/smtc_real/src/smtc_real.c

代码语言:txt
复制
status_lorawan_t smtc_real_is_channel_mask_for_mobile_mode( const lr1_stack_mac_t* lr1_mac )
{
...

return ( OKLORAWAN ); // return early for work around
	
for( int i = 0; i &lt; const_number_of_tx_channel; i++ )
{
    if( SMTC_GET_BIT8( unwrapped_channel_mask_ctx, i ) == CHANNEL_ENABLED )
    {
        for( uint8_t dr = const_min_tx_dr; dr &lt; const_max_tx_dr; dr++ )
        {
            if( SMTC_GET_BIT16( &amp;dr_bitfield_tx_channel_ctx[i], dr ) == 1 )
            {
                if( ( dr &gt;= min_mobile_dr ) &amp;&amp; ( dr &lt;= max_mobile_dr ) )
                {
                    return ( OKLORAWAN );
                }
            }
        }
    }
}
SMTC_MODEM_HAL_TRACE_WARNING( &#34;Not acceptable data rate in mobile mode\n&#34; );
return ( status );

}

b. LBT RSSI 门限调整

另外测试时,如果设备离网关较近,可能由于超过RSSI门限导致无法发出数据包,要么临时把天线旋松一些,要么把阈值调整下。

lr1mac/src/smtc_real/src/region_cn_470_rp_1_0_defs.h

代码语言:txt
复制
#define LBT_THRESHOLD_DBM_CN_470_RP_1_0            (int16_t)(-50)  // TODO value must be checked
2.2.3 将 LR1110 烧写为纯 transceiver

在 BasicModem 用例中,LR1110 为 transceiver,需要烧写 transceiver 版本固件,目前最新的版本为 “lr1110_updater_tool_v1.2.0_trx_0x0305.bin”。如果版本太老,或者 LR1110 使用了 modem-E 固件那就无法使用。

LR1110 EVK 可以通过烧写固件变成升级工具,给其连接的 LR1110 芯片烧写固件。这边有预编译好的基于 LR1110_EVK 的固件,我们要给 LR1110 切换模式,只要给 EVK 烧写相应的固件即可完成模式切换。

如果使用的 LR1110 为市场购买的模块,那估计得按照 EVK 的连接,将 LR1110 模块连接到 EVK Nucleo 底板上,通过 EVK 的 MCU 来切换 LR1110 的模式。

2.2.4 编译烧写运行

编译命令:

代码语言:txt
复制
make full HYBRID_CHINA=yes

Semtech LR1110 EVK 支持 USB 拖拽烧写,直接将编译生成后的bin文件复制到 EVK 在电脑中的 USB 存储即可,EVK 烧写固件后会自动重启。

一旦烧写完成,串口采用 115200bps 就会有打印信息。

代码语言:txt
复制
 DevNonce = 446
NbOfReset = 188
Region = CN470_RP_1_0
rp_hook_init done
smtc_real_config done
TX - idx:0, freq: 470300000, dr: 0x3f,
TX - idx:1, freq: 470500000, dr: 0x3f,
TX - idx:2, freq: 470700000, dr: 0x3f,
TX - idx:3, freq: 470900000, dr: 0x3f,

这个示例是用不到EVK的屏幕,你会看到一片白屏,可以拔掉不管。

3 LoRaWAN 网关接入

用户的 LoRaWAN 网关需支持 Packet Forwarder 协议。

LoRaWAN 网关上的配置需做如下调整:

代码语言:txt
复制
配置接入域名:loragw.things.qcloud.com
接入端口:1700

详细的网关接入操作及腾讯云物联网开发平台的操作,可以查看文档:https://cloud.tencent.com/document/product/1081/41192

3.1 腾讯LoRa社区网络

除了自建网关之外,值得一提的是还可以借助腾讯 LoRa 社区网络实现更广的网络覆盖,可以极大方便 LR1110 的测试。

尤其是在深圳,可以看到周围有腾讯开放的一些社区网关,采用 80~87 上行信道,也就是 486.3 ~ 487.7 MHz。

4 腾讯云 IoT Explorer 控制台操作

4.1 创建产品及设备

1.创建产品

  • 产品品类:智慧生活-安防报警-定位器。// 别的产品品类或者不选也都可以,这个产品品类的好处是在腾讯连连中有一个地图免开发面板,方便查看位置。
  • 设备类型:设备
  • 认证方式:密钥认证
  • 通信方式:LoRaWAN

2.物模型添加标准功能

菜单操作为:物模型 -> 添加标准功能 -> 通用类型 -> 勾选“wifi定位”、“GNSS导航电文”

“wifi定位”为扫描的AP信息,包含MAC地址和RSSI。

“GNSS导航电文”为视野卫星的导航电文。

3.新建设备

在设备调试tab中,点击“新建设备”。按照之前源码中配置的 DevEUI 和 AppKey 来创建设备。

4.2 查看设备日志

LR1110 节点如果上电工作,且LoRaWAN网关保持上线,那么控制台中就会看到设备数据更新。

设备属性 tab 页面中可以看到数据更新:

设备日志 tab 页面中可以看到设备原始数据:

4.3 位置空间操作

如果想要在控制台看到设备的实时位置,需要新建位置空间。菜单位于“增值服务-位置服务”。

打开位置空间,将会看到最近的实时位置。

位置空间还有更丰富的功能,可以查看历史轨迹、热力图,以及操作围栏等等。

4.4 第三方应用

第三方应用如果想要获得设备原始数据,可以使用数据同步功能,将数据通过HTTP或者CKafka推送到第三方服务器,菜单位于“基础服务-数据同步”。

5 使用腾讯连连小程序

5.1 扫码绑定设备

设备列表 tab 页面可以快速查看设备的二维码,打开“腾讯连连”小程序扫码绑定设备。

5.2 打开面板

交互开发 tab 页面默认是“标准面板”,展现产品 json 物模型。如果要在小程序中看到地图,需要调整为“免开发面板”。

5.3 小程序界面

打开腾讯连连小程序,即可看到设备的实时位置。

END

That's all