2回答

2收藏

[大赛作品提交] 基于RPI的LORA网关

Raspberry Pi Raspberry Pi 8071 人阅读 | 2 人回复 | 2017-12-07

本帖最后由 ky123 于 2018-1-31 14:19 编辑

基于RPI3LORA网关
首先,特别感谢爱板及ELEMENT14提供的RPI3赞助!
LORA很火,虽然LORA模块不算贵,但LORA网关太贵。
考虑倒这一点,国外的大神C. Pham就有了一个想法,使用价格低廉的LORA芯片,结合强大的RPIDIY了一个价格低廉的RPI LORA网关并成功的在 EU H2020 WAZIUP 项目上跑起来了。
C. Pham大神的项目支持众多的LORA芯片,从Libelium LoRa radio module HopeRFRFM92W/HopeRF RFM95W 等芯片均支持,软件项目则以开源的方式提供,广大DIY用户结合自己的具体硬件,对软件工程进行适当的适配后就可以工作了。
不过C.Pham大神的项目并不完全兼容LORAWAN规范,主要原因之一是硬件本身的处理能力,大多数SX1272/SX1276芯片都只支持单通道通信,这是个硬伤。
单通道就单通道吧,不兼容LORAWAN也可以接受,能用上就好。
本文接下来的内容组织如下
1.         构架,硬件、软件构成
2.         实现,具体的实现方式
3.         测试

主要的工作:
1. 让LORA跑起来,必须得跑起来
2. 软件以C.Pham大神的项目为基础,改,加,简化。原来的工程可能要照顾到方方面面,很复杂,看着费劲。
3. 原本准备写个APP的,只是总共就两个参数,也没有实现下行功能,所以最后以JSON结果了事,败笔!
构架及硬件
整体框图如下

各部分功能简介如下
?            Lora结点收集信息,在PHY层将信息传递给RPI GATEWAY网关
?         RPI GATEWAY收集各结点信息,上传到TTN,THINGSPEAK之类的网站
?            PC/移动终端等通过网络访问信息
软件方面使用改进的SX1272/SX1276代码,实现载波检测以改进通信效率,PHY层的基本通信数据可以通过网络协议转发给上层应用,可以进一步处理,主要包括过滤、分析、可视化等操作。由于原生的实现并没有考虑到LORAWAN协议,所以这一块的内容要么交给高层处理,要么实现自己的网关转发操作,从而实现真正意义的LORAWAN
市面大部分的LORA模块如下

这些模块都使用SPI接口与RPI进行通信。
本文使用的模块如下

该模块除了包括LORA芯片,还包括一个GPS模块,可以用于提供GPS定位、校时等功能。
模块与RPI连接作为网关使用,收集结点提供的信息,特别感谢爱板及ELEMENT14提供的RPI3赞助!

客户端使用的是LORA SHIELD,与LORA/GPS HAT一样,二者都是DRADINO的产品,配合ARDUINO使用。

实现
实现一个简单的LORA网关,首先通过LORA来传输信息。
SX1272库提供了底层的LORA通信功能,C.Pham进一步加入了载波检测功能以增加传输效率。
原生的LORA包格式如下

FRAME格式中包含目标地址,源地址,序列号,负载长度,负载数据及重试次数。
SX1272/SX1276库位于整个软件栈中的位置如下

LORA通信规范中对传输速率、距离做了相应的规定,划分了若干所谓的通信模式,如下

软件包中使用的通信模式是mode 1,即BWCRSF等设置分别为125KHZ, 4/512
通信频段使用的是868MHZ,部分配置参数如下
///////////////////////////////////////////////////////////////////
// DEFAULT LORA MODE
#define LORAMODE 1
// the special mode to test BW=125MHz, CR=4/5, SF=12
// on the 868.1MHz channel
//#define LORAMODE 11
///////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////
// GATEWAY HAS ADDRESS 1
#define LORA_ADDR 1
///////////////////////////////////////////////////////////////////
网关设定的结点地址为1
上述是网关端 的参数配置,客户端的参数配置与服务端应该一致,只是将LORA地址设置为与服务端地址不同即可。
另外为了验证传感器的相关操作,在客户端连接了一个DHT11,将采集的温度、湿度信息通过LORA传送到网关。
采集与发送数据的关键代码如下
   r_size = sprintf((char*)message, "Humi:%02d.%-2d Temp: %02d.%-2d", (int)DHT.humidity, (int)(DHT.humidity * 100) %100,
     (int)DHT.temperature, (int)(DHT.temperature * 100) % 100);

    // this isthe no-ack version
    e =sx1272.sendPacketTimeout(DEFAULT_DEST_ADDR, message, r_size);
最后一步是实现将采集的数据发送到IOT网站,这里使用的是THINGSPEAK来接收及显示数据。
登录THINGSPEAK,创建一个Channel,定义两个基本的数据单元,分别表示温度及湿度,如下file:///C:/Users/netlh/AppData/Local/Temp/msohtmlclip1/01/clip_image018.png

该项目原来的操作是通过PYTHON做后期处理,将获取到的信息使用PYTHON代码来进行上传。为了简化,修改了源代码,直接使用CURL来操作HTTP请求发送数据。
修改后的代码直接将数据上传并更新具体的数据单元,相应的C代码如下
        //
        PRINT_STR("%s", "Sending data to IotPlatform...\n");
         charupdate_token[] = "EFNZPJEOLMATXXXX";
         charpost_url[] = "https://api.thingspeak.com/update";
         charupdate_url[100];
         charpost_fields[100];
         chartemperature[5];
         charhumidity[5];
         for(inti = 6; i < 10; i ++) {
          humidity[i - 6] = sx1272.packet_received.data;
         }
        humidity[4] = '\0';
         for(inti = 18; i < 22; i ++) {
          temperature[i - 18] = sx1272.packet_received.data;
         }
        temperature[4] = '\0';

        sprintf(post_fields, "api_key=%s&field1=%s&field2=%s",update_token, temperature, humidity);
        sprintf(update_url, "curl -d \"%s\" %s",post_fields, post_url);
        PRINT_STR("%s", update_url);
        PRINTLN;
        system(update_url);
        PRINTLN;
        //sprintf(post_fields, "api_key=%s&field%d=%s",update_token, 2, humidity);
        //sprintf(update_url, "curl -d \"%s\" %s",post_fields, post_url);
        //PRINT_STR("%s", update_url);
        //PRINTLN;
        system(update_url);
        PRINTLN;
这里使用的是调用curl命令来实现post操作上传温度及温度数据,当然最好是使用libcurl库来实现,这里偷个懒,直接调用CURL命令来实现,效果相同。
这样子就差不多了。
验证
将网关及客户端同时上电,在RPI上运行网关程序,如下

控制台输出显示了LORA硬件的初始化过程、基本参数设置等信息。
接下来的输出信息就是从LORA结点接收到的温度及湿度信息,然后使用CURL命令上传到THINGSPEAK的操作。
另外注意还有其它一些信息的输出,如包序列号等信息。作为对比,下面显示的是ARDUINO串口输出的LORA结点的信息

最后,可以通过HTTP请求获取实时信息,如下

HTTP请求获取到的是JSON信息,格式化后的显示结果如下
{
   "channel": {
       "id": 369887,
       "name": "rpi3",
       "description": "rpi3 based lora gateway",
       "latitude": "0.0",
       "longitude": "0.0",
       "field1": "temp",
       "field2": "humi",
       "created_at": "2017-11-22T08:41:11Z",
       "updated_at": "2017-12-07T12:21:00Z",
       "last_entry_id": 142
    },
   "feeds": [
        {
           "created_at": "2017-12-07T12:20:45Z",
           "entry_id": 141,
           "field1": "17.0",
           "field2": "19.0"
        },
        {
           "created_at": "2017-12-07T12:21:00Z",
            "entry_id": 142,
           "field1": "17.0",
           "field2": "19.0"
        }
    ]
}
测试通过
最后上一张动态GIF图,看同步通信状况



结论
虽然只能使用单通道,同时也不兼容LORWAN协议,但胜在价格便宜。一片SX1301模块大约要1500元,一个RPI3加上LORA/GPS HAT,大约价格在400左右。对于一般的用户来说,够用了。
下一步的目标,是加上下行数据的处理,这个涉及的内容更复杂。主要是一方面要在网络站点(TTN, THINGSPEAK)上建立一个应用程序,来实现数据的下发;另一个要在RPI网关上创建应用程序,实现LORA数据的反射传输。其实功能上应该没有问题,只是代码的工作量大一点。


代码打包:


lora_gatewayt.7z (1.93 MB, 下载次数: 22)

论坛排版很蛋疼,愿意看的,还是下载PDF版吧

基于RPI3的LORA网关.pdf (1.05 MB, 下载次数: 44)





关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

netlhx

发表于 2017-12-7 21:22:28 | 只看该作者

补充一张图,THINGSPEAK的可视化显示

板凳

ky123

发表于 2017-12-8 17:04:53 | 只看该作者

netlhx 发表于 2017-12-7 21:22
补充一张图,THINGSPEAK的可视化显示

突现,“论坛排版很蛋疼”几个大字(?_?)
可以qq跟可依吐槽
我们会越来越好的
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条