Я сделал действительно простой скрипт на python, который прослушивает порт ip +.У меня есть сетевой сканер штрих-кода, который отправляет orderID на эту комбинацию ip + порт, и этот скрипт получает метку от API, который отправляет его на принтер.Работает как надо, запускаю на малине.
Моя единственная проблема - всякий раз, когда я хочу запустить его как службу, которая постоянно работает, и прослушивать ip для нового сканирования, он только прослушивает первое сканирование и печатает правильную метку, но второе сканирование получает то же самоеlabel.
import socket
import urllib.request
import cups
import base64
import json
import re
from PIL import Image
PrintConn = cups.Connection()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.18.208', 51235))
while 1:
contin = False
data = s.recv(512)
print(data)
if not data: break
if not data == b'\x02\x18\r\n':
contin = True
barCode = re.findall(r'\d+', data.decode("utf-8"))
print("https://example.com/api/upsgif/{}".format(''.join(map(str, barCode))))
if contin:
try:
url = "https://example.com/api/upsgif/{}".format(''.join(map(str, barCode)))
req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"})
response = urllib.request.urlopen(req).read().decode('utf-8')
if not response: break
upsGif = bytes(response, 'utf-8')
if not upsGif: break
if upsGif == b'\n': break
except urllib.error.HTTPError:
print('Error while getting order label')
else:
with open("label.png", "wb") as fh:
fh.write(base64.decodebytes(upsGif))
img = Image.open('label.png')
PrintConn.printFile('Zebra_Printer', '/var/www/label.png', "",{'fit-to-page':'True'})
И это сервис, который я сделал:
[Unit]
Description=Autoinpak keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target
[Service]
## use 'Type=forking' if the service backgrounds itself
## other values are Type=simple (default) and Type=oneshot
Type=forking
## here we can set custom environment variables
ExecStart=/var/www/runClient.sh
ExecStop=/usr/bin/killall -9 autoinpak
Restart=always
TimeoutSec=infinity
# Useful during debugging; remove it once the service is working
StandardOutput=console
[Install]
WantedBy=multi-user.target
И скрипт bash:
#!/bin/bash
while true; do
sudo python3 /var/www/client.py &>/var/log/python/client.log
wait $!
sleep 10
done
exit
Я ожидал, что он будет работатьтак же, как когда я запускаю скрипт из терминала (python3 /var/www/client.py), но вместо этого он все время использует один и тот же файл upsgif, поэтому каждый отпечаток этикетки совпадает с первым сканированием, которое я выполняю.