From ea8947757cf34821dfda712c1629a2ec0f651184 Mon Sep 17 00:00:00 2001 From: Cuddly Cheetah Date: Wed, 23 Oct 2019 11:49:02 +0200 Subject: [PATCH] first release fo the working code --- doc/rabbitmq-users.jpg | Bin 0 -> 57128 bytes main.py | 141 +++++++++++++++++++++++++++++------------ pocsag.py | 2 +- 3 files changed, 103 insertions(+), 40 deletions(-) create mode 100644 doc/rabbitmq-users.jpg diff --git a/doc/rabbitmq-users.jpg b/doc/rabbitmq-users.jpg new file mode 100644 index 0000000000000000000000000000000000000000..502d3da2fbabd0b41e22eca0c24aec8b57fc334f GIT binary patch literal 57128 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 z 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 xFPLY35;gXuPMb}>3>AAr^w)L!7_&*&=x$OV| literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 8160de9..a1316a9 100644 --- a/main.py +++ b/main.py @@ -1,20 +1,26 @@ #!/usr/bin/env python2 +#-*- coding: UTF-8 -*- import RFM69_POCSAG from RFM69_POCSAGregisters import * import datetime +from threading import Timer import time from ConfigParser import SafeConfigParser import pika +import os +import json config = SafeConfigParser() config.read('config.ini') -config.add_section('main') -config.set('main', 'amqpURI', 'amqp://user:pw@host:port') - -with open('config.ini', 'w') as f: - config.write(f) - +if not config.has_section('main'): + config.add_section('main') + config.set('main', 'amqpURI', 'amqp://user:pw@host:port') +try: + with open('config.ini', 'w') as f: + config.write(f) +except Exception: + pass rfmModule = RFM69_POCSAG.RFM69_POCSAG(RF69_433MHZ, pocsagBaudRate=1200, isRFM69HW = True) #rfmModule.shutdown() @@ -28,47 +34,104 @@ rfmModule.setFreqeuncy(freqHz) rfmModule.rcCalibration() rfmModule.setHighPower(True) -import uuid -def my_random_string(string_length=10): - """Returns a random string of length string_length.""" - random = str(uuid.uuid4())+str(uuid.uuid4())+str(uuid.uuid4())+str(uuid.uuid4())+str(uuid.uuid4())+str(uuid.uuid4())+str(uuid.uuid4())+str(uuid.uuid4()) # Convert UUID format to a Python string. - random = random.upper() # Make all characters uppercase. - random = random.replace("-","") # Remove the UUID '-'. - return random[0:string_length] # Return the random string. +os.system("echo heartbeat | sudo tee /sys/class/leds/led0/trigger") + +def byteify(input): + if isinstance(input, dict): + return {byteify(key): byteify(value) + for key, value in input.iteritems()} + elif isinstance(input, list): + return [byteify(element) for element in input] + elif isinstance(input, unicode): + return input.encode('utf-8') + else: + return input + + +from pocsag import encodeTXBatch + +inputQueue = [] +txQueue = [] +def batchFinal(): + global t + global inputQueue + global txQueue + #print(" [x] Batch Final") + txQueue = inputQueue + inputQueue = [] + #print(txQueue) + if len(txQueue) > 0: + os.system("echo timer | sudo tee /sys/class/leds/led0/trigger") + data = encodeTXBatch(txQueue, repeatNum=2) + rfmModule.sendBuffer(data) + os.system("echo heartbeat | sudo tee /sys/class/leds/led0/trigger") + resetTimer() +t = Timer(.5, batchFinal) +t.start() +def resetTimer(): + global t + if t.is_alive(): + t.cancel() + t = Timer(.5, batchFinal) + t.start() def msgCallback(ch, method, properties, body): - print(" [x] Received %r" % body) + global inputQueue + msg = byteify(json.loads(body)) + print(msg) + address = '13370' + msg[0] + message = msg[1] + """.encode('ascii', 'ignore') + message = message.replace("Ä", '[') + message = message.replace("Ü", '[') + message = message.replace("Ö", '\\') + + message = message.replace("ä", '{') + message = message.replace("ö", '|') + message = message.replace("ü", '}') + message = message.replace("ß", '~') + + message = str(message.encode('ascii', 'ignore')) + #message = message.replace(/(\r\n|\n|\r)/gm, '') + """ + print(" [x] Received", address, message) + inputQueue.append([False, address, message]) + #resetting timer + resetTimer() while True: - try: - connection = pika.BlockingConnection(pika.ConnectionParameters( config.get('main', 'amqpURI') )) - channel = connection.channel() - queue = channel.queue_declare(queue='input') - queue_ttl60 = channel.queue_declare(queue='input_ttl60') - channel.basic_consume(queue='input', - auto_ack=True, - on_message_callback=msgCallback) - channel.basic_consume(queue='input_ttl60', - auto_ack=True, - on_message_callback=msgCallback) - print(' [*] Waiting for messages. To exit press CTRL+C') - channel.start_consuming() - - except Exception: - time.sleep(.5) - pass - + try: + print(' [*] Connecting') + connection = pika.BlockingConnection(pika.URLParameters( config.get('main', 'amqpURI') )) + channel = connection.channel() + queue = channel.queue_declare(queue='input', durable=True) + queue_ttl60 = channel.queue_declare(queue='input_ttl60', durable=True, arguments={ "x-message-ttl": 60000 }) + channel.basic_consume(queue='input', + auto_ack=True, + on_message_callback=msgCallback) + channel.basic_consume(queue='input_ttl60', + auto_ack=True, + on_message_callback=msgCallback) + print(' [*] Waiting for messages. To exit press CTRL+C') + channel.start_consuming() + except KeyboardInterrupt: + break + except pika.exceptions.ConnectionClosed: + print 'oops. lost connection. trying to reconnect.' + # avoid rapid reconnection on longer RMQ server outage + time.sleep(0.5) + except Exception: + print 'oops. fail.' + # avoid rapid reconnection on longer RMQ server outage + time.sleep(0.5) -from pocsag import encodeTXBatch -msgs = [] """ +msgs = [] msgs.append([False, "133722", 'Zeile 1\nZeile 2\nZeile 3\nZeile 4']) msgs.append([False, "133742", '1234567890^12w3e4rt5zu