查看: 6847|回复: 2

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

[复制链接]
  • TA的每日心情
    开心
    2016-7-19 10:35
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-12-7 21:10:11 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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结果了事,败笔!
    构架及硬件
    整体框图如下
    2017-12-07_171528.jpg

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

    这些模块都使用SPI接口与RPI进行通信。
    本文使用的模块如下
    300px-Lora_GPS_HAT.jpg.png

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

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

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

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

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

    软件包中使用的通信模式是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
    2017-12-07_200903.jpg
    该项目原来的操作是通过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上运行网关程序,如下
    2017-12-07_201359.jpg

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

    最后,可以通过HTTP请求获取实时信息,如下
    2017-12-07_202216.jpg

    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图,看同步通信状况
    comm.gif



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


    代码打包:


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

    使用道具 举报

  • TA的每日心情
    开心
    2016-7-19 10:35
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

     楼主| 发表于 2017-12-7 21:22:28 | 显示全部楼层
    补充一张图,THINGSPEAK的可视化显示

    2017-12-07_211922.jpg
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2017-12-8 17:04:53 | 显示全部楼层
    netlhx 发表于 2017-12-7 21:22
    补充一张图,THINGSPEAK的可视化显示

    突现,“论坛排版很蛋疼”几个大字(ಥ_ಥ)
    可以qq跟可依吐槽
    我们会越来越好的
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-4-24 17:36 , Processed in 0.139255 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.