- Replace Vite + React Router with Next.js 15 App Router - Implement i18n with next-intl (URL-based: /de, /en, /sr) - Add SSR/SSG for all pages (48 static pages generated) - Setup Supabase SSR client for auth - Migrate all pages: Home, About, Portfolio, Blog, Contact, Login, Dashboard, Imprint, Privacy, Terms - Add Docker support with standalone output - Replace i18next with next-intl JSON translations - Use next/image for optimized images Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
205 lines
8.1 KiB
TypeScript
205 lines
8.1 KiB
TypeScript
// src/i18n/locales/de/blog/posts/rfid-automation.ts
|
|
export const rfidAutomation = {
|
|
meta: {
|
|
title: 'RFID-Etiketten-Automatisierung: Von Datenbank zum Drucker',
|
|
date: '2024-02-09',
|
|
excerpt: 'Eine detaillierte technische Analyse der Implementierung eines automatisierten RFID-Etikettendruck-Systems mit Python',
|
|
category: 'System Integration',
|
|
coverImage: '/images/posts/rfid-automation/cover.jpg',
|
|
tags: ['RFID', 'Python', 'ZPL', 'Automation', 'Zebra Printer', 'EPC']
|
|
},
|
|
content: {
|
|
intro: {
|
|
title: 'RFID-Etiketten-Automatisierung: Von Datenbank zum Drucker',
|
|
description: 'In modernen Logistik- und Retail-Umgebungen ist die effiziente und fehlerfreie Etikettierung von Produkten mit RFID-Tags von entscheidender Bedeutung. In diesem Artikel teile ich meine Erfahrungen bei der Implementierung einer automatisierten Lösung für die Generierung und den Druck von RFID-Etiketten mit Chipkodierung.'
|
|
},
|
|
requirements: {
|
|
title: 'Projekthintergrund',
|
|
points: [
|
|
'Automatische Generierung von EPC-Codes (Electronic Product Code)',
|
|
'Erstellung von ZPL-Code für Zebra-Drucker',
|
|
'Direkte Netzwerkkommunikation mit dem Drucker',
|
|
'Integration mit bestehenden Produktdaten',
|
|
'Fehlerbehandlung und Logging'
|
|
]
|
|
},
|
|
implementation: {
|
|
title: 'Technische Umsetzung',
|
|
epcGeneration: {
|
|
title: 'EPC-Code Generierung',
|
|
description: 'Die EPC-Codes werden nach dem SGTIN-Standard (Serialized Global Trade Item Number) generiert:',
|
|
code: `def generate_encoded_epc(company_prefix, indicator, item_ref, serial):
|
|
sgtin = SGTIN(company_prefix, indicator, item_ref, serial)
|
|
return sgtin.encode()`
|
|
},
|
|
zplTemplates: {
|
|
title: 'ZPL-Template Management',
|
|
description: 'Für die unterschiedlichen Etikettentypen wurden ZPL-Templates implementiert:',
|
|
code: `def generate_zpl_code(artikelnr, description, ean, price, material, water_resistance, glass_type, encoded_epc):
|
|
formatted_price = f'{price:.2f}'
|
|
return f'''
|
|
CT~~CD,~CC^~CT~
|
|
^XA
|
|
~TA000
|
|
~JSN
|
|
^LT35
|
|
^MNW
|
|
^MTT
|
|
^PON
|
|
^PMN
|
|
^LH0,0
|
|
^JMA
|
|
^PR2,2
|
|
~SD23
|
|
^JUS
|
|
^LRN
|
|
^CI27
|
|
^PA0,1,1,0
|
|
^RS8,,,3
|
|
^XZ
|
|
^XA
|
|
^MMT
|
|
^PW413
|
|
^LL531
|
|
^LS-24
|
|
^FT150,57^A0N,33,33^FH\\^CI27^FD{artikelnr}^FS^CI27
|
|
^FT44,86^A0N,21,20^FH\\^CI27^FD{description}^FS^CI27
|
|
^FT130,141^A0N,50,51^FH\\^CI27^FD{formatted_price} €^FS^CI27
|
|
^FT167,175^A0N,21,20^FH\\^CI27^FD{material}^FS^CI27
|
|
^FT185,201^A0N,21,20^FH\\^CI27^FD{water_resistance}^FS^CI27
|
|
^FT155,227^A0N,21,20^FH\\^CI27^FD{glass_type}^FS^CI27
|
|
^BY3,2,113^FT73,420^BEN,,Y,N
|
|
^FH\\^FD{ean}^FS
|
|
^RFW,H,1,2,1^FD3000^FS
|
|
^RFW,H,2,12,1^FD{encoded_epc}^FS
|
|
^PQ1,0,1,Y
|
|
^XZ'''`
|
|
},
|
|
printerCommunication: {
|
|
title: 'Netzwerkkommunikation mit dem Drucker',
|
|
description: 'Die Kommunikation mit dem Zebra-Drucker erfolgt über TCP/IP:',
|
|
code: `def send_to_printer(data, printer_ip='192.168.68.50', printer_port=9100):
|
|
try:
|
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
|
sock.connect((printer_ip, printer_port))
|
|
sock.sendall(data.encode('utf-8'))
|
|
logger.info('Daten erfolgreich an den Drucker gesendet')
|
|
except Exception as e:
|
|
logger.error(f'Fehler beim Senden der Daten an den Drucker: {e}')`
|
|
},
|
|
serialNumberManagement: {
|
|
title: 'Datenprozessierung und Seriennummernverwaltung',
|
|
description: 'Die Verwaltung von Seriennummern ist kritisch für die Eindeutigkeit der EPC-Codes:',
|
|
code: `def initialize_serial_number():
|
|
global current_serial_number
|
|
try:
|
|
serial_log_content = SERIAL_NUMBER_LOG_PATH.read_text().strip()
|
|
current_serial_number = int(serial_log_content)
|
|
except (FileNotFoundError, ValueError):
|
|
current_serial_number = START_SERIAL_NUMBER
|
|
def get_next_serial_number():
|
|
global current_serial_number
|
|
current_serial_number += 1
|
|
return current_serial_number
|
|
def finalize_serial_number():
|
|
SERIAL_NUMBER_LOG_PATH.write_text(str(current_serial_number))`
|
|
}
|
|
},
|
|
features: {
|
|
title: 'Implementierte Features',
|
|
errorHandling: {
|
|
title: '1. Robuste Fehlerbehandlung',
|
|
points: [
|
|
'Validierung der Eingabedaten',
|
|
'Überprüfung der Netzwerkverbindung',
|
|
'Persistenz von Seriennummern',
|
|
'Detailliertes Logging aller Operationen'
|
|
]
|
|
},
|
|
configurability: {
|
|
title: '2. Konfigurierbarkeit',
|
|
points: [
|
|
'Drucker-IP und Port einstellbar',
|
|
'Anpassbare ZPL-Templates',
|
|
'Flexible EPC-Code-Generierung',
|
|
'Konfigurierbare Seriennummernbereiche'
|
|
]
|
|
},
|
|
scalability: {
|
|
title: '3. Skalierbarkeit',
|
|
points: [
|
|
'Batch-Verarbeitung von Produktdaten',
|
|
'Parallele Druckaufträge möglich',
|
|
'Effizientes Ressourcenmanagement',
|
|
'Modularer Code für einfache Erweiterbarkeit'
|
|
]
|
|
}
|
|
},
|
|
bestPractices: {
|
|
title: 'Best Practices',
|
|
dataValidation: {
|
|
title: '1. Datenvalidierung',
|
|
points: [
|
|
'Strict typing für kritische Datenfelder',
|
|
'Überprüfung von Pflichtfeldern',
|
|
'Format- und Plausibilitätsprüfungen'
|
|
]
|
|
},
|
|
faultTolerance: {
|
|
title: '2. Fehlertoleranz',
|
|
points: [
|
|
'Automatische Wiederholungsversuche',
|
|
'Graceful Degradation',
|
|
'Detaillierte Fehlerprotokolle'
|
|
]
|
|
},
|
|
maintainability: {
|
|
title: '3. Wartbarkeit',
|
|
points: [
|
|
'Modularer Code-Aufbau',
|
|
'Ausführliche Dokumentation',
|
|
'Klare Trennung von Konfiguration und Code'
|
|
]
|
|
}
|
|
},
|
|
lessonsLearned: {
|
|
title: 'Lessons Learned',
|
|
zplSpecifics: {
|
|
title: '1. ZPL-Spezifika',
|
|
points: [
|
|
'Genaue Kenntnis der ZPL-Spezifikationen notwendig',
|
|
'Sorgfältige Validierung der generierten ZPL-Codes',
|
|
'Regelmäßige Tests mit verschiedenen Druckermodellen'
|
|
]
|
|
},
|
|
rfidStandards: {
|
|
title: '2. RFID-Standards',
|
|
points: [
|
|
'Einhaltung der EPC-Standards kritisch',
|
|
'Sorgfältige Verwaltung von Seriennummern',
|
|
'Validierung der generierten EPC-Codes'
|
|
]
|
|
},
|
|
networkCommunication: {
|
|
title: '3. Netzwerkkommunikation',
|
|
points: [
|
|
'Robuste Fehlerbehandlung bei Netzwerkproblemen',
|
|
'Timeouts und Wiederholungsversuche',
|
|
'Pufferung von Druckaufträgen'
|
|
]
|
|
}
|
|
},
|
|
conclusion: {
|
|
title: 'Fazit',
|
|
description: 'Die implementierte Lösung ermöglicht eine effiziente und zuverlässige Automatisierung des RFID-Etikettierungsprozesses. Durch die Kombination von EPC-Code-Generierung, ZPL-Template-Management und direkter Druckerkommunikation wurde ein robustes System geschaffen, das sich in der Praxis bewährt hat.',
|
|
keyPoints: [
|
|
'Gründliche Planung der Systemarchitektur',
|
|
'Umfassende Fehlerbehandlung',
|
|
'Sorgfältige Dokumentation',
|
|
'Regelmäßige Tests und Validierung'
|
|
],
|
|
results: 'Die Lösung läuft seit mehreren Monaten stabil im Produktivbetrieb und verarbeitet täglich hunderte von Etiketten.'
|
|
}
|
|
}
|
|
};
|