LoRa天线电路设计四大要点

随着LoRa技术在业内的持续发热,加上其独特优越的传输性能,运用LoRa技术的群体正在爆发式的增长,由于很大部分群体对LoRa等射频技术均是初次接触,在做产品的过程中,通常会遇到棘手的射频电路设计问题,其实只要掌握几大要点,就基本可以发挥LoRa的最佳性能。要点一、匹配电路设计在原理图设计时,需要在天线接头与模块的天线引脚之间预留一个π型匹配电路。天线的阻抗是受到电路板的铺地、外壳和安装角度等因素...了解详情

LoRaWAN实战 LinkADR命令的源码分析

前言LinkADR是LoRaWAN网络管理中相当重要的一个MAC命令,其解析占用了183行。索性专门写篇源码解析,记录下。阅读此文前,最好再把第五章的这个命令好好翻一翻,代码和协议才能对应上。我正在陆续对协议的各个章节进行翻译,具体其他章节的译文,以及译文之外的代码解析,可点此查看帖子LoRa学习笔记_汇总。本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/LinkADRReq 的源码解析按照代码思路走一遍。1.解析 DataRate_TXPower 字段datarate = payload[macIndex++];txPower = datarate & 0x0F;datarate = ( datarate >> 4 ) & 0x0F;if( ( AdrCtrlOn == false ) &&( ( LoRaMacParams.ChannelsDatarate != datarate ) || ( LoRaMacParams.ChannelsTxPower != txPower ) ) ){ // ADR disabled don't handle ADR requests if server tries to change datarate or txpower// Answer the server with fail status// Power ACK = 0// Data rate ACK = 0// Channel mask = 0AddMacCommand( MOTE_MAC_LINK_ADR_ANS, 0, 0 );macIndex += 3; // Skip over the remaining bytes of the requestbreak;}如果终端ADR没开,那么就立即丢弃本命令处理。这里的macIndex += 3是对应LinkADRReq的剩余命令长度3而言的。2.解析 ChMask 字段chMask = ( uint16_t )payload[macIndex++];chMask |= ( uint16_t )payload[macIndex++] << 8;3.解析 Redundancy 字段nbRep = payload[macIndex++];chMaskCntl = ( nbRep >> 4 ) & 0x07;nbRep &= 0x0F;if( nbRep == 0 ){nbRep = 1;}把字段中的 chMaskCntl 和 nbRep 都给解析了出来。4.按地区规定处理 chMaskCntl ,及判断 ChMask 有效性#elif defined( USE_BAND_470 )if( chMaskCntl == 6 ){// Enable all 125 kHz channelsfor( uint8_t i = 0, k = 0; i < LORA_MAX_NB_CHANNELS; i += 16, k++ ){for( uint8_t j = 0; j < 16; j++ ){if( Channels[i + j].Frequency != 0 ){channelsMask[k] |= 1 << j;}}}}else if( chMaskCntl == 7 ){status &= 0xFE; // Channel mask KO}else{for( uint8_t i = 0; i < 16; i++ ){if( ( ( chMask & ( 1 << i ) ) != 0 ) &&( Channels[chMaskCntl * 16 + i].Frequency == 0 ) ){// Trying to enable an undefined channelstatus &= 0xFE; // Channel mask KO}}channelsMask[chMaskCntl] = chMask;}如果 chMaskCntl 为6,则所有信道都使能。如果 chMaskCntl 为7,则由于未定义返回失败。其他有效 chMaskCntl 情况下,先检查是否有未定义的频点,如果没问题则更新对应的channelsMask。5.判断速率有效性if( ValidateDatarate( datarate, channelsMask ) == false ){status &= 0xFD; // Datarate KO}6.判断发射功率有效性if( ValueInRange( txPower, LORAMAC_MAX_TX_POWER, LORAMAC_MIN_TX_POWER ) == false ){status &= 0xFB; // TxPower KO}7.全部判断通过后更新参数if( ( status & 0x07 ) == 0x07 ){LoRaMacParams.ChannelsDatarate = datarate;LoRaMacParams.ChannelsTxPower = txPower;memcpy1( ( uint8_t* )LoRaMacParams.ChannelsMask, ( uint8_t* )channelsMask, sizeof( LoRaMacParams.ChannelsMask ) );LoRaMacParams.ChannelsNbRep = nbRep;}8.回复MAC命令 LinkADRAnsAddMacCommand( MOTE_MAC_LINK_ADR_ANS, status, 0 );突然发现 AddMacCommand 的形参只有CID加2字节的回复,我是太无聊,把终端所有MAC命令都翻了一遍,确认所有payload确实是小于2字节。再次赞扬LoRaWAN协议的精简作风。End了解详情

唯传LoRa网关路由器测试结果惊人,稳定传输可达21.5公里

近日,唯传科技应客户需求,对GW5000网关路由器(城市级)进行了长距离测试。因客户所处区域在戈壁滩上,准备在20 公里范围内安装1200个探测设备,选用基站进行远距离数据监测和传输。考虑到客户实际需求,唯传决定在深圳区域寻找大范围空旷地带模拟客户需求环境进行现场测试。此前半年,唯传也已经多次进行LoRa最大空空通讯距离的测试,测试结果得到了Semtech公司的高度认可。7月29日,唯传公司将GW...了解详情

花费200欧元打造自己的LoRa网关

本文来源https://github.com/isiot/diy_LoRa_gateway本教程介绍一个便宜的LoRa网关的制作步骤,然后让节点、网关和云在一起运行。注:本文仅翻译自github,并未亲测part1硬件选择我要介绍的LoRa网关,运行在sx1301之上,该芯片不能单独出售,只出售给符合条件的客户。唯一的办法就是购买一个成品的网关板。目前市场基于sx1301的LoRa网关板有:Semtech LoRa物联网入门套件,只出售给符合条件的客户IMST iC880A,约189欧元:Multitech mCard-LoRa, 约156欧元:Link Labs LoRaWAN Raspberry Pi(树莓蒎) Gateway Board, 225美元:Cisco LoRa card, sold with Cisco IR900 router only(思科LoRa板卡,只提供思科IR900路由器):只有Multitech mCard-LoRa符合我们的预算,而剩下的其他硬件就很便宜了。mCard LoRa是一个为Multitech MultiConnect Conduit router定制的插件板,这个Mini-PCIe card没有使用文档可以提供,因为它是即插即用的。但是如果我们想把用它在其他的硬件环境下,我们应该对它进行逆向拆解。余下的硬件则需要一个嵌入式Linux主机像Raspberry Pi,25欧元:以及一个 USB to Mini-PCIe转换器, 5欧元:对了,别忘了还有电源适配器、电缆和天线。进入第2部分我们将探讨对mCard LoRa硬件上的修改。part2硬件改造mCard LoRa是一个Mini-PCIe规格的板卡。包含有一个sx1301基带芯片和两个sx1257 I/Q调制收发器(1 TX 2 RX) ,都集成在一个很小的板上。图中,射频链用蓝色线画出,包含发送通道上的“平衡-不平衡转换器”BALUN,声表面波滤波器saw,功率放大器PA,滤波器和开关接收通道上的声表面波滤波器saw,低噪声放大器LNA,声表面波滤波器saw在另一层有一个FTDI SPI转USB转换器FT232,以及一些电源芯片请看USB转Mini-PCIe板卡的电源引脚,GND引脚连接到地,3.3V的电源引脚(2,24,52)连接到了一些电源芯片的输入上(用于为数字部分供电)。但是为模拟部分供电的电源芯片的输入接到了引脚23和25。3个LDO器件lp38502sd-adj用于模拟供电并调整到3.3V输出,所以它们 的输入电压应该大于3.52v,因为它们工作时的最小压差是220mv,总之,我决定为迷你PCIe连接器的23和25脚提供5V电压,这个5V电压从 USB接口处取得。我推荐你使用一个质量好的USB接口供电.树莓蒎2有USB电流限制以防止集线器启动,可以修改启动文件/boot/config.txt,增加max_usb_current = 1来增大USB电流。part3软件编译Raspberry Pi足够强大,Raspbian(Raspbian,树莓派自带的基于debian的OS)系统自带了GCC,Git…这样我们就可以在Raspberry Pi里面进行软件编译,而不需要在桌面PC上编译后上传二进制文件到Raspberry Pi。打开一个控制台或SSH会话,默认的用户名是“pi”和密码“raspberry”。首先我们需要FTDI芯片FT232HQ的驱动(libmpsse.so),不要试图在网上找到它,因为它是依赖于平台的,所以最好是从源码编译:现在我们可以继续关于LoRa网关的部分了:下载源代码和编译,一旦完成编译,就把他们复制到 ~/lora/exec:最后,我们执行的LoRa gateway:本节我使用了这些链接作为参考资料:https://github.com/Lora-net/lora_gateway/blob/v3.1.0/libloragw/install_ftdi.txthttps://github.com/Lora-net/packet_forwarder/wiki/Use-with-Raspberry-Pipart4软件修改LoRa网关的软件部分本来应该做适当修改再进行编译的,但本教程第3部分用来编译的代码是我从原始lora_gateway代码fork的一个分支并做了必要的修改,所以你不需要修改任何文件如果你想知道我所做的修改,请阅读下文并查看我提交的commits。我第一次编译时,软件并没有运行起来,我意识到USB驱动没有被识别,因为我手上的mCard与LoRa开发套件(即与 https://github.com/Lora-net/lora_gateway 配套的套件)使用了不同的FTDI USB to SPI转换芯片FT232H,每个FT232H都有不同的PID(Product IDentification),我修改了源文件中的以下文件:loragw_spi.ftdi.c99-libftdi.rules为了使用FTDI SPI,我们必须做以下修改library.cfg现在,板子可以被正确识别但是还不能与SX1301通信,因为板子还处于复位状态,复位引脚是由主机通过FTDI的GPIO引脚来控制的,修改以下文件:loragw_spi.ftdi.c现在sx1301似乎开始工作但没有读寄存器,这是因为sx1301没有时钟源,两个sx1257通过共享的TCXO进行时钟驱动,sx1257具有时钟输出,用于驱动sx1301时钟, 查看schematic的文档,我发现是radio_0的时钟输出而不是radio_1的被连接到了sx1301的时钟输入,所以修改以下文件:global_conf.json完工!!!Note:写完本教程以后,MultiTech公开发布了具有相同补丁的的GIT库文件,地址在http://git.multitech.net/cgi-bin/cgit.cgi/lora_gateway.git/commit/?h=1.7.0-mts了解详情

LoRaWAN协议(七)–完整数据流程

以下的GW指Gatewa所用指令tcpdump -i lo -nn -x 'length>100入网流程OTAA入网流程,ABP方式入网则不需要NS ->AS ->NS ->AS ->NS->GW Join_accept messGW ->数据通讯流程GW->NS ->AS ->AS ->app.userdata.payload bas...了解详情

LoRaWAN协议(六)–OTAA KEY生成过程

前言通过OTAA方式入网的设备,通讯时使用的KEY需要通过服务器获得,在入网之间,设备无法通讯。相关的OTAA入网流程已经在上一章中讲解过了,有兴趣的可以去看看*LoRaWAN协议(五)__OTAA入网方式详述**这一章讲解的是OTAA中的密钥生成过程。其中使用到的库函数都是从semtech的官方库中来的,官方库代码链接:LoRaMac-node。详解设备在通讯时,会使用的密钥有NwkSKey 和AppSKey。生成的公式如下:NwkSKey = aes128_encrypt(AppKey, 0x01 | AppNonce | NetID | DevNonce | pad16)AppSKey = aes128_encrypt(AppKey, 0x02 | AppNonce | NetID | DevNonce | pad16)可以看到相关的参数一共有四个:1.AppNonce2.NetID3.DevNonce4.pad16其中AppNonce、NetID、pad16 是产生于服务器的,DevNonce产生于node设备本身。还是使用LoRaWAN协议(五)这篇文章中使用的包数据来进行分析。这里,我们调用官方库的接口,因为我们这里只是熟悉协议,并不是要研究Key的生成算法。如果不明白数据协议的,可以去看LoRaWAN协议(五)这篇文章提取DevNonce1.GW->NS JSON包,从中提取出来DevNonce,data为MAC层数据,为join_request message,其数据包格式为
MHDAPPEUDevEUDevNoncMI
1字节8字节8字节2字节4字节
base64解码得到的数据
字段内容
MHD\x0
AppEU\x01 \x00 \x00 \x20 \x00 \xc5 \x26 \x2
DevEU...
了解详情

LoRaWAN协议(五)–OTAA入网方式详述

前言OTAA(Over-The-Air Activation),是LoRaWAN的一种空中入网方式。当node在上电的时候处于非入网状态时,需要先入网才能和服务器进行通信。其操作就是node发送join_request message,请求入网,然后服务器同意入网,并且返回Join-accept message,node再对信息进行解析,获取通信参数,之后就可以和服务器通信了。顺便分享几个工具网站给大家...了解详情

LoRaWAN协议(四)–入网方式概述

前言在LoRaWAN中,node最终和服务器能够正常数据交互,需要先入网,入网的本质,也就是获得一些通信相关的参数,有以下几个NwkSKeAppSKeDevAddDevEu其中NwkSKey用于数据的校验,也就是说在MIC校验时会用到AppSKey用于负载的AES加密,也就是说在加密解密时会使用到DevAddr是node的短地址,在数据通讯时,使用的是node的短地址DevEUI 在AB...了解详情

LoRaWAN协议(三)–Server端数据协议

LoRaWAN Server 端架构LoRaWAN 的server包括 NS(Network server)、AS(application server)、CS(Custom server)....其中NS和AS是必不可少的,是完成LoRaWAN协议的重要组成部分NS 职责NS是直接与GW通信的服务器,也是AS和GW之间的桥梁我所知道的工作有如下几点验证数据的合法性(校验MIC从GW的信息中提取数据,整理成NS 的JSON数据包...了解详情

LoRaWAN协议(二)–LoRaWAN MAC数据包格式

名词解析上行:终端的数据发送经过一个或多个网关中转到达网络服务器。下行:由网络服务器发送给终端设备,每条消息对应的终端设备是唯一确定的,而且只通过一个网关中转。LoRaWAN ClasseLoRaWAN Classes 一共分为3类:Class A,Class B,Class Class A:终端先发送,在发送后开启一段时间的接收窗口,终端只有在发送后才可以接收。也就是说上行没有限制,下行的数...了解详情

LoRaWAN协议(一)–架构解析

LoRaWAN 分层总体架构一共分为4部分LoRaWAN从底层到最后用户拿到数据的通讯过程通讯大致可分为三段MOTE <—> GWGW <—>server <—LoRa联盟 规定了 MAC层的通讯协议,只有在设备(GW、MOTE)共同遵守的MAC层协议的前提下,不同硬件厂商的设备才能互相接入。而GW <—> Server以及Server <—&g...了解详情

LoRaWAN stack移植笔记(六)_调试2

前言调试的过程中碰到的问题基本都是以前没有遇到过的,而且需要对整个协议栈及射频方面的工作流程较熟悉才能找到问题的原因,需要多读SX1276的数据手册以及与射频芯片的物理层通信例程和MAC层通信例程进行对比相结合。正文发送失败LoRa 模块在进行 模式切换时,比如TX 切换到RX模式,需要先将设备切换到standby模式CRC 校验失败,然后程序陷入死循环按逻辑来讲,CRC校验失败,应该进行的操作是...了解详情

LoRaWAN stack移植笔记(五)__调试1

先废话一小段在将LoRaWAN的程序移植的过程中,调试发现了很多的问题。做好记录工作,防止以后再踩坑移植使用的是LoRaMac-node库,使用的是STM32L151CBT6 MCU,需要要移植到STM32L051C8T6 这个MCU上面。开始正文JLink的配置由于第一次使用JLink(SWD方式),在一开始使用时,踩了几处坑:KEIL选择JLINK之后,点击设置进入,会出现一个对话框,要选择NOKEIL里面JLINK的 方式要选择SW,不然认不到芯片Flash download要选择对应大小的芯片,注意Flash的大小要选择正确程序无法进入main,甚至一个函数都没有跑当配置完JLink之后,程序可以正常烧写调试了,但是问题又出现了,无法跑进main函数,再进一步调试,发现来一个函数都没有执行,直接就进入进入死循环了(通过单步调试看上面的汇编代码)。这个现象就很奇怪了,以前也没有碰到过。因为3.3V和GND是正常的,这样就算晶振有问题,也会执行程序到配置晶振才会出问题,而不是一句函数都没有执行。后来顿悟,大概是BOOT0没接,仔细一看原理图,果然BOOT0是悬空的,飞线焊上之后,问题终于得到了解决。NOTE:画原理图时一定要主要,BOOT0一定要接地,这样程序才能正常从FLASH启动RTC定时链表的配置官方的库中使用了RTC来作为定时器来处理一些定时的事件,这也是库中唯一的任务调度机制。所以保证这个机制的正常运行非常重要。但是,当我把一切参数都配置完成之后,却发现,RTC的定时器不听使唤,经常不进入中断,初步诊断是写入寄存器的定时时间出了问题,但是却找不到出问题的原因。这个问题也是非常的诡异,至今还未发现原因。但是在一次偶然的调试中,我将原本处于static void RtcStartWakeUpAlarm( uint32_t timeoutValue )这个函数中的RtcCalendar_t now;RtcCalendar_t alarmTimer;RTC_AlarmTypeDef alarmStructure;这三个变量由局部变量改为了全局变量,问题就得到了解决。但是原因还未发现。原本以为是变量未赋初值就使用,但是程序中都有在使用前赋初值,具体原因不明。程序进入Default_handler在调试程序的时候,程序又出现跑死的情况,然后单步调试发现程序进入了Default_handler这里,始终无法跑出来。然后通过搜索得知,进入这里的情况应该是发生了中断但是没有处理,然后程序一直进入中断。后来查看代码发现,由于Cotex-M3和cotex-M0的核,对GPIO的中断的入口是不一样的,在移植时需要做修改,在做了修改之后,程序终于跑正常了。无法点对点通信需要注意的是,点对点通信中,能够建立条件需要两个点的通信参数配置成相同。特别注意的是iqInverted preamble SYNCWORDnote:1. 如果发射方使能了iqInverted,那么接收方也要使能iqInverted2. 接收方的preambleLen必须设置大于发射方,否则有很大可能接收不到(偶尔可以收到,但是接收成功率很低)3. 发射方和接收方的SYNCWORD必须设置一样(同步字一样),否则认为是不同网络接收机在接收检测时,会先检测前导码的长度,小于设置的最大接收长度时再检测同步字的内容,看是否一致,都符合时,才会接收负载的内容。邮箱地址:454626653@qq.com 欢迎咨询搭讪了解详情

LoRaWAN_stack移植笔记(四)__RTC

stm32相关的配置由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱动所以做修改。RTC 的配置此例程中,RTC被当做定时器使用,用于定时执行任务。例程中,RTC使用外部LSE的32.768Khz的晶振作为时钟源而在本设计中,使用内部LSI作为RTC的时钟源,需要重新...了解详情

LoRaWAN_stack移植笔记(三)__SPI

stm32相关的配置由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱动所以做修改。SPI 的配置SPI使用的是STM32的硬件接口-SPI1 MOSI MIS可以看到例程中,对SPI接口进行了再一层的封装,封装如下其中是原先的STM32Cube库的封装,在此基础上...了解详情

LoRaWAN_stack移植笔记(一)–RF硬件相关

和硬件相关的问题TCXO 的使用根据SX1276数据手册如果使用TCXO,则需要配置RegTcxo寄存器为0x19,代码如下否则配置为0x09,因为芯片上电默认不使用TCXO,即上电寄存器值即为0x09,所以无需配置PA_BOOST 引脚的使用根据sx1276 数据手册如果使用PA_BOOST作为RF输出,则需要配置PaSelect脚为RXTX switch(接收和发送的天线电路的切换在图中...了解详情

LoRaWAN_stack移植笔记 (二)_GPIO

stm32相关的配置由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱动所以做修改。另外例程中对STM32库函数的再一次封装的方法也非常值得学习。GPIO 的配置例程中可以看到,对IO口的初始化只有这一句,是因为例程中对GPIO的操作进行了封装,方便了上层的使用。例程中使用Enum定义了64个IO口,其中...了解详情