Add AMBE parser and UDP sender.

This commit is contained in:
Mike Zingman 2016-07-30 12:28:49 -04:00
parent 4c5f808e5c
commit 107d8fa85d

View File

@ -21,6 +21,8 @@ from socket import gethostbyname
from random import randint from random import randint
from hashlib import sha256 from hashlib import sha256
from time import time from time import time
from bitstring import BitArray
import socket
# Debugging functions # Debugging functions
from pprint import pprint from pprint import pprint
@ -70,6 +72,7 @@ if cli_args.LOG_LEVEL:
logger = hb_log.config_logging(CONFIG['LOGGER']) logger = hb_log.config_logging(CONFIG['LOGGER'])
logger.debug('Logging system started, anything from here on gets logged') logger.debug('Logging system started, anything from here on gets logged')
# Shut ourselves down gracefully by disconnecting from the masters and clients. # Shut ourselves down gracefully by disconnecting from the masters and clients.
def handler(_signal, _frame): def handler(_signal, _frame):
logger.info('*** HBLINK IS TERMINATING WITH SIGNAL %s ***', str(_signal)) logger.info('*** HBLINK IS TERMINATING WITH SIGNAL %s ***', str(_signal))
@ -106,7 +109,37 @@ def hex_str_4(_int_id):
# Convert a hex string to an int (radio ID, etc.) # Convert a hex string to an int (radio ID, etc.)
def int_id(_hex_string): def int_id(_hex_string):
return int(h(_hex_string), 16) return int(h(_hex_string), 16)
#************************************************
# AMBE CLASS: Used to parse out AMBE and send to gateway
#************************************************
class AMBE:
_sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
def parseAMBE(self, _client, _data):
_seq = int_id(_data[4:5])
_srcID = int_id(_data[5:8])
_dstID = int_id(_data[8:11])
_rptID = int_id(_data[11:15])
_bits = int_id(_data[15:16]) # SCDV NNNN (Slot|Call type|Data|Voice|Seq or Data type)
_slot = 2 if _bits & 0x80 else 1
_callType = 1 if (_bits & 0x40) else 0
_frameType = (_bits & 0x30) >> 4
_voiceSeq = (_bits & 0x0f)
_streamID = int_id(_data[16:20])
logger.debug('(%s) seq: %d srcID: %d dstID: %d rptID: %d bits: %0X slot:%d callType: %d frameType: %d voiceSeq: %d streamID: %0X',
_client, _seq, _srcID, _dstID, _rptID, _bits, _slot, _callType, _frameType, _voiceSeq, _streamID )
#logger.debug('Frame 1:(%s)', self.ByteToHex(_data))
_dmr_frame = BitArray('0x'+h(_data[20:]))
_ambe = _dmr_frame[0:108] + _dmr_frame[156:264]
#_sock.sendto(_ambe.tobytes(), ("127.0.0.1", 31000))
ambeBytes = _ambe.tobytes()
self._sock.sendto(ambeBytes[0:9], ("127.0.0.1", 31000))
self._sock.sendto(ambeBytes[9:18], ("127.0.0.1", 31000))
self._sock.sendto(ambeBytes[18:27], ("127.0.0.1", 31000))
#************************************************ #************************************************
# HB MASTER CLASS # HB MASTER CLASS
#************************************************ #************************************************
@ -287,6 +320,7 @@ class HBMASTER(DatagramProtocol):
#************************************************ #************************************************
class HBCLIENT(DatagramProtocol): class HBCLIENT(DatagramProtocol):
ambe = AMBE()
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
if len(args) == 1: if len(args) == 1:
self._client = args[0] self._client = args[0]
@ -327,6 +361,7 @@ class HBCLIENT(DatagramProtocol):
_rf_src = _data[5:8] _rf_src = _data[5:8]
_dst_id = _data[8:11] _dst_id = _data[8:11]
logger.debug('(%s) DMRD - Seqence: %s, RF Source: %s, Destination ID: %s', self._client, h(_seq), int_id(_rf_src), int_id(_dst_id)) logger.debug('(%s) DMRD - Seqence: %s, RF Source: %s, Destination ID: %s', self._client, h(_seq), int_id(_rf_src), int_id(_dst_id))
self.ambe.parseAMBE(self._client, _data)
def datagramReceived(self, _data, (_host, _port)): def datagramReceived(self, _data, (_host, _port)):
# Validate that we receveived this packet from the master - security check! # Validate that we receveived this packet from the master - security check!