UDP接收GNGGA报文同时转发UDP报文的方法
package Frame;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import PbuliClass.ShowMessage;
public class Udp_Receive_and_send implements Runnable {
static DatagramSocket socket;
int port=7000;//监听的端口
DatagramPacket packet;
/**初始化对象
* @throws NumberFormatException
* @throws IOException */
public Udp_Receive_and_send() {
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
byte[] data = new byte[2048]; // 创建byte数组
packet= new DatagramPacket(data, data.length);
}
/**启动线程的方法*/
public void startThread() {
Thread t=new Thread();
t.start();
}
/**不间断监听端口上来的数据*/
public void run() {
while(true) {
try {
socket.receive(packet);// 接收数据包
} catch (IOException e) {
e.printStackTrace();
}
int lenth=packet.getLength();//数据包长度
String ip=packet.getAddress().getHostAddress();//数据上来的地址
int port=packet.getPort();//数据上来的端口
String message=new String(packet.getData(), 0, lenth);//收到的数据
message=message.replaceAll(" ", "");//去掉收到的数据空格
message=message.replaceAll("\r\n", "");//去掉收到的数据换行回车
String message_to_big=message.toUpperCase();//数据转为大写
if(message.startsWith("$GNGGA")) {//如果收到的报文是$GNGGA开头
dell_GNGGA( message_to_big, ip, port);//调用处理GNGGA报文的方法
}
}
}
/**实现UDP转发
* @param data 需要转发的数据
* @param 需要发送的ip地址
* @param 需要发送的port端口
* @param 需要发送的设备id*/
public static void udp_out(byte[] data,String ip,int port,String tagid) {
InetAddress address=null;
try {
address=InetAddress.getByName(ip);
} catch (UnknownHostException e) {
ShowMessage.zidingyi_24("UDP未知地址异常:"+ip);
}
DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
try {
socket.send(packet);
} catch (IOException e) {
System.out.println("UDP发送异常"+ip);
}
}
/**处理GNGGA报文的方法
* /***
*gps经纬度数据
*$GNGGA,[utc_time],[ weidu],[ NS],[ jingdu],[ EW],[state],[num],[hdop],[haiba_gao],
*[gao_danwei],[tuoqiu],[chafen_time],[chafen_id],[jiaoyan],[tagid],[power],[信号强度],[保留1],[保留2],[保留3]
*示例:$GNGGA,045449.000,3951.764319,N,11615.386554,E,2,19,0.70,57.726,M,-9.89,M,11,0000*69,1872,2d,19,0,0,0
*说明:
*1.$GNGGA;//包头
*2.utc_time;//字段1:UTC 时间,hhmmss.sss,时分秒格式
*3.weidu;//字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
*4.NS;//字段3:纬度N(北纬)或S(南纬)
*5.jingdu;//字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)
*6.EW;//字段5:经度E(东经)或W(西经)
*7.state;//字段6:定位质量GPS状态,0初始化, 1单点定位, 2码差分, 3无效PPS, 4固定解, 5浮点解, 6正在估算 7,人工输入固定值, 8模拟模式, 9WAAS差分
*8.num;//字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)
*9.hdop;//字段8:HDOP水平精度因子(0.5 - 99.9)
*10.haiba_gao;//字段9:天线距离海平面高度(-9999.9 - 99999.9)
*11.gao_danwei;//字段10:高度单位M表示米
*12.tuoqiu;//字段11:地球椭球面相对大地水准面的高度
*13.chafen_time;//字段12:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
*14.chafen_id;//字段13:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)
*15.jiaoyan;//字段14:校验值
*16.tagid;//字段15,:设备id,低位在前高位在后HEX格式
*17.power;//字段16;电量,HEX格式,0~100
*18.信号强度
*19.保留1
*20. 保留2
*21.保留3**/
public static void dell_GNGGA(String message,String ip,int port) {
//根据自己需求写
String[] gpgga=message.split(",");//用逗号分割字段
int lenth=gpgga.length;//字段长度
if(lenth==21 ) {
String gps_utc_time=gpgga[1];//字段1:UTC 时间,hhmmss.sss,时分秒格式
String gps_weidu=gpgga[2];//字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
String gps_NS=gpgga[3];//字段3:纬度N(北纬)或S(南纬)
String gsp_jingdu=gpgga[4];//字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)
String gps_EW=gpgga[5];//字段5:经度E(东经)或W(西经)
//字段6:定位质量GPS状态,0初始化, 1单点定位, 2码差分, 3无效PPS,
//4固定解, 5浮点解, 6正在估算 7,人工输入固定值, 8模拟模式, 9WAAS差分
String gps_state=gpgga[6];
String gps_num=gpgga[7];//字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)
String gps_hdop=gpgga[8];//字段8:HDOP水平精度因子(0.5 - 99.9)
String gps_haiba_gao=gpgga[9];//字段9:海拔高度(-9999.9 - 99999.9)
String gao_danwei=gpgga[10];//高度单位M表示米
String gps_tuoqiu=gpgga[11];//字段10:地球椭球面相对大地水准面的高度
String gps_chafen_time=gpgga[12];//字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
String gps_chafen_id=gpgga[13];//字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)
String gps_jiaoyan=gpgga[14];//字段13:校验值
String tagid=gpgga[15];//设备id
String power=gpgga[16];//设备电量
String gpsxinhao="0";//GPS信号强度
String baoliu1="0";//保留字段1,CO+URT的时候为CO的浓度
String baoliu2="0";//保留字段2
String baoliu3="0";//保留字段3
}
}
}