本帖最后由 ky123 于 2018-1-31 14:19 编辑
基于RPI3的LORA网关
首先,特别感谢爱板及ELEMENT14提供的RPI3赞助!
LORA很火,虽然LORA模块不算贵,但LORA网关太贵。 考虑倒这一点,国外的大神C. Pham 就有了一个想法,使用价格低廉的LORA 芯片,结合强大的RPI,DIY 了一个价格低廉的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模块如下
本文使用的模块如下
该模块除了包括LORA芯片,还包括一个GPS模块,可以用于提供GPS定位、校时等功能。
客户端使用的是LORA SHIELD,与LORA/GPS HAT一样,二者都是DRADINO的产品,配合ARDUINO使用。
实现实现一个简单的LORA网关,首先通过LORA来传输信息。 SX1272库提供了底层的LORA通信功能,C.Pham进一步加入了载波检测功能以增加传输效率。 原生的LORA包格式如下
FRAME格式中包含目标地址,源地址,序列号,负载长度,负载数据及重试次数。 SX1272/SX1276库位于整个软件栈中的位置如下
LORA通信规范中对传输速率、距离做了相应的规定,划分了若干所谓的通信模式,如下
软件包中使用的通信模式是mode 1,即BW、CR、SF等设置分别为125KHZ, 4/5及12。 通信频段使用的是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)
|