Membuat QR Code Scanner USB ke MQTT Gateway di Linux Menggunakan Python
Pendahuluan
Dalam dunia industri modern, mengintegrasikan perangkat input seperti scanner barcode ke dalam sistem berbasis IoT atau backend server adalah hal penting. Artikel ini menunjukkan cara membangun sistem scanner QR/Barcode berbasis USB yang otomatis mengirimkan hasil scan ke broker MQTT menggunakan Python di Linux.
Prasyarat
- Linux (contoh: Debian, Ubuntu, Orange Pi)
- Scanner barcode USB
- Python 3.x
- MQTT broker (bisa lokal atau cloud seperti Mosquitto, EMQX)
1. Cek dan Identifikasi Scanner USB
Sambungkan scanner barcode ke port USB. Gunakan perintah berikut untuk melihat apakah perangkat terdeteksi:
lsusb
Contoh output:
Bus 001 Device 005: ID 0c2e:0b61 Scanner Scanner
Catat Vendor ID dan Product ID (contoh: 0c2e:0b61). Ini akan membantu dalam mengidentifikasi device secara eksplisit jika diperlukan.
Lanjutkan dengan mengecek event device dari scanner:
ls -l /dev/input/by-id/
Output yang dituju:
usb-Scanner_Scanner_20180411-event-kbd -> ../event0
Catat path ke device, misalnya /dev/input/event0. Ini akan digunakan dalam kode.
2. Instalasi Library yang Dibutuhkan
sudo apt update
sudo apt install python3-pip
pip3 install evdev paho-mqtt
3. Struktur Kode Scanner
Letakkan skrip di /opt/qrscanner/scanner_evdev_mqtt.py:
import traceback
import paho.mqtt.client as mqtt
import json
from datetime import datetime
import warnings
from evdev import InputDevice, categorize, ecodes, list_devices
warnings.filterwarnings("ignore", category=DeprecationWarning)
# Konfigurasi MQTT
MQTT_BROKER = "broker.hivemq.com"
MQTT_PORT = 1883
MQTT_TOPIC = "scanner/iot"
# Mapping Key Code
KEY_MAP = {
2: '1', 3: '2', 4: '3', 5: '4', 6: '5', 7: '6', 8: '7', 9: '8', 10: '9', 11: '0',
12: '-', 13: '=', 14: 'Backspace', 15: 'Tab', 16: 'q', 17: 'w', 18: 'e', 19: 'r',
20: 't', 21: 'y', 22: 'u', 23: 'i', 24: 'o', 25: 'p', 26: '[', 27: ']', 28: 'Enter',
29: 'Ctrl', 30: 'a', 31: 's', 32: 'd', 33: 'f', 34: 'g', 35: 'h', 36: 'j', 37: 'k',
38: 'l', 39: ';', 40: "'", 41: '`', 42: 'Shift', 43: '\', 44: 'z', 45: 'x',
46: 'c', 47: 'v', 48: 'b', 49: 'n', 50: 'm', 51: ',', 52: '.', 53: '/', 54: 'Shift',
55: '*', 56: 'Alt', 57: ' ', 100: 'AltGr'
}
SHIFT_MAP = {
'1': '!', '2': '@', '3': '#', '4': '$', '5': '%', '6': '^', '7': '&',
'8': '*', '9': '(', '0': ')', '-': '_', '=': '+', '[': '{', ']': '}',
'\': '|', ';': ':', "'": '"', ',': '<', '.': '>', '/': '?', '`': '~'
}
TARGET_SCANNER_NAME = "Scanner Scanner"
# Deteksi scanner
def find_scanner_device(target_name=TARGET_SCANNER_NAME):
devices = [InputDevice(path) for path in list_devices()]
for dev in devices:
if dev.name == target_name:
return dev
return None
# Kirim hasil ke MQTT
def publish_scanned_data(data):
try:
payload = {
"timestamp": datetime.now().isoformat(),
"scanned": data
}
client = mqtt.Client()
client.connect(MQTT_BROKER, MQTT_PORT, 60)
client.publish(MQTT_TOPIC, json.dumps(payload))
client.disconnect()
except Exception as e:
print("[ERROR] MQTT publish failed:", e)
traceback.print_exc()
# Fungsi utama scanner
def read_scanner():
dev = find_scanner_device()
if dev is None:
print("[ERROR] Scanner not found.")
return
shift = False
scanned = ''
for event in dev.read_loop():
if event.type == ecodes.EV_KEY:
data = categorize(event)
if data.keystate == 1:
key = KEY_MAP.get(data.scancode, '')
if key == 'Shift':
shift = True
elif key == 'Enter':
if scanned:
print("[INFO] Scanned:", scanned)
publish_scanned_data(scanned)
scanned = ''
elif key:
scanned += SHIFT_MAP.get(key, key.upper()) if shift else key
shift = False
if __name__ == "__main__":
read_scanner()
4. Buat Service Systemd
File: /etc/systemd/system/qrscanner.service
[Unit]
Description=QR Scanner Python Script
After=network.target
[Service]
ExecStart=/usr/bin/python3 /opt/qrscanner/scanner_evdev_mqtt.py
WorkingDirectory=/opt/qrscanner
Restart=always
RestartSec=3
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Aktifkan dan jalankan service:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable qrscanner.service
sudo systemctl start qrscanner.service
5. Troubleshooting
- Gunakan
journalctl -u qrscanner.service -funtuk memantau log - Cek apakah device input berubah, misalnya unplug scanner lalu replug, dan amati
ls -l /dev/input/by-id/ - Jika error karena device tidak ditemukan, buat pengecekan di awal dan log errornya.
6. Penutup
Dengan setup ini, scanner barcode Anda akan otomatis membaca QR/Barcode dan mengirimkan hasilnya secara langsung ke server melalui MQTT. Anda bisa mengintegrasikannya dengan dashboard IoT, database, atau sistem lain untuk proses lebih lanjut.