La technologie de lecture de codes-barres est cruciale pour de nombreuses entreprises, telles que celles des supermarchés, de la logistique et de l’entreposage. Les données obtenues à partir de la numérisation des codes-barres sont utilisées pour suivre l’inventaire, gérer les commandes et traiter les paiements. Les lecteurs de codes-barres portables sont largement utilisés comme périphériques dans ces industries. Cependant, les scanners de codes-barres laser portables traditionnels ne peuvent détecter que les codes unidimensionnels, tandis que des scanners plus coûteux avec une caméra intégrée sont nécessaires pour détecter les codes bidimensionnels tels que les codes QR. Les smartphones avec caméras intégrées peuvent détecter les codes unidimensionnels et bidimensionnels. De nos jours, les smartphones sont devenus omniprésents. Tout le monde a au moins un smartphone dans sa poche. Si un smartphone peut faire le même travail qu’un lecteur de codes-barres portable, aucun matériel supplémentaire n’est nécessaire. Cet article présente une solution qui combine des technologies telles que Flutter, Python, Bonjour, des sockets Web, PyAutoGUI et Dynamsoft Barcode Reader SDK pour aider les entreprises à réduire leurs coûts en utilisant des smartphones au lieu de lecteurs de codes-barres.
Plates-formes prises en charge
Vidéo de démonstration : Smartphone en tant que clavier périphérique et lecteur de code-barres
La démo montre comment saisir simultanément du texte depuis un téléphone Android dans le bloc-notes Windows et les notes macOS.
Aperçu des technologies utilisées et pourquoi elles sont utilisées
Avant de plonger dans les détails de la solution, examinons d’abord les technologies utilisées dans cette solution.
- Flutter : Flutter est un framework d’interface utilisateur multiplateforme. Il permet aux développeurs de créer des applications natives pour les fenêtres, Linux, macOS, Android, iOS, et le la toile à partir d’une seule base de code. L’utilisation de Flutter peut économiser beaucoup de temps et d’efforts dans la création de l’interface utilisateur du client.
- Python : avec Python, il suffit de quelques lignes de code pour implémenter des services réseau et simuler la saisie au clavier sur les systèmes d’exploitation.
- Bonjour : Bonjour est un protocole de mise en réseau sans configuration (zeroconf) développé par Apple. Il permet aux appareils sur le même réseau de se découvrir. Dans cette solution, Bonjour est utilisé pour découvrir le serveur de socket Web sur le même réseau.
- WebSocket : les sockets Web sont un protocole de communication informatique qui permet une communication bidirectionnelle entre un client et un serveur. Dans cette solution, les sockets Web sont utilisés pour communiquer entre les appareils mobiles et les PC.
- PyAutoGUI : PyAutoGUI est un module Python qui peut être utilisé pour automatiser les mouvements de la souris et les pressions sur le clavier. Dans cette solution, PyAutoGUI est utilisé pour simuler la saisie au clavier.
- Dynamsoft Barcode Reader SDK : Dynamsoft Barcode Reader SDK est un SDK de reconnaissance de codes-barres multiplateforme qui peut être utilisé pour reconnaître les codes-barres 1D et 2D dans les images. Dans cette solution, Dynamsoft Barcode Reader SDK est utilisé pour reconnaître les codes-barres dans les images capturées par l’appareil photo du smartphone.
Construire un serveur de socket Web détectable avec Bonjour en Python
Commençons par l’implémentation côté serveur. L’implémentation côté serveur est écrite en Python.
Installer les modules Python requis
pip install pyautogui websockets zeroconf
Obtenir l’adresse IP locale en Python
Il peut y avoir plusieurs interfaces réseau sur votre ordinateur. Une façon simple de tous les lister est d’utiliser le ipconfig
commande sous Windows ou la ifconfig
commande sous Linux et macOS. Le Python subprocess.run()
La méthode peut être utilisée pour exécuter la commande et obtenir la sortie. L’adresse IP souhaitée peut être obtenue à partir de la sortie en utilisant une expression régulière, telle que r'(\d+\.\d+\.\d+\.\d+)'
.
import subprocess
import re
import sys
def get_ip_address():
ip_address=""
if sys.platform == 'win32':
result = subprocess.run(['ipconfig', '/all'], capture_output=True, text=True)
else:
result = subprocess.run(['ifconfig'], capture_output=True, text=True)
foundEthernet = False
for line in result.stdout.split('\n'):
if sys.platform == 'win32':
match = re.search(r'Ethernet adapter Ethernet:', line)
if match:
foundEthernet = True
if foundEthernet:
match = re.search(r'IPv4 Address.*? : (\d+\.\d+\.\d+\.\d+)', line)
if match:
ip_address = match.group(1)
break
else:
if sys.platform == "linux" or sys.platform == "linux2":
match = re.search(r'eth0:', line)
else:
match = re.search(r'en0:', line)
if match:
foundEthernet = True
if foundEthernet:
match = re.search(r'(\d+\.\d+\.\d+\.\d+)', line)
if match:
ip_address = match.group(1)
break
return ip_address
Remarque : Vous devrez peut-être modifier l’expression régulière utilisée dans le code ci-dessus pour qu’elle corresponde au nom de l’interface réseau sur votre ordinateur..
Implémenter le serveur Web Socket
Après avoir obtenu l’adresse IP locale, le serveur de socket Web peut être implémenté avec asyncio
et websockets
.
import asyncio
import asyncio
import websockets
import socket
import pyautogui
import signal
connected = set()
isShutdown = False
async def handle_message(websocket, path):
async for message in websocket:
if isinstance(message, str):
pass
elif isinstance(message, bytes):
pass
async def server(websocket, path):
connected.add(websocket)
try:
await handle_message(websocket, path)
except:
connected.remove(websocket)
def ctrl_c(signum, frame):
global isShutdown
isShutdown = True
async def main(ip_address):
global isShutdown
# Start the server
s = await websockets.serve(server, ip_address, 4000)
while not isShutdown:
await asyncio.sleep(1)
s.close()
await s.wait_closed()
signal.signal(signal.SIGINT, ctrl_c)
Nous utilisons signal.signal()
pour gérer la saisie au clavier pour interrompre la boucle infinie du serveur.
Simuler l’entrée au clavier avec PyAutoGUI
Une fois qu’un message est reçu du client mobile, le serveur peut simuler la saisie au clavier avec PyAutoGUI.
if message != '':
if message == 'backspace':
pyautogui.press('backspace')
elif message == 'enter':
pyautogui.press('enter')
else:
Le pyautogui.press
peut être utilisée pour simuler l’appui sur une touche du clavier. Le pyautogui.typewrite
peut être utilisée pour simuler la saisie de texte sur le clavier.
Intégrer Bonjour dans le serveur Web Socket
La dernière étape consiste à rendre le serveur de socket Web détectable avec Bonjour. Le zeroconf
module peut être utilisé pour intégrer Bonjour dans le serveur web socket.
from zeroconf import ServiceBrowser, ServiceInfo, ServiceListener, Zeroconf
class MyListener(ServiceListener):
def update_service(self, zc: Zeroconf, type_: str, name: str) -> None:
print(f"Service {name} updated")
def remove_service(self, zc: Zeroconf, type_: str, name: str) -> None:
print(f"Service {name} removed")
def add_service(self, zc: Zeroconf, type_: str, name: str) -> None:
info = zc.get_service_info(type_, name)
print(f"Service {name} added, service info: {info}")
ip_address_str = get_ip_address()
ip_address = socket.inet_aton(ip_address_str)
info = ServiceInfo("_bonsoirdemo._tcp.local.", socket.gethostname().split('.')[0] +
" Web Socket Server._bonsoirdemo._tcp.local.",
port=7000, addresses=[ip_address])
zeroconf = Zeroconf()
# Register the Bonjour service
zeroconf.register_service(info)
listener = MyListener()
browser = ServiceBrowser(zeroconf, "_bonsoirdemo._tcp.local.", listener)
# Start the web socket server
signal.signal(signal.SIGINT, ctrl_c)
asyncio.run(main(ip_address_str))
# Unregister the Bonjour service
print("Unregistering Bonjour service")
zeroconf.unregister_service(info)
zeroconf.close()
Le socket.gethostname()
peut renvoyer un nom d’hôte contenant un .
à l’intérieur. Le .
doit être filtré ; sinon, le nom du service Bonjour ne sera pas valide.
Création d’une application mobile avec Flutter, Bonjour, WebSocket et Dynamsoft Barcode Reader SDK
Dans cette section, nous allons créer une application mobile avec Flutter, Bonjour, WebSocket et Dynamsoft Barcode Reader SDK. L’application mobile peut détecter automatiquement le serveur Web Socket et envoyer des données de code-barres via la connexion Web Socket.
Installer les packages Flutter requis
flutter pub add bonsoir flutter_riverpod device_info web_socket_channel dynamsoft_capture_vision_flutter
-
Pour Android, remplacez la version minimale du SDK par 21 dans
android/app/build.gradle
:defaultConfig { minSdkVersion 21 }
-
Pour iOS, ajoutez la description suivante à
ios/Runner/Info.plist
:NSCameraUsageDescription Can I use the camera please? NSLocalNetworkUsageDescription Looking for local tcp Bonjour service NSBonjourServices _bonsoirdemo._tcp
La valeur de NSBonjourServices
doit être le même que le type de service de votre service Bonjour.
Implémenter la connexion Web Socket et la découverte du service Bonjour dans Flutter
Nous utilisons la découverte du service Bonjour car nous voulons éviter de saisir manuellement l’adresse IP du serveur de socket Web.
L’exemple de code de bonsoir est utile pour implémenter la découverte du service Bonjour. Nous pouvons copier app_service.dart
, discovery.dart
et service_list.dart
fichiers de l’exemple de code à notre projet, puis modifiez-les pour répondre à nos besoins.
Implémenter la numérisation de code QR de code-barres dans Flutter
Le dynamsoft_capture_vision_flutter
contient également un excellent exemple de code, qui vous explique comment utiliser l’API du SDK Dynamsoft Barcode Reader dans Flutter.
Voici les étapes de base pour implémenter la numérisation de code QR de code-barres dans Flutter :
- Initialisez le SDK avec une clé de licence.
late final DCVCameraEnhancer _cameraEnhancer; late final DCVBarcodeReader _barcodeReader; final DCVCameraView _cameraView = DCVCameraView(); ...