文中提供的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) {