室内外融合北斗+uwb终端数据监听和发送控制方法

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
		}
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值