Legende: : 8 Bits : 4 Byte, little endian : 6 Zeichen - hexadezimale Zahl : 'AirCopy' | 'iScanAir' | ? -------------------------------------------------------------------------------------------------------- Kommunikation: - Optional: Überprüfen, ob WIFI zur SSID 'DIRECT-_' verbunden ist. - Optional: Überprüfen, ob zur MAC Adresse von 192.168.33.18 passt. - TCP Verbindung zu 192.168.33.18:23 öffnen - Verbindung nach Abschließen der Aktion schließen: status, calibration, cleaning, scanning, dpi. Außer man hängt mehrere Aktionen zusammen (status + dpi + scan) - Socket timeout 60 Sekunden - Eine kleine Verzögerung ist nach dem Senden eines Kommandos nötig (200 - 500ms). - Eine kleine Verzögerung ist nach dem Lesen einer Antwort nötig (100 - 500ms), bevor man eine neues Kommando senden kann. - Polling ist nicht empfohlen, non blocking Socket + select() ist besser (sonst halt Schleife mit Zähler etc) Beispiel: Nach dem Starten eines Scans, wenn man 'jpegsize' anfordert, muss man eine ganze Weile warten, ein select() mit 20 Sekunden timeout ist da einfacher. Auch beim Lesen der Vorschaudaten sind immer mal längere Pausen dazwischen. -------------------------------------------------------------------------------------------------------- Anworten: Sind meistens weniger als 16 s (außer preview und jpeg data), deshalb reicht ein 16 Buffer meistens aus. Bekannte Antworten lassen sich auf ASCII Strings für die ersten mappen, danach folgt meist noch ein Padding . - devbusy Device ist beschäftigt. Generisch, Aktion abbrechen oder später nochmal versuchen. Sollte nicht als Antwort einer Aktion erfolgen, wenn das Gerät vorher nicht busy war. - battlow Akkustand niedrig. Nicht sicher, ob der nur im Idle auftreten kann, oder auch mittem im Scan. - nopaper Gerät ist idle. Kein Papier eingelegt, deshalb ein Fehler für scan, calibrate oder clean. - scanready Papiersensor getriggert. Breit für scan, calibrate oder clean. - calgo Gerät busy, Kalibrierung gestartet. - calibrate Gerät busy?, Kalibrierung beendet. - cleango Gerät busy, Reinigung gestartet. - cleanend Gerät busy?, Reinigung beendet. - dpistd DPI auf 300 gesetzt. - dpifine DPI auf 600 gesetzt. (Wird nach erfolgreichem Scan wieder auf 300 gesetzt). - scango Gerät busy, Scannen gestartet. Spezielle Anworten: - previewend Vorschau beendet. - jpegsize Jpeggröße, d.h. jpeg verfügbar. -------------------------------------------------------------------------------------------------------- Kommandos: Als s senden. 20203030 get version lese: {1; 9} ; bekannte Response = Fehler Beispiel: IO0a.032 - ASCII string - ersten 2 = Manufacturer Code, bekannt: "NB" = Mustek, "IO" ion - s nach dem '.' sind eine Dezimalzahl = Firmware Version, hier 32. Versionen >=26 unterstützen 600 dpi. 50006000 get status warte 200ms lese: bekannte Response - 'battlow' - 'nopaper' - 'devbusy' - 'scanready' 70708080 clean (benötigt Status 'scanready') warte 500ms lese: 'cleango' warte >=10s lese: 'cleanend'; schlecht: 'nopaper', 'devbusy', 'battlow' a000b000 calibrate (benötigt Status 'scanready') warte 500ms lese: 'calgo' warte >=10s lese: 'calibrate'; schlecht: 'nopaper', 'devbusy', 'battlow' 10203040 set dpi 300 warte 200ms lese: 'dpistd' 50607080 set dpi 600 warte 200ms lese: 'dpifine' 10002000 start scan warte 200ms lese: 'scango' 30304040 send preview data warte 1s lese: n * (640*3) endet auf 'previewend' warte 1s c000d000 send jpeg size warte 200ms lese: 'jpegsize' e000f000 send jpeg data warte 500ms lese: $jpegsize -------------------------------------------------------------------------------------------------------- Beispiel: wie 300 dpi Scan einlesen: - socket öffnen - 50006000 - wenn Antwort nicht 'scanready', abbrechen - 10002000 - wenn Antwort nicht 'scango', abbrechen - c000d000 - wenn Anwort nicht 'jpegsize', abbrechen (Antwort kann lange dauern!) - File für angegeben Größe allozieren - e000f000 - Jpeg Daten lesen