1.Mqtt

LoRa网关与服务器通信协议这节给大家讲了下LoRa网关与服务器之间的协议格式。那么他们是怎么通信的呢?主流的有原生的UDP和Mqtt,今天就讲讲Mqtt这种方式。
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于 发布/订阅 范式的消息协议。它工作在 TCP/IP 协议族上,是为 硬件性能低下远程设备 以及网络状况糟糕 的情况下而设计的发布/订阅型消息协议,它是一个消息中间件 。(度娘版)

如上图是IBM官方给的图解。我对他的理解就是:Broker是消息集散中心,负责消息的接收,汇总,分发,所有终端或者服务器都是消息的生产者或者消费者。就整个LoRa通信过程,网关端会生产PUSH_DATA,PULL_DATA同时又会消费PULL_ACK等回复消息。同理服务器端会消费PUSH_DATA,PULL_DATA生产PULL_ACK。

2.EMQ 安装

实现Mqtt协议的中间件太多太多,老牌的Rabbitmq,阿里的Rocketmq,本人以前用过的mosquito,还有今天介绍的emq等等。

本人安装环境:ubuntu 16.04的虚机。
IP:

下载地址

  1. 安装所需要的依赖包
sudo apt update && sudo apt install -y \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common
  1. 添加 EMQ X 的官方 GPG 密钥
curl -fsSL https://repos.emqx.io/gpg.pub | sudo apt-key add -

验证密钥

sudo apt-key fingerprint 3E640D53
  1. 使用以下命令设置 stable 存储库。 如果要添加 unstable 存储库,请在以下命令中的单词 stable 之后添加单词 unstable。
sudo add-apt-repository \"deb [arch=amd64] https://repos.emqx.io/emqx-ce/deb/ubuntu/ \$(lsb_release -cs) \stable"
  1. 更新 apt 包索引
sudo apt update
  1. 安装最新版本的 EMQ X
sudo apt install emqx
  1. 启动 EMQ X
sudo service emqx start

EMQ有可视化的管理页面:http://192.168.237.128:18083
可根据自己的IP做相应修改;
下图为管理页面

还可以切换中文奥

3.撸起来

在此只做简单演示

  1. 仿网关发送
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;public class MqttPublish {private static int QOS = 1;private static String HOST = "tcp://192.168.237.128:1883";private static String userName = "admin";private static String password = "public";private static String msg = "{\"rxpk\":[\n" +"\t{\n" +"\t\t\"time\":\"2013-03-31T16:21:17.528002Z\",\n" +"\t\t\"tmst\":3512348611,\n" +"\t\t\"chan\":2,\n" +"\t\t\"rfch\":0,\n" +"\t\t\"freq\":866.349812,\n" +"\t\t\"stat\":1,\n" +"\t\t\"modu\":\"LORA\",\n" +"\t\t\"datr\":\"SF7BW125\",\n" +"\t\t\"codr\":\"4/6\",\n" +"\t\t\"rssi\":-35,\n" +"\t\t\"lsnr\":5.1,\n" +"\t\t\"size\":32,\n" +"\t\t\"data\":\"-DS4CGaDCdG+48eJNM3Vai-zDpsR71Pn9CPA9uCON84\"\n" +"\t},{\n" +"\t\t\"time\":\"2013-03-31T16:21:17.530974Z\",\n" +"\t\t\"tmst\":3512348514,\n" +"\t\t\"chan\":9,\n" +"\t\t\"rfch\":1,\n" +"\t\t\"freq\":869.1,\n" +"\t\t\"stat\":1,\n" +"\t\t\"modu\":\"FSK\",\n" +"\t\t\"datr\":50000,\n" +"\t\t\"rssi\":-75,\n" +"\t\t\"size\":16,\n" +"\t\t\"data\":\"VEVTVF9QQUNLRVRfMTIzNA==\"\n" +"\t},{\n" +"\t\t\"time\":\"2013-03-31T16:21:17.532038Z\",\n" +"\t\t\"tmst\":3316387610,\n" +"\t\t\"chan\":0,\n" +"\t\t\"rfch\":0,\n" +"\t\t\"freq\":863.00981,\n" +"\t\t\"stat\":1,\n" +"\t\t\"modu\":\"LORA\",\n" +"\t\t\"datr\":\"SF10BW125\",\n" +"\t\t\"codr\":\"4/7\",\n" +"\t\t\"rssi\":-38,\n" +"\t\t\"lsnr\":5.5,\n" +"\t\t\"size\":32,\n" +"\t\t\"data\":\"ysgRl452xNLep9S1NTIg2lomKDxUgn3DJ7DE+b00Ass\"\n" +"\t}\n" +"]}\n";public static void main(String[] args){start(msg);}public static MqttClient connect(String clientId, String userName, String password){MemoryPersistence persistence = new MemoryPersistence();MqttConnectOptions options = new MqttConnectOptions();options.setCleanSession(false);options.setUserName(userName);options.setPassword(password.toCharArray());options.setConnectionTimeout(10);options.setKeepAliveInterval(20);MqttClient client = null;try {client = new MqttClient(HOST, clientId, persistence);
//            client.setCallback(new PushCallback());client.connect(options);} catch (MqttException e) {e.printStackTrace();}return client;}private static void publish(MqttClient client, String msg, String topic){MqttMessage message = new MqttMessage(msg.getBytes());message.setQos(QOS);message.setRetained(false);try {client.publish(topic, message);} catch (MqttException e) {e.printStackTrace();}}public static void start(String msg){/*String msg = "Hello !";*/String clientId = "ZWT_PUBLISH";String topic = "PUSH_DATA";MqttClient client = (MqttClient) connect(clientId, userName, password);if (client != null) {publish(client, msg, topic);System.out.println("Start-Public Message:" + msg);}if (client != null) {try {client.disconnect();} catch (MqttException e) {e.printStackTrace();}}}}
  1. 服务端接收
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;public class MqttSub {private static int QOS = 1;private static String HOST = "tcp://192.168.237.128:1883";private static String userName = "admin";private static String password = "public";public static void main(String[] args){start();}private static MqttClient connect(String clientId){System.out.println("MqttSub connect");MemoryPersistence persistence = new MemoryPersistence();MqttConnectOptions options = new MqttConnectOptions();options.setCleanSession(false);options.setUserName(userName);options.setPassword(password.toCharArray());options.setKeepAliveInterval(20);options.setConnectionTimeout(10);MqttClient client = null;try {client = new MqttClient(HOST, clientId, persistence);client.setCallback(new PushCallback());client.connect(options);} catch (MqttException e) {e.printStackTrace();}return client;}public static void receive(MqttClient client, String topic){int[] Qos = {QOS};String[] topics = {topic};try {client.subscribe(topics, Qos);} catch (MqttException e) {e.printStackTrace();}}public static void start(){String clientId = "ZWT_SUB";String topic = "PUSH_DATA";MqttClient client = connect(clientId);if (client != null) {receive(client, topic);}}
}

回调函数

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;public class PushCallback implements MqttCallback {@Overridepublic void connectionLost(Throwable throwable) {System.out.println("connect lost");}@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {System.out.println("Client topic : " + topic);System.out.println("Client Qos : " + message.getQos());System.out.println("Client msg : " + new String(message.getPayload()));}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {System.out.println("deliveryComplete****" + token.isComplete());}
}

控制台打印
publish

Start-----Public Message:{"rxpk":[{"time":"2013-03-31T16:21:17.528002Z","tmst":3512348611,"chan":2,"rfch":0,"freq":866.349812,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/6","rssi":-35,"lsnr":5.1,"size":32,"data":"-DS4CGaDCdG+48eJNM3Vai-zDpsR71Pn9CPA9uCON84"},{"time":"2013-03-31T16:21:17.530974Z","tmst":3512348514,"chan":9,"rfch":1,"freq":869.1,"stat":1,"modu":"FSK","datr":50000,"rssi":-75,"size":16,"data":"VEVTVF9QQUNLRVRfMTIzNA=="},{"time":"2013-03-31T16:21:17.532038Z","tmst":3316387610,"chan":0,"rfch":0,"freq":863.00981,"stat":1,"modu":"LORA","datr":"SF10BW125","codr":"4/7","rssi":-38,"lsnr":5.5,"size":32,"data":"ysgRl452xNLep9S1NTIg2lomKDxUgn3DJ7DE+b00Ass"}
]}

sub

Client topic : PUSH_DATA
Client Qos : 1
Client msg : {"rxpk":[{"time":"2013-03-31T16:21:17.528002Z","tmst":3512348611,"chan":2,"rfch":0,"freq":866.349812,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/6","rssi":-35,"lsnr":5.1,"size":32,"data":"-DS4CGaDCdG+48eJNM3Vai-zDpsR71Pn9CPA9uCON84"},{"time":"2013-03-31T16:21:17.530974Z","tmst":3512348514,"chan":9,"rfch":1,"freq":869.1,"stat":1,"modu":"FSK","datr":50000,"rssi":-75,"size":16,"data":"VEVTVF9QQUNLRVRfMTIzNA=="},{"time":"2013-03-31T16:21:17.532038Z","tmst":3316387610,"chan":0,"rfch":0,"freq":863.00981,"stat":1,"modu":"LORA","datr":"SF10BW125","codr":"4/7","rssi":-38,"lsnr":5.5,"size":32,"data":"ysgRl452xNLep9S1NTIg2lomKDxUgn3DJ7DE+b00Ass"}
]}

我们再看看EMQ的控制台




因为没有改emq的配置文件Node都是emq@127.0.0.1。
这一步走完,LoRaWAN Network server的第一步就完了。接下来就是数据分流解析了。
扔我

LoRa网关与服务器通信——MQTT相关推荐

  1. 无线网关服务器搭建教程,【树莓派】简易LoRa网关搭建+服务器设置一条龙教程(the things network)...

    测试项目需要LoRa网关和服务器又不想花太多钱,于是自己试着做一个简易实惠的测试用LoRa网关,服务器免费用the things network的 注:该简易(简陋)版网关只支持ABP入网单信道通信 ...

  2. LoRa网关和NS的那些事

    LoRa网关 1.LoRa网关在整个通信过程中起透传作用 2.网关通过收发器可以和终端通信,是以射频的形式通信的,如上图,网关会接受到符合配置文件中频点和数据率的终端数据,也会以一定的频点数据率和发射 ...

  3. 云服务器部署mqtt协议通信,云服务器部署mqtt协议通信

    云服务器部署mqtt协议通信 内容精选 换一换 虚拟IP(Virtual IP Address,简称VIP)是一个未分配给真实弹性云服务器网卡的IP地址.弹性云服务器除了拥有私有IP地址外,还可以拥有 ...

  4. DTU网关连接MQTT服务器、MQTT.fx工具测试

    4G DTU网关连接MQTT服务器+MQTT.fx工具调试 今天介绍DTU网关如何通过简单几步配置连接MQTT服务器,再使用MQTT.fx客户端进行串口测试. 一. 设备准备 1.硬件准备 DTU网关 ...

  5. 工程小白问题:数采网关、智慧网关、物联网关、工业网关、DTU透传网关、边缘网关、协议网关、通讯管理机、中控网关、LORA网关、PROFIBUS网关、HART网关,都啥区别?如何判断是否符合工程要求?

    什么是数采网关,LoRa数采网关\NB-IOT数采网关\HART数采网关profibus DB 数采网关 数采网关就是数据采集网关,一端对接各种数据采集终端.电子仪器仪表,一般都是工业现场总线通讯传输 ...

  6. 亿佰特Lora网关技术为马拉松保驾护航

    2021年10月份成都马拉松跑步比赛开始报名了,身边很多感兴趣的朋友都在纷纷报名.按照朋友的话说,报名马拉松不是为了去跑步,就是为了体验马拉松跑到路边景色及配套设施. 根据介绍,野外超级马拉松现场许多 ...

  7. SX1278 Lora网关

    目前市面上的Lora网关多采用SX1301+树莓派这样的设计,同时还要配套NS服务器等,整个设计比较复杂,而且SX1301方案的成本比较高.    本文没有使用SX1301,二是采用两片SX1278, ...

  8. lora网关软件设计_LoRa 物联网集成开发套件

    原标题:LoRa 物联网集成开发套件 简介 LoRa 物联网集成开发套件由数据传输单元(DTU,Data Transfer Unit), LoRa 网关(室内型)和TurCloud™ IoT 平台组成 ...

  9. 基于mqtt协议的消息推送服务器,基于 MQTT 协议的推送服务

    一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...

  10. arduino lora通讯_ESP8266 LoRa网关第一步:SPI总线

    logic_spi_esp8266_arduino.png 之前一直有看到PyCom开发的基于MicroPython/ESP32的LoRa网关,但是也没有测试过.最近看到国内有卖ESP32/LoRa模 ...

最新文章

  1. Python 一个判断对象是否是一个已知类型的函数-isinstance()
  2. Linux系统vi编辑器执行命令,linux下vi编辑器命令
  3. 轮询没有收到的可能性_轮询(Polling)是什么?
  4. SQLite基本语法
  5. C++11 Lambda函数(匿名函数)
  6. 3224: Tyvj 1728 普通平衡树
  7. mysql+tushare搭建本地数据库
  8. python高级编程技巧
  9. sql实现自定义排序
  10. JPA+Hibernate 3.3 ——第一个JPA程序
  11. mac下安装nginx及相关配置
  12. JAVA实现字体扩大代码_[Java教程]jQuery实现设置字体大小代码实例
  13. koa2异常处理_【HAVENT原创】KOA2 异常处理
  14. html画表盘 随时间转动,canvas绘制表盘时钟
  15. 重启linux系统后 启动mysql ERROR! The server quit without updating PID file /var/run/mysqld/mysqld.pid
  16. 统计系统技术方案-clickhouse
  17. [论文阅读] (07) RAID2020 Cyber Threat Intelligence Modeling Based on Heterogeneous GCN
  18. 万字长文!Unix 和 Linux 你不知道的那些历史(详解版)
  19. Python遍历目录下的文件(os.walk 、os.listdir的用法)
  20. shell学习整理笔记

热门文章

  1. 用VMWARE安装Mac OSX Tiger 10.4.4 X86
  2. Revit二次开发——新建墙类型
  3. CubeMX编写风力摆控制系统[HAL库]
  4. word编辑公式并编号
  5. hprose-php教程,Swoole学习笔记(六):Hprose入门
  6. Coablt strike官方教程中文译版本
  7. 24点扑克游戏详细解析附代码
  8. 扩展卡尔曼滤波算法 EKF
  9. java 生成随机数_JAVA生成随机数
  10. n1_如何高分通过日语N1考试?