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 小能手从设备侧开发、平台功能操作、应用侧开发三个部分来进行学习分享,另外还分享了一些动手实践作品,帮助读者更好地理解整个开发链路。详情可点此查看。
一图胜千言。画这张图的时间,够再写一篇文章了。
这里 LR1110 节点先采用 Semtech LR1110 EVK,官方配套的软件采用的 GCC 编译器,需要在 Linux 环境下编译。后面 TencentOS tiny 也会开放一套 EVK,支持 MDK 编译器,Window 下的 Keil 就能编译了。
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,配套一根长长的无源天线,方便测试。
basic modem 的软件已在github开源:https://github.com/lorabasics/lorabasicsmodem/tree/develop/
这个软件目前只能在 Linux 下使用 GCC ARM 编译器 进行编译。
访问上面编译器官网,找到你的编译机对应平台的安装包。
# 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
添加环境变量
# vim ~/.bashrc
增加这么一行
export PATH=$PATH:/usr/local/gcc-arm-none-eabi-10-2020-q4-major/bin/
验证:
# arm-none-eabi-gcc -v
编译器安装完毕之后,可以着手代码修改。
1.修改DevEUI/AppKey
user_app/main_examples/example_options.h
/**
* @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.修改通信频点
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 下行。
单信道模式在编译时指定:
make full HYBRID_CHINA=yes
修改文件 user_app/main_examples/main_geolocation.c
中 main_geolocation() 对应的频点及速率变量。
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,需要把这个辅助位置改成你当地的位置。经纬度信息可以使用腾讯位置服务_坐标拾取器来获取。
#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代码。
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 需要到注释里的网址去注册获取。
$ python --version
Python 3.7.3
$ python lr1110_almanac_manual_update.py
python脚本运行的结果可以保存为一个头文件,例如 user_app/main_examples/geolocation_utilities/almanac_2021_08_24.h
,伪代码如下:
#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
:
//#include "almanac_2021_04_06.h"
#include "almanac_2021_08_24.h"
5.另外一些修改,可能后续不用处理
a. linkadr
目前这版代码在 ChannelMask 的处理感觉不是很合适,NS 下发使能对应的 8 信道时会出现应答拒绝,导致 NS 持续下发 LinkADR 命令。
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
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 < 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 < const_max_tx_dr; dr++ )
{
if( SMTC_GET_BIT16( &dr_bitfield_tx_channel_ctx[i], dr ) == 1 )
{
if( ( dr >= min_mobile_dr ) && ( dr <= max_mobile_dr ) )
{
return ( OKLORAWAN );
}
}
}
}
}
SMTC_MODEM_HAL_TRACE_WARNING( "Not acceptable data rate in mobile mode\n" );
return ( status );
}
b. LBT RSSI 门限调整
另外测试时,如果设备离网关较近,可能由于超过RSSI门限导致无法发出数据包,要么临时把天线旋松一些,要么把阈值调整下。
lr1mac/src/smtc_real/src/region_cn_470_rp_1_0_defs.h
#define LBT_THRESHOLD_DBM_CN_470_RP_1_0 (int16_t)(-50) // TODO value must be checked
在 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 的模式。
编译命令:
make full HYBRID_CHINA=yes
Semtech LR1110 EVK 支持 USB 拖拽烧写,直接将编译生成后的bin文件复制到 EVK 在电脑中的 USB 存储即可,EVK 烧写固件后会自动重启。
一旦烧写完成,串口采用 115200bps 就会有打印信息。
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的屏幕,你会看到一片白屏,可以拔掉不管。
用户的 LoRaWAN 网关需支持 Packet Forwarder 协议。
LoRaWAN 网关上的配置需做如下调整:
配置接入域名:loragw.things.qcloud.com
接入端口:1700
详细的网关接入操作及腾讯云物联网开发平台的操作,可以查看文档:https://cloud.tencent.com/document/product/1081/41192
除了自建网关之外,值得一提的是还可以借助腾讯 LoRa 社区网络实现更广的网络覆盖,可以极大方便 LR1110 的测试。
尤其是在深圳,可以看到周围有腾讯开放的一些社区网关,采用 80~87 上行信道,也就是 486.3 ~ 487.7 MHz。
1.创建产品
2.物模型添加标准功能
菜单操作为:物模型 -> 添加标准功能 -> 通用类型 -> 勾选“wifi定位”、“GNSS导航电文”
“wifi定位”为扫描的AP信息,包含MAC地址和RSSI。
“GNSS导航电文”为视野卫星的导航电文。
3.新建设备
在设备调试tab中,点击“新建设备”。按照之前源码中配置的 DevEUI 和 AppKey 来创建设备。
LR1110 节点如果上电工作,且LoRaWAN网关保持上线,那么控制台中就会看到设备数据更新。
设备属性 tab 页面中可以看到数据更新:
设备日志 tab 页面中可以看到设备原始数据:
如果想要在控制台看到设备的实时位置,需要新建位置空间。菜单位于“增值服务-位置服务”。
打开位置空间,将会看到最近的实时位置。
位置空间还有更丰富的功能,可以查看历史轨迹、热力图,以及操作围栏等等。
第三方应用如果想要获得设备原始数据,可以使用数据同步功能,将数据通过HTTP或者CKafka推送到第三方服务器,菜单位于“基础服务-数据同步”。
设备列表 tab 页面可以快速查看设备的二维码,打开“腾讯连连”小程序扫码绑定设备。
交互开发 tab 页面默认是“标准面板”,展现产品 json 物模型。如果要在小程序中看到地图,需要调整为“免开发面板”。
打开腾讯连连小程序,即可看到设备的实时位置。
That's all
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。