LoRaWAN学习心得

LoRaWAN学习心得关于LoRaWAN学习的小小心得

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

LoRaWAN学习心得

1.学习历程

在前面学习了Linux高级编程的基础上,开始对硬件正式有所交集,以前学习Linux可能只知道某些传感器的数据存放在哪个文件夹下,读取相应的数据就完事,大部分是应用层方面的实现,而不知道这些传感器的数据具体是怎么来的。学习了stm32单片机之后,与硬件打交道,离底层又更近了一步。

当然开始学习stm32的时候,只是照着一些资料依葫芦画瓢,并没有真正理解实现的原理。只知道跟着资料一顿操作之后,如果烧录程序进入开发板,能够实现相应的功能就万事大吉。这样的学习只能解决有教程的问题,而如果想要独立实现某功能,会很困难。

后面在学习了流水灯,蜂鸣器,按键,声音传感器,光强传感器等基本期间的使用之后,逐渐进入一些协议的学习,比如一线协议的DHT11温湿度传感器,DS18B20温度传感器的工作原理;I2C协议SHT30温湿度传感器的工作原理,OLED显示屏的基本使用;串口的输出,使用esp8266连接WIFI利用MQTT协议实现温湿度上报云平台,了解NB-IoT基本原理等;到后来学习SPI协议,利用SX1278LoRa模块实现两个模块透传,实现LoRaWAN网络结构的温湿度上报。其实对于像单片机这种与硬件打交道来说,底层的原理都是死的,无非就是引脚的配置和使能,使用哪些协议,告诉CPU这个“大蜘蛛”,现在要哪几个脚去干什么,其他的过程都差不太多,当然很重要的一点是原理图和芯片datasheet的了解。就像LoRaWAN的学习,其实并不是要让你去写整个LoRaWAN的体系结构,从寄存器开始写到应用层,而是要学会模块驱动的移植,协议栈的移植,以及实现整个网络体系中需要终端节点干的事,比如数据的采集,数据的发送以及接收等基本功能,也不需要自己去写底层驱动,操作寄存器等,重要的是理解每一环的作用和实现的原理。

2.关于LoRaWAN

LoRaWan 网络架构
下图是 LoRa以及LoRaWAN在通用的物联网架构中的位置:
在这里插入图片描述

•LoRa:是无线接入技术,在物联网架构中,LoRa 处于物联网的无线终端感知层和网络传输层。因此 LoRa 本身并不是物联网的全部,只是物联网的一部分。

•LoRa 终端:通过传感器采集物体的信息,并通过 LoRa 无线空口技术,把数据传输给 LoRa 无线基站。

•LoRa 无线基站:提供对 LoRa 终端的无线接入和汇聚,LoRa 无线基站通过以太局域网或 2G/4G/5G 的公共移动通信网,连接到 LoRaWAN 广域网络服务器。

•LoRaWAN 服务器:可以管理多个 LoRa 无线基站,同时充当 LoRa 终端连接物联网云平台的网关。

下图是 LoRa 联盟推荐的 LoRaWAN网络架构:
在这里插入图片描述

•LoRa Node:LoRa 终端节点

•Concentrator:实现对 LoRa 终端节点提供接入和汇聚功能的 LoRa 基站(网关)。

•Network Server:LoRa 的核心网,用于管理 LoRa 网络中所有的 LoRa 节点。

•Application Server:由不同业务领域的服务器组成,并通过 Web 或手机接入的方式向用户提供业务服务。

与通用物联网架构的区别是,在此架构中,没有一个显式的、支持各种物联网无线接入的、通用的物联网云平台层。该云平台可以从 ApplicationServer 中分离出来,处于 Network Server 和 Application Server 之间。可以与 Network Server 一起部署。

当然目前我学习的主要是LoRaWAN节点的开发,主要负责终端节点采集数据以及数据的发送和接收,主要掌握A类和C类节点的开发使用。其实这两类节点的差别并不是很大,毕竟C类是在A类的基础上实现的,只是C类在数据接收方面更灵敏,但是功耗更大。

3.学习心得
从刚开始了解SPI协议,了解SPI协议需要哪些引脚,各自的功能,SPI工作的四种模式,SPI主设备是怎么和从设备进行数据交换,通过短接MISO和MOSI引脚进行SPI的回环测试等等。然后是SX1278模块的驱动移植,通过在semtech官网下载对应模块的驱动文件,对照着官方的介绍以及查找的资料进行驱动的移植,当然SX1278模块和MCU之间的连通主要用到的是SPI协议,只不过除了SPI的四根线以外还有VCC,GND,DIO0和RESET,需要在移植的驱动文件里对着自己单片机配置的相应引脚进行更改,对于不需要用到的文件或者配置只需要删除和注释就行了。很重要的是要查找资料,修改LoRa模块的发射频率等一些配置参数,因为在不同的地区这些参数都不一样,这一点在LoRaWAN协议栈的移植过程中也很重要,最后需要在主函数里调用发射/接收函数,实现自己想要的功能即可。当然一次就成功的几率很小,会有很多看似不重要的参数决定着本质上的问题,比如说SX1278的SPI支持最大速率等。

在实现LoRa两个模块消息点对点的通信之后,开始对LoRaWAN的协议栈进行移植。这次可比SX1278驱动移植困难更多,因为虽然官方有协议栈移植的说明文件,但是很多自己单片机用不到的文件或者函数需要修改,不然一编译满屏的报错,需要对着一个个错误进行修改,这个有一定的工作量,首先需要实现ping-pong固定频率测试,就相当于升级版的LoRa模块互传,只不过两个模块都可以作为主(从)设备,且收发频率固定。

之后进行LoRa模块节点与网关通信,首先需要了解节点的类型,以及各种节点的工作模式和原理,然后是节点入网的激活,数据在收发过程中,关于地区,频点,信道等方面的参数都需要自己去查找资料进行修改,数据从应用层到物理层的封装过程需要了解,数据的加密方式等,虽然关于协议栈方面不需要自己写很多的代码,但是需要自己查看源码,查找相应资料进行理解。很多东西给你封装好了不一定是好事,虽然使用方便了,但是对于学习来说,更需要花时间和精力去挖掘底层的原理。

在LoRaWAN入网,信道选择,收发信息等过程中,运用了很多网络和通信有关的知识,比如说OTAA/ABP激活方式,发送时进行信道冲突避免的ALOHA协议算法(duty-cycle),ADR自动优化传输速率,CAD检测前导码机制,AES-128加密算法,SF扩频因子,和TCP/IP协议类似的MAC/PHY数据包分层封装/解封的机制等等,想要理解整个LoRaWAN网络结构,除了了解协议栈函数的调用实现相应功能,配置相应的参数以外,关于通信方面也需要深入研究,特别是数据在发送过程中的调制,解调,加密,怎样让数据收发效率最高,可靠性最高,都是需要研究的问题。

整个LoRaWAN网络架构还只是学习了部分,且正在继续挖掘深层原理中,仍需努力!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179661.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • codeblocks中文编码问题

    codeblocks中文编码问题其实这是老调重弹的问题了,在windows下面出现中文乱码大多都是编码格式的问题不一致的问题,最简单的就是uft-8和gbk冲突的问题。如果一个文件本来是以utf-8存的,但是以gbk打开,当然会出现乱码了。方法一:用utf-8打开文件linux中中文常用的格式是utf-8,minGW是gcc的编译器,默认是utf-8格式,但是我们打开Setting/Editor/EncodingSetting

  • 如何让你的网站支持 IE9 Pinned Site (Part 2 – 实战)

    如何让你的网站支持 IE9 Pinned Site (Part 2 – 实战)

  • 用注册机注册Keil

    用注册机注册Keil注册前需用管理员权限打开软件,不然会提示ERRORR206:NOREGISTRYACCESS,ADMINISTRATIONRIGHTSREQUIRED。截至到2032年的最新注册机链接:https://pan.baidu.com/s/1kfVnA6FL_ZvHGpQPtZprTw提取码:tu2m

  • docker 修改容器时间_jenkins docker持续集成

    docker 修改容器时间_jenkins docker持续集成前言用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间查看时间查看系统时间date-R进入docker容器内部,查看容器时间dockere

  • 测试sleep()和pthread_cond_timewait()之间的区别

    测试sleep()和pthread_cond_timewait()之间的区别用来测试sleep()和pthread_cond_timewait()之间的区别通过#if0/1来分别测试当从终端输入q时,通过打印来判断是否可以立即返回结束线程,还是要等睡眠时间到了才能结束线程。当条件满足时,pthread_cond_signal()来触发代码#include<stdio.h>#include<stdlib.h>#include<strin…

  • adb shell 命令大全_adb版本查看命令

    adb shell 命令大全_adb版本查看命令一、adb相关命令。1.关闭adb服务:adbkill-server2.开启adb服务:adbstart-server3.查看当前连接的手机设备:adbdevices4.多设设备操作,<-s虚拟设备名称>5.重启设备adbreboot–指定虚拟设备adb-s设备名称reboot6.查看日志adblogcat清除日志a…

    2022年10月18日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号