mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-15 10:07:26 -05:00
Add Motorola OTA alias decoding (#2098)
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* *****************************************************************************
|
* *****************************************************************************
|
||||||
* Copyright (C) 2014-2024 Dennis Sheirer
|
* Copyright (C) 2014-2024 Dennis Sheirer, 2024 Ilya Smirnov
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -38,6 +38,26 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class MotorolaTalkerAliasComplete extends TimeslotMessage implements IMessage
|
public class MotorolaTalkerAliasComplete extends TimeslotMessage implements IMessage
|
||||||
{
|
{
|
||||||
|
private static final byte[] LOOKUP_TABLE =
|
||||||
|
{
|
||||||
|
-14, 46, 102, -112, 116, -118, 111, 120, -69, 83, 3, 17, 104, -51, 68, 23,
|
||||||
|
40, 95, 30, -124, 117, 121, 110, -101, 44, -66, 98, 45, -15, 124, -72, -125,
|
||||||
|
-39, 78, 109, 2, 97, 61, -88, 6, -71, -8, -100, 55, 58, 35, -63, 80,
|
||||||
|
-19, -97, -81, 59, -67, -126, -70, -96, -33, -62, 71, 34, -16, -18, -95, -2,
|
||||||
|
-94, 16, 91, 72, 87, -93, 5, 96, 123, 13, -7, 108, -77, 86, 76, -68,
|
||||||
|
41, -92, 15, -20, -74, -91, -90, 60, 127, 107, -76, 33, -83, -82, -60, -56,
|
||||||
|
-59, 93, -34, -32, 29, 25, 75, -58, 12, 63, 90, -57, -31, 89, 85, 84,
|
||||||
|
74, 67, 66, -30, -29, -6, 0, -28, -27, 24, 65, 11, 10, -26, -4, -3,
|
||||||
|
-46, -10, -44, 43, 99, 73, -108, 94, -89, 92, 112, 105, -9, 8, -79, 125,
|
||||||
|
56, -49, -52, -40, 81, -113, -43, -109, 106, -13, -17, 126, -5, 100, -12, 53,
|
||||||
|
39, 7, 49, 20, -121, -104, 118, 52, -54, -110, 51, 27, 79, -116, 9, 64,
|
||||||
|
50, 54, 119, 18, -45, -61, 1, -85, 114, -127, -107, -55, -64, -23, 101, 82,
|
||||||
|
36, 48, 28, -37, -120, -24, -105, -99, 88, 38, 4, 57, -84, 42, -98, -86,
|
||||||
|
37, -41, -50, -21, -106, -11, 14, -115, -36, -87, 47, -35, 31, -22, -111, -73,
|
||||||
|
-42, -119, -117, -47, -80, -103, 19, 122, -25, -102, -75, -122, -1, 70, -123, -78,
|
||||||
|
115, -38, -65, -48, 113, -53, 77, -128, 21, 103, 22, 26, 32, -114, 69, 62
|
||||||
|
};
|
||||||
|
|
||||||
private static final IntField SUID_WACN = IntField.length20(OCTET_0_BIT_0);
|
private static final IntField SUID_WACN = IntField.length20(OCTET_0_BIT_0);
|
||||||
private static final IntField SUID_SYSTEM = IntField.length12(OCTET_2_BIT_16 + 4);
|
private static final IntField SUID_SYSTEM = IntField.length12(OCTET_2_BIT_16 + 4);
|
||||||
private static final IntField SUID_ID = IntField.length24(OCTET_4_BIT_32);
|
private static final IntField SUID_ID = IntField.length24(OCTET_4_BIT_32);
|
||||||
@@ -113,9 +133,64 @@ public class MotorolaTalkerAliasComplete extends TimeslotMessage implements IMes
|
|||||||
{
|
{
|
||||||
if(mAlias == null)
|
if(mAlias == null)
|
||||||
{
|
{
|
||||||
//BinaryMessage encoded = getEncodedAlias();
|
byte[] encoded = getEncodedAlias().toByteArray();
|
||||||
//TODO: implement decoding of the encoded alias.
|
|
||||||
String alias = "*ALIAS " + getRadio().getValue() + "*"; //Temporary value until we implement decoding
|
// TODO: check CRC in last two bytes to validate alias has no errors
|
||||||
|
//
|
||||||
|
// Data: wwwww sss iiiiii aaaa...aaaa cccc
|
||||||
|
//
|
||||||
|
// - w = WACN
|
||||||
|
// - s = system
|
||||||
|
// - i = id
|
||||||
|
// - a = encoded alias
|
||||||
|
// - c = CRC-16/GSM of the previous bytes
|
||||||
|
|
||||||
|
// Get number of bytes and characters excluding checksum
|
||||||
|
char bytes = (char)(encoded.length - 2);
|
||||||
|
char chars = (char)(bytes / 2);
|
||||||
|
|
||||||
|
// Create array for decoded computed bytes (big-endian)
|
||||||
|
byte[] decoded = new byte[encoded.length];
|
||||||
|
|
||||||
|
// Set up the long-running accumulator
|
||||||
|
char accumulator = bytes;
|
||||||
|
char byteIndex = 0;
|
||||||
|
|
||||||
|
// Calculate each byte sequentially
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// Multiplication step 1
|
||||||
|
char accumMult = (char)(((accumulator + 65536) % 65536) * 293 + 0x72E9);
|
||||||
|
|
||||||
|
// Lookup table step
|
||||||
|
byte lut = LOOKUP_TABLE[encoded[byteIndex] + 128];
|
||||||
|
byte mult1 = (byte)(lut - (byte)(accumMult >> 8));
|
||||||
|
|
||||||
|
// Incrementing step
|
||||||
|
byte mult2 = 1;
|
||||||
|
byte shortstop = (byte)(accumMult | 0x1);
|
||||||
|
byte increment = (byte)(shortstop << 1);
|
||||||
|
|
||||||
|
while(mult2 != -1 && shortstop != 1) {
|
||||||
|
shortstop = (byte)(shortstop + increment);
|
||||||
|
mult2 += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multiplication step 2
|
||||||
|
decoded[byteIndex] = (byte)(mult1 * mult2);
|
||||||
|
|
||||||
|
// Update the accumulator
|
||||||
|
accumulator += (char)(((encoded[byteIndex] + 256) % 256) + 1);
|
||||||
|
byteIndex += 1;
|
||||||
|
}
|
||||||
|
while(byteIndex < bytes);
|
||||||
|
|
||||||
|
// Copy decoded bytes (as chars) to our alias string
|
||||||
|
String alias = "";
|
||||||
|
for (char i = 0; i < chars; i++) {
|
||||||
|
alias += (char)((decoded[i * 2] << 8) | decoded[i * 2 + 1]);
|
||||||
|
}
|
||||||
|
|
||||||
mAlias = P25TalkerAliasIdentifier.create(alias);
|
mAlias = P25TalkerAliasIdentifier.create(alias);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,8 +267,7 @@ public class MotorolaTalkerAliasComplete extends TimeslotMessage implements IMes
|
|||||||
mIdentifiers = new ArrayList<>();
|
mIdentifiers = new ArrayList<>();
|
||||||
mIdentifiers.add(getTalkgroup());
|
mIdentifiers.add(getTalkgroup());
|
||||||
mIdentifiers.add(getRadio());
|
mIdentifiers.add(getRadio());
|
||||||
//TODO: uncomment once alias decoding is implemented.
|
mIdentifiers.add(getAlias());
|
||||||
// mIdentifiers.add(getAlias());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return mIdentifiers;
|
return mIdentifiers;
|
||||||
|
|||||||
Reference in New Issue
Block a user