使用Ntrip协议连接CORS服务器获取差分数据-Java

文中提供的NtripClient类,支持CORS服务器的连接、断开、获取挂载点列表。

调用方法

连接服务器

NtripClient ntripClient = new NtripClient();
ntripClient.addDataListener(dataListener);
ntripClient.connect(ip, port, username, password, mountPoint);

判断是否已连接上

ntripClient.isConnected()

断开连接

ntripClient.removeDataListener(dataListener);
ntripClient.disconnect();

获取挂载点列表

// 需放到子线程调用
ArrayList<MountPoint> mountPoints = ntripClient.getMountPoint(ip, port);

NtripClient

import android.util.Base64;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * ntrip客户端,连接CORS服务器获取差分数据
 */
public class NtripClient {
   

    private static final String TAG = NtripClient.class.getSimpleName();

    /**
     * 超时自动重连的时间,单位:毫秒
     */
    private static final long TIME_OUT = 30000;

    /**
     * 服务器地址
     */
    private String ip;

    /**
     * 服务器端口
     */
    private int port;

    /**
     * 用户名
     */
    private String userName;

    /**
     * 密码
     */
    private String password;

    /**
     * 挂载点
     */
    private String mountPoint;

    /**
     * 网络通讯
     */
    private TcpComm comm;

    /**
     * 连接服务器
     */
    private ExecutorService connectService;

    /**
     * 读数据
     */
    private ScheduledExecutorService readService;

    /**
     * 用于判断是否超时
     */
    private long currentDiffTime;

    private Object readLock = new Object();

    private Object writeLock = new Object();

    /**
     * 是否已连接
     */
    public boolean isConnected() {
   
        return comm != null && comm.isOpen();
    }

    /**
     * 数据监听
     */
    private List<IDataListener> dataListenerList = new ArrayList<>();

    /**
     * 添加数据监听
     */
    public void addDataListener(IDataListener listener) {
   
        if (dataListenerList.contains(listener) == false) {
   
            dataListenerList.add(listener);
        }
    }

    /**
     * 移除数据监听
     */
    public void removeDataListener(IDataListener listener) {
   
        if (dataListenerList.contains(listener)) {
   
            dataListenerList.remove(listener);
        }
    }

    /**
     * 连接服务器
     * @param ip 服务器地址
     * @param port 服务器端口
     * @param userName 用户名
     * @param password 密码
     * @param mountPoint 挂载点
     */
    public void connect(String ip, int port, String userName, String password, String mountPoint) {
   
        disconnect();

        this.ip = ip;
        this.port = port;
        this.userName = userName;
        this.password = password;
        this.mountPoint = mountPoint;

        connectService = ThreadUtils.getCachedPool();
        connectService.execute(() -> {
   
            // 连接并登录服务器
            connectServer();
        });
    }

    /**
     * 断开连接
     */
    public void disconnect() {
   
        // 停止连接线程
        if (connectService != null) {
   
            ThreadUtils.stopExecutorService(connectService);
            connectService = null;
        }

        // 停止读线程
        if (readService != null) {
   
            ThreadUtils.stopExecutorService(readService);
            readService = null;
        }

        // 断开连接
        if (comm != null) {
   
            comm.close();
            comm = null;
        }
    }

    /**
     * 发送GGA
     * GGA示例:$GNGGA,021102.00,2259.01378,N,11322.05927,E,1,12,0.60,40.7,M,-5.1,M,,*66
     */
    public void sendGGA(String gga) {
   
        writeToNet(gga.getBytes());
    }

    /**
     * 获取挂载点(耗时操作,最长等待20s)
     * @param ip 服务器地址
     * @param port    服务器端口
     * @return 挂载点列表
     */
    public ArrayList<MountPoint> getMountPoint(String ip, int port) {
   
        return getMountPoint(ip, port, 20000);
    }

    /**
     * 获取挂载点(耗时操作)
     * @param ip 服务器地址
     * @param port 服务器端口
     * @param timeOut 等待的毫秒值(超出时长,则返回空),建议 >=20000
     * @return 挂载点列表
     */
    public ArrayList<MountPoint> getMountPoint(String ip, int port, long timeOut) {
   
        ArrayList<MountPoint> mountPoints = null;

        TcpComm comm = new TcpComm(ip, port);
        try {
   
            // 连接服务器
            boolean isConnect = comm.open();
            if (!isConnect) {
   

你可能感兴趣的:(Android,Ntrip,CORS,差分,Java)