赞
踩
在做标准的LoRaWAN项目中时,网关有着承上启下的作用,在MCU上跑的网关程序,既要接收来自节点的数据,又要将节点数据打包发到服务器(chirpstack)。
今天博主要讲的是网关和服务器的通信到底是怎么样的呢?
听上去,网关和服务器的连接不就是标准的socket流程吗,创建两个文件描述符一个负责上行,一个负责下行,往里面读写不就行了吗?其实非也,在这里面大有学问!
位于数据包转发和MQTT代理之间。它将数据包转发器格式(例如 Semtech UDP数据包转发器协议)转换为ChirpStack组件使用的数据格式(GRPC)。它还提供与各种云平台的集成,例如GCP Cloud IoT Core 和Azure IoT Hub。
负责管理网络的状态。它具有网络上设备激活的知识,并且能够在设备要加入网络时处理加入请求。
当多个网关接收到数据时,ChirpStack网络服务器将对这些数据进行重复数据删除,并将其作为一个有效负载转发给ChirpStack应用服务器。当应用服务器需要将数据发送回设备时,ChirpStack网络服务器会将这些项目保留在队列中,直到能够发送到其中一个网关为止。
与ChirpStack网络服务器兼容。它提供了用于管理用户,组织,应用程序,网关和设备的Web界面和API。收到的上行链路数据将转发到一个或多个已配置的集成。
是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。ChirpStack应用程序服务器将所有非持久性数据存储到 Redis数据存储中。
是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。ChirpStack应用程序服务器将网关数据保存到 PostgreSQL数据库中。
ChirpStack应用程序服务器利用MQTT来发布和接收应用程序有效负载。Mosquitto是流行的开源MQTT服务器。
是Goolge公司开发并工作在应用层的通信协议,RPC是指本地服务调用远程服务器上的程序或服务,是一种客户端服务器(C/S)通信模式。GRPC是由Google开发并且将其开源。 通过它,一个客户端消费者服务可以像调用本地方法一样,调用另一台主机上面的服务端方法。GRPC相对于RPC,在实现上使用了HTTP2.0,协议缓冲区(protobuf)等技术。
1)在微服务的设计中,我们通常采用HTTP REST(网络应用程序的设计风格和开发方式)传输数据,并在两个服务之间进行序列化和反序列化操作;另外传统的RESTful接口使用JSON、XML或者其他的一些格式作为数据载体,使得服务运行缓慢,内存占用较高、并且传输过程没有压缩;grpc里面跑的是protobuf格式,依赖于客户端和服务端建立socket连接进行。
2)由于HTTP在应用层中完成,整个通信的代价较高,远程过程调用中直接基于TCP进行远程调用,数据传输在传输层TCP层完成,更适合对效率要求比较高的场景,RPC主要依赖于客户端和服务端之间建立Socket链接进行,底层实现比REST更复杂;
3)相比常规的RPC,GRPC拥有更好性能;
Protobuf全称是Google Protocol Buffer,是一种高效轻便的结构化数据存储方式,可用于(数据)通信协议、数据存储等。也可以理解为结构化数据的序列化方法,提供了高效率的序列化和反序列化机制,序列化就是把对象转换成二进制数据发送给服务端,反序列化就是将收到的二进制数据转换成对应的对象。
序列化将数据结构或对象转换成能够被存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能是另一个计算环境中)能够被重建回原来的数据结构或对象。
1)与语言无关、与平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台
2)高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单
3)扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序
json是文本文件,文本文件是基于字符的。
protobuf是二进制编码,基于值的。
根据程序框图我们可以看出来,chirpstack_bridge位于NS之前,作用是将所有网关来的数据包都转换成适合chirpstack内部走的protobuf格式,然而显而易见的是,我们也可以在网关程序实现这个功能,即网关把收到的RF包组装成protobuf再发出,意思就是在网关程序内部实现chirpstack_bridge这个功能,那么这个数据便可以直接通过GRPC传送到chirpstack的NS而不经过chirpstack_bridge!
下面是我自己画的流程图:
依旧看流程图,MQTT的broker位于NS和chirpstack_bridge之间,那么我们实现mqtt的方式就会有两种:
第一种:
网关实现chirpstack_bridge功能(将数据封装成protobuf)以后,将数据pub到chirpstack的broker,再进行后面的操作,这种实现比较容易。
第二种:
网关不实现chirpstack_bridge功能,通过udp到chirpstack_bridge,然后chirpstack_bridge再pub到chirpstack的broker,再进行后面的操作,这种实现要在网关这边将数据包重新组包再通过udp发送,且在chirpstack内部与要进行多次mqtt的操作,比较困难,但是各部分分工明确,各部分之间能有交互性,扩展性好。
下面是我自己画的流程图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。