Clean-up, re-arranging
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
##DMRlink FAQ
|
||||
**PURPOSE:** Since DMRlink was published, a number of similar questions have come in regarding it's use. This FAQ will attempt to address common questions or concerns.
|
||||
|
||||
**Can DMRlink bridge networks like a c-Bridge?** Yes, bridge.py can bridge IPSC networks, but no, not not quite like a c-Bridge. It does not have automatic scheduling or "trigggering" of bridge events. Currently bridge rules must all be static.
|
||||
|
||||
**Someone said DMRlink "bricked" their repeater, is it safe to use?** DMRlink has no abilty to speak the XNL/XCMP protocol (which involves encrypted keys) that Motorla uses to control radios and repeaters. DMRlink simply cannot even remotely speak the language necessary to do this.
|
||||
|
||||
**DMRlink is OpenSource, but IPSC is proprietary, will I get in trouble for using it?** DMRlink is an original interpretation of the IPSC protocol. It's probably not quite 100% correct, and it certainly doesn't implement every last feature in IPSC. It is not being sold, and it is not presented as a replacement for exising commercial software. We have received no complaints from Motorola regarding this project. We do not believe using it will be a problem -- if there's a problem, it will be with those of us who wrote it, and to date, we have recieved no complaints.
|
||||
|
||||
**Was DMRlink created by hacking the c-Bridge and/or SmartPTT?** Absolutely not! DMRlink was created using wireshark to capture packets between IPSC speaking endpoints on an IPSC network and pattern-matching. For example, when we know the transmisison was from radio ID 12345, we assume that when we find 12345 in the data stream, that's the source radio ID... we then further match patterns to validate what we find. This is why DMRlink will likely never include all features in IPSC, like XNL/XCMP for example, which uses encryption that makes pattern matching virutally impossible.
|
||||
|
||||
**Why can't DMRlink talk to my c-Bridge over a CC-CC connection??** The c-Bridge CC-CC connection is a proprietary system written by Ravennet Systems. It is not part of IPSC, and is used only between c-Bridge, TL-NET and other Ravennet-based RoIP systems. The DMRlink project only deals with IPSC. As such it doesn't communicate with SmartPTT radioserver-to-radioserver links either.
|
||||
|
||||
**Will you help me get it working?** DMRlink is not commercial software, and nobody is getting paid to write it. The work here represents HUNDREDS of hours of volunteer effort. We will help as we can, but you must be familiar with IP data networking, very basic programming (preferably python) and IPSC or you will likely have a very hard time getting it to work to your satisfaction.
|
||||
|
||||
|
||||
***73 DE N0MJS***
|
||||
@@ -0,0 +1,134 @@
|
||||
This is the internal structure dmrlink uses to hold master, peer and local information for each IPSC. the actual numbers are bogus, and the encoded FLAGS and MODE bytes don't match the binary decoding. This example is only to illustrate and document the struture in a "pretty print" type format only. Yeah, you could just pretty print it, but this is a little cleaner and you don't have to go in and take the extra 5 mintues this way.
|
||||
|
||||
{
|
||||
'MASTER': {
|
||||
'STATUS': {
|
||||
'KEEP_ALIVES_OUTSTANDING': 1,
|
||||
'KEEP_ALIVES_MISSED': 0,
|
||||
'CONNECTED': True,
|
||||
'KEEP_ALIVES_SENT': 10,
|
||||
'PEER_LIST': True },
|
||||
'MODE_DECODE': {
|
||||
'TS_1': True,
|
||||
'TS_2': True,
|
||||
'PEER_MODE': 'DIGITAL',
|
||||
'PEER_OP': True },
|
||||
'FLAGS_DECODE': {
|
||||
'VOICE': True,
|
||||
'RCM': True,
|
||||
'XNL_SLAVE': True,
|
||||
'MASTER': True,
|
||||
'CON_APP': True,
|
||||
'XNL_CON': False,
|
||||
'CSBK': True,
|
||||
'DATA': True,
|
||||
'XNL_MASTER': False,
|
||||
'AUTH': True },
|
||||
'IP': '10.10.10.1',
|
||||
'RADIO_ID': '\x00\x00\x00\x01',
|
||||
'FLAGS': '\x00\x00\xe0\x3d',
|
||||
'MODE': '\x6a',
|
||||
'PORT': 50001 },
|
||||
'PEERS': {
|
||||
'\x00\x00\x01\x03': {
|
||||
'STATUS': {
|
||||
'KEEP_ALIVES_OUTSTANDING': 1,
|
||||
'KEEP_ALIVES_MISSED': 0,
|
||||
'CONNECTED': True,
|
||||
'KEEP_ALIVES_SENT': 8 },
|
||||
'MODE_DECODE': {
|
||||
'TS_1': True,
|
||||
'TS_2': True,
|
||||
'PEER_MODE': 'DIGITAL',
|
||||
'PEER_OP': True },
|
||||
'FLAGS_DECODE': {
|
||||
'VOICE': True,
|
||||
'RCM': False,
|
||||
'XNL_SLAVE': False,
|
||||
'MASTER': False,
|
||||
'CON_APP': True,
|
||||
'XNL_CON': False,
|
||||
'CSBK': False,
|
||||
'DATA': True,
|
||||
'XNL_MASTER': False,
|
||||
'AUTH': True },
|
||||
'IP': '10.10.20.1',
|
||||
'FLAGS': '\x00\x00\x00\x1c',
|
||||
'MODE': '\x6a',
|
||||
'PORT': 51990 },
|
||||
'\x00\x00\x05\x80': {
|
||||
'STATUS': {
|
||||
'KEEP_ALIVES_OUTSTANDING': 1,
|
||||
'KEEP_ALIVES_MISSED': 0,
|
||||
'CONNECTED': True,
|
||||
'KEEP_ALIVES_SENT': 8},
|
||||
'MODE_DECODE': {
|
||||
'TS_1': True,
|
||||
'TS_2': True,
|
||||
'PEER_MODE': 'DIGITAL',
|
||||
'PEER_OP': True },
|
||||
'FLAGS_DECODE': {
|
||||
'VOICE': True,
|
||||
'RCM': False,
|
||||
'XNL_SLAVE': False,
|
||||
'MASTER': False,
|
||||
'CON_APP': True,
|
||||
'XNL_CON': False,
|
||||
'CSBK': False,
|
||||
'DATA': True,
|
||||
'XNL_MASTER': False,
|
||||
'AUTH': True },
|
||||
'IP': '10.10.20.2',
|
||||
'FLAGS': '\x00\x00\x00\x01',
|
||||
'MODE': '\x6a',
|
||||
'PORT': 50900 },
|
||||
'\x00\x04\xa2\x37': {
|
||||
'STATUS': {
|
||||
'KEEP_ALIVES_OUTSTANDING': 1,
|
||||
'KEEP_ALIVES_MISSED': 0,
|
||||
'CONNECTED': True,
|
||||
'KEEP_ALIVES_SENT': 8 },
|
||||
'MODE_DECODE': {
|
||||
'TS_1': True,
|
||||
'TS_2': True,
|
||||
'PEER_MODE': 'DIGITAL',
|
||||
'PEER_OP': True },
|
||||
'FLAGS_DECODE': {
|
||||
'VOICE': True,
|
||||
'RCM': False,
|
||||
'XNL_SLAVE': False,
|
||||
'MASTER': False,
|
||||
'CON_APP': False,
|
||||
'XNL_CON': False,
|
||||
'CSBK': True,
|
||||
'DATA': True,
|
||||
'XNL_MASTER': True,
|
||||
'AUTH': True },
|
||||
'IP': '10.10.20.3',
|
||||
'FLAGS': '\x00\x00\x00\x01',
|
||||
'MODE': '\x6a',
|
||||
'PORT': 50000 },
|
||||
'LOCAL': {
|
||||
'TS2_LINK': True,
|
||||
'AUTH_KEY': '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xcd\xef\xf0',
|
||||
'CON_APP': True,
|
||||
'RADIO_ID': '\x00\x67\x03',
|
||||
'ENABLED': True,
|
||||
'ALIVE_TIMER': 5,
|
||||
'TS1_LINK': True,
|
||||
'RCM': True,
|
||||
'AUTH_ENABLED': True,
|
||||
'IPSC_MODE': 'DIGITAL',
|
||||
'DATA_CALL': True,
|
||||
'NUM_PEERS': 6,
|
||||
'PORT': 50001,
|
||||
'VOICE_CALL': True,
|
||||
'MASTER_PEER': False,
|
||||
'CSBK_CALL': True,
|
||||
'XNL_CALL': True,
|
||||
'XNL_MASTER': True,
|
||||
'MODE': '\x6a',
|
||||
'MAX_MISSED': 20,
|
||||
'FLAGS': '\x00\x00\xe0\xdc',
|
||||
'PEER_OPER': True }
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
PARTS OF THE PACKET THAT ARE NOT KNOWN ARE WRAPPED WITH STARS -- LIKE THIS **00.00.AC**, MEANS WE DONT KNOW WHAT THAT IS
|
||||
|
||||
VOICE HEADER 1: 80 00.04.bf.fd 08 2f.7c.ca 00.00.02 02 **00.00.30.ac** 20 | 80.dd 3b.01 3b.eb.3c.e0 00.00.00.00 | 01 80 00.0a 80 0a 00.60 00 00 00 00.00.02 2f.7c.ca 92.af.70 **00113532**
|
||||
VOICE HEADER 2: 80 00.04.bf.fd 08 2f.7c.ca 00.00.02 02 **00.00.30.ac** 20 | 80.5d 3b.02 3b.eb.3e.c0 00.00.00.00 | 01 80 00.0a 80 0a 00.60 00 00 00 00.00.02 2f.7c.ca 92.af.70 **00113530**
|
||||
VOICE HEADER 3: 80 00.04.bf.fd 08 2f.7c.ca 00.00.02 02 **00.00.30.ac** 20 | 80.5d 3b.03 3b.eb.40.a0 00.00.00.00 | 01 80 00.0a 80 0a 00.60 00 00 00 00.00.02 2f.7c.ca 92.af.70 **00113531**
|
||||
VOICE BURST A: 80 00.04.bf.fd 08 2f.7c.ca 00.00.02 02 **00.00.30.ac** 20 | 80.5d 3b.04 3b.eb.42.80 00.00.00.00 | 8a 14 **40** f8.01.a9.9f.8c.e0.be.00.6a.67.e3.38.2f.80.1a.99.f8.ce.08
|
||||
VOICE BURST B: 80 00.04.bf.fd 08 2f.7c.ca 00.00.02 02 **00.00.30.ac** 20 | 80.5d 3b.05 3b.eb.44.60 00.00.00.00 | 8a 19 **06** f8.01.a9.9f.8c.e0.be.00.6a.67.e3.38.2f.80.1a.99.f8.ce.08 **0505060612**
|
||||
VOICE BURST C: 80 00.04.bf.fd 08 2f.7c.ca 00.00.02 02 **00.00.30.ac** 20 | 80.5d 3b.06 3b.eb.46.40 00.00.00.00 | 8a 19 **06** f8.01.a9.9f.8c.e0.be.00.6a.67.e3.38.2f.80.1a.99.f8.ce.08 **0905060516**
|
||||
VOICE BURST D: 80 00.04.bf.fd 08 2f.7c.ca 00.00.02 02 **00.00.30.ac** 20 | 80.5d 3b.07 3b.eb.48.20 00.00.00.00 | 8a 19 **06** 98.02.b9.4f.a4.d3.bb.b7.96.c7.83.d8.ee.81.19.41.e4.4a.68 **0f05060f16**
|
||||
VOICE BURST E: 80 00.04.bf.fd 08 2f.7c.ca 00.00.02 02 **00.00.30.ac** 20 | 80.5d 3b.08 3b.eb.4a.00 00.00.00.00 | 8a 22 **16** e8.1a.62.d6.8c.6b.ba.06.3d.0d.eb.04.e9.81.dd.f1.04.86.c8 **000a0a0c000000** 00.00.02 2f.7c.ca **14**
|
||||
VOICE BURST F: 80 00.04.bf.fd 08 2f.7c.ca 00.00.02 02 **00.00.30.ac** 20 | 80.5d 3b.09 3b.eb.4b.e0 00.00.00.00 | 8a 19 **06** 98.22.d3.d9.00.b4.a6.05.6d.29.a2.17.a8.82.75.14.f8.10.08 **0000000010**
|
||||
VOICE TERMINATOR: 80 00.04.bf.fd 08 2f.7c.ca 00.00.02 02 **00.00.30.ac** 60 | 80.5e 3e.76 3b.f1.b8.40 00.00.00.00 | 02 80 00.0a 80 0a 00.60 00 00 00 00.00.02 2f.7c.ca 9d.a0.7f **00123535**
|
||||
|
||||
|
||||
VOICE HEADER: 54 Bytes (0-53) (sent 3 times, see notes):
|
||||
IPSC:
|
||||
PACKET_TYPE[0]
|
||||
PEER_ID[1-4]
|
||||
IPSC_SEQ[5]
|
||||
SRC_SUB[6-9]
|
||||
DST_SUB[9-11]
|
||||
CALL_TYPE[12]
|
||||
CALL_CONTROL[13-16] (use a random number)
|
||||
CALL_INFO[17]
|
||||
RTP:
|
||||
RTP_HEAD[18-19]
|
||||
RTP_SEQ[20-21]
|
||||
RTP_TIMESTMP[22-25]
|
||||
RTP_SSID[26-29]
|
||||
RTP PAYLOAD:
|
||||
BURST_TYPE[30]
|
||||
RSSI_THRESH_PARITY[31]
|
||||
LENGTH_TO_FOLLOW[32-33] (in words)
|
||||
RSSI_STATUS[34]
|
||||
SLOT_TYPE_SYNC[35]
|
||||
DATA_SIZE[36-37] Burst data length in bits; 96/8 = 12.. last 4 bytes ont part of Burst??
|
||||
FULL_LC_BYTE1[38] (PF, R, FLCO)
|
||||
FULL_LC_FID[39]
|
||||
VOICE_PDU_SVC_OPT[40]
|
||||
VOICE_PDU_DST[41-43]
|
||||
VOICE_PDU_SRC[44-46]
|
||||
BURST_CRC[47-49]
|
||||
VOICE_PDU_DST[41-43]
|
||||
VOICE_PDU_SRC[44-46]
|
||||
BURST_CRC[47-49] (Reed-Solomon(12,9) if the same as DMR burst, though sample data doesn't come out right)
|
||||
???[50-53]
|
||||
|
||||
VOICE BURST A: 52 Bytes (0-51):
|
||||
IPSC:
|
||||
PACKET_TYPE[0]
|
||||
PEER_ID[1-4]
|
||||
IPSC_SEQ[5]
|
||||
SRC_SUB[6-9]
|
||||
DST_SUB[9-11]
|
||||
CALL_TYPE[12]
|
||||
CALL_CONTROL[13-16] (use a random number)
|
||||
CALL_INFO[17]
|
||||
RTP:
|
||||
RTP_HEAD[18-19]
|
||||
RTP_SEQ[20-21]
|
||||
RTP_TIMESTMP[22-25]
|
||||
RTP_SSID[26-29]
|
||||
RTP PAYLOAD:
|
||||
BURST_TYPE[30]
|
||||
LENGTH[31] (bytes left after this one)
|
||||
???[32]
|
||||
AMBE_DATA[33-51]
|
||||
|
||||
VOICE BURST B-D and maybe F: 57 Bytes (0-56):
|
||||
IPSC:
|
||||
PACKET_TYPE[0]
|
||||
PEER_ID[1-4]
|
||||
IPSC_SEQ[5]
|
||||
SRC_SUB[6-9]
|
||||
DST_SUB[9-11]
|
||||
CALL_TYPE[12]
|
||||
CALL_CONTROL[13-16] (use a random number)
|
||||
CALL_INFO[17]
|
||||
RTP:
|
||||
RTP_HEAD[18-19]
|
||||
RTP_SEQ[20-21]
|
||||
RTP_TIMESTMP[22-25]
|
||||
RTP_SSID[26-29]
|
||||
RTP PAYLOAD:
|
||||
BURST_TYPE[30]
|
||||
LENGTH[31] (bytes left after this one)
|
||||
???[32]
|
||||
AMBE_DATA[33-51]
|
||||
???[52-56]
|
||||
|
||||
VOICE BURST E: 66 Bytes (0-65):
|
||||
IPSC:
|
||||
PACKET_TYPE[0]
|
||||
PEER_ID[1-4]
|
||||
IPSC_SEQ[5]
|
||||
SRC_SUB[6-9]
|
||||
DST_SUB[9-11]
|
||||
CALL_TYPE[12]
|
||||
CALL_CONTROL[13-16] (use a random number)
|
||||
CALL_INFO[17]
|
||||
RTP:
|
||||
RTP_HEAD[18-19]
|
||||
RTP_SEQ[20-21]
|
||||
RTP_TIMESTMP[22-25]
|
||||
RTP_SSID[26-29]
|
||||
RTP PAYLOAD:
|
||||
BURST_TYPE[30]
|
||||
LENGTH[31] (bytes left after this one)
|
||||
???[32]
|
||||
AMBE_DATA[33-51]
|
||||
???[52-64]
|
||||
VOICE_PDU_DST[59-61]
|
||||
VOICE_PDU_SRC[62-64]
|
||||
???[65]
|
||||
|
||||
VOICE BURST F, Same as B-D???: 57 Bytes (0-56):
|
||||
|
||||
VOICE TERMINATOR: 54 Bytes (0-53)
|
||||
IPSC:
|
||||
PACKET_TYPE[0]
|
||||
PEER_ID[1-4]
|
||||
IPSC_SEQ[5]
|
||||
SRC_SUB[6-9]
|
||||
DST_SUB[9-11]
|
||||
CALL_TYPE[12]
|
||||
CALL_CONTROL[13-16] (use a random number)
|
||||
CALL_INFO[17]
|
||||
RTP:
|
||||
RTP_HEAD[18-19]
|
||||
RTP_SEQ[20-21]
|
||||
RTP_TIMESTMP[22-25]
|
||||
RTP_SSID[26-29]
|
||||
RTP PAYLOAD:
|
||||
BURST_TYPE[30]
|
||||
RSSI_THRESH_PARITY[31]
|
||||
LENGTH_TO_FOLLOW[32-33] (in words)
|
||||
RSSI_STATUS[34]
|
||||
SLOT_TYPE_SYNC[35]
|
||||
DATA_SIZE[36-37] Burst data length in bits; 96/8 = 12.. last 4 bytes ont part of Burst??
|
||||
IPSC_DATA { [38] to (LENGTH_TO_FOLLOW *2)-4 }
|
||||
FULL_LC_BYTE1[38] (PF, R, FLCO)
|
||||
FULL_LC_FID[39]
|
||||
VOICE_PDU_SVC_OPT[40]
|
||||
VOICE_PDU_DST[41-43]
|
||||
VOICE_PDU_SRC[44-46]
|
||||
BURST_CRC[47-49] (Reed-Solomon(12,9) if the same as DMR burst, though sample data doesn't come out right)
|
||||
???[50-53]
|
||||
|
||||
|
||||
A is a sync burst
|
||||
B,C,D are the ame
|
||||
E has extra data -- EMB?
|
||||
F is the same length as B,C,D, but has a lot of zeros near the end.
|
||||
|
||||
Send a wakeup before starting a call (type 0x85
|
||||
|
||||
IPSC Sequence Number - incremented with each call made
|
||||
|
||||
RTP Header - Marker set for 1st voide header - 0x80DD, not for anything else 0x805D except terminator 0x80DE, which is the payload type and use is proprietary.
|
||||
I've decoded the bits in the RTP header, it's going to be ok to use this recipe. Nothing else is going on.
|
||||
|
||||
RTP Sequence number -- increment with each packet
|
||||
|
||||
RTP timestamp - assumed currently to be 32 bit fixed point number 16bit.16bit seconds. Which would place these packets at 4.8ms apart... seems wrong.
|
||||
|
||||
LENGTH_TO_FOLLOW is in 16bit words
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
|
||||
80 00.04.c2.c0 cb 2f.9b.e5 00.0c.30 02 00.00.48.c2 20 | 80.dd a9.97 1c.4d.ab.76 00.00.00.00 | 01 80 00.0a 80 0a 00.60 00 10 20 00.0c.30 2f.9b.e5 da.d4.5a 00 11 71 18
|
||||
80 00.04.c2.c0 cb 2f.9b.e5 00.0c.30 02 00.00.48.c2 20 | 80.5d a9.98 1c.4d.ad.56 00.00.00.00 | 01 80 00.0a 80 0a 00.60 00 10 20 00.0c.30 2f.9b.e5 da.d4.5a 00 11 71 2b
|
||||
80 00.04.c2.c0 cb 2f.9b.e5 00.0c.30 02 00.00.48.c2 20 | 80.5d a9.99 1c.4d.af.36 00.00.00.00 | 01 80 00.0a 80 0a 00.60 00 10 20 00.0c.30 2f.9b.e5 da.d4.5a 00 11 71 8a
|
||||
|
||||
80 00.04.c2.c0 cb 2f.9b.e5 00.0c.30 02 00.00.48.c2 20 | 80.5d a9.9a 1c.4d.b1.16 00.00.00.00 | 8a 14 40 f8.01.a9.9f.8c.e0.be.00.6a.67.e3.38.2f.80.1a.99.f8.ce.08
|
||||
80 00.04.c2.c0 cb 2f.9b.e5 00.0c.30 02 00.00.48.c2 20 | 80.5d a9.9b 1c.4d.b2.f6 00.00.00.00 | 8a 19 06 f8.01.a9.9f.8c.e0.be.00.6a.67.e3.38.2f.80.1a.99.f8.ce.08 4e 0f 06 06 12
|
||||
80 00.04.c2.c0 cb 2f.9b.e5 00.0c.30 02 00.00.48.c2 20 | 80.5d a9.9c 1c.4d.b4.d6 00.00.00.00 | 8a 19 06 f8.01.a9.9f.8c.e0.be.00.6a.67.e3.38.2f.80.1a.99.f8.ce.08 17 11 00 47 16
|
||||
80 00.04.c2.c0 cb 2f.9b.e5 00.0c.30 02 00.00.48.c2 20 | 80.5d a9.9d 1c.4d.b6.b6 00.00.00.00 | 8a 19 06 f8.01.a9.9f.8c.e0.a6.00.ae.53.e9.34.ea.c0.92.e8.b4.fb.88 0c 03 18 1b 16
|
||||
80 00.04.c2.c0 cb 2f.9b.e5 00.0c.30 02 00.00.48.c2 20 | 80.5d a9.9e 1c.4d.b8.96 00.00.00.00 | 8a 22 16 48.03.42.64.a4.e9.1a.02.d2.a1.63.1a.a9.80.9a.32.78.1b.a8 17 5a 0f 4e 00 10 20 00.0c.30 2f.9b.e5 14
|
||||
80 00.04.c2.c0 cb 2f.9b.e5 00.0c.30 02 00.00.48.c2 20 | 80.5d a9.9f 1c.4d.ba.76 00.00.00.00 | 8a 19 06 98.02.24.99.01.0b.3a.02.6a.b3.59.36.4a.80.27.90.ec.68.58 00 00 00 00 10
|
||||
|
||||
80 00.04.c2.c0 cb 2f.9b.e5 00.0c.30 02 00.00.48.c2 60 | 80.5e a9.ca 1c.4e.0b.16 00.00.00.00 | 02 80 00.0a 80 0a 00.60 00 10 20 00.0c.30 2f.9b.e5 d5.db.55 00 12 74 5c
|
||||
Reference in New Issue
Block a user