北斗RDSS的TXA通讯申请和TXR通讯信息报文Java样例

        基于Java开发北斗RDSS的CCTXA【通讯申请】和BDTXR【通讯信息】的报文发送和接收java开发代码段

        1)发送CCTXA【通讯申请】

        2)接收到BDFKI【反馈信息】和BDTXR【通讯信息】

        发送CCTXA后,会接收到BDFKI反馈信息,如果反馈信息为正确,则对方可能会接收到BDTXR【通讯信息】(也可能存在丢包,非100%准确,和北斗终端的位置和灵敏度有关);如果BDFKI反馈信息表示为错误,则对方不会接收到BDTXR

 

(1)发送CCTXA【通讯申请】

public class TXASender implements Runnable
{
	MySerialPort sp_;

	int destCardNum_;						//目标用户的卡号(此次通信的收信方地址)
	int txType_;								//通讯类别:0-特快通信;1-普通通信
	int transType_;							//传输方式:0-汉字;1-代码;2-混合传输。
	String data_="313131";			//通信电文内容
	int interval_;

	String txaCmdStr = "CCTXA";
	private Logger log = Logger.getLogger(this.getClass());

。。。。。。

	public TXASender(MySerialPort sp, int destCardNum, int txType, int transType, String data, int interval)
	{
		sp_ = sp;
		destCardNum_ = destCardNum;
		txType_ = txType;
		transType_ = transType;
		data_ = data;
		interval_ = interval;
	}

	public void run()
	{
		int counter = 0;
		String sendData = "";
		while(true) 
		{
			counter++;
			sendData = (data_+"_No"+counter);

			String header = "$";
			String preMsg = txaCmdStr + "," + destCardNum_ + "," + txType_ + "," + transType_ + "," + ((2==transType_)?"A4":"") + strTo16(sendData);

			//log.debug("preMsg=["+preMsg+"]");
			//log.debug("getXORCheck=["+getXORCheck(preMsg.getBytes())+"]");
			String msg = header + preMsg + "*" + getXORCheck(preMsg.getBytes()) +"\r\n";

			log.debug("destCardNum_=["+destCardNum_+"]");
			log.debug("txType_=["+txType_+"]");
			log.debug("transType_=["+transType_+"]");
			log.debug("data=["+sendData+"]");

			try
			{
				sp_.send(msg.getBytes());

				log.debug("msg=["+msg+"]");
				log.debug("msg=["+strTo16(msg)+"]");

				System.out.println((new StringBuilder(String.valueOf((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())))).append("").toString());
				System.out.println("CCTXA(通讯申请),counter="+counter);
				System.out.println("用户地址(ID 号)="+destCardNum_);
				System.out.println("通信类别="+txType_);
				switch(txType_)
				{
				case 1:
					System.out.println("\t\t普通通信");
					break;
				case 0:
					System.out.println("\t\t特快通信");
					break;
				}
				System.out.println("传输方式="+transType_);
				switch(transType_)
				{
				case 0:
					System.out.println("\t\t汉字");
					break;
				case 1:
					System.out.println("\t\t代码");
					break;
				case 2:
					System.out.println("\t\t混合传输");
					break;
				}
				System.out.println("通信电文内容=["+sendData+"]");
				System.out.println("\n");
				Thread.sleep(1000L*interval_);
			}
			catch(Exception e)
			{
				e.printStackTrace();
				break;
			}
		}
	}
}

(2)接收BDFKI【反馈信息】和BDTXR【通讯信息】

public class TXReceiver implements Runnable
{
	MySerialPort sp_;

	int BDFKI_counter=0;					//反馈信息BDFKI计数器
	int BDTXR_counter=0;					//通讯信息BDTXR计数器

	private Logger log = Logger.getLogger(this.getClass());

	public TXReceiver(MySerialPort sp)
	{
		sp_ = sp;
	}

。。。。。。

	public void run()
	{
		byte recvDataBytes[];
		int recvDataLen = 0;

		while(true) 
		{
			recvDataBytes = new byte[1024];
			recvDataLen = 0;

			try
			{
				//while(sp_.is.available() > 0) 
				if(sp_.is.available() > 0) 
				{
					recvDataLen = sp_.read(recvDataBytes);	//从串口接收数据
					recvDataBytes[recvDataLen]=0;

					//输出接收到的所有信息
					log.debug("SerialPort recvDataLen=["+recvDataLen+"]");
					log.debug("SerialPort recvDataBytes=\n"+new String(recvDataBytes, 0, recvDataLen));
				}

				//未接收到串口数据
				if(0 == recvDataLen){
					Thread.sleep(1000L);
					continue;
				}

				boolean flag = false;
				int charIndex = 0;

				//拷贝数据,分析用
				byte recvDataTmp[] = new byte[recvDataLen];
				System.arraycopy(recvDataBytes, 0, recvDataTmp, 0, recvDataLen);

				if(recvDataLen > 5)
				{
					for(; charIndex < recvDataLen - 6; charIndex++)
					{
						//临时存储5个字符,用于判断各种指令
						byte tmp[] = new byte[5];
						System.arraycopy(recvDataTmp, charIndex, tmp, 0, 5);

						//BDFKI指令(反馈信息)
						if(tmp[0] == 0x42 && tmp[1] == 0x44 && tmp[2] == 0x46 && tmp[3] == 0x4b && tmp[4] == 0x49)
						{
							BDFKI_counter++;

							//获取指令后的数据
							String leftDataStr = new String(recvDataTmp, charIndex, recvDataTmp.length-charIndex);
							//log.debug("tmpStr1 ="+leftDataStr);
							//log.debug("tmpStr1 ="+strTo16(leftDataStr));

							//查找\r\n子串
							int indexCRNL = leftDataStr.indexOf("\r\n");
							if(indexCRNL>=0){
								//找到了\r\n子串,进行剔除
								leftDataStr = leftDataStr.substring(0, indexCRNL);
							}

							//log.debug("tmpStr2 ="+leftDataStr);
							//log.debug("tmpStr2 ="+strTo16(leftDataStr));

							//以,进行拆分子串
							String[] strArr = leftDataStr.split(",");
							//System.out.println(strArr.length);
							for (int i = 0; i < strArr.length; ++i){
								//System.out.println(strArr[i]);
							}

							//打印输出BDFKI的信息
							if(true)
							{
								System.out.println((new StringBuilder(String.valueOf((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())))).append("").toString());
								System.out.println("BDFKI(反馈信息),counter="+BDFKI_counter);
								System.out.println("\t"+leftDataStr);
								System.out.println("\t指令名称="+strArr[1]);
								System.out.println("\t指令执行情况="+strArr[2]);
								System.out.println("\t指令执行情况="+((strArr[2].equals("Y"))?"指令执行成功":"指令执行失败"));
								System.out.println("\t频度设置指示="+strArr[3]);
								System.out.println("\t频度设置指示="+((strArr[3].equals("Y"))?"频度设置正确":"频度设置错误"));
								System.out.println("\t发射抑制指示="+strArr[4]);
								System.out.print("\t发射抑制指示=");
								switch(Integer.valueOf(strArr[4]))
								{
								case 0:
									System.out.println("发射抑制解除");
									break;
								case 1:
									System.out.println("接收到系统的抑制指令,发射被抑制");
									break;
								case 2:
									System.out.println("电量不足,发射被抑制");
									break;
								case 3:
									System.out.println("设置为无线电静默,发射被抑制");

									break;
								}
								int index_ = strArr[5].indexOf("*");
								if(index_>=0)
									strArr[5] = strArr[5].substring(0, index_);
								System.out.println("\t等待时间="+Integer.valueOf(strArr[5])+"秒");
								System.out.println("\n");
							}
						}
						//BDTXR指令(通信信息)
						else if(tmp[0] == 0x42 && tmp[1] == 0x44 && tmp[2] == 0x54 && tmp[3] == 0x58 && tmp[4] == 0x52)
						{
							BDTXR_counter++;

							String leftDataStr = new String(recvDataTmp, charIndex, recvDataTmp.length-charIndex);
							//log.debug("tmpStr1 ="+leftDataStr);
							//log.debug("tmpStr1 ="+strTo16(leftDataStr));

							int indexCRNL = leftDataStr.indexOf("\r\n");
							if(indexCRNL>=0)
								leftDataStr = leftDataStr.substring(0, indexCRNL);

							log.debug("tmpStr2 ="+leftDataStr);
							log.debug("tmpStr2 ="+strTo16(leftDataStr));

							String[] strArr = leftDataStr.split(",");
							//System.out.println(strArr.length);
							for (int i = 0; i < strArr.length; ++i){
								//System.out.println(strArr[i]);
							}

							//打印输出BDTXR的信息
							if(true)
							{
								System.out.println((new StringBuilder(String.valueOf((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date())))).append("").toString());
								System.out.println("BDTXR(通讯信息),counter="+BDTXR_counter);
								System.out.println("\t"+leftDataStr);
								System.out.println("\t信息类别="+strArr[1]);
								switch(Integer.valueOf(strArr[1]))
								{
								case 1:
									System.out.println("\t\t普通通信");
									break;
								case 2:
									System.out.println("\t\t特快通信");
									break;
								case 3:
									System.out.println("\t\t通播通信(可以判断是下属用户)");
									break;
								case 4:
									System.out.println("\t\t按最新存入电文查询获得的通信");

									break;
								case 5:
									System.out.println("\t\t按发信方地址查询获得的通信");

									break;
								}

								System.out.println("\t发信方地址="+strArr[2]);

								System.out.println("\t电文形式="+strArr[3]);
								switch(Integer.valueOf(strArr[3]))
								{
								case 0:
									System.out.println("\t\t汉字");
									break;
								case 1:
									System.out.println("\t\t代码");
									break;
								case 2:
									System.out.println("\t\t混合传输");
									break;
								}

								System.out.println("\t发信时间="+strArr[4]);

								int index_ = strArr[5].indexOf("*");
								if(index_>=0)
									strArr[5] = strArr[5].substring(0, index_);
								System.out.println("\t通信电文内容1="+strArr[5]);
								if(2==Integer.valueOf(strArr[3]))
									strArr[5] = strArr[5].substring(2,strArr[5].length());
								System.out.println("\t通信电文内容2="+strArr[5]);
								System.out.println("\t通信电文内容3="+hexStringToString(strArr[5]));
								System.out.println("\n");
							}
						}
						else{
							continue;
						}
					}
				}
			}
			catch(IOException e)
			{
				e.printStackTrace();
			}
			catch(Exception e)
			{
				e.printStackTrace();
				break;
			}
		}
	}
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
北斗RDSS区域短报文功能是指北斗卫星导航系统中的一项特殊功能,它通过北斗卫星提供的短报文通信能力,实现在无人区、弱信号地区使用北斗终端和短信、微信互通的功能。这项功能解决了工作人员在偏远地区无法及时上报位置、无法与外界联系的难题。此外,在紧急时刻,北斗RDSS区域短报文功能还可以通过北斗终端上的SOS键向后台发起求救信号,提高救援效率,降低企业损失。\[1\]北斗RDSS区域短报文功能的技术解决方案包括现场端和局端两部分。现场端包括北斗手持终端、北斗车载终端、北斗船载终端等,通过北斗卫星这条新的通信链路发送到局端的接收设备,实现与局端之间的数据透传。局端收到北斗报文后,通过北斗通信前置服务器的软件解析并将数据传送至用户的业务系统,实现用户的业务功能。\[2\]北斗RDSS区域短报文功能具备双向通信能力,可以在全球范围内为各类用户提供高精度、高可靠的定位、导航、授时、短报文通信服务。它具有通信信道的稳定性、无通信盲区、传送距离远、良好的加密功能等特点。用户终端采用一户一密的安全加密方式,保证用户数据通信的安全性。\[3\]总之,北斗RDSS区域短报文功能是北斗卫星导航系统中的一项重要功能,通过短报文通信实现了在偏远地区的通信需求,提高了工作效率和安全性。 #### 引用[.reference_title] - *1* *3* [北斗RDSS卫星短报文通信对构建全国覆盖的应急通信链路的重要作用](https://blog.csdn.net/weixin_44303398/article/details/96484473)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基于北斗RDSS短报文通信卫星的位置追踪监控和应急通信系统技术解决方案](https://blog.csdn.net/weixin_44303398/article/details/97392252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pony12

助力1000篇OpenDDS文

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值