序
腾讯云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的参数,代码如下:
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
文件的下面这个函数
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
文件的下面一个结构体
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后没折腾成功的梦
用了一个晚上 周日一白天的时间
从一开始的全部Timeout到TxDone RxTimeout
再到无几六瘦的调试
最后全部成功的喜悦
就像是追一个对象终于追到手的感觉
这……或许就是一个自动化小白的成长之路吧
AD时间
有同样感兴趣的可以关注一波