一,了解初步
请看我上篇博客 https://blog.csdn.net/Crazy_Cw/article/details/137515699
二,什么是 NMEA-0183 全协议解析
引入第三方jar 解析,GPGSA、GPGSV、GPGGA、GPRMC、GPVTG
在写解析的时候突然想到,我五种协议都要写个遍吗?这是不是太麻烦了。
于是,我发现了第三方封装好的协议解析jar包,以下是它的代码仓库:
2.1 第三方jar简介
2.2 第三方jar,如何使用
2.3 第三方jar,支持协议
maven地址:
https://mvnrepository.com/artifact/net.sf.marineapi/marineapi/0.11.0
三,项目实践
假设你有java 5年开发经验,忽略框架部分。第三方源码,此文章不解释。
3.1 引入依赖
xml
<dependency>
<groupId>net.sf.marineapi</groupId>
<artifactId>marineapi</artifactId>
<version>0.11.0</version>
</dependency>
3.2 使用 springboot 接口,初始化
xml
package com.joyaiot.vehiclemonitor.config;
import com.joyaiot.vehiclemonitor.netty.util.GpsListener;
import lombok.extern.slf4j.Slf4j;
import net.sf.marineapi.nmea.io.SentenceReader;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.net.DatagramSocket;
/**
* 功能描述: 任务队列
* @Author keLe
* @Date 2022/7/20
*/
@Component
@Slf4j
public class LaunchRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// 使用UDP链接,监听 10183 端口
DatagramSocket source = new DatagramSocket(10183);
SentenceReader reader = new SentenceReader(source);
// 使用 我们自定义的 监听器解析 GPRMC 协议
reader.addSentenceListener(new GPRMCListener());
reader.start();
log.info("启动成功:监听ip:{127.0.0.1},端口:{10011}");
}
}
3.3 编写 GPRMC 协议监听器
以下字段不在做解析,这里假设你已经有了开发此协议的经验
java
package com.joyaiot.vehiclemonitor.listener;
import net.sf.marineapi.nmea.event.AbstractSentenceListener;
import net.sf.marineapi.nmea.sentence.RMCSentence;
import net.sf.marineapi.nmea.util.DataStatus;
import net.sf.marineapi.nmea.util.Date;
import net.sf.marineapi.nmea.util.FaaMode;
import net.sf.marineapi.nmea.util.Position;
/**
* 功能描述: GPRMC 协议监听器
*
* @Author keLe
* @Date 2024/4/8
*/
public class GPRMCListener extends AbstractSentenceListener<RMCSentence> {
@Override
public void sentenceRead(RMCSentence sentence) {
FaaMode mode = sentence.getMode();
double correctedCourse = sentence.getCorrectedCourse();
DataStatus status = sentence.getStatus();
double speed = sentence.getSpeed();
double course = sentence.getCourse();
Date date = sentence.getDate();
Position position = sentence.getPosition();
System.out.println(1111111111);
}
}
这里给大家重点看下源码
这个 Sentence 的 子类接口,就是所有协议的具体解析
四,测试
4.1 使用 udp 工具
百度网盘地址:
链接:https://pan.baidu.com/s/1LTpdPHSwbHl4p6dcRtWbjQ
提取码:dzfx
启动服务端
发送数据
可以看到 所有的值都解析成功了。至此完毕!