EgiGeoZone Forum

EgiGeoZone => Programmierecke (Google und Android) => Thema gestartet von: seb1985 am 28.02.2017, 07:57:02

Titel: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 28.02.2017, 07:57:02
Hallo Zusammen,

ist es möglich, unter Serverprofilen irgendwo die HTTP-Methode auszuwählen? Für die Anbindung an openHAB bräuchte ich einen POST- oder PUT-Request.
Sollte das noch nicht gehen, wäre das doch eine sinnvolle Erweiterung für jegliche Art von Rest-API (nicht nur für openHAB).

Für Infos und Hinweise bin ich sehr dankbar.

Danke und Gruß,
Sebastian.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 28.02.2017, 13:26:13
Hallo Sebastian,

schön, dass du openHAB über die App ansprechen möchtest. Gibt es da keinen SOAP- oder anderen Webservice, den du ansprechen könntest?

Zitat
ist es möglich, unter Serverprofilen irgendwo die HTTP-Methode auszuwählen? Für die Anbindung an openHAB bräuchte ich einen POST- oder PUT-Request.
Ist nicht vorgesehen. Könnte ich wählbar einbauen.

Zitat
Sollte das noch nicht gehen, wäre das doch eine sinnvolle Erweiterung für jegliche Art von Rest-API
REST geht auch nicht. Wurde noch nie gebraucht.


Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 28.02.2017, 14:28:14
Hallo,

danke für die schnelle Antwort. openHAB bietet, soweit ich weiß, nur eine REST-API an. Wenn man die vier grundlegenden HTTP-Methoden unterstützt, kommt man an einer REST-API schon recht weit.
Eine Einstellung für die zu verwendende Methode wäre daher für mich durchaus wünschswert. Ich könnte dabei auch unterstützen, habe aber den Code nirgends gefunden. Ist der eigentlich OpenSource? Ich hatte auch schon darüber nachgedacht, ein Plugin dafür zu entwickeln, denke aber, dass es eher direkt in die App (also in die Serverprofile) gehört.

Also: Wenn ich in irgendeiner Weise untersützen kann, dann melde dich bitte!

Danke und Gruß,
Sebastian.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 28.02.2017, 17:23:25
Zitat
Ich könnte dabei auch unterstützen, habe aber den Code nirgends gefunden.
Er ist nicht veröffentlicht.

Zitat
Ich hatte auch schon darüber nachgedacht, ein Plugin dafür zu entwickeln, denke aber, dass es eher direkt in die App (also in die Serverprofile) gehört.
Bin eher für ein Plugin, da es sonst das Serverprofil überfrachten würde und dann einige Nutzer Probleme bekämen, die dann wiederum bei mir aufschlagen.
Bei einem Plugin würde ich dich gerne beraten.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 02.03.2017, 08:56:27
OK, dann versuche ich mich mal daran. Schade, dass der Code nicht veröffentlicht ist. Hat das konkrete Gründe?
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 02.03.2017, 18:16:24
Zitat
OK, dann versuche ich mich mal daran.
Du hast ja gesehen, dass ich ein Beispielplugin bereitgestellt habe.

Zitat
Schade, dass der Code nicht veröffentlicht ist. Hat das konkrete Gründe?
Ich wollte keine Nachahmer  ;)
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 06.03.2017, 20:25:27
Hallo Egmont,
wie versprochen habe ich mich mal an dem Thema versucht. Da ich gerade in das Thema Android einsteige, könnte ich noch etwas Hilfe gebrauchen.
Ich war jetzt in der Lage mit dem abgelegten Code einen beliebigen HTTP-Request abzusetzen, wenn ich mir einen Intent mit folgendem ADB-Aufruf erstelle:

adb shell am broadcast -a de.egi.geofence.geozone.plugin.EVENT --es "transition" "0"
Wenn ich aber einen Zoneneintritt bzw. -austritt in der EgiGeoZoneBT-App erzeuge, tut sich jedoch nichts. Hast du vlt. einen Hinweis, wo ich beim Debuggen ansetzen kann? Ich bin auch für andere Hinweise zu Oberfläche, Bedienung, Codestyle etc. dankbar.

Den Code findest du hier:

https://github.com/sebastiankutschbach/HTTPPlugin (https://github.com/sebastiankutschbach/HTTPPlugin)

Vielen Dank schonmal und Gruß,
Sebastian.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 07.03.2017, 08:26:09
Hallo Sebastian,

bei mir hat es auf Anhieb funktioniert. Bis auf das, dass ich keine richtige URL hatte.

1. Prüfen, ob Plugin in den EgiGeoZone-Einstellungen unter "Registrierte Plugins anzeigen" angezeigt wird. Tut es.
2. In den App-Einstellungen von EgiGeoZone "Übermittlung an Plugins erlauben"

3. Nun Testen.
3.1 Ich starte das Plugin im Android Studio mit "Debug app" und setze die nötigen Breapoints.
3.2 Nachdem im Plugin die nötigen Parameter erfasst wurden, kehre ich zu EgiGeoZone zurück
3.3 und rufe eine Zone auf und ohne was zu ändern speichere ich diese. Dies sollte sofort/bald den "Betreten-Event" aufrufen. Damit dies funktioniert, musst du dich in dieser Zone befinden! Wenn nicht lege eine da an.
4. Debuggen....  :)

Das Design schaut schon mal gut aus  ;)
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 07.03.2017, 08:44:33
Hallo Egmont,

ah, ok. Ich nehme an, es lag an dem fehlenden Häkchen "Übermittlung an Plugins erlauben". Werde ich heute abend gleich probieren. Kann es sein, dass der Hinweis auf das Häckchen noch in der Anleitung für Plugins fehlt oder habe ich das überlesen?
Kannst du das in dem Fall bitte nachpflegen?

Danke schonmal für dein Feedback!

Gruß,
Sebastian.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 07.03.2017, 09:29:30
Hallo Sebastian,

Zitat
ah, ok. Ich nehme an, es lag an dem fehlenden Häkchen "Übermittlung an Plugins erlauben". Werde ich heute abend gleich probieren. Kann es sein, dass der Hinweis auf das Häckchen noch in der Anleitung für Plugins fehlt oder habe ich das überlesen?
Kannst du das in dem Fall bitte nachpflegen?
Hier stand es ganz unten dabei: https://egigeozone.de/developer/default.html (https://egigeozone.de/developer/default.html)
und hier nicht: https://www.egigeozone.de/forum/index.php?topic=89.0 (https://www.egigeozone.de/forum/index.php?topic=89.0)
Habe es aber nachgetragen.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 08.03.2017, 08:07:48
Hallo,

ich kann nun bestätigen, dass das Plugin grundlegend funktioniert. Allerdings führt es die Operation für das Betreten/Verlassen jeder Zone aus. Für mich heißt das, dass ich für jede Zone eine extra Konfiguration anbieten muss.
Gibt es irgendeine Möglichkeit, die in EgiGeoZone angelegten Zonen abzufragen? Sollte das nicht funktionieren, müsste man den Namen der Zone deklarativ angeben. Das ist nicht schön, würde aber auch funktionieren.

Danke und Gruß,
Sebastian.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 08.03.2017, 12:39:43
Zitat
ich kann nun bestätigen, dass das Plugin grundlegend funktioniert.
Super! Wirst du das Plugin im Google Play Store anbieten?

Zitat
Allerdings führt es die Operation für das Betreten/Verlassen jeder Zone aus.
Habe ich auch gemerkt, dass es unschön ist. Mir ist aber noch nicht Gescheites eingefallen.
Eine Liste mit den zu verwendenen Plugins bei jeder Zone war mir eine zu große Änderung.

Zitat
Gibt es irgendeine Möglichkeit, die in EgiGeoZone angelegten Zonen abzufragen?
Nein.

Zitat
Sollte das nicht funktionieren, müsste man den Namen der Zone deklarativ angeben.
Oder das Backend handelt die Logik der Zonen, die man ja mitgeben kann.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 08.03.2017, 13:23:24
Ich habe mich mit dem Thema PlayStore noch nicht beschäftigt und weiß nicht, wieviel Aufwand dahinter steckt. Vlt. kannst du das was zu sagen...
Mit der deklarativen Angabe der Zone meine ich, dass man in meiner Konfiguration die Zone(n) angeben kann/muss, für die Konfiguration gilt.
Schöner wäre es natürlich, eine Liste der existierenden Zonen von deiner App zu haben. Könntest du die nicht über einen ContentProvider bereitstellen?
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 08.03.2017, 13:59:03
Zitat
Ich habe mich mit dem Thema PlayStore noch nicht beschäftigt und weiß nicht, wieviel Aufwand dahinter steckt. Vlt. kannst du das was zu sagen...
Man muss sich dazu registrieren und zahlt einmalig 25 Dollar, meine ich, und kann dann über einer Seite die Apps hochladen, die dann jedem zur Verfügung stehen. Ist eigentlich einfach: https://support.google.com/googleplay/android-developer/answer/6112435?hl=de (https://support.google.com/googleplay/android-developer/answer/6112435?hl=de)

Zitat
Mit der deklarativen Angabe der Zone meine ich, dass man in meiner Konfiguration die Zone(n) angeben kann/muss, für die Konfiguration gilt.
Hatte ich aus so verstanden.

Zitat
Schöner wäre es natürlich, eine Liste der existierenden Zonen von deiner App zu haben. Könntest du die nicht über einen ContentProvider bereitstellen?
Ich werde es versuchen.

Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 08.03.2017, 20:25:08
Habe eine Lösung ohne ContentProvider. Also mit Aufruf einer Activity:

        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
        intent.setComponent(new ComponentName("de.egi.geofence.geozone", "de.egi.geofence.geozone.plugins.Zones"));
        startActivityForResult(intent, 4730);

und dann:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case 4730:
                if (resultCode == RESULT_OK) {
                    ArrayList<String> mCurrentGeofenceNames = data.getExtras().getStringArrayList("allZoneNames");
                    // more to do
                    for (String zone : mCurrentGeofenceNames){
                        Log.i("HttpPlugin", zone);
                    }
                }
                break;
            default:
                break;
        }
    }

Problem ist, dass einer EgiGeoZone aufrufen möchte und ein anderer EgiGeoZoneBT. Somit muss man hier differenzieren:
new ComponentName("de.egi.geofence.geozone", "de.egi.geofence.geozone.Zones")Wie sollen wir das lösen?

Mit ContentProvider sollte sich ein ähnliches Problem ergeben.

Geht erst nach einem Update von EgiGeoZone!
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 08.03.2017, 21:42:27
Habe EgiGeoZone updaten müssen und die Zonenabfrage gleich mit eingebaut. Ist schon im
Play Store.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 09.03.2017, 08:11:00
Sehr schön, das werde ich mir mal anschauen, wenn das Update bei mir angekommen ist. Wie lange dauert so etwas in der Regel? Bekomme ich das Update auch für EgiGeoZoneBT?
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 09.03.2017, 08:58:54
Zitat
Wie lange dauert so etwas in der Regel?
Maximal eine Stunde und jenachdem wann dein System diese abfrägt.

Zitat
Bekomme ich das Update auch für EgiGeoZoneBT?
Da habe ich es noch nicht eingebaut. Kann ich aber am Abend tun, wenn wir uns entscheiden, wie wir es machen wollen.

Das Problem besteht aber immer noch. Die Plugins müssen wissen, mit welchem der EgiGeoZone(BT) sie es zu tun haben wollen!
Die Unterscheidung wäre dann:
Im Plugin für EgiGeoZone: intent.setComponent(new ComponentName("de.egi.geofence.geozone", "de.egi.geofence.geozone.plugins.Zones"));Im Plugin für EgiGeoZoneBT: intent.setComponent(new ComponentName("de.egi.geofence.geozone.bt", "de.egi.geofence.geozone.plugins.bt.Zones"));
Ich habe es mit ContentProvider ausprobiert und da besteht das gleiche Problem. Die Provider müssen unterschiedliche Namen haben und diese müssen in den Plugins dann entsprechend angegeben werden.
Im Plugin für EgiGeoZone: private static final Uri CONTENT_URI = Uri.parse("content://de.egi.geofence.geozone.zonesContentProvider/zoneNames");Im Plugin für EgiGeoZoneBT: private static final Uri CONTENT_URI = Uri.parse("content://de.egi.geofence.geozone.bt.zonesContentProvider/zoneNames");
Aufrufbeispiel:
Zitat
    private static final Uri CONTENT_URI = Uri.parse("content://de.egi.geofence.geozone.zonesContentProvider/zoneNames");
    private static final String CN_NAME = "name";
....
        // Returns the zone names. You may not select other fields or make changes on them
        ContentResolver cr = this.getContentResolver();
        Cursor cursor = cr.query(CONTENT_URI, null, null, null, null);

        if (cursor.moveToFirst()) {
            do{
                Toast.makeText(this, cursor.getString(cursor.getColumnIndex(CN_NAME)), Toast.LENGTH_SHORT).show();
            } while (cursor.moveToNext());
        }



Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 09.03.2017, 09:14:30
Ist das wirklich ein Problem? Ist nicht angedacht, die beiden Varianten von EgiGeoZone auf kurz oder lang zusammenzuführen? Die Doppelpflege ist doch auf Dauer auch nicht wirklich schön/machbar.
Ich würde mich zuerst einmal auf die nicht BT-Variante stürzen.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 09.03.2017, 09:46:05
Die Apps werden zweigleisig angeboten, da die ohne BT etwas schlanker und weniger Akku verbraucht. Man kann in der BT nicht ganz einen Teil des Beaconscannings abschalten. Ist so in der verwendeten API implementiert. Schon blöd.
Oder man lässt nur eine Variante zur Installation zu.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 09.03.2017, 12:05:54
Das Plugin könnte eine Auswahl zwischen EgiGeoZone und EgiGeoZoneBT anbieten. Oder beide?
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 09.03.2017, 13:49:54
Also m.E. wären beide Varianten möglich. Es macht doch nicht wirklich Sinn beide Varianten der App auf dem Smartphone zu haben, oder?
Eine Auswahl im Plugin wäre aber sicher auch denkbar. Allerdings müsste das dann jedes Plugin machen.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 09.03.2017, 15:26:44
Zitat
Es macht doch nicht wirklich Sinn beide Varianten der App auf dem Smartphone zu haben, oder?
Stimmt, aber ich kenne die User aus Erfahrung :-)
Somit werde ich zwei Varianten bereitstellen.
Ich schlage die Variante mit ContentProvider vor. Was sagst du dazu?
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 09.03.2017, 16:52:59
Wie gesagt, ich habe noch nicht wirklich viel Erfahrung mit Android-Programmierung, da müssten andere bewerten, was da Sinn macht. Ich habe bloß mal kurz Google gefragt und das schien für mich am passendsten. Ich hoffe, ich komme morgen mal dazu, die Sachen zu implementieren, die ich mir vorgenommen habe.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 10.03.2017, 16:34:31
Habe heute EgiGeoZoneBT extra für dich upgedatet und in den Store gestellt :-)
Dabei habe ich nur mehr die ContentProvider-Variante implementiert.

Bin ab morgen eine Woche nicht zu Hause und kann dann nicht besonders viel nachschauen und helfen.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 16.03.2017, 20:18:08
Hallo,

ich habe das Plugin nochmal grundlegend überarbeitet.
Es können nun mehrere Profile angelegt, die für bestimmte Zonen aktiv geschalten werden können.
Die Zonen werden aus beiden Apps geholt und im Profil zur Auswahl angezeigt.

Der Code liegt immer noch auf GitHub. Ich arbeite daran, mit jedem Commit ein Release anlegen zu können, dass man auch direkt installieren kann. PlayStore kommt eventuell noch.
@Egmont: Ich wollte aber nicht unbedingt meine Kreditkarte bei Google hinterlegen. Gibt es da eine Alternative dazu?

Ich freue mich über Feedback.

Gruß,
Sebastian
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 16.03.2017, 20:45:11
Zitat
Es können nun mehrere Profile angelegt, die für bestimmte Zonen aktiv geschalten werden können.
Die Zonen werden aus beiden Apps geholt und im Profil zur Auswahl angezeigt.

Cool!
Zitat
Der Code liegt immer noch auf GitHub.
Der Code kann da liegen bleibenn und du kannst trotzdem auf Google veröffentlichen.

Zitat
@Egmont: Ich wollte aber nicht unbedingt meine Kreditkarte bei Google hinterlegen. Gibt es da eine Alternative dazu?
Weiss ich leider auch nicht.

Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 23.03.2017, 18:29:27
Guten Abend,

ich habe noch ein Problem festgesttellt: Nach einer gewissen Zeit sendet das Plugin keine Requests mehr. Erst, wenn ich die App wieder öffne, dann funktioniert es wieder. Es scheint so, also der BroadcastReceiver sich nach einer gewissen Zeit beendet bzw. abstürzt. Energie sparen ist für diese App auch schon ausgeschaltet.
Hast du da eine Idee, was da das Problem sein könnte bzw. wie man ihm auf die Schliche kommen kann?

Gruß,
Sebastian.
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 23.03.2017, 19:09:25
Hallo Sebastian,

kann es sein, dass es dein Plugin ist, welches sich verabschiedet?
Du solltest dieses auch aus der Akkuoptimierung entfernen. Auch aus dem SmartManager von Samsung.
Und die Rechte auch richtig abfragen/vergeben.

Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: seb1985 am 23.03.2017, 20:04:25
Ja, es ist sicher mein Plugin. Deine App funktioniert einwandfrei und erkennt das Betreten/Verlassen der Zonen. Akkuoptimierung ist für meine App schon ausgeschaltet...
Titel: Re: Server-Profile: PUT oder POST anstatt GET
Beitrag von: Admin am 23.03.2017, 21:30:46
Also wenn die Akku-Optimierung aus ist und alle Permissions der App gesetzt sind, dann kann es nur am Programm liegen.

Ich rufe immer im WakefulBroadcastReceiver einen Service mit startWakefulService auf und erledige dort die Arbeit, da die Receiver kurzlebig sind und sich eventuell vorzeitig beenden. Wie im ExmaplePlugin von mir.
Mach mal sofort nach der Methode onReceive() m Receiver eine Logausgabe, um zusehen, ob er aufgerufen wird.

Was anderes fällt mir nicht ein.