From 2db9c0154ee7e1e0c35bd2e3c05a4c76d71c7b09 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 1 Jul 2023 12:25:13 +0300 Subject: [PATCH] Handle third party header with rx gating --- codec2talkie/build.gradle | 4 ++-- .../radio/codec2talkie/protocol/AprsIs.java | 5 +++++ .../protocol/aprs/tools/AprsIsData.java | 20 +++++++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/codec2talkie/build.gradle b/codec2talkie/build.gradle index 79b33e0..c5c81ee 100644 --- a/codec2talkie/build.gradle +++ b/codec2talkie/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.radio.codec2talkie" minSdkVersion 23 targetSdkVersion 30 - versionCode 160 - versionName "1.60" + versionCode 161 + versionName "1.61" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/AprsIs.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/AprsIs.java index 61c5368..9bd38ac 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/AprsIs.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/AprsIs.java @@ -171,9 +171,14 @@ public class AprsIs implements Protocol, Runnable { @Override protected void onReceiveData(String src, String dst, String path, byte[] data) { if (_isRxGateEnabled && !_isLoopbackTransport) { + // NOTE, https://aprs-is.net/IGateDetails.aspx AprsIsData aprsIsData = new AprsIsData(src, dst, path, new String(data)); if (aprsIsData.isEligibleForRxGate()) { synchronized (_toAprsIsQueue) { + // strip "rf header" for third party packets before gating + if (aprsIsData.hasThirdParty()) { + aprsIsData = aprsIsData.thirdParty; + } String rawData = aprsIsData.toString() + "\n"; _toAprsIsQueue.put(rawData.getBytes()); } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/tools/AprsIsData.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/tools/AprsIsData.java index c7e58f3..e6f6f78 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/tools/AprsIsData.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/tools/AprsIsData.java @@ -11,6 +11,7 @@ public class AprsIsData { public String digipath; public String rawDigipath; public String data; + public AprsIsData thirdParty; public AprsIsData() { } @@ -20,6 +21,14 @@ public class AprsIsData { this.dst = dst; this.digipath = path; this.data = data; + // handle third party packet + if (data.length() > 10 && data.startsWith("}")) { + thirdParty = AprsIsData.fromString(data.substring(1)); + } + } + + public boolean hasThirdParty() { + return thirdParty != null; } @NonNull @@ -39,8 +48,12 @@ public class AprsIsData { rawDigipath.contains("NOGATE") || rawDigipath.contains("RFONLY"); - // do not gate TCPIP/NOGATE and queries - return !hasNoGate && !data.startsWith("?"); + boolean thirdPartyHasNoGate = thirdParty != null && + (thirdParty.rawDigipath.contains("TCPIP") || + thirdParty.rawDigipath.contains("TCPXX")); + + // do not gate TCPIP/NOGATE, queries and third party tcp ip packets + return !hasNoGate && !data.startsWith("?") && !thirdPartyHasNoGate; } public boolean isEligibleForTxGate() { @@ -65,6 +78,9 @@ public class AprsIsData { aprsIsData.digipath = joinTail(path, ",", "^WIDE.+$"); aprsIsData.rawDigipath = joinTail(path, ",", ".*"); aprsIsData.data = joinTail(digipathData, ":", ".*"); + if (aprsIsData.data.length() > 10 && aprsIsData.data.startsWith("}")) { + aprsIsData.thirdParty = AprsIsData.fromString(aprsIsData.data.substring(1)); + } return aprsIsData; }