从零开始搭建一个LoRaWAN基站
先说两句
SX1301/SX1302是semtech公司推出的基站端射频基带芯片,其与SX127x/SX126x的主要区别在于:
- 只是个基带芯片,使用时需要加射频前端(SX125x/SAW/...)
- 其具有比SX1278强大很多的基带处理能力,可以同时解调8个信道的数据,并且每个信道可以同时监听SF7-12(SX1302为SF5-12)
所以,从参数上可以看出,对于lorawan这样的多节点网络来讲,使用SX1301/SX1302才是正确的打开方式。
接下来,我就分享一下我自己从零开始搭建LoRaWAN基站的经验。
准备工作
运行环境
- raspberry 3/3b/4都可以
- M-GW1302S模块
- 树莓派转接板
Note:
由于硬件使用GPIO7作为SX1302的RESET,与树莓派的SPI0.1的CS脚冲突(虽然没有用的SPI0.1,但是有些版本的镜像会有冲突),
我平时使用2020-05-27版本的刚好没有冲突,所以建议大家先不要下载最新版的镜像,2020-05-27-树莓派镜像下载地址
实物图
用到的软件
SSH工具(XShell,PuTTY等都可以)
资料
- M-GW1302S的用户手册(描述使用方法)
- M-GW1302S的硬件设计手册(描述模块硬件设计时需要用到的资料),暂时还用不到
- 基站端代码,见下方
官方开源代码
https://github.com/Lora-net/sx1302_hal
git命令:
git clone https://github.com/Lora-net/sx1302_hal.git
厂家适配后的源码
因为官方源码中使用了一个温度传感器,而在此版设计中,并没有此传感器,所以需要将部分代码注释掉才能运行,这一步,M-GW1302S的厂家已经帮我们改好了。
https://gitee.com/rejeee/gw1302s
git命令:
git clone https://gitee.com/rejeee/gw1302s
步骤
准备工作
- 树莓派制作好系统,连上网线,使用SSH与树莓派连接
- 进入树莓派之后,需要先开启SPI,若有问题请自行百度,不同版本的树莓派可能会不同
下载代码、编译、运行
git clone https://gitee.com/rejeee/gw1302s.git
cd gw1302s
修改target.cfg中的TARGET_DIR为
TARGET_DIR=/home/pi/gw1302s/bin
make clean all ->此步骤会把代码编译成可执行文件
make install -> 此步骤会用调用SCP将编译结果拷贝到TARGET_DIR所在目录,所以可能需要输入密码(此处是将scp的dst设为localhost,所以会拷贝到本地),若不想输密码,可参考README.md进行ssh秘钥拷贝,后续就无需输入密码了
make install_conf ->至此,源码就编译完成了,并且生成的已经在TARGET_DIR指定的目录下了
接下来我们需要配置global_conf.json,配置得适用于我们的需要,此处我贡献一下我的global_conf.json文件,其中配置基站的接收频点是通过配置两个SX1250的中心频点,外加8个偏移频点来进行的,如下图,我配置的为474.3~475.7的接收频点范围
{
"SX130x_conf": {
"spidev_path": "/dev/spidev0.0",
"lorawan_public": true,
"clksrc": 0,
"antenna_gain": 0, /* antenna gain, in dBi */
"full_duplex": false,
"precision_timestamp": {
"enable": false,
"max_ts_metrics": 255,
"nb_symbols": 1
},
"radio_0": {
"enable": true,
"type": "SX1250",
"single_input_mode": true,
"freq": 474600000,
"rssi_offset": -207.0,
"rssi_tcomp": {"coeff_a": 0, "coeff_b": 0, "coeff_c": 20.41, "coeff_d": 2162.56, "coeff_e": 0},
"tx_enable": true,
"tx_freq_min": 470000000,
"tx_freq_max": 510000000,
"tx_gain_lut":[
{"rf_power": -6, "pa_gain": 0, "pwr_idx": 0},
{"rf_power": -3, "pa_gain": 0, "pwr_idx": 1},
{"rf_power": 0, "pa_gain": 0, "pwr_idx": 2},
{"rf_power": 3, "pa_gain": 1, "pwr_idx": 3},
{"rf_power": 6, "pa_gain": 1, "pwr_idx": 4},
{"rf_power": 10, "pa_gain": 1, "pwr_idx": 5},
{"rf_power": 11, "pa_gain": 1, "pwr_idx": 6},
{"rf_power": 12, "pa_gain": 2, "pwr_idx": 7},
{"rf_power": 13, "pa_gain": 1, "pwr_idx": 8},
{"rf_power": 14, "pa_gain": 2, "pwr_idx": 9},
{"rf_power": 16, "pa_gain": 2, "pwr_idx": 10},
{"rf_power": 20, "pa_gain": 3, "pwr_idx": 11},
{"rf_power": 23, "pa_gain": 3, "pwr_idx": 12},
{"rf_power": 25, "pa_gain": 3, "pwr_idx": 13},
{"rf_power": 26, "pa_gain": 3, "pwr_idx": 14},
{"rf_power": 27, "pa_gain": 3, "pwr_idx": 15}
]
},
"radio_1": {
"enable": true,
"type": "SX1250",
"single_input_mode": true,
"freq": 475400000,
"rssi_offset": -207.0,
"rssi_tcomp": {"coeff_a": 0, "coeff_b": 0, "coeff_c": 20.41, "coeff_d": 2162.56, "coeff_e": 0},
"tx_enable": false
},
"chan_multiSF_0": {"enable": true, "radio": 0, "if": -300000},
"chan_multiSF_1": {"enable": true, "radio": 0, "if": -100000},
"chan_multiSF_2": {"enable": true, "radio": 0, "if": 100000},
"chan_multiSF_3": {"enable": true, "radio": 0, "if": 300000},
"chan_multiSF_4": {"enable": true, "radio": 1, "if": -300000},
"chan_multiSF_5": {"enable": true, "radio": 1, "if": -100000},
"chan_multiSF_6": {"enable": true, "radio": 1, "if": 100000},
"chan_multiSF_7": {"enable": true, "radio": 1, "if": 300000},
"chan_Lora_std": {"enable": true, "radio": 1, "if": -200000, "bandwidth": 250000, "spread_factor": 7,
"implicit_hdr": false, "implicit_payload_length": 17, "implicit_crc_en": false, "implicit_coderate": 1},
"chan_FSK": {"enable": true, "radio": 1, "if": 300000, "bandwidth": 125000, "datarate": 50000}
}, "gateway_conf": {
"gateway_ID": "AA555A0000000000",
/* change with default server address/ports */
"server_address": "lora.ansitw.com",
"serv_port_up": 1700,
"serv_port_down": 1700,
/* adjust the following parameters for your network */
"keepalive_interval": 10,
"stat_interval": 30,
"push_timeout_ms": 100,
/* forward only valid packets */
"forward_crc_valid": true,
"forward_crc_error": false,
"forward_crc_disabled": false,
/* Beaconing parameters */
"beacon_period": 0,
"beacon_freq_hz": 869525000,
"beacon_datarate": 9,
"beacon_bw_hz": 125000,
"beacon_power": 14,
"beacon_infodesc": 0
}, "debug_conf": {
"ref_payload":[
{"id": "0xCAFE1234"},
{"id": "0xCAFE2345"}
],
"log_file": "loragw_hal.log"
}
}- 最后,我们运行一下./lora_pkt_fwd,程序就会读取global_conf.json文件,启动起来了。
至此,我们就拥有一台自己DIY的LoRaWAN基站了!!
global_conf.json配置
这个配置文件是lora_pkt_fwd程序运行的所有配置参数,其中有几点是我们平时会比较常用到的:
- 如何修改基站的接收频点
- 如何设置基站的ID
- 如何设置基站的LoRaWAN NS指向
- 如何设置基站的发射功率
设置基站的接收频点
设置接收频点主要是通过设置radio_0和radio_1的中心频点,并在此基础上设置8个接收信道的偏移来进行的,比如上面的参数,其中radio_0.freq==474600000,radio_1.freq==475400000,这就是radio_0和radio_1的中心频点,下面会根据设置的8个频点的偏移情况来开启8个接收信道,具体体现在
"chan_multiSF_0": {"enable": true, "radio": 0, "if": -300000},
"chan_multiSF_1": {"enable": true, "radio": 0, "if": -100000},
"chan_multiSF_2": {"enable": true, "radio": 0, "if": 100000},
"chan_multiSF_3": {"enable": true, "radio": 0, "if": 300000},
"chan_multiSF_4": {"enable": true, "radio": 1, "if": -300000},
"chan_multiSF_5": {"enable": true, "radio": 1, "if": -100000},
"chan_multiSF_6": {"enable": true, "radio": 1, "if": 100000},
"chan_multiSF_7": {"enable": true, "radio": 1, "if": 300000},
我们以第一条为例
chan_multiSF_X,指的是这个频点是可以接收多个SF的,这种频点最多可以有8个,这是由硬件决定的
enable:true表示这个频点开启
"radio":0,表明此信道的中心频点是radio_0的中心频点
"if": -300000,表明此信道在中心频点上偏移-300000Hz
故此条配置的含义是:
- 此频点可接收多个SF
- 此频点为radio_0.freq-300000=474600000-300000=474300000=474.3MHz
设置基站的ID
gateway_conf.gateway_ID即是
如何设置基站的LoRaWAN NS指向
- gateway_conf.server_address为NS的地址
- gateway_conf.serv_port_up为NS的上行端口
- gateway_conf.serv_port_down为NS的下行端口
如何设置基站的发射功率
基站的发射功率
首先是要有个radio的tx_enable是true的,即表示通过此芯片发送下行,这个和硬件有关,不过大部分情况下都是radio_0(大家都参考的原厂的参考设计)
tx_freq_min,tx_freq_max设置的是发射的最大,最小频点范围
tx_gain_lut是tx power的一个具体配置表,也就是说,当基站收到NS的下发命令时,会按照指定功率进行下发,若指定的功率不在这个表里面,那么可能就不会进行下发了,此表为什么这配我也不清楚,一般情况下不要去改动它
从零开始搭建一个LoRaWAN基站的更多相关文章
- vue-用Vue-cli从零开始搭建一个Vue项目
Vue是近两年来比较火的一个前端框架(渐进式框架吧). Vue两大核心思想:组件化和数据驱动.组件化就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用:数据驱动是前端的未来发展方向,释放了对 ...
- 从零开始搭建一个react项目
Nav logo 120 发现 关注 消息 4 搜索 从零开始搭建一个react项目 96 瘦人假噜噜 2017.04.23 23:29* 字数 6330 阅读 32892评论 31喜欢 36 项目地 ...
- 从零开始搭建一个简单的基于webpack的vue开发环境
原文地址:https://segmentfault.com/a/1190000012789253?utm_source=tag-newest 从零开始搭建一个简单的基于webpack的react开发环 ...
- 从零开始搭建一个PaaS平台 - 我们要做什么
前言 从最开始的小公司做小网站,到现在进入现在的公司做项目,发现小公司里很多很多工作都是重复的劳动(增删改查),不过想想也是,业务软件最基础的东西不就是增删改查吗. 但是很多时候,这种业务逻辑其实没有 ...
- Django1.8教程——从零开始搭建一个完整django博客(一)
第一个Django项目将是一个完整的博客网站.它和我们博客园使用的博客别无二致,一样有分类.标签.归档.查询等功能.如果你对Django感兴趣的话,这是一个绝好的机会.该教程将和你一起,从零开始,搭建 ...
- 在django中如何从零开始搭建一个mock服务
mock概念 mock 就是模拟接口返回的一系列数据,用自定义的数据替换接口实际需要返回的数据,通过自定义的数据来实现对下级接口模块的测试.这里分为两类测试:一类是前端对接口的mock,一类是后端单元 ...
- 从零开始搭建一个vue.js的脚手架
在谷歌工作的时候,我们要做很多界面的原型,要求快速上手,灵活运用,当时用的一些现有框架,比如angular,太笨重了——尤雨溪(Vue.js 作者) vue.js是现在一个很火的前端框架,官网描述其简 ...
- 如何用Django从零开始搭建一个网站(0)
python,django等安装就直接略过了.下面直接奔如主题,搭建网站. Step1:新建一个django project,运行命令:‘django-admin startproject myPit ...
- webpack+vue+koa+mongoDB,从零开始搭建一个网站
github 地址 https://github.com/wangxiaoxi... webpakc+vue的搭建1.新建项目文件夹(see-films);2.npm init //初始化项目3.搭建 ...
- Java进阶专题(二十二) 从零开始搭建一个微服务架构系统 (上)
前言 "微服务"一词源于 Martin Fowler的名为 Microservices的,博文,可以在他的官方博客上找到http:/ /martinfowler . com/art ...
随机推荐
- 在Windows系统中解决端口占用问题
在Windows系统中,你可以通过以下步骤查询并结束占用8001端口的进程: 查询占用8001端口的进程: 打开命令提示符(CMD)或者PowerShell,并执行以下命令: netstat -a ...
- 【摘译+整理】System.IO.Ports.SerialPort使用注意
远古的一篇博客,内容散落于博文和评论 https://sparxeng.com/blog/software/must-use-net-system-io-ports-serialport C# 和 . ...
- 写写Redis十大类型stream的常用命令
前言:感觉这个好像没啥用,我没学过mq,好像这个东西用别的中间件比较好,比如kafka,rabbitmq 最后一个是bitfield,看尚硅谷介绍说那玩意基本用不着,所以那个也不看了,直接跳了,十大类 ...
- python 返回实例对象个数
python 返回实例对象个数 Python 没有提供任何内部机制来跟踪一个类有多少个实例被创建了,或者记录这些实例是些什么东西.如果需要这些功能,你可以显式加入一些代码到类定义或者__init__( ...
- Jmeter函数助手21-evalVar
evalVar函数用于执行变量表达式. 变量的名称:填入变量的名称name.注意不是引用变量${name} 1.evalVar函数和eval函数的区别:evalVar只能接收变量名称:eval能接收引 ...
- Python将本地文件上传到服务器
1.首先本地有一个文件"E:\Double\python\dataCheck\html_detail\20221206140345_activeBug.html",我需要上传到服务 ...
- 【SpringMVC】03 使用注解
第一步还是配置web.xml,使用分发器统一处理请求和加载容器文件 <?xml version="1.0" encoding="UTF-8"?> & ...
- 【Linux】Re02
一.运行启动级别 0 关机 1 单用户 2 多用户状态没有网络服务 3 多用户状态存在网络服务 4 系统未使用保留给用户 5 图形界面 6 重启 命令: init [0 - 6] 图形化界面级别需要对 ...
- Arm V8 - ADRP指令
ADRP指令 作用 将当前指令所在页的基地址加/减去字节差,并写入目标寄存器 字节差:与目标地址页基地址的间隔字节数,其为PAGE_SIZE的整数倍 此时的字节差就是指令所操作的立即数 该指令通常配合 ...
- TensorFlow图像预处理函数
预处理图像 文件名: cat.jpg 读取.打印图片 import matplotlib.pyplot as plt import tensorflow as tf import nump ...