Den HTTP-Post-Verbindungstyp verwenden

In iCody 2.2 haben wir einen weiteren Verbindungstyp für die Echtzeit-Übertragung von gescannten Barcodes eingeführt: Das HTTP-Post-Protokoll. Mit diesem Verbindungstyp ist es möglich, den gescannten Barcode und alle damit in Zusammenhang stehenden Informationen einschließlich der GPS-Informationen an einen Web Service zu senden. Dort können die Daten dann verarbeitet werden und iCody ggf. sogar eine ANtwort zurück gesandt werden, die dem Nutzer angezeigt wird.

httpde

Um diese Funktion zu verwenden, folgen Sie bitte diesen Schritten:

  • Wählen Sie den Verbindungstyp “HTTP”.
  • Geben Sie die Adresse Ihres Web Servers ein, auf dem das Skript läuft, das die gesendeten Daten verarbeitet.
  • Entscheiden Sie, ob iCody die Daten “blind” senden oder auf eine Antwort warten soll. In diesem Fall aktivieren Sie “Auf Antwort warten” (OK, im Screenshot ist noch ein Übersetzungsfehler … sorry!).

Wichtig: Um diese Funktion verwenden zu können, müssen Sie Ihren eigenen Web-Service aufsetzen. Entwicklerkenntnisse sind erforderlich!

Seit iCody 3.0 wird ein JSON-String übertragen, der zumindest die folgenden Werte plus die Workflow-Elemente enthält.

iCody liefert als POST-Werte die folgenden Variablennamen aus, sie Sie in Ihrem Serverskript weiter verarbeiten können:

value Der gescannte bzw. ausgewählte Barcode
type Der Barcode-Typ (string)
typeID Die Typ-ID des Barcodes (in Abhängigkeit des Scanners, numerisch)
timestamp Der UNIX-Timestamp des Scanvorgangs
location Die GPS-Koordinaten des Scanvorgangs, sofern verfügbar (string)
udid Die ID des Gerätes

Sofern die “Auf Server-Antwort warten”-Option aktiviert ist, wartet iCody auf Daten, die von Ihrem Serversckript erzeugt und zurück gesandt werden. Das Datenformat folgt dabei dem bekannten Apple property list format (Dokumentation). Jedes Kommando, das iCody verarbeiten soll, wird ein ein “Dictionary” gekapselt (eingefasst von <dict> Tags). Die zurück gelieferten Daten enthalten dabei entweder genau ein Dictionary (<dict>) oder ein Array (<array>), das ein oder mehere Dictionary bzw. Dictionaries enthält, die die Kommandos beschreiben.

Die erlauben Key-Value-Paare in deen Kommando-Dictionaries sind:

type Der im Folgenden beschriebene “key” – die meisten Kommandos (Ausnahme: alert) benötigen iCody 2.3 oder neuer.
alert Eine Alert-Box anzeigen.
  title Der Titel der Alert-Box
  message Die anzuzeigende Nachricht
vibrate Das Gerät vibrieren lassen (sofern möglich).
sound Einen Sound abspielen.
  name Sound-ID:
playSucessSound, playFailureSound
  repeat Anzahl Wiederholungen (0 – default)
print Auf einem verbundenen DPP-xxs- oder PP-60-Drucker drucken (erfordert entweder ein Linea Pro mit Bluetooth oder einen PP-60).
  commands Druckkommando-Array (s.u.)

Hier ein einfaches Beispiel für eine plist, die nur eine Alert-Box anzeigt (Bitte beachten Sie, dass diese plist nur ein Kommando zurück gibt und daher kein umfassendes Array erforderlich ist. Wenn Sie mehrere Kommandos zurück geben möchten, schauen Sie sich bitte das Beispiel weiter unten an):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>type</key>
    <string>alert</string>
    <key>title</key>
    <string>Dies ist der Titel</string>
    <key>message</key>
    <string>Dies ist die Nachricht.</string>
</dict>
</plist>

Und hier ein einfaches Beispiel in PHP, um die plist zu erzeugen und zurück zu liefern:

<?php
        // this PHP scripts writes all given data to a mysql database (which has to exist ...)

        // connect to database
    $link = mysqli_connect( '<db URL>', '<username>', '<password>', '<database>' );
    if( !$link )
        exit;

        // the insertation stuff
    $query = 'INSERT INTO <table> SET value='.$_REQUEST["value"].', typeID='.$_REQUEST["typeID"].', type='.$_REQUEST["type"].', scandate='.$_REQUEST["timestamp"].', location='.$_REQUEST["location"];
    $result = mysqli_query( $link, $query );

    mysqli_close($link);

        // the back channel plist
    echo '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>type</key>
    <string>alert</string>
    <key>title</key>
    <string>Dies ist der Titel</string>
    <key>message</key>
    <string>Dies ist die Nachricht.</string>
</dict>
</plist>
';
?>

Wenn Sie das print-Kommando nutzen möchten, beachten Sie bitte, dass Sie dafür ein Linea Pro mit Bluetooth sowie einen DPP-xxx-Drucker oder ein PP-60 benötigen. Die verfügbaren Druckkommandes werden jedes für sich in einem Dictionary (<dict>) definiert und insgesamt in der erforderlichen Reihenfolge von einem Array ums chlossen (<array>):

cmd Der im Folgenden beschriebene <key> für die Druckkommandos:
PCFD Führt ein Paper-Feed aus.
  value n/203″ (0 – auto) – optional -
PCFLSH Den Drucker-Cache “flushen” und die Warteschlange leeren (abarbeiten).
PCSLGO Ein Bild (Logo) in den nicht-flüchtigen Gerätespeicher ablegen.
  value Hex-String mit den Bilddaten (ohne $ oder # oder 0x)
  align Standardausrichtung des Logos beim (späteren) Druck):
0 – Links (default)
1 – MItte
2 – Rechts
3 – Blocksatz (naja)
PCLSMRGN Den linken Rand festlegen.
  value linker Rand in px (0 – auto)
PCLSHGHT Die Zeilenhöhe festlegen.
  value Zeilenhöhe in px (0 – auto)
PCDLM Eine Zeile mit Delimitern (Trennzeichen) über die gesamte Papierbreite drucken.
  value das zu druckende Zeichen (nur 1 Zeichen Länge)
PCLGO Das gespeicherte Logo (s.o.) drucken.
  value 0 – normal
1 – doppelte Breite
2 – doppelte Höhe
3 – doppelte Breite + doppelte Höhe
PCIMG Ein Bild drucken.
  value Hex-String mit den Bilddaten (ohne $ oder # oder 0x)
  align 0 – Links (default)
1 – Mitte
2 – Rechts
3 – Blocksatz
PCPBC Einen Barode drucken.
  value der zu druckende Wert
  type der zu druckende Barcode-Typ:
kBCRScanTypeUPCA, kBCRScanTypeUPCE, kBCRScanTypeEAN13, kBCRScanTypeEAN8, kBCRScanTypeCODE39, kBCRScanTypeCodebar, kBCRScanTypeCODE93, kBCRScanTypeCODE128, kBCRScanTypePDF417, kBCRScanTypeEAN128
PCPT Text drucken.
  value Der zu druckende Text. Er darf folgende Control-Sequenzen enthalten, um die Darstellung zu beeinflussen:
{==}    alle bisherigen Einstellungen zurück setzen (einschl. Zeichengröße, Stil und AUsrichtung).
{=Fx}   Fontgröße festlegen: x darf folgende Werte annehmen:
    0: FONT_9X16
    1: FONT_12X24
{=L}    Text links ausrichten
{=C}    Text mittig ausrichten
{=R}    Text links ausrichten
{=Rx}   Text rotieren:
    0: nicht rotiert
    1: um 90° rotiert
    2: um 180° rotiert
{+/-B}  setzt oder löscht den “Fett”-Stil
{+/-I}  setzt oder löscht den “Kursiv”-Stil
{+/-U}  setzt oder löscht den “Unterstrichen”-Stil
{+/-V}  setzt oder löscht den “Invertiert”-Stil
{+/-W}  setzt oder löscht wortweisen Zeilenumbruch
{+/-DW} setzt oder löscht doppelte Zeichenbreite
{+/-DH} setzt oder löscht doppelte Zeichenhöhe

Dies ist ein komplexeres Beispiel für ein Dictionary mit mehreren Kommandos (Bitte beachten Sie das <array> als Root-Objet):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
     <dict>
         <key>type</key>
         <string>sound</string>
         <key>name</key>
         <string>playSuccessSound</string>
         <key>repeat</key>
         <string>1</string>
     </dict>
     <dict>
         <key>type</key>
         <string>print</string>
        <key>commands</key>
        <array>
             <dict>
                 <key>cmd</key>
                 <string>PCPT</string>
                 <key>value</key>
                 <string>{=L}Barcode:#barcode#</string>
             </dict>
             <dict>
                 <key>cmd</key>
                 <string>PCPT</string>
                 <key>value</key>
                 <string>{=L}Type:#type#</string>
             </dict>
             <dict>
                 <key>cmd</key>
                 <string>PCDLM</string>
                 <key>value</key>
                 <string>-</string>
             </dict>
             <dict>
                 <key>cmd</key>
                 <string>PCFLSH</string>
             </dict>
        </array>
     </dict>
</array>
</plist>

 

Hier der dazugehörige PHP-Code (ohne Validierung oder Datenbank-Zugriff):

<?php
         // the back channel plist
    echo '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
     <dict>
         <key>type</key>
         <string>sound</string>
         <key>name</key>
         <string>playSuccessSound</string>
         <key>repeat</key>
         <string>1</string>
     </dict>
     <dict>
         <key>type</key>
         <string>print</string>
        <key>commands</key>
        <array>
             <dict>
                 <key>cmd</key>
                 <string>PCPT</string>
                 <key>value</key>
                 <string>{=L}Barcode: '.$_POST["value"].'</string>
             </dict>
             <dict>
                 <key>cmd</key>
                 <string>PCPT</string>
                 <key>value</key>
                 <string>{=L}Type:    '.$_POST["type"].'</string>
             </dict>
             <dict>
                 <key>cmd</key>
                 <string>PCDLM</string>
                 <key>value</key>
                 <string>-</string>
             </dict>
             <dict>
                 <key>cmd</key>
                 <string>PCFLSH</string>
             </dict>
        </array>
     </dict>
</array>
</plist>
';
?>