×

接收LoRa数据包的实践示例

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-21

张娟

分享资料个

介绍

LoRa Lo ng Range的缩写)是火星这一侧最令人惊叹的物联网通信技术。随着 Semtech 对法国公司 Cycleo 的收购,LoRa 在 2012 年崭露头角,作为低功耗、低成本物联网传感器设备的首选无线通信方法,LoRa 的人气持续上升。

在本教程中,我们将简要概述 LoRa 的特殊之处,并提供使用最新的 LoRa 无线电 IC SX1262 以及使用IoT.Keystone Innovator Board 发送和接收 LoRa 数据包的实践示例。

关于 SX1262 的一些信息

SX1262 于 2018 年推出,能够以高达 22 dBm 的功率输出在全球所有主要的 sub-GHz ISM 频段中运行。在 sub-GHz 频段(例如 868 或 915 MHz)中运行是在城市室内、室外和工业环境中实现远距离传输的关键。它有一个微控制器友好的接口,由 4 线 SPI、BUSY 信号和 RESET 线组成。固件驱动程序是开源的也很棒。

罗拉

在我们看来,LoRa 的伟大之处在于它不仅提供比传统调制技术更远的范围和更强的抗干扰性,而且它以用户友好的方式描述其操作特性。那是什么意思呢?

使用 LoRa,只需转动 3 个参数或旋钮即可控制传输范围、数据速率和能耗等关键特性。如您所料,当您配置更长的范围时,您的数据速率会下降并且能耗会增加,反之亦然。

您需要了解的主要参数是扩频因子、带宽和编码率。

扩频因子(SF)。从 SF5 到 SF12 只有 7 个级别,SF7 是中短距离设置的典型设置。随着扩频因子的增加,范围增加,数据速率下降,空中时间增加(即发送数据包的时间,这会消耗更多能量)。很酷的是,这些设置中的每一个都是彼此“正交”的,这意味着您可以设置 7 个不同的发射器和接收器对,以在同一频段同时运行而不会受到干扰!

带宽 (BW). 这里只有 3 个主要设置:125 kHz、250 kHz 和 500 kHz,尽管对于一些非常特殊的低比特率应用,无线电将支持低至 7.81 kHz 的一些较低带宽。应该注意的是,LoRaWAN 是一种流行的 MAC 层,在 LoRa 之上工作,仅使用 3 个带宽 125、250 和 500 KHz。您可以通过更高的带宽推送更多数据,从而提高有效比特率。结果,播出时间随着能源消耗而减少。但是,您会在射程上受到一些影响。我会提到术语“比特率”在物联网中有点用词不当,因为许多物联网解决方案对能够连续发送数据不感兴趣。比特率只是影响每次传输的空中时间(通常只在长时间睡眠期间很少发生)以节省电池电量。

编码率(CR)。LoRa 数据包引擎将对您的数据执行“前向纠错”编码,以便接收方可以实际处理传输中的一些错误,而不会损坏您的数据。此功能实质上为您的数据负载增加了一些冗余。这里有 4 个可能的级别:4/5、4/6、4/7 和 4/8。这意味着对于每 4 位真实数据,LoRa 数据包引擎将创建 5、6、7 或 8 个用于传输。所以正如你所看到的,实际传输的数据量可能是你想象的两倍。随着编码率的增加,您将获得更远的距离,因为接收器可以容忍传输中的更多错误。最常见的编码率是最低设置 4/5。

物联网.Keystone

我们认为 LoRa 非常酷,因此我们构建了自己的名为IoT.Keystone的硬件和固件平台,以便轻松地将 LoRa 技术集成到低功耗物联网传感器设计中。

配置

在GitHub 上提供的开源固件中,我们有一个名为LoRa-Radio的应用程序,它提供对威廉希尔官方网站 板及其 SX1262 无线电的命令行控制。借助IoT.Keystone创新板的“USB 记忆棒”外形,我们只需将其插入可用的 USB 端口即可。操作系统将注册一个串行/COM 端口,我们可以将我们最喜欢的终端应用程序调整到它。确保它在 115、200 波特率 N、8、1 下工作。还要确保终端应用程序终止使用 LF(换行符)或 CR-LF 输入的命令。这是IoT.Keystone固件描述命令所必需的。当在空行上按下回车键时,我们会看到这样的提示:

#0012.4b00.18a7.f322>

玩弄

您需要两个运行 LoRa-Radio 固件应用程序的 IoT.Keystone 板。这里我们有一个 ID为f319的节点设置为发送器,一个 ID为f322的节点设置为接收器。

我们将从在两者上设置相同的参数开始:

选择任意频率 915000 kHz。从技术上讲,这里可以使用任何东西,但天线系统当然会针对特定频段进行调谐。我们的设置适用于涵盖 902 - 928 MHz 的 915 MHz ISM 频段。

#0012.4b00.18a7.f319> lora set freq 915000
Command OK. Radio mode=STBY_RC status=RFU

将扩展因子设置为 7。

#0012.4b00.18a7.f319> lora set sf 7
Command OK. Radio mode=STBY_RC status=RFU

然后在我们进入 RX listen 模式之前检查当前设置:

#0012.4b00.18a7.f322> lora set
frequency: 915000000 Hz
bandwidth: 0 -> 125
spreading factor: SF7
coding rate: 1 -> 4/5
tx power: 20 dBm
tx size: 0 bytes
tx payload: [ ]
tx timeout: 3000 ms
preamble length: 8 symbols
IQ invert: false
Command OK. Radio mode=STBY_RC status=RFU

在一个节点上进入 RX侦听模式,然后在另一个节点上重复参数设置:

#0012.4b00.18a7.f322> lora rx
Running RX on freq 915000000 kHz at SF7 CR:1 BW:0 preamble:8 IQ invert:false ...
Command OK. Radio mode=RX status=RFU

在另一个节点上,设置相同的 SF 后,输入传输的有效负载。我们将使它成为 64 个字节,但只指定前 4 个字节 (0xA 0xB 0xC 0xD):

#0012.4b00.18a7.f319> lora set tx 64 A B C D
Command OK. Radio mode=STBY_RC status=RFU

完成后,是时候发送它并查看接收者是否捕获它了:

#0012.4b00.18a7.f319> lora tx
TX 64 bytes on freq 915000000 kHz at SF7 CR:1 BW:0 PWR:20 dBm airtime:119 ms timeout:3000 ms  preamble:8 IQ invert:false ...
Command OK. Radio mode=TX status=RFU
#0012.4b00.18a7.f319> [INFO: lora-rf   ] Tx completed.

这个 64 字节的 LoRa 传输在 SF7、BW 0 (125 kHz) 和 CR 1 (4/5) 下花费了 119 毫秒。

如果我们查看另一个监听节点 (ID:F322),我们会看到这条消息:

#0012.4b00.18a7.f322> [INFO: lora-rf ] RxDone: size:64 rssi:-52 snr:9 payload:[ 0A 0B 0C 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]

当功耗是设计中的一个因素时,无线电通常是功耗最高的。在这些情况下,我们希望减少无线电发射器开启的时间。让我们快速了解一下参数如何影响播出时间。

当我们将带宽增加到 500 kHz 时,广播时间会发生什么变化?当我们在 SF7 传输相同的 64 字节数据包时,空中时间从 119 毫秒下降到 30 毫秒,与带宽增加成比例 (120/30 = 500/125 = 4)。

#0012.4b00.18a7.f319> lora tx
TX 64 bytes on freq 915000000 kHz at SF7 CR:1 BW:2 PWR:20 dBm airtime:30 ms timeout:3000 ms  preamble:8 IQ invert:false ...
Command OK. Radio mode=TX status=RFU
#0012.4b00.18a7.f319> [INFO: lora-rf   ] Tx completed.

当我们增加扩频因子时,广播时间会发生什么变化?将带宽设置回 125 kHz(与大多数 LoRaWAN 上行链路通道相同)并将扩频因子设置为 10,我们发现广播时间从 119 毫秒跃升至 699 毫秒。

TX 64 bytes on freq 915000000 kHz at SF10 CR:1 BW:0 PWR:20 dBm airtime:699 ms timeout:3000 ms  preamble:8 IQ invert:false ...
Command OK. Radio mode=TX status=RFU
#0012.4b00.18a7.f319> [INFO: lora-rf   ] Tx completed.

我们为什么要这样做?简而言之,增加扩频因子只会将数据包错误率降低到可接受的水平。换句话说,如果您的消息没有到达您的接收器,您可以转动 SF 旋钮直到它们到达为止。结果,您的广播时间和功耗将会增加。值得注意的是,LoRaWAN,一个位于 LoRa 之上的 MAC 层,包括自动向下调整节点扩频因子的规定。显然,如果消息一开始就无法到达网关,那么从网络的角度来看,就没有什么可以拒绝的了。因此,LoRa 节点可能会在与它们交谈的实体告诉它们将其调低(具有适当高的扩频因子响应)之前,在初始消息上以更高的扩频因子传输设置开始!

最后,此 LoRa-Radio 固件应用程序还可以直接访问 SX1262 无线电寄存器,如图所示。在 LoRa 模式下没有很多,这是一件好事!

#0012.4b00.18a7.f319> lora reg get
Content of lora registers:
name                 address value
-------------------- ------- -----
 LoRa Sync Word MSB  0x0740  0x34
 LoRa Sync Word LSB  0x0741  0x44
 RandomNumberGen[0]  0x0819  0x08
 RandomNumberGen[1]  0x081A  0xA5
 RandomNumberGen[2]  0x081B  0x45
 RandomNumberGen[3]  0x081C  0x49
            Rx Gain  0x08AC  0x94
  OCP Configuration  0x08E7  0x38
           XTA trim  0x0911  0x05
           XTB trim  0x0912  0x05
Command OK. Radio mode=STBY_RC status=RFU
#0012.4b00.18a7.f319>

概括

借助 LoRa,您可以发送和接收少量数据——非常适合物联网——在更远的距离上更可靠。它有一个友好的用户界面,描述了它在带宽、扩频因子和编码率方面的主要特性。

我们刚刚谈到了 LoRa 无线电通信的主要用户界面元素,但没有深入了解太多细节。Internet 上有许多深入研究细节的重要资源,例如比特率和广播时间实际上是如何受到扩频因子、带宽和编码率设置的影响的。

如果您有兴趣,我们正在使用的这款IoT.Keystone板还在相同的 sub-GHz 频段提供支持 IPv6 的网状网络,但使用不同的、标准化的和非专有的调制技术 (FSK) 以获得更高的比特率命令和控制应用程序。还有一些板载传感器用于测试 IoT.Keystone 使用 LoRa+LoRaWAN 或 6LoWPAN 的完整传感器到云功能。

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'接收LoRa数据包的实践示例',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);