Skip to main content

Command Palette

Search for a command to run...

Membuat QR Code Scanner USB ke MQTT Gateway di Linux Menggunakan Python

Updated
3 min read

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 -f untuk 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.