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
2Author
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
3Author
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
4Agenda
• 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
5Company
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
6Initial 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
7Initial 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
8Different 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
9Kamera / Foto
Hardware
page
11Kamera / Foto
App
page
12Kamera / 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
13Kamera / 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
14Kamera / 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
15Kamera / Barcode
Hardware
page
16Kamera / Barcode
App
page
17Kamera / 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
18Kamera / 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
19RFID / Barcode Scanner
Hardware
LogiScan Modelle
von aitronic
page
20RFID / Barcode Scanner
App
page
21RFID / 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
22RFID / 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
23RFID / 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
24NFC
Hardware
page
25NFC
App
page
26NFC
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
27NFC
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
28NFC
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
29Mobile Drucker
Hardware
Star SM-L200
Datamax-Oneil page
Apex 30Drucker (allgemein)
App – Lösung I
page
31Drucker (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
32Mobile Drucker
App – Lösung II
direkter Druck
optional
eigene Vorschau
page
33Mobile 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
34Mobile 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
35Mobile 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
36Anbauwaage
Hardware
page
37Anbauwaage
App
page
38Anbauwaage
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
39Anbauwaage
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
40Anbauwaage
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
41Kartenleser
Hardware
page
42Kartenleser
App
page
43Kartenleser
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
44Kartenleser (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
45Kartenleser (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
46Kartenleser (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
47Conclusion
• 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
48Thank You
Sie können auch lesen