1 x FileMaker zu Xojo und zurück, bitte!

Letztens war ich im schönen Salzburg, und zwar strenggenommen bei der FileMaker Konferenz. Das namengebende, an sich wirklich sehr schöne Datenbankentwicklungswerkzeug ist durch die Lizenzentscheidungen des Herstellers ein wenig bedroht, zumindest was kleinere Projekte angeht, da die Fähigkeit zur Entwicklung von Stand-Alones, also ohne FileMaker laufende Projekte, immer weiter zurückgeschraubt wird und Datenbankkunden pro Arbeitsplatz eine FM-Lizenz erwerben müssen – was schnell so richtig ins Geld gehen kann und den Vertrieb kleiner Projekte (die berüchtigte CD-Sammlung, falls jemand überhaupt noch physische Datenträger sammelt) unlukrativ macht.

Allerdings ist die Entwicklung einer reinen Datenbanklösung in FM wirklich um Klassen komfortabler, und auch in puncto ansprechende Benutzeroberfläche hat FM die Nase vorn. Weshalb es keinen klaren Punktsieger zu vermelden gibt: Hat man sich in Xojo eingearbeitet und womöglich eine eigene Sammlung datenbankbewusster Steuerelemente entworfen (z.B. nach diesem Muster), sind die Möglichkeiten ungleich höher. Dahin zu kommen, ist allerdings ein weiter Weg.

Auf der anderen Seite sind findige Entwickler auch dabei, die Datenbank-Features von Xojo auf ein anderes Niveau zu hieven. Siehe z.B. die neuste Entwicklung von Tim Dietrich über die einfache Integration von FM Server-Datenbanken in Xojo.

Dann gibt es aber noch jene FileMaker-Projekte, die schon lange in dieser Entwicklungsumgebung gewachsen sind, denen es aber an Funktionen fehlt, die in Xojo einfach zu programmieren sind. Wie lässt man beide Systeme miteinander reden?

Es gibt die Möglichkeit, via ODBC direkt in die FM-Datenbank zu schreiben. Dafür gibt es eine ausführliche Beschreibung von Christian Schmitz/Monkeybreadsoftware. Allerdings löst das nicht die Frage des Ansteuerns der Xojo-App von FM aus.

Ein FileMaker-Server kann auch FMP:-URLs empfangen – was aber das gleiche Problem ungelöst lässt.

Dann kam der Vorschlag auf, eine Xojo-Web-App zu verwenden, um die Kommunikation in Richtung FM -> Xojo zu etablieren. Praktikabel, aber für mich nicht der Weisheit letzter Schluss. Eine Web-App lokal laufen zu lassen, um eine versteckte Kommunikation zu führen … Das ist nicht wirklich elegant, ein ziemlicher Overhead, und ein paar Sicherheitsbedenken birgt das für mich auch.

Aber der Hinweis von Tim Dietrich brachte mich auf die richtige Spur. FileMaker kennt seit Version 13 den Befehl Aus URL einfügen. Und damit lässt sich eine Verbindung aufbauen, die den meisten Anwendungen gerecht wird: Eine Xojo-App, die durchaus auch eine Kommandozeilen-App sein kann, eröffnet eine Verbindung auf einem definierten Port und lauscht dort. Schickt FM nun via Aus URL einfügen eine Frage, kann die Anwendung darauf reagieren und eine Antwort zurücksenden. Und das ist gar nicht mal so schwer. Wieder einmal half ein Beispielprojekt enorm dabei, nämlich das unter Examples/Communication/Internet befindliche ServerSocketServerTest-Projekt. Hier die Bauanleitung:

  • Erstellen Sie ein neues Xojo-Projekt (ich nehme hier einmal ein Kommandozeilenprojekt) und geben Sie dem App-Element im Navigator eine neue Property:
    MainServerSocket As ServerSocket

ServerSocket kurz erklärt

Ein ServerSocket ist mehr oder weniger eine Factory für TCPSockets. Alles klar?

In besserem Deutsch: Ein ServerSocket ist ein Steuerelement, das einen Netzwerkport beobachtet und einen genügend großen Pool an TCPSockets zur Verfügung stellt (bzw. bei Bedarf erzeugt), um eintreffende Verbindungen zu beantworten.

In der Grundausstattung reicht es, dem ServerSocket eben den gewünschten Port zuzuweisen und seinen AddSocket-Event zu belegen, der nämlich immer dann automatisch feuert, wenn die Anzahl freier TCPSockets seine in der Property MinimumSocketsAvailable definierte Mindestanzahl unterschreitet. Standardwert ist 2, weshalb das ServerSocket auch gleich zu produzieren anfängt, sobald es zu lauschen beginnt. Oder in Code:

App.Run erhält diesen:

Function Run(args() as String) Handles Run as Integer
 MainServerSocket = New ServerSocket
 MainServerSocket.Port = mSocketPort
 AddHandler MainServerSocket.AddSocket, Addressof AddSocket
 MainServerSocket.Listen
 
 While True
  app.DoEvents()
 Wend
 
 #Pragma Unused args
End Function

mSocketPort ist eine Integer-Property, der ich einen Port zuweise. Es sollte ein Wert über 1024 sein, da Ports darunter auf macOS und Linux Administrator-Rechte benötigen. Sagen wir also mal 23456.

Dann gibt es noch eine App-Property

Private Property mCurrentSocket as Integer

die als Zähler für die eigene TCPSocket-Unterklasse dient, einfach für Debugzwecke.

Die Methode AddSocket bekommt diesen Code:

Public Function AddSocket(socket as ServerSocket) as TCPSocket
 Dim ret As TCPSocket = New ClientSocket(mCurrentSocket)
 System.Debuglog "Added Socket " + mCurrentSocket.totext+ " at "+socket.LocalAddress.totext
 mCurrentSocket = mCurrentSocket + 1
 Return ret
End Function

ClientSocket ist eine eigene Klasse, basierend auf TCPSocket. Sie erhält aus ebenjenen Debug-Gründen einen

Public Sub Constructor(num As Integer)
 mNum = num
End Sub

und eine ebensolche Property

Private Property mNum as Integer

 

Kurzer Überblick

In App.Run wird das ServerSocket initialisiert und auf Lauschen gestellt, woraufhin es einen Schwung ClientSockets produziert. Kommt eine Anfrage über den eingestellten Port herein (an die Localhost-Adresse 127.0.0.1 und ebenjenen Port geschickt, also „127.0.0.1:23456″), wird ein Socket verbunden. Sein Connected-Event feuert. Das wollen wir sehen, also

Sub Connected() Handles Connected
 System.DebugLog ("Socket " + mNum.totext + " connected")
End Sub

Mit der Verbindungsherstellung sind aber auch Daten eingetroffen. Um diese sichtbar zu machen:

Sub DataAvailable() Handles DataAvailable
 Dim result As Text = Self.ReadAll.DefineEncoding ( Encodings.UTF8).totext
 System.DebugLog ("Socket " + mNum.totext+ " got: " + result)
End Sub

Für den Fall der Fälle noch

Sub Error() Handles Error
 System.DebugLog ("Socket " + mNum.totext + ": (Error) = " + Self.LastErrorCode.totext)
End Sub

Das reicht auch schon zum ersten Ausprobieren, ganz ohne FileMaker. Starten Sie das Programm – der Mac wird Sie nach Erlaubnis fragen, um den Lauschangriff auf Port 23456 zu beginnen –, und die Konsole wird in etwa so aussehen:

Nov 23 18:21:54  FMConnector.debug[72905] <Warning>: Added Socket 0 at 192.168.1.2
Nov 23 18:21:54  FMConnector.debug[72905] <Warning>: Added Socket 1 at 192.168.1.2
Nov 23 18:21:54  FMConnector.debug[72905] <Warning>: Added Socket 2 at 192.168.1.2

usw. Die TCP-Sockets werden also erzeugt. Stören Sie sich am „Warning“, das liegt nur an der DebugLog-Benachrichtigungsart.

Wechseln Sie nun einmal zum Webbrowser und geben Sie als URL

http://127.0.0.1:23456

ein. In der Konsole findet sich daraufhin

Nov 23 18:22:22  FMConnector.debug[72905] <Warning>: Socket 11 connected
Nov 23 18:22:22  FMConnector.debug[72905] <Warning>: Socket 11 got: GET / HTTP/1.1
Host: 192.168.1.2:23456
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Connection: keep-alive

Der Browser hat also eine Anfrage an den Server geschickt und hängt nun, da er keine Antwort erhält und die Verbindung (das TCPSocket) offen gehalten wird.

Browser-Kommunikation interessiert gerade nicht; wir wollen ja keinen Webserver bauen. Zunächst eine Erweiterung für den DataAvailable-Event:

Sub DataAvailable() Handles DataAvailable
 Dim result As Text = Self.ReadAll.DefineEncoding ( Encodings.UTF8).totext
 System.DebugLog ("Socket " + mNum.totext+ " got: " + result)
 Me.Write("Es funktioniert!")
End Sub

Es soll also auch etwas zurückgegeben werden. Und jetzt zu

 

FileMaker

Erstellen Sie dort eine neue Lösung mit einem Textfeld in der Tabelle – ich nenne das Projekt FMConnector und das Feld TCP_Result.

Dazu ein Script:

ConnectToServer
 Neuer DatenSatz/Abfrage
 Aus URL einfügen [SSL-Zertifikate verifizieren; Mit Dialog: Aus: FMConnector::TCP-Result ; "127.0.0.1:23456" ]

Starten Sie nun wieder das Xojo-Programm und dann das Script. Seien Sie nicht enttäuscht – es passiert etwas, aber nicht genug:

URL Transfer

Denn auch hier wird der Port noch offen gehalten. Das TCPSocket muss nach vollendetem Senden die Verbindung kappen:

Sub SendComplete(userAborted as Boolean) Handles SendComplete
 Me.Close
End Sub

… und wenn Sie das ganze jetzt wieder ausprobieren:

ItWorks.png

Sie können dem ConnectToServerScript Parameter in URL-Art hinzufügen, also z.B.

"127.0.0.1:23456?Activate"

und diese im Data-Available-Event (oder einer eigenen Methode) auswerten lassen. Die erste empfangene Zeile würde dann

GET /?Activate HTTP/1.1

lauten.

In ersten Experimenten schien es ratsam, das Schließen des Sockets vom SendComplete-Event abzukoppeln, indem z.B. eine Methode mit me.close via Xojo.Core.Timer.CallLater angesprungen wird. Und FileMaker verschluckte sich bei einigen Rückmeldungen, was aber aufhörte, wenn ich den Ergebnisstring in Tags verpackte – wobei es ganz egal ist, was in diesen Tags steht. Das mag aber auch nur ein Schluckauf der aktuellen Beta-Version von Xojo gewesen sein.

Und selbstverständlich gülte es zu testen, um der Port überhaupt frei ist, Sicherheitsroutinen einzubauen und pipapo. Aber für den Anfang …

Wie üblich: Das Projekt zum Testen, diesmal auch gleich mit FM-Datei dazu.

 

 

 

 

 

2 Gedanken zu “1 x FileMaker zu Xojo und zurück, bitte!

  1. Frage aus Interesse am Einsatz FM (bin XOJO User, aber eher wenig DB Marktanteil -Wissen):
    Spielt den FM (als DB-Entwicklungsumgebung + DB) denn auch auf reinen Win-Server-Client, Linux_Server-Client Systeme eine Rolle bzw. hat Marktanteile? Oder kommen FM nie ohne Bezug zu OS X / Mac Clients vor?
    Nicht falsch verstehen, wenn ja, also FM nie/extrem selten ohne OS X Bezug in Unternehmen auftaucht, soll das nicht heißen FM spielt keine Rolle!
    Danke

    Gefällt mir

    1. Über Marktanteile von FileMaker kann ich leider herzlich wenig sagen. Es hat nach ganz persönlichem Eindruck in der Entwicklerwelt eine Stellung ganz ähnlich der von Xojo: Eher ein Exot, aber aufgrund der Entwicklungsgeschwindigkeit „Geheimwaffe“ und Wettbewerbsvorteil der Anwender. Als Apple-Tochter hat die Firma Filemaker vor allem in der Mac-Welt Fuß gefasst, aber das System lässt sich ebenso unter Windows einsetzen und hat dort seinen Anwenderkreis (und iOS-Möglichkeiten gibt es ebenso). Die Linux-Version ist allerdings vor vielen Jahren eingestellt worden, insofern dürfte der Marktanteil dort gleich 0 sein.

      Gefällt mir

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s