Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import time
- import struct
- import socket
- import pyodbc
- import logging
- import datetime
- UDP_IP = '192.168.10.2'
- UDP_PORT = 4007
- def rawbytes(s):
- """
- Convert a string to raw bytes without encoding
- Used to convert the encoded string message for the radio into a byte array
- """
- outlist = []
- for cp in s:
- num = ord(cp)
- if num < 255:
- outlist.append(struct.pack('B', num))
- elif num < 65535:
- outlist.append(struct.pack('>H', num))
- else:
- b = (num & 0xFF0000) >> 16
- H = num & 0xFFFF
- outlist.append(struct.pack('>bH', b, H))
- return b''.join(outlist)
- def decode_message(message):
- """
- decode the string message coming from the radio
- """
- # header = message[:message.index(b'\n')]
- header = message[:6]
- ret = message[6:].replace(b'\x00', b'')
- return header, ret.decode(errors='ignore').strip()
- def recv_message(cursor, conn, udp_ip=UDP_IP, udp_port=UDP_PORT):
- """
- listen for messages then generate ack and send it
- """
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- sock.bind((udp_ip, udp_port))
- while True:
- data, addr = sock.recvfrom(1024)
- header, decoded_message = decode_message(data)
- if len(header) == 6:
- print('Recieved {} from {}:{}'.format(
- decoded_message, addr[0], addr[1]))
- # time.sleep(1)
- send_ack(generate_ack(header), sock, addr[0], addr[1])
- push_to_db(cursor, conn, decoded_message, addr[0])
- def push_to_db(cursor, conn, decoded_message, radio_id):
- cursor.execute('insert into messages (radio_id, message_type, message_text, timestamp) values(?, ?, ?, ?)',
- 205, 'Text', decoded_message, datetime.datetime.now())
- conn.commit()
- def generate_ack(header):
- """
- generate ack for message
- """
- msg_header_2 = bin(header[5])[2:]
- extension = 0
- if msg_header_2[1:3] != '00':
- extension = 1
- seq_extension = msg_header_2[1:3]
- ack_header_3 = '0{}00000'.format(seq_extension)
- ack_message_size = '0000000000000100'
- else:
- ack_header_3 = ''
- ack_message_size = '0000000000000011'
- seq_num = bin(header[4])[2:][3:]
- ack_header_1 = '10011111'
- ack_header_2 = '{}00{}'.format(extension, seq_num)
- address_size = '00000000'
- print(ack_message_size[:8], ack_message_size[8:], ack_header_1,
- address_size, ack_header_2, ack_header_3)
- s = ack_message_size + ack_header_1 + address_size + ack_header_2 + ack_header_3
- return bytes(int(s[i:i+8], 2) for i in range(0, len(s), 8))
- def send_ack(ack, sock, udp_ip, udp_port):
- """
- send ack
- """
- print('Sending {} to {}:{}'.format(ack, udp_ip, udp_port))
- sock.sendto(ack, (udp_ip, udp_port))
- def init_db():
- conn = pyodbc.connect('Driver={MariaDB};'
- 'Server=localhost;'
- 'Database=motoroladb;'
- 'UID=engineer;'
- 'PWD=motorolastore')
- cursor = conn.cursor()
- return conn, cursor
- if __name__ == '__main__':
- conn, cursor = init_db()
- recv_message(cursor, conn)
- # 00000000 00000011 10011111 00000000 000[10111]
- # [MESSAGE SIZE] [HEADER 1] [ADDRESS SIZE] [HEADER 2]
- # 00000000 00000011 10011111 00000000 000[01101]
- # 00000010 00110100 11100000 00000000 100[10111] 0[00]00100
- # If extension is indicated in message header, add extra header to ack and copy two extra seq num bits
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement