foxBarcodeScannerClient/scanner.py

101 lines
4.2 KiB
Python
Executable File

#!/usr/bin/python3
import serial
import time
import codecs
import re
import pika
import json
import os
import hashlib
# docker run -v "`pwd`:/src:ro" --device "/dev/ttyACM0:/dev/ttyACM0" -e "RABBIT_HOST=100.64.240.14" -e "RABBIT_PORT=5672" -e "RABBIT_USER=guest" -e "RABBIT_PASSWORD=itrw8pyNK8a7hipM" -e "RABBIT_USESSL=false" -e "RABBIT_EXCHANGE=fox.barcode" -e "ALLOW_SHORT_PAIRING_TAG=true" -e "ALLOW_LONG_PAIRING_TAG=true" -ti python:3 bash
# pip install --no-cache-dir -r list.txt
# pip3 install serial
# pip3 install pika
scannerPort=os.environ.get('SCANNER_PORT', "/dev/ttyACM0")
pingTimeout=os.environ.get('PING_TIMEOUT', 5)
rabbitHost=os.environ.get('RABBIT_HOST', None)
rabbitPort=os.environ.get('RABBIT_PORT', 5672)
#rabbitUser="guest"
rabbitUser=os.environ.get('RABBIT_USER', None)
#rabbitPass="itrw8pyNK8a7hipM"
rabbitPass=os.environ.get('RABBIT_PASSWORD', None)
rabbitSSL=os.environ.get('RABBIT_USE_SSL', "false").lower()=="true"
rabbitExchange=os.environ.get('RABBIT_EXCHANGE', "fox.barcode")
allowShortPairingTag=os.environ.get('ALLOW_SHORT_PAIRING', "true").lower()=="true"
allowLongPairingTag=os.environ.get('ALLOW_LONG_PAIRING', "true").lower()=="true"
routingTag=os.environ.get('DEFAULT_TAG', None)
debug_enabled=os.environ.get('DEBUG_ENABLED', "false").lower()=="true"
codelist = []
ser = serial.Serial(
port = scannerPort,\
timeout=0)
print("Scanner connected to: " + ser.portstr)
count=1
parameters = pika.URLParameters('amqp://'+rabbitUser+':'+rabbitPass+'@'+rabbitHost+':'+str(rabbitPort)+'/%2F')
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
if (routingTag):
channel.basic_publish(exchange=rabbitExchange,
routing_key=routingTag,
body=json.dumps({"type": "service", "data": "scannerReady","timeout":pingTimeout}))
tmx=0;
while True:
tmx+=1
if (tmx > pingTimeout*10):
tmx=0
if (debug_enabled):
print("Ping sent "+str(routingTag))
if (routingTag):
channel.basic_publish(exchange=rabbitExchange,
routing_key=routingTag,
body=json.dumps({"type": "service", "data": "scannerReady","timeout":pingTimeout}))
time.sleep(0.1)
for byte in ser.readline():
if (byte==128):
continue
if (byte=="\r"):
continue
if byte==13:
try:
codestring=codecs.decode(bytes(codelist),"utf-8")
if (len(codestring)>1):
m = re.match('^fxc([0-9a-f]{20})xf$', codestring)
m2=re.match('^70918([0-9]{9})819070$', codestring)
if (m and allowLongPairingTag):
print("Pairing request. RoutingTag: "+m.group(1))
routingTag=m.group(1)
channel.basic_publish(exchange=rabbitExchange,
routing_key=routingTag,
body=json.dumps({"type": "service", "data": "scannerReady","timeout":pingTimeout}))
elif(m2 and allowShortPairingTag):
rt2=hashlib.sha256(m2.group(1).encode());
routingTag=rt2.hexdigest()[5:25];
print("Pairing request. RoutingTag: "+routingTag)
channel.basic_publish(exchange=rabbitExchange,
routing_key=routingTag,
body=json.dumps({"type": "service", "data": "scannerReady","timeout":pingTimeout}))
else:
if (debug_enabled):
print("Read: "+codestring)
tmx=0
if (routingTag):
channel.basic_publish(exchange=rabbitExchange,
routing_key=routingTag,
body=json.dumps({"type": "code", "data": codestring,"timeout":pingTimeout}))
if (debug_enabled):
print("Sent")
except:
print("read failed")
codelist=[]
else:
codelist.append(byte)