POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE

 
WEITER LESEN
POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
PowerBuilder User Group
Germany - Meeting
Integration von und Zugriff
auf spezieller Hardware
mittels PowerServer Mobile

Heino Hellmers / S&F Datentechnik
Juni 11-12, 2018 – Berlin (Germany)
POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
DISCLAIMER
This presentation was authored by volunteer(s) in the Appeon community. This is not a
work for hire by Appeon. The views and opinions expressed in this presentation are those
of the author(s).
Its contents are protected by German copyright law and may not be reproduced, distributed,
transmitted, displayed, published or broadcast without the prior written permission. All
rights belong to their respective owners.
Any reference to third-party materials, including but not limited to Websites, content,
services, or software, has not been reviewed or endorsed by Appeon. YOUR USE OF THIRD-
PARTY MATERIALS SHALL BE AT YOUR OWN RISK.
I make no warranty of any kind, either express or implied, including but not limited to, the
implied warranties of merchantability, fitness for a particular purpose, or non-infringement.
I assume no responsibility for errors or omissions.

                                                                                                page
                                                                                                2
POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
Author
  Profile

              Heino Hellmers

Name                 Heino Hellmers, Dipl.-Informatiker
Place of residence   Leer, Germany
Position             CEO, S&F Datentechnik
E-Mail               hellmers@sf-datentechnik.de

                                                          page
                                                          3
POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
Author
Profile

                                           Key Skills
                                             PowerBuilder                       PowerServer Web/Mobile
                                             SQL Server / Oracle                Visual Studio
                                             Software Development               Project Management and
                                             (Desktop, Web, Mobile)             Consulting

     Heino Hellmers                        Recent Projects
                                             Migrations of Windows Mobile/CE based mobile Apps to Android/iOS
          twitter.com/HeinoHellmers
                                             using PowerServer Mobile and developing new mobile Apps

          linkedin.com/in/HeinoHellmers/     Migration of PB WebForm based Apps to PowerServer Web and
                                             bringing native PB Windows Desktop App to the Web.
                                             Maintenance and new Development of different Desktop Apps.
                                             Moving Desktop Apps to Appeon PowerBuilder 2017
                                             from older PB Version.

                                                                                                                page
                                                                                                                4
POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
Agenda

• Company Profile „S&F Datentechnik“
• Initial Situation and Motivation
  for hardware integration with mobile apps
• Techniques for hardware integration
  with PowerServer Mobile (Basics)
• Case studies from Practice
  Hardware, Application, Implementation/Solution, Sourcecode
• Conclusion

                                                               page
                                                               5
POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
Company
Profile

          About
            S&F Datentechnik is an independent consulting and software
            development company in Germany with a team of around
            45 people (15 PowerBuilder developers).
            The company was founded in 1984.
            The company began the development and consulting with
            PowerBuilder in 1996 and has since then implemented various
            projects based on PowerBuilder.

          Experience / Installations / Services
            Software Development for Desktop-, Web- and Mobile- Apps based on
            Appeon products
            Project Management, Consulting, Customer Service and Sales
            Over 30 years of service provider for Public Administration (product line
            KOMVOR) and the waste management industry (product line EMOS)
            More than 400 installations in Europe
                                                                                        page
                                                                                        6
POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
Initial Situation and Motivation
for hardware integration with mobile apps

Ausgangssituation
• diverse mobile Lösungen bei Kunden im Einsatz
  auf Basis von Windows Mobile / Windows CE (MDE Geräte)
• Mobile Lösungen realisiert mittels PocketBuilder / embedded Visual C++
• Hardware wie Steuerungsgeräte (Wägesysteme) oder Identsysteme
  verschiedener Hersteller angebunden

• offene „Feature Requests“ für mobile Lösungen zur Hardwareintegration
  wie Anbindung eines Kartenlesers zur “bargeldlosen Bezahlung”
• je nach Hersteller/Hardware unterschiedliche Möglichkeiten zur Integration
• sehr individuelle, zeit- und kostenaufwendige Hardwareintegration            page
                                                                               7
POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
Initial Situation and Motivation
(for hardware integration with mobile apps)

Motivation (Anforderungen)
• Migration der Kunden auf Android/iOS basierende Lösungen und
  Einstellung der Windows CE/Windows Mobile basierenden Entwicklung
• Umsetzung aller bisherigen Hardwareanbindung der mobilen Lösungen
• Umsetzung der „Feature Requests“, die nicht umgesetzt werden konnten

• Finden von standardisierten Lösungen zur Anbindung von Hardware
• Geräte und Hersteller unabhängigere Lösungen sowie
  größere Auswahl an Geräten und weniger Spezialhardware
• geringere Anschaffungskosten für Hardware
                                                                         page
                                                                         8
POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
Different techniques for hardware integration
with PowerServer Mobile (Basics)

• PowerScript Funktionen, die vom PowerServer direkt unterstützt werden
• „mobile Device API“ des PowerServer für konkrete Hardware

• Appeon Cordova PBL - Solution I
• Appeon Cordova PBL - Solution II

• Custom URL Schemata zur bidirektionalen Kommunikation
  und Steuerung von Hardware

                                                                          page
                                                                          9
POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
Fallbeispiele
Kamera / Foto
Hardware

                page
                11
Kamera / Foto
App

                page
                12
Kamera / Foto
Realisierung - Lösung

•   Nutzung der „mobile Device API“ des PowerServer für konkrete Hardware
•   Appeon Objekt eon_mobile_cameraex zur Ansprache der Kamera
    um ein Foto zu erstellen
•   Appeon Objekt eon_mobile_image zur Bildbearbeitung
    um ein Foto zu verkleinern

•   Eigenes Serviceobjekt n_cst_camera als Service/Instanz am
    Appmanager gnv_app.inv_camera
•   Aufruf der Fotoerstellung über Picture Button auf einer Karte über die
    Funktion of_captureimage() am Serviceobjekt

                                                                             page
                                                                             13
Kamera / Foto
Sourcecode I

// im appmanager – sf_open event ; Erstellung von gnv_app.inv_camera - create n_cst_camera
of_setcamera (TRUE)

// in n_cst_camera - constructor event
inv_camera = CREATE eon_mobile_cameraex
inv_image = CREATE eon_mobile_image

// [ PUBLIC ] of_captureimage ( string )
// Function in n_cst_camera inherited from n_base - User Object
// Description:   Neues Foto erstellen.

                                                                                             page
                                                                                             14
Kamera / Foto
 Sourcecode II

 li_return = inv_camera.of_takefile ( 1, TRUE, REF ls_filePath, REF lblb_picture )
 …
 // Foto verkleinern – unter Nutzung der Struktur eon_mobile_str_imageoption
 istr_imageoption.b_grayimage = FALSE
 istr_imageoption.b_returnblob = TRUE
 istr_imageoption.i_imagetype = 0           // JPG
 istr_imageoption.i_quality = 10
 …
 li_return = inv_image.of_createImageWithOptions ( lblb_picture, ls_filePathReduced,
 istr_imageoption, REF istr_imageinfo )
 iu_requestor.dw_foto.EVENT ue_foto_new (ls_filePathReduced )
 …
Wunsch: Funktion zur Voreinstellung von Auflösung und Bildformat                       page
                                                                                       15
Kamera / Barcode
Hardware

                   page
                   16
Kamera / Barcode
App

                   page
                   17
Kamera / Barcode
Realisierung - Lösung

•   Nutzung der „mobile Device API“ des PowerServer für konkrete Hardware
•   Appeon Objekt eon_mobile_barcode zur Ansprache der Kamera um
    eine Fotokamera zur Barcodeerkennung zu nutzen

•   Eigenes Serviceobjekt n_cst_barcode als Service/Instanz am
    Appmanager gnv_app.inv_barcode
•   Aufruf der Barcodeerkennung über Picture Button auf einer Karte über
    die Funktion of_read() am Serviceobjekt

                                                                            page
                                                                            18
Kamera / Barcode
 Sourcecode

 // im appmanager – sf_open event ; Erstellung von gnv_app.inv_barcode
 inv_barcode = create n_cst_barcode
 …
 // in n_cst_barcode - constructor event
 inv_barcode = CREATE eon_mobile_barcodeex
 …
 // [ PUBLIC ] integer of_read (ref string rs_data, ref integer ri_format);
 // Description:   Lesen des Barcodes,
 // Argumente:     rs_data string [reference] - Barcode Daten – gelesener Wert
 //                ri_format integer [reference] - Barcode Format z.B. Code128 ,Code39, QRCode

 RETURN inv_barcode.of_read ( REF rs_data, REF ri_format )

Wunsch: Funktion zur Einstellung des Blitzlichtes                                                page
                                                                                                 19
RFID / Barcode Scanner
Hardware

          LogiScan Modelle
             von aitronic

                             page
                             20
RFID / Barcode Scanner
App

                         page
                         21
RFID / Barcode Scanner
Realisierung - Lösung

•   Tool des Geräteherstellers um gescannte Daten ins „Clipboard“ des
    Betriebssystem zu schreiben (z.B. „Devin“ beim Hersteller aitronic)
•   Appeon Cordova PBL - Solution II
    Clipboard Plugin www.npmjs.com/package/cordova-universal-clipboard
•   Eigene Serviceobjekt n_cst_cordova als Ahne für Plugins der Solution II
    und spezieller Erbe n_cst_clipboard für das Clipboard Plugin
•   Eigenes Serviceobjekt n_cst_scanclipboard für Windows,
    welches per Timer das Clipboard prüft und einen gescannten Wert
    an ein Window per Event übergibt.

                                                                              page
                                                                              22
RFID / Barcode Scanner
Sourcecode I

// [ PUBLIC ] sf_init ( ) - Event von n_cst_cordova um allgemein ein Cordova Plugin zu initialisieren

oleCordova = CREATE OLEObject
li_rc = oleCordova.ConnectToNewObject ( "AppeonMobile.CordovaPlugin" )
…
// Prüfen, ob es das Plugin gibt - "cordova.plugins.clipboard“ für das Clipboard Plugin
ls_return = oleCordova.ExecJavaScriptWithReturn ( "typeof " + is_pluginname )
IF ls_return  "object" THEN RETURN -1

// Cordova Plugin (JavaScript Objekt) und PB Objekt verbinden.
oleCordova.associateJSwithPB ( is_pluginName, THIS )

                                                                                                        page
                                                                                                        23
RFID / Barcode Scanner
Sourcecode II

// [ PUBLIC ] string of_paste ();
// Function in n_cst_cordova_clipboard inherited from n_cst_cordova - User Object
// Description:   Clipboard auslesen und zurückgeben

STRINGls_clipboard
ls_clipboard = oleCordova.paste ( "@", "@" )

// Hinweis: in einigen Fällen, wenn Clipboard noch nicht benutzt bzw. leer,
// steht im String eine Fehlermeldung anstelle des Inhalts vom Clipboard
IF pos ( ls_clipboard, "on a null object reference" ) > 0 THEN ls_clipboard = ""

RETURN ls_clipboard

                                                                                    page
                                                                                    24
NFC
Hardware

           page
           25
NFC
App

      page
      26
NFC
Realisierung - Lösung

•   Nutzung der „mobile Device API“ des PowerServer für konkrete Hardware
•   Appeon Objekt eon_mobile_nfcex zur Ansprache der NFC Funktionen

•   Eigenes Serviceobjekt n_cst_nfc als Service/Instanz am Appmanager
    gnv_app.inv_nfc
•   Aktivierung der Funktionalität am gewünschten Fenster durch
    Instancevariable ib_nfcscan, welcher den NFC Scan aktiviert
•   Auslösung eines Events am Fenster beim Lesen eines NFC Tags und
    Weitergabe der Informationen mittels Struktur

                                                                            page
                                                                            27
NFC
Sourcecode

// [ PUBLIC ] of_open ( ) - NFC Kommunikation öffnen
li_rc = inv_nfcex.of_open ()

// [ PUBLIC ] oe_newtagfound ( integer ) - Wird ausgelöst, wenn ein NFC Tag gelesen wurde
eon_mobile_str_nfcrecord           lstr_record

// Anzahl der Datensätze auf dem Tag ermitteln
li_maxIndex = of_getndefrecordcount ( )
// Alle Datensätze des Tags in eine Struktur schreiben
FOR li_index = 1 TO li_maxIndex
        li_rc = of_getNdefRecord ( li_index, REF lstr_record )

                                                                                            page
                                                                                            28
NFC
Sourcecode

        ...
        // Typ ermitteln und eigene Struktur füllen
        lstr_nfc.messageType [ li_index ] = lstr_record.i_messagetype
        // Typ: Text
        IF lstr_record.i_messagetype = cii_type_text THEN
                 ...
                 lb_tagOk = TRUE
        END IF
NEXT
// Gelesene Daten an das aktive Fenster weitergeben
li_rc = lw_activeWindow.EVENT sf_nfcTagFound ( lstr_nfc )

                                                                        page
                                                                        29
Mobile Drucker
Hardware

                      Star SM-L200

      Datamax-Oneil                  page
          Apex                       30
Drucker (allgemein)
App – Lösung I

                      page
                      31
Drucker (allgemein)
Realisierung – Lösung I

• PowerScript Funktionen, die vom PowerServer unterstützt werden
• Nutzung der DataWindow Funktion dw.Print()

• bei Android ist die Installation eines Print Service Plugins vom Hersteller
  erforderlich und bei iOS muss der Drucker AirPrint unterstützen
• kaum „kompakte“ mobile Drucker, die diese Anforderungen erfüllen

• Druck erfolgt über Zwischendialog des Betriebssystem und nicht
  unmittelbar zum Drucker
• Geschwindigkeit des Ausdruck eher langsam
                                                                                page
                                                                                32
Mobile Drucker
App – Lösung II

                  direkter Druck

                                       optional
                                   eigene Vorschau
                                                     page
                                                     33
Mobile Drucker
Realisierung – Lösung II

•   Printer Control Language (PCL) bzw. Printer Commands des
    Druckerherstellers um Befehle direkt über Bluetooth zu senden
•   Appeon Cordova PBL - Solution I – für Android
    Bluetooth Plugin github.com/tanelih/phonegap-bluetooth-plugin
•   Appeon Cordova PBL - Solution I – für iOS
    Bluetooth LE Plugin www.npmjs.com/package/cordova-plugin-bluetoothle

•   Eigene Erben der Appeon Bluetooth Objekte eon_cordova_bluetooth /
    eon_cordova_bluetoothle, welches die Bluetooth Kommunikation und
    die Fehlerbehandlung erweitern
•   Eigenes Serviceobjekt n_cst_printer_pcl und spezielle Erben für jeden
    unterstützten (implementierten) Drucker
                                                                            page
                                                                            34
Mobile Drucker
Sourcecode – Lösung II

// [ PUBLIC ] of_initbluetooth ( ) - Function in n_cst_printer inherited from n_base - User Object
// Description:   Bluetooth-Service initialisieren
IF ib_bluetoothLE THEN
         inv_bluetoothLE = CREATE n_cst_bluetooth_le
         inv_bluetoothLE.of_setDeviceName ( is_printerName )
         inv_bluetoothLE.of_initialize ( TRUE )
ELSE
         inv_bluetooth = CREATE n_cst_bluetooth
         inv_bluetooth.of_setDeviceName ( is_printerName )
         inv_bluetooth.of_connectDevice ( )
END IF

                                                                                                     page
                                                                                                     35
Mobile Drucker
Sourcecode – Lösung II

// [ PUBLIC ] sf_init ( ) -Event in n_cst_printer_star inherited from n_cst_printer_pcl - User Object
// siehe StarPRNT Command Specifications http://www.starmicronics.com/

is_font = is_escape + char(29) + char (116) + char (32) // "ESC GS t 32" Code Page 1252
is_crlf = is_escape + char (97) + char (1)
is_bold_on = is_escape + char (69)
is_bold_off = is_escape + char (70)
…
il_maxCharPerLine = 31

                                                                                                        page
                                                                                                        36
Anbauwaage
Hardware

             page
             37
Anbauwaage
App

             page
             38
Anbauwaage
Realisierung - Lösung

•   Nutzung eines RS232 Funkadapters
    wie z.B. unter www.blueserial.de der „BlueSerial“
•   Appeon Cordova PBL - Solution I
    Bluetooth Plugin github.com/tanelih/phonegap-bluetooth-plugin

•   Eigener Erbe des Appeon Bluetooth Objekts eon_cordova_bluetooth,
    der die Bluetooth Kommunikation und die Fehlerbehandlung erweitert
•   Eigenes Serviceobjekt n_cst_serial und spezielle Erben für die serielle
    Kommunikation mit den verschiedenen Anbauwaagen / Protokolle

                                                                              page
                                                                              39
Anbauwaage
Sourcecode

/// [ PUBLIC ] of_startconnectionmanager ( )
// Function in n_cst_bluetooth - ConnectionManager starten
..
ls_return = ieon_ole.startConnectionManager ( "@ue_dataread", "@ue_connect_error" )
…
EVENT ue_connected ()

// [ PUBLIC ] ue_dataread ( string ) -Event - Daten wurden vom Bluetooth Gerät empfangen
// Empfangene Daten an den Requestor weiterleiten
// Empfangen im Format         [97,98,99,49,50,51]
// Weitergeleitet im Format    abc123

                                                                                           page
                                                                                           40
Anbauwaage
Sourcecode

IF isValid ( inv_serial ) THEN
         as_message = mid ( as_message, 2, len ( as_message ) - 2 )
         ll_maxIndex = gnv_app.inv_string.of_parseToArray ( as_message, ",", REF lsa_ascii [] )
         IF ll_maxIndex > 0 THEN
                  FOR ll_index = 1 TO ll_maxIndex
                           ls_data += string ( char ( integer ( lsa_ascii [ ll_index ] ) ) )
                  NEXT
                  inv_serial.EVENT sf_dataRead ( ls_data )
         END IF
END IF

                                                                                                  page
                                                                                                  41
Kartenleser
Hardware

              page
              42
Kartenleser
App

              page
              43
Kartenleser
Realisierung - Lösung

• Nutzung von Custom URL Schemata zur bidirektionalen Kommunikation
  und Steuerung von Hardware
• Aufruf der SumUp Anwendung mittels custom URL aus der mobilen App
  unter Angabe einer CallBack URL

• Rückmeldung über die erfolgte Transaktion an die mobile App durch die
  SumUp Anwendung mittels Aufruf der angegebenen CallBack URL
• Nutzung der mobile Device API für den Appeon Workspace
  zum Erhalt und Bearbeitung der custom URLs innerhalb der mobilen
  Anwendung
• Eigenes Serviceobjekt um die Kartenzahlung aufzurufen und die
  Rückmeldungen zu verarbeiten
                                                                          page
                                                                          44
Kartenleser (SumUP)
Sourcecode

// [ PUBLIC ] of_kartenzahlung_init ( ) - Initialisierung der Kartenzahlung
...
// Event für Callback/Rückgabe registrieren
inv_workspaceEx.of_register ( THIS, "ue_kartenzahlungcallback" )

// custom URL mit Lizenzschlüssel des Kunden zusammenstellen
is_kartenZahlungURL = "sumupmerchant://pay/1.0?“
is_kartenZahlungURL += "&affiliate-key=" + “XxXXxXXx-772c-47f4-aed6-XXXxXXcxxxxx" //

inv_inet = CREATE n_cst_inet
…

                                                                                       page
                                                                                       45
Kartenleser (SumUP)
Sourcecode

// Die URL der mobilen App wird als Callback URI verwendet

gnv_app.inv_workspace.of_getAppinfo ( REF ls_dummy, REF ls_appUrl )
ls_appUrl = left ( ls_appurl, len ( ls_appUrl ) - 1 ) // ohne abschliessenden Slash
is_kartenZahlungURL += "&callback=appeonaws://?url=" + ls_appUrl

// [ PUBLIC ] of_kartenzahlung ( ) - Funktion für einzelnen Kartenzahlungen

// Betrag ergänzen und App für die Kartenzahlung aufrufen
ls_url = is_kartenzahlungURL + "&amount=" + …
RETURN inv_inet.hyperLinkToUrl ( ls_url )

                                                                                      page
                                                                                      46
Kartenleser (SumUP)
Sourcecode

// [ PUBLIC ] ue_kartenzahlungscallback () - Event des Serviceobjektes für Kartenzahlungen
// Wird als Callback vom Kartenterminal ausgelöst
...
inv_workspaceEx.of_getUrlSchemeParm ( REF ls_urlScheme )
IF pos ( ls_urlScheme, "smp-status=success" ) > 0 THEN
         gnv_app.inv_error.of_message ( "ems_kartenzahlung_ok" )
ELSE
         …
         gnv_app.inv_error.of_message ( "ems_kartenzahlung_fehler", ls_message )
END IF

                                                                                             page
                                                                                             47
Conclusion

• Die Anbindung von Hardware für mobile Anwendungen kann auf sehr
  verschiedenen Wegen realisiert werden.
• Die Anbindung häufig genutzter Hardware ist einfach umsetzbar und
  bereits im Standard des Appeon PowerServer vorgesehen.
• Die Anbindung von Hardware abseits des Standard ist weiterhin sehr
  individuell sowie zeit- und kostenintensiv.
• Reichen die im Standard vorhandenen Hardwareanbindungen nicht aus,
  kann in der Regel über alternative Techniken wie Cordova Plugins oder
  Custom URL Schemata eine Lösung realisiert werden.

                                                                          page
                                                                          48
Thank You
Sie können auch lesen