POWERBUILDER USER GROUP GERMANY - MEETING - INTEGRATION VON UND ZUGRIFF AUF SPEZIELLER HARDWARE MITTELS POWERSERVER MOBILE - PBUGG.DE
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
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)
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
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
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
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
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
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
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
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
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