losangler / LoRa

开发笔记

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LoRa个人学习笔记

重拾LoRa,将离线笔记搬运到 GitHub 上来,也算是总结一下这个项目。🚩

🌾 English

概述

这是大三开始的项目,书面称作 城市河道排污在线监测系统 通常我叫做**蜻蜓点水**项目,因为内容虚胖,多是浮光掠影。😀 主要涉及LoRaSX1301SX1278STM32L151Raspberry PINode.js

  • 水质监测(浊度、PH值、水温)💧
  • LoRaWAN 系统 10 km覆盖 🛫
  • 监测中心(预警、统计)📈
  • 实时追踪 🔎

目录

相关概念

​ 一些基本概念需要知道,LoRa与LoRaWAN的区别,LoRaWAN的三种模式,LoRaWAN网路架构的特点等等,知道这些有助于理解接下来的各种参数。

LoRa与LoRaWAN

起初我并没有分清LoRa与LoRaWAN,后来发现是非常有必要区分两者:

LoRa(Long Range)是由法国格勒诺布尔的Cycleo开发并于2012年被Semtech收购的专利数字无线数据通信技术。LoRa使用免许可的亚千兆赫兹无线电频段,如169 MHz,433 MHz,868 MHz(欧洲)和915 MHz(北美)。 LoRa能够以低功耗实现超远距离传输(农村地区超过10公里)。该技术分为两部分:物理层LoRa,和上层LoRaWAN。

LoRaWAN是LoRa运营的网络,可以被物联网用于远程和非连接行业。 LoRaWAN是媒体访问控制(MAC)层协议,但主要是用于管理LPWAN网关和端节点设备之间的通信的网络层协议,作为由LoRa联盟维护的路由协议。 LoRaWAN规范1.0版于2015年6月发布。从基本的角度来说,人们可以认为LoRaWAN是一个新的WiFi,可以连接各个行业的新物联网设备。

区别 LoRa LoRaWAN LPWAN
本质 Semtech LoRa 芯片所使用的一种chirp扩频CSS的调制技术。 一种媒体访问控制(MAC)层协议。 一种拥有广泛覆盖能力的低功耗无线网络。
应用 鲁棒调制,实现不同数据速率。
位置 PHY Layer MAC Layer 四层结构:RF、PHY、MAC、Application

LoRaWAN的三种模式

  • Class A(可双向通讯的终端装置)即时性最好 用于需要以最低功耗操作的终端装置。 这种装置常常在它送出 uplink 之后,只需要与 server 端进行很短暂的 downlink 通讯 (例如只收个ACK 而已)在任何其他时间,从 server downlink 必须等到下一次的 scheduled uplink (所以通讯没办法很即时,例如下一次的 scheduled uplink 可能是在128秒之后)

  • Class B(可双向通讯的终端装置,但有 scheduled receive slots) 相较于 A 类的随机 receive windows,Class B 的装置会在排程的时间打开一个额外的接收窗。为了让终端装置在排程时间打开它的 receive window,它需要从 gateway 接收一个用于时间同步的 Beacon (如此一来,server 就能知道终端装置何时在 listening),相较于 A 类会更即时。

  • Class C(可双向通讯的终端装置,尽可能安排最多的 receive slots) C 类的终端装置是几乎连续地开着 receive windows,只有在发送时才会关闭接收视窗 C 类对 server 与终端装置通讯带来最低的延迟 (latency),所以即时性最好,但消耗功率最高

    项目中使用最低功耗的Class A

LoRaWAN的两种入网方式

  • ABP(activation by personalization) DevAddr、NwkSKey 与 AppSKey 是直接储存在装置上的; 每个装置都有自己的 NwkSKey 与 AppSKey,这样泄漏一个装置的密钥,不会牵连到其他装置。

  • OTAA(over-the-air activation) DevEUI、AppEUI、AppKey 金钥这三个东西,AppKey 的目的是为了产生 NwkSKey 与 AppSKey。 接着由 End Device 发起请求,进行入网程序。 过程中如果失去 session context,必须重新跑 Join Procedure。

    项目中使用OTAA

LoRaWAN网路架构的特点

  • 终端点的通讯是双向的 (bi-directional)
  • LoRaWAN 数据速率可以从 0.3 kbps 到 50 kbps
  • 扩频技术 (同一Channel中,以不同的SF切割通道做multiple access,但会影响数据传输率)
  • 网关 (gateway) 负责桥接 (bridging) 节点的数据,同时也作为与后端服务连结的网路伺服器 (IP 网路)
  • 自适应速率 (adaptive data rate, ADR)
  • LoRaWAN 的网路伺服器可为个别装置设定数据速率,以最佳化电池效率及网路容量
  • LoRaWAN 使用扩频调制技术,可解调低于20 dB的噪声,这确保了高灵敏度和可靠的网络连接
  • 采用不同扩频因子就可以改变扩频系统的传输速率,且可变的扩频因子提高了整个网络的系统容量
  • 采用不同扩频因子的信号可以在一个信道**存。与固定速率的FSK系统相比,LoRa协议的星形拓扑结构消除了同步开销和跳数,因而降低了功耗。

关键参数

​ 通过调整关键参数:最终在带宽占用、数据速率、链路预算改善以及抗干扰性之间达到最佳平衡,总的来说:最重要的是**扩频因子(SF)编码率(CR)带宽(BW)信噪比(SNR)接收的信号强度指示(RSSI)等效全向辐射功率(EIRP)速率自适应(ADR)正交可变扩频因子(OVSF)**

🚀 回到顶部

定义

  • 扩频因子 SF (Spreading Factor)

    当扩频因子为1时,数据1就用“1”来表示,扩频因子为4时,可能用“1011”来表示1;这样传输的目的是降低误码率也就是信噪比,但是却减少了可以传输的实际数据,所以,扩频因子越大,传输的数据数率就越小。简而言之:扩大带宽、减少干扰

    当扩频因子为4时,有4个正交的扩频码,正交的扩频码可以让同时传输的无线信号互不干扰,也就是说,扩频因子为4时,可以同时传输4个人的信息。简而言之:根据对速率的不同要求分配不同数量的码道,提高利用率

    扩频因子越大,传播时间越长,传播距离越广,传输的数据数率(比特率)就越小;

    LoRa扩频因子取值范围:

  • 符号速率 SR (Symbol Rate)

    扩频信息的发送速度称为符号速率(Rs),码片速率与标称的Rs比值即为扩频因子(SF,Spreading Factor),表示了每个信息位发送的符号数量。

    LoRa符号速率Rs计算公式: $$ RS=\frac{BW}{2^{SF}} $$

  • 数据速率 DR (Data Rate)

    数据传送速率为单位时间内在数据传输系统中的相应设备之间传送的比特、字符或码组平均数。在该定义中,相应设备常指调制解调器、中间设备或数据源与数据宿。单位为比特/秒(bit/s)、字符/秒或码组/秒。

    LoRa数据速率DR计算公式:

$$ DR=SF\times(\frac{BW}{2^{SF}})\times CR $$

  • 编码率 CR (code rate)

    编码率:数据流中有用部分(非冗余)的比例,如果编码率是k/n,则对每k位有用信息,编码器总共产生n位的数据,其中n-k是多余的。

    LoRa采用循环纠错编码进行前向错误检测与纠错,使用该方式会产生传输开销。

    编码率(RegTxCfg1) 循环编码率 开销比率
    1 4/5 1.25
    2 4/6 1.5
    3 4/7 1.75
    4 4/8 2

    在存在干扰的情况下,前向纠错能有效提高链路的可靠性。由此,编码率(抗干扰性能)可以随着信道条件的变化而变化—可以选择在报头中加入编码率以便接收端能够解析。

  • 发射功率

    提高通信距离常用的办法是提高发射功率,同时也带来更多的能耗。

  • 调制带宽 BW (Band Width)

    带宽就是单位时间内的最大数据流量,也可以说是单位时间内最大可能提供多少个二进制位传输。

    1M带宽指的是1Mbps=1 megabits per second

    增加信号带宽,可以提高有效数据速率缩短传输时间,但会牺牲灵敏度

    LoRa芯片SX127x,LoRa为双边带宽(全信道带宽),而FSK调制方式是指单边带宽

  • 信噪比 SNR (Signal-to-noise ratio)

    SNR 是一个正的dBm,表示信号比噪声的强度。SNR 越大,说明混在信号里的噪声越小,否则相反。

    典型实例:SNR至少比RSSI高20~25dB。

  • 接收的信号强度指示 RSSI (Received Signal Strength Indication)

    RSSI 是一个负的dBm,表示RF信号的数值。信号越强,连线品质越好。因此RSSI越接近于0越好。

    -60dBm的信号比-80dBm的品质好。

  • 等效全向辐射功率 或叫有效全向辐射功率 EIRP (equivalent isotropically radiated power)

  • 速率自适应(ADR)

    LoRaWAN网络服务器通过一种速率自适应(ADR)方案来控制数据传输速率和每一终端设备的射频输出。

传输速率与通讯距离

LoRa 的传输率可以自由调整,传输率越低,传输的距离可以越远。

计算

最方便的计算方法当然是官方的计算器:LoRa Modem Calculator Tool 所有参数一目了然,非常方便:

无线电传输公式 $$ 传输损耗dB=20\lg{F(MHz)}+20\lg{D(km)}+经验常数 $$ SNR越大,通信链路预算值越高,意味着传输距离更远。用公式推断:增加6dB的链路预算,可以提高大约2km的传输距离,实际情况发现,增加12dB并没有获得更多的通信距离,这是还有其他的参量发生作用,是什么却不得而知 🙃

修改

​ 在main.c中,可以修改必要参数,

APP_TX_DUTYCYCLE 数据传输占空比
APP_TX_DUTYCYCLE_RND 数据传输占空比的随机延迟
LORAWAN_DEFAULT_DATARATE 默认数据速率
LORAWAN_CONFIRMED_MSG_ON LoRaWAN确认消息
LORAWAN_ADR_ON 自适应数据速率 启用ADR时,终端设备应该是静态
LORAWAN_DUTYCYCLE_ON ETSI占空比控制启用/禁用 仅用于测试
LORAWAN_APP_PORT LoRaWAN应用程序端口
LORAWAN_APP_DATA_SIZE
OVER_THE_AIR_ACTIVATION OTAA空中激活
LORAWAN_APP_DATA_MAX_SIZE 用户应用数据缓冲区大小
#define APP_TX_DUTYCYCLE                            10000
#define APP_TX_DUTYCYCLE_RND                        500
#define LORAWAN_DEFAULT_DATARATE                    DR_0
#define LORAWAN_CONFIRMED_MSG_ON                    false
#define LORAWAN_ADR_ON                              1
#if defined( REGION_EU868 )
#include "LoRaMacTest.h"
#define LORAWAN_DUTYCYCLE_ON                        true
#define LORAWAN_APP_PORT                            2
#if defined( REGION_CN470 ) || defined( REGION_CN779 ) || defined( REGION_EU433 ) || defined( REGION_EU868 ) || defined( REGION_IN865 ) || defined( REGION_KR920 )
#define LORAWAN_APP_DATA_SIZE                       16
#elif defined( REGION_AS923 ) || defined( REGION_AU915 ) || defined( REGION_US915 ) || defined( REGION_US915_HYBRID )
#define LORAWAN_APP_DATA_SIZE                       11
#else
#error "Please define a region in the compiler options."
#endif
static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
static uint8_t AppEui[] = LORAWAN_APPLICATION_EUI;
static uint8_t AppKey[] = LORAWAN_APPLICATION_KEY;
#if( OVER_THE_AIR_ACTIVATION == 0 )
static uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
static uint8_t AppSKey[] = LORAWAN_APPSKEY;
static uint32_t DevAddr = LORAWAN_DEVICE_ADDRESS;
#endif
static uint8_t AppPort = LORAWAN_APP_PORT;
static uint8_t AppDataSize = LORAWAN_APP_DATA_SIZE;
#define LORAWAN_APP_DATA_MAX_SIZE                           242

系统搭建

​ 项目采用以树莓派作为核心处理器,SX1301作为网关集中器的LoRaWAN网关系统。在多次试验与改进后,以LoRaWAN网关作为信息处理的中心,远程站点上具有LoRa协议的边界设备为节点,组成了在低功率广域网内的传感器网络,以单向通讯机制完成数据采集,以无线局域网方式完成采集数据上行服务器。展示1

🚀 回到顶部

LoRaWAN网关

​ LoRaWAN网络架构是一个典型的星形拓扑结构,在这个网络架构中,LoRa网关是一个透明的中继,连接前端终端设备和后端**服务器。网关与服务器通过标准IP连接,而终端设备采用单跳与一个或多个网关通信,所有的节点均是双向通信。

安装树莓派系统

  • 磁盘写入工具:etcher

  • SSH服务安装与开机自动启动

    打开 /etc/rc.local文件;

    在语句exit 0之前加入:

    /etc/init.d/ssh start
  • 给只读文件加上写权限

    sudo chmod a+w filename
    

    同理,给只读文件加上可执行权限

    sudo chmod a+x filename
  • 树莓派3-配置-通过VNC访问系统

    sudo apt-get install tightvncserver

    设置密码,等等,省略好多可以忽略的步骤。。。

    使用如下命令手工启动VNC服务器程序

    tightvncserver -geometry 800x600 :1

    然后就可以去同局域网的PC端访问了,密码就是刚才设置的。

  • 预设值wifi密码

    打开 /etc/wpa_supplicant/wpa_supplicant.conf

    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    country=GB
    
    network={
    	ssid="family"
    	psk="416liuliuliu"
    	key_mgmt=WPA-PSK
    }
    
    network={
    	ssid="nkbh_micromouse"
    	psk="115115115115"
    	key_mgmt=WPA-PSK
    }
  • 更改键盘布局

    树莓派(raspberry pi)是英国产品,默认键盘布局是英国(GB),我们用的键盘布局一般是美国(US)

    sudo dpkg-reconfigure keyboard-configuration

    进入后,选通用的101键PC键盘;

    按tab键,到OK,按Enter确定

    在键盘layout选择中,选Other;

    按tab键,到OK,按Enter确定

    然后在选项中,选English(US);

    按tab键,到OK,按Enter确定

    再选English(US, alternative international);

    按tab键,到OK,按Enter确定

    然后一路按OK;

    最后,重启系统

    sudo reboot

启动SX1301集中器

增添ME909s-821模块

​ 由于项目需求,LoRaWAN网关必须安装到郊外,意味着Raspberry PI 无法使用WIFI联网,目前的代替方案是:Huawei ME909s-821 ​ ME909s系列是Cat4 LTE工业级M2M无线模块,沿用华为LGA封装标准,与MU709s系列 pin-to-pin兼容。同时具有标准Mini PCIe形态,客户选择更具灵活性。ME909s系列支持下行150Mbps,上行50Mbps的传输速率;提供高质量的语音、短信功能;丰富的扩展功能,包括:FOTA、USSD、IPV6/IPV4;内置TCP/IP协议栈;华为扩展AT指令集…

🚀 回到顶部

  • 因为无法访问外网,所以首先修改树莓派的更新源

    sudo nano /etc/apt/sources.list
    # deb http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
    # Uncomment line below then 'apt-get update' to enable 'apt-get source'
    # deb-src http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
    # use ustc mirror:
    # deb http://mirrors.aliyun.com/raspbian/raspbian/ stretch main non-free contrib rpi
    # deb-src http://mirrors.aliyun.com/raspbian/raspbian/ stretch main non-free contrib rpi
    deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
    deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
    sudo apt-get update
    sudo nano /etc/apt/sources.list.d/raspi.list
    # deb http://archive.raspberrypi.org/debian/ stretch main ui
    # Uncomment line below then 'apt-get update' to enable 'apt-get source'
    # deb-src http://archive.raspberrypi.org/debian/ stretch main ui
    # use ustc mirror:
    deb http://mirrors.aliyun.com/debian/ stretch main ui
    deb-src http://mirrors.aliyun.com/debian/ stretch main ui
    
  • 安装 minicom

    sudo apt-get install minicom
  • 注意天线

    根据 Mini PCIe 转接板上的标签标识,将主集天线的连接器插入到Mini PCIe 转接板的主集天线接口(M)。使用同样方法,将分集天线的连接器插入到Mini PCIe 转接板的分集天线接口(A)。

    如果你只有一根天线,请连接主集天线(M)

  • 查看是否识别Huawei ME909s-821

    lsusb
  • 安装模式切换工具

    sudo apt-get install usb-modeswitch usb-modeswitch-data
  • 安装拨号软件

    sudo apt-get install wvdial
    正在读取软件包列表... 完成
    正在分析软件包的依赖关系树       
    正在读取状态信息... 完成       
    将会同时安装下列软件:
      libpcap0.8 libuniconf4.6 libwvstreams4.6-base libwvstreams4.6-extras ppp
    下列【新】软件包将被安装:
      libpcap0.8 libuniconf4.6 libwvstreams4.6-base libwvstreams4.6-extras ppp wvdial
    升级了 0 个软件包,新安装了 6 个软件包,要卸载 0 个软件包,有 14 个软件包未被升级。
    ...省略...
    正在设置 libwvstreams4.6-extras (4.6.1-11) ...
    正在设置 libuniconf4.6 (4.6.1-11) ...
    正在设置 wvdial (1.61-4.1) ...
    Success!  You can run "wvdial" to connect to the internet.
      (You can also change your configuration by editing /etc/wvdial.conf)
    正在处理用于 libc-bin (2.24-11+deb9u3) 的触发器 ...
    正在处理用于 systemd (232-25+deb9u2) 的触发器 ...
  • 扫描可用的Modem

    sudo wvdialconf  /etc/wvdial.conf

    成功找到Modem会打出如下message

    Editing `/etc/wvdial.conf'.
    
    Scanning your serial ports for a modem.
    
    ttyUSB0<*1>: ATQ0 V1 E1 -- OK
    ttyUSB0<*1>: ATQ0 V1 E1 Z -- OK
    ttyUSB0<*1>: ATQ0 V1 E1 S0=0 -- OK
    ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 -- +CME ERROR: 50
    ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &D2 -- +CME ERROR: 50
    ttyUSB0<*1>: ATQ0 V1 E1 S0=0 +FCLASS=0 -- +CME ERROR: 50
    ttyUSB0<*1>: Modem Identifier: ATI -- Manufacturer: Huawei Technologies Co., Ltd.
    ttyUSB0<*1>: Speed 9600: AT -- OK
    ttyUSB0<*1>: Max speed is 9600; that should be safe.
    ttyUSB0<*1>: ATQ0 V1 E1 S0=0 -- OK
    ttyUSB1<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
    ttyUSB1<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 9600 baud
    ttyUSB1<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
    ttyUSB2<*1>: ATQ0 V1 E1 -- OK
    ttyUSB2<*1>: ATQ0 V1 E1 Z -- OK
    ttyUSB2<*1>: ATQ0 V1 E1 S0=0 -- OK
    ttyUSB2<*1>: ATQ0 V1 E1 S0=0 &C1 -- +CME ERROR: 50
    ttyUSB2<*1>: ATQ0 V1 E1 S0=0 &D2 -- +CME ERROR: 50
    ttyUSB2<*1>: ATQ0 V1 E1 S0=0 +FCLASS=0 -- +CME ERROR: 50
    ttyUSB2<*1>: Modem Identifier: ATI -- Manufacturer: Huawei Technologies Co., Ltd.
    ttyUSB2<*1>: Speed 9600: AT -- OK
    ttyUSB2<*1>: Max speed is 9600; that should be safe.
    ttyUSB2<*1>: ATQ0 V1 E1 S0=0 -- OK
    ttyUSB3<*1>: ATQ0 V1 E1 -- ERROR
    ttyUSB3<*1>: failed with 2400 baud, next try: 9600 baud
    ttyUSB3<*1>: ATQ0 V1 E1 -- ERROR
    ttyUSB3<*1>: failed with 9600 baud, next try: 9600 baud
    ttyUSB3<*1>: ATQ0 V1 E1 -- ERROR
    ttyUSB3<*1>: and failed too at 115200, giving up.
    ttyUSB4<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
    ttyUSB4<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 9600 baud
    ttyUSB4<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
    
    Found a modem on /dev/ttyUSB0.
    Modem configuration written to /etc/wvdial.conf.
    ttyUSB0<Info>: Speed 9600; init "ATQ0 V1 E1 S0=0"
    ttyUSB2<Info>: Speed 9600; init "ATQ0 V1 E1 S0=0"

    接下来可以打开wvdial.conf配置文件,进行相应的修改

  • 配置文件wvdial.conf

    sudo nano /etc/wvdial.conf

    修改三个引号行,我的修改如下:

    [Dialer Defaults]
    Init1 = ATZ
    Init2 = ATQ0 V1 E1 S0=0
    Modem Type = Analog Modem
    Phone = *99#
    ISDN = 0
    Password = guest
    New PPPD = yes
    Username = guest
    Modem = /dev/ttyUSB0
    Baud = 9600

    *99#:**联通的WCDMA的拨号网络号码

    Ctrl + O:保存修改的文件

  • 拨号上网!

    sudo wvdial

测试玻璃钢天线

LoRa节点

​ STM32L151/152器件利用Cortex-M3内核和频率介于32 kHz至32 MHz的CPU时钟扩展了超低功耗理念,并且不会降低性能。除了动态运行和低功耗运行模式以外,还有另外2种超低功耗模式为您带来了极低的功耗,同时还能保持RTC、后备寄存器内容与低压检测器的工作。项目主要使用的特性为片上集成的快速12位1 MSPS ADC。

🚀 回到顶部

主控STM32L151

  • 普通版 (WisNode)

    无论普通还是升级,网关配置完成后的第一步:填appkey

    对应TTN的设置,修改:LORAWAN_DEVICE_EUI 与 LORAWAN_APPLICATION_KEY

    #define LORAWAN_DEVICE_EUI                          { IEEE_OUI, 0xFF, 0xFE, 0xFD, 0xFC, 0x02 }
    																										//Modifications in the case of mass production
    /*!	
     * Application IEEE EUI (big endian)
     */
    #define LORAWAN_APPLICATION_EUI                     { 0x70, 0xB3, 0xD5, 0x7E, 0xD0, 0x00, 0x88, 0xA8 }
                                                         //70b3d57ef00046a4   70B3D57E D0007DFA
    /*!
     * AES encryption/decryption cipher application key
     */
    #define LORAWAN_APPLICATION_KEY                     { 0x73, 0xB6, 0x49, 0xCD, 0xA4, 0x90, 0x1E, 0x9F, 0xBC, 0xE5, 0xCD, 0x68, 0x68, 0xB6, 0x14, 0xC8 }
                                                         //Modifications in the case of mass production
  • 升级版 (Tracker Node)

外设

  • u-blox GPS芯片 MAX-7Q

    亮点:微型LCC封装;低功耗;UART 接口

    case 2: {
    	ret = GpsGetLatestGpsPositionDouble(&latitude, &longitude);
    	altitudeGps = GpsGetLatestGpsAltitude(); // in m
    	//printf("[Debug]: latitude: %f, longitude: %f , altitudeGps: %d \n", latitude, longitude, altitudeGps);
    	printf("GpsGetLatestGpsPositionDouble ret = %d\r\n", ret);
    	if (ret == SUCCESS) {
    		AppData[0] = 0x01;	//Data Channel
    		AppData[1] = 0x88;	//Type: 88 = GPSLocation
    		AppData[2] = ((int32_t) (latitude * 10000) >> 16) & 0xFF;
    		AppData[3] = ((int32_t) (latitude * 10000) >> 8) & 0xFF;
    		AppData[4] = ((int32_t) (latitude * 10000)) & 0xFF;
    		AppData[5] = ((int32_t) (longitude * 10000) >> 16) & 0xFF;
    		AppData[6] = ((int32_t) (longitude * 10000) >> 8) & 0xFF;
    		AppData[7] = ((int32_t) (longitude * 10000)) & 0xFF;
    		AppData[8] = ((altitudeGps * 100) >> 16) & 0xFF;
    		AppData[9] = ((altitudeGps * 100) >> 8) & 0xFF;
    		AppData[10] = (altitudeGps * 100) & 0xFF;
    		AppDataSize = 11;
    	} else {
    		AppDataSize = 0;
    		GPS_GETFAIL = SUCCESS;
    	}
    }

​ 所有外设均为ADC采样,测温范围-20℃~+80℃,测温精度±0.5℃;测PH 范围 0.0~14.0PH,测PH 精度,±0.01PH;下面为自定义的一段ADC采样函数

uint32_t CustomizeMeasureVolage( uint32_t channel )
{
    uint16_t vdd = 0;
    uint16_t vref = VREFINT_CAL;
    uint16_t vdiv = 0;
    uint16_t Voltage = 0;

    vdiv = AdcReadChannel( &Adc, channel );
    //vref = AdcReadChannel( &Adc, ADC_CHANNEL_VREFINT );

    vdd = ( float )FACTORY_POWER_SUPPLY * ( float )VREFINT_CAL / ( float )vref;
    Voltage = vdd * ( ( float )vdiv / ( float )ADC_MAX_VALUE );

    //                                 vDiv
    // Divider bridge  VBAT <-> 100k -<--|-->- 150k <-> GND => vBat = (5 * vDiv )/3
    Voltage = (5 * Voltage )/3;
    return Voltage;
}
  • 浊度传感器

    vdd3 = CustomizeMeasureVolage(EXTERNAL_ADC_PB12); //黑色 浊度
    AppData[4] = 0x03;	//Data Channel
    AppData[5] = 0x03;	
    AppData[6] = (vdd3 >> 8) & 0xFF; //@Suvan|| ADC_CHANNEL_18 EXTERNAL_ADC_PB12
    AppData[7] = (vdd3) & 0xFF;
  • PH计传感器

    vdd2 = CustomizeMeasureVolage(EXTERNAL_ADC_PA1);//绿色 PH
    vdd2 = vdd2*0.028;
    AppData[0] = 0x02;	//Data Channel
    AppData[1] = 0x03;	
    AppData[2] = (vdd2*10 >> 8) & 0xFF; //@Suvan|| ADC_CHANNEL_2 EXTERNAL_ADC_PA1
    AppData[3] = (vdd2*10) & 0xFF;
  • 温度传感器

    vdd4 = CustomizeMeasureVolage(BAT_LEVEL_CHANNEL);//白色 温度
    vdd4 = vdd4*0.2-200;
    AppData[8] = 0x04;	//Data Channel
    AppData[9] = 0x03;	
    AppData[10] = (vdd4*10 >> 8) & 0xFF; //@Suvan|| ADC_CHANNEL_20 BAT_LEVEL_CHANNEL
    AppData[11] = (vdd4*10) & 0xFF; 
    AppDataSize = 12;

上位机

🚀 回到顶部

服务器 (The Things Network)

The Things Network

Payload结构:数据类型

通道 类型 Object 量纲
01 88 GPS 定位 定位 N/A
02 67 Temperature 温度 °C
03 03 Analog Output 电量 mv
04 71 Accelerometer 加速度 g
05 7E Acidity 酸碱PH值 N/A
06 7F Conductivity 电导率 uS/cm
07 96 Turbidity 水质浊度 NTU
08 97 COD 化学需氧量 mg/L

服务平台 (Node.js)

​ 项目采用Node.js和Express框架设计,不仅缩短了平台的开发周期,并且较广泛的兼容各种管理终端。在基于阿里云服务器的平台下,完成了融合各种异构网络接口为一体的初步目标。实现了自动获取节点传感器实时监测数据,在平台后端对数据进行分析处理,通过HTTP协议展示到前端界面。Node.js的响应速度快、高并发、吞吐率高的特点能够使平台稳定的运行,并良好的支持用户的各种动作。

Ubuntu配置Node.js环境

  • 安装 Node.js

    curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
    sudo apt-get install -y nodejs

    如果失败,可能是没有安装 curl :curl 是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中,并且有DOS和Win32、Win64下的移植版本

    sudo apt-get install curl
  • 安装 git

    sudo apt-get install git
  • 创建工程目录

    mkdir Filename
    
  • 安装 The Things Network Node.js Application SDK

    cd Filename
    npm install --save ttn
  • 创建脚本文件 For example

    第一行注掉:
    //import { data, application } from "ttn"
    第二行添加:
    let ttn = require("ttn");
    let data = ttn.data;
    let application = ttn.application;

    多谢 3-304 马斌老师!

CentOS安装MATE桌面环境

  • 安装 X Window System

    yum groups install "X Window System"
  • 安装 MATE Desktop

    yum groups install "MATE Desktop"
  • 设置默认通过桌面环境启动服务器

    systemctl set-default graphical.target
  • 重启服务器

    reboot
    systemctl set-default multi-user.target  //设置成命令模式
    systemctl set-default graphical.target  //设置成图形模式

服务平台 (Node-red)

​ Node-RED 是构建物联网应用程序的一个强大工具,其重点是简化代码块的“连接”以执行任务。它使用可视化编程方法,允许开发人员将预定义的代码块(称为“节点”,Node)连接起来执行任务。连接的节点,通常是输入节点、处理节点和输出节点的组合,当它们连接在一起时,构成一个“流”(Flows)。

🚀 回到顶部

树莓派(Node-RED)

树莓派本身预安装Node-RED,所以只需要update

update-nodejs-and-nodered

update成功会出现打出以下message

All done.
  You can now start Node-RED with the command  node-red-start
  or using the icon under   Menu / Programming / Node-RED
  Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880

安装node-red-admin到【全局目录】

cd ~/.node-red
sudo npm install -g node-red-admin

生成个人密码

node-red-admin hash-pw
Password: 
$2a$08$ysZq7ivCwbQBNCCsvSJ89u1IUzskYfchCnoLVIm7KySLIqI5vqvDu

配置node-red

nano ~/.node-red/settings.js

sudo systemctl enable nodered.service
sudo reboot

阿里云(Node-RED)

🚀 回到顶部

安装Node-red

注意,阿里云需要打开1880端口

管理控制台 --> 产品与服务 --> 安全组规则 --> 入方向 --> 添加自定义 TCP

Node-red 点亮 led

开启:node-red,打开http://192.168.0.108:1880/

192.168.0.108是树莓派在局域网的IP地址

Manage palette,安装 node-red-dashboard & node-red-node-pi-gpiod

[{"id":"7c1e7b4b.da34e4","type":"rpi-gpio out","z":"1fe5d95c.88e647","name":"led","pin":"7","set":true,"level":"0","freq":"100","out":"out","x":810,"y":340,"wires":[]},{"id":"8b812881.120738","type":"ui_switch","z":"1fe5d95c.88e647","name":"","label":"LED","group":"f94ed544.fa12c8","order":0,"width":0,"height":0,"passthru":false,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":430,"y":340,"wires":[["dd1b0223.69643"]]},{"id":"dd1b0223.69643","type":"change","z":"1fe5d95c.88e647","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"true","fromt":"bool","to":"1","tot":"num"},{"t":"change","p":"payload","pt":"msg","from":"false","fromt":"bool","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":620,"y":340,"wires":[["7c1e7b4b.da34e4"]]},{"id":"f94ed544.fa12c8","type":"ui_group","z":"","name":"Switch","tab":"d010dc9f.a4fc1","order":1,"disp":true,"width":"6"},{"id":"d010dc9f.a4fc1","type":"ui_tab","z":"","name":"My PI3b","icon":"dashboard","order":1}]

打开 dashboard,完成

其它

🚀 回到顶部

Q&A

LoRa通信模块为什么封装都有一个2mm的通孔,LDO为什么距离模块那么近?

​ LoRa通信对供电的纯净性有比较高的要求,虽然芯片能够对电源噪声进行抑制,但LoRa灵敏度实在太高(-135 dBm~-148 dBm,Zig-Bee也只能低至-96 dBm,白噪声主要分布在-120 dBm),让我们不得不极为重视GND的纯净性。因此有两个对策:

  • 一般使用纹波/噪声比较小的LDO或者线性稳压器件,以降低噪声,减少发热量(当然控制好压差);
  • LDO输出的GND与SX1276/78的GND PAD非常接近。

在Ubuntu中,有时候运用sudo apt-get install 安装软件时,会出现一下的情况

E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)

E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

LoRa为什么Radio层传输速率越快,通信距离越短?

从以下表格可以看出SF=9相对7的时候,SNR灵敏度提高了5dB,SF=12时候更是提高12.5dB。从无线电传输公式可以得知:

传输损耗(dB)= 20lgF(MHz)+20lgD(km)+经验常数

SNR越大,意味着通信链路预算值越高,也意味着传输距离更远。用经验公式推断:增加6dB的链路预算,可以提高大约2km的传输距离(实际情况会发现,增加12dB并没有获得更多的通信距离,这是还有其他的参量发生作用,在此不详细讨论)

Other

第一代网关展示

第二代网关展示

🚀 回到顶部 |

About

开发笔记


Languages

Language:C 92.4%Language:C++ 3.6%Language:HTML 2.1%Language:Makefile 1.5%Language:Assembly 0.4%Language:Objective-C 0.0%