【LoRaWAN活动】HT-M00L网关+STM32WL node评估板

2021-05-17 11:12:12 浏览数 (1)

腾讯云IoT继上次的点亮LoRaWAN节点后的又一大好玩的活动

看着7.9的单价,为了牛年的鹅,果断下单一个LoRaWAN网关

主要是为了弥补一下上次买了node,但成都却不像深圳遍地腾讯网关的痛

1 配置小网关联网

首先拿出这个小网关,进行配网工作

1、 保持"USR"键处于按下状态,单次按下"RST"并松开,待RGB灯变成黄绿色后,松开"USR"键。用手机搜索一个名为"M00L_XXXX"的WiFi,密码heltec.org。

2、 浏览器进入192.168.4.1配置网关,大部分内容保持默认即可,给他找一个能够使用的WiFi

3、 点击提交即可

【参数解析】

WiFi名称 -- HT-M00L网关将接入的WiFi名称,配置提交后,将通过此WiFi连接腾讯云;

WiFi密码 -- HT-M00L网关将接入的WiFi密码;

信道频率Hz -- 该网关LoRa将要监听的频率,该频率必须与服务器、节点发射频率相对应;(默认是CN470的频率)

最小扩频因子(MIN SF:7~12) -- LoRa通信的最小扩频因子;

最大扩频因子(MAX SF:MIN SF ~12) -- LoRa通信的最大扩频因子,该值必须大于等于“最小扩频因子”;

网关ID -- 网关的唯一序列号,根据硬件Mac地址自动产生,已绑定;(很重要要考的!)

服务器地址 -- 已绑定腾讯云;

端口号 -- HT-M00L网关与LoRa服务器通信的端口,一般默认1700;

时区 -- 网关所在位置的时区。

2 在腾讯云物联网平台注册网关

1、 登录物联网开发平台,注册新项目

2、 依次找到【网络管理】-【LoRa网关管理】-【用户网关】-【添加网关】

3、 在新建网关页面,填写网关基本信息,其中【网关ID】在上一步配置网关的时候的网页当中。

4、 选择【用户自定义频点】-【添加频点】

5、 因为开发选择的频点是CN470信道,按照TX、RX1、RX2信道频率填写表格。

6、 返回【用户网关】页面,找到刚刚添加的网关,编辑修改频点信息,更改为刚刚自定义的频点

3 配置node节点

拿出上次活动买的STM32WL评估板,在Github仓库中找到对应的程序

【基于TencentOS Tiny EVB_WL开发板完成LoRaWAN应用开发】

TencentOS tiny官方开源仓下载源码,地址为:

https://github.com/Tencent/TencentOS-tiny

进入 < TencentOS-tinyboardRHF0M0E5_STM32WLE5xxKEILlorawan> 目录,打开TencentOS_tiny.uvprojx工程

基于TencentOS Tiny的WL开发板的业务流程如下:

1. main函数中完成 板级初始化,主要是 board_init函数中初始化好基础外设和LoRa射频及LoRa协议栈;其中MX_LoRaWAN_Init函数会完成LoRaWAN协议的基础配置,比如选择CLASS、配置通道、配置ADR等;

2. main函数中,完成内核初始化、创建主线程入口application_entry,启动内核;

3. application_entry函数中再创建lora_mac_process_task;

4. application_entry函数中调用lw_send函数向LoRa网关和云端上报终端数据。示例中是模拟了3个元数据发送,开发者可以修改发送自己想发送的数据,配合腾讯云IoT平台设计好对应的数据模板即可。

打开commissioning.h文件,修改下面的数据

自己随意定义APP_KEY和EUID的值,一定注意【不能修改长度!!】

**踩坑**

这里要注意,由于这次的HT-M00L网关支持多速率通讯,但是首先要对node进行配置:

1、 根据网关配置页面固定频点

2、 前导码要改成16个symbol

首先对这两个部分进行配置

3.1 配置node频点

由于网关默认设定的是CN470的频点,这部分我们就不修改,直接在app_lorawan.c文件中,找到MX_LoRaWAN_Init(void)函数,修改信道ch的参数,代码如下:

代码语言:javascript复制
void MX_LoRaWAN_Init(void)
{
 printf("Lora node powered by TencentOS-tinyrn"); 
 /* Configure the Lora Stack*/
 lw_init(&LoRaMainCallbacks);
 APP_LOG("APP_VERSION= X.X.X.Xrn", (uint8_t)(__APP_VERSION >> 24), (uint8_t)(__APP_VERSION >> 16), (uint8_t)(__APP_VERSION >> 8), (uint8_t)__APP_VERSION);
 APP_LOG("MAC_VERSION= X.X.X.Xrn", (uint8_t)(__LORA_MAC_VERSION >> 24), (uint8_t)(__LORA_MAC_VERSION >> 16), (uint8_t)(__LORA_MAC_VERSION >> 8), (uint8_t)__LORA_MAC_VERSION);
 /*Class*/
 lw_request_class(CLASS_A);
 /*channel*/   /*!注意下面的ch数组!*/  
 LWChannel_mask_t ch={0x0001,0,0,0,0,0x0000}; 
 lw_current_chmask_set(&ch);
 /*tx dr*/
 lw_config_tx_datarate_set(DR_0);
 /*OTAA*/
  lw_config_otaa_set(LORA_ENABLE);
 /*enable adr*/
 lw_adr_set(LORA_ENABLE);
 /*set retry*/
 lw_confirm_retry_set(10);
 printf("lorawan init ok.rn");
}

3.2 修改前导码长度

修改TX的前导码为16个symbol,这部分程序直接固定好的,找了好久才修改成功

(这里要说一下调试技巧,当你不知道这部分代码是否执行的时候,就在他的下一行printf到串口一段文字,看是否能收到这段文字,就知道是否执行了)

找到radio.c文件的下面这个函数

代码语言:javascript复制
void RadioSetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
 uint32_t bandwidth, uint32_t datarate,
 uint8_t coderate, uint16_t preambleLen,
 bool fixLen, bool crcOn, bool freqHopOn,
 uint8_t hopPeriod, bool iqInverted, uint32_t timeout )

然后找到

代码语言:javascript复制
 if( ( SubgRf.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF5 ) ||
 ( SubgRf.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF6 ) )
 {
   if( preambleLen < 12 )
   {
     SubgRf.PacketParams.Params.LoRa.PreambleLength = 12;
   }
   else
   {
     SubgRf.PacketParams.Params.LoRa.PreambleLength = preambleLen;
    }
 }
 else
 {
   SubgRf.PacketParams.Params.LoRa.PreambleLength = preambleLen;
 }

把最后一个else中的语句更换成

代码语言:javascript复制
SubgRf.PacketParams.Params.LoRa.PreambleLength = 16; //change to 16

3.3 修改速率

如果要修改入网速率和TX、RX的速率(DR),那么需要修改的地方

对于入网DR,找到lora.c文件的下面一个结构体

代码语言:javascript复制
static lw_param_t lw_param_init = 
{
 .adr_enable = 0,
 .tx_datarate =DR_0,
 .confirm_retry = 3,
 .enable_public_network = LORAWAN_PUBLIC_NETWORK,
 .active_region = LORAWAN_DEFAULT_ACTIVE_REGION,
 .dev_addr = LORAWAN_DEVICE_ADDRESS
};

修改结构体的第二行即可

另外对于TX和RX的速率,找到RegionCN470.h文件(如果选用其他信道频点的,就找到对应的头文件)

依次修改下列数据

代码语言:javascript复制
/*!
 * Minimal datarate that can be used by the node
 */
#define CN470_TX_MIN_DATARATE DR_0 
/*!
 * Maximal datarate that can be used by the node
 */
#define CN470_TX_MAX_DATARATE DR_0
/*!
 * Minimal datarate that can be used by the node
 */
#define CN470_RX_MIN_DATARATE DR_0 
/*!
 * Maximal datarate that can be used by the node
 */
#define CN470_RX_MAX_DATARATE DR_0
/*!
 * Default datarate used by the node
 */
#define CN470_DEFAULT_DATARATE DR_0 
/*!
 * Second reception window channel datarate definition.
 */
#define CN470_RX_WND_2_DR DR_0

至此,对于频点、速率和前导码的部分就修改完成了。

4.配置数据物模型

至于上报数据,我们先默认用demo程序中的内容(其实是还没时间折腾其他的参数)

利用评估板采集温度、湿度和采集周期

程序下载进入单片机后,进入下一步骤。

1、 在左侧找到【产品开发】-【新建产品】

2、 通信方式选择LoRaWAN,产品名称自定义

3、 找到【数据模板】,点击导入json,导入下面的json文件

代码语言:javascript复制
{
 "version": "1.0",
 "profile": {
 "ProductId": "F2G256SY2G",
 "CategoryId": "1"
 },
 "properties": [
 {
 "id": "temperature",
 "name": "温度",
 "desc": "",
 "mode": "r",
  "define": {
 "type": "int",
 "min": "-100",
 "max": "155",
 "start": "0",
 "step": "1",
 "unit": "摄氏度"
 },
 "required": false
 },
 {
 "id": "humidity",
 "name": "湿度",
 "desc": "",
 "mode": "rw",
 "define": {
 "type": "int",
 "min": "0",
 "max": "100",
 "start": "0",
 "step": "1",
 "unit": "%"
 },
 "required": false
 },
 {
 "id": "period",
  "name": "上报周期",
 "desc": "",
 "mode": "rw",
 "define": {
 "type": "int",
 "min": "0",
 "max": "3600",
 "start": "0",
 "step": "1",
 "unit": "秒"
 },
 "required": false
 }
 ],
 "events": [],
 "actions": []
}

4、 在设备开发页面中,按需调整 LoRaWAN 参数配置。

这一步注意,RX的延时、速率(DR)和频点,一定要和node的单片机配置一致!

5、 然后点击【云端解析】页面,对上行数据和下行数据进行一个解析,这里利用的是js语言。

在上行数据解析部分,javascript 示例代码如下:

代码语言:javascript复制
function RawToProtocol(fPort, bytes) {
 var data = {
 "method": "report",
 "clientToken" : new Date(),
 "params" : {}
 };
 data.params.temperature = bytes[0];
 data.params.humidity = bytes[1];
 data.params.period = bytes[2] | (bytes[3] << 8);
 return data;
}

在下行数据解析部分,javascript 示例代码如下:

代码语言:javascript复制
function ProtocolToRaw(obj) {
 var data = new Array();
 data[0] = 5;// fport=5
 data[1] = 0;// unconfirmed mode
 data[2] = obj.params.period & 0x00FF;
 data[3] = (obj.params.period >> 8) & 0x00FF;
 return data;
}

6、找到【设备调试】页面-点击【新建设备】

这里的DEVEUI和AppKey参数,就是我们刚刚在Keil中写入的参数。

5 调试步骤

上述工作完成后,打开腾讯连连小程序,扫描二维码,打开腾讯连连面板。

腾讯连连小程序远程查看数据腾讯连连小程序远程查看数据

修改部分数据,继续观察串口助手

串口助手打印node数据串口助手打印node数据

在设备日志中查看数据交互情况

设备调试日志设备调试日志

后记

生命在于折腾,这次的网关算是圆了去年买了node后没折腾成功的梦

用了一个晚上 周日一白天的时间

从一开始的全部Timeout到TxDone RxTimeout

再到无几六瘦的调试

最后全部成功的喜悦

就像是追一个对象终于追到手的感觉

这……或许就是一个自动化小白的成长之路吧

AD时间

有同样感兴趣的可以关注一波

0 人点赞