Hallo,
um meine alte REST Schnittstelle abzulösen, bin ich gerade dabei, eine Android-Implementierung gegen das Websocket-IF zu schreiben.
Zur Vorwarnung: der Code der gleich kommt ist nur ein roher Proof of Concept, keine Anleitung, keine Referenzimplementierung oder gar eine "Pre Alpha". Wenn es einen Buchstaben vor dem Alpha gäbe, wäre es vielleicht das
Aktueller Stand: Die Klasse SmartHomeNGConnector die die Websocket-Verbindung handelt und Items aufnimmt, die dann geupdated (gemonitored) werden. Das geht soweit schon auch... Der Weg bis zur GUI fehlt aber noch, hier könnte ich Rat gebrauchen.
In meiner Application Klasse starte ich das Ding mit
In der Activity selber mache ich nur noch im onCreate bspw. ein:
Problem ist jetzt, wie ich dynamisch die GUI in der Activity am besten updaten kann. Früher hatte ich irgendwie alles auf IntentServices usw gebaut, hatte aber auch kein live Update.. Vielleicht gibt es ja Android-versierte Mitstreiter hier..
Anbei noch die Klasse für die Websocket-Verbindung:
um meine alte REST Schnittstelle abzulösen, bin ich gerade dabei, eine Android-Implementierung gegen das Websocket-IF zu schreiben.
Zur Vorwarnung: der Code der gleich kommt ist nur ein roher Proof of Concept, keine Anleitung, keine Referenzimplementierung oder gar eine "Pre Alpha". Wenn es einen Buchstaben vor dem Alpha gäbe, wäre es vielleicht das

Aktueller Stand: Die Klasse SmartHomeNGConnector die die Websocket-Verbindung handelt und Items aufnimmt, die dann geupdated (gemonitored) werden. Das geht soweit schon auch... Der Weg bis zur GUI fehlt aber noch, hier könnte ich Rat gebrauchen.
In meiner Application Klasse starte ich das Ding mit
Code:
this.smartHomeNGConnector = new SmartHomeNGConnector("ws://"+hostIdentifier+":2424/");
Code:
app = (HomeMonitorApplication) getApplication(); [...] waterPump = new Item("outside.pump"); garageGate = new Item("outside.gate.garage"); officeLight = new Item("office.light"); app.getSmartHomeNGConnector().addMonitoredItem(waterPump); app.getSmartHomeNGConnector().addMonitoredItem(garageGate); app.getSmartHomeNGConnector().addMonitoredItem(officeLight); app.getSmartHomeNGConnector().monitor();
Anbei noch die Klasse für die Websocket-Verbindung:
Code:
package xxx.xxx.xxx.services; import android.app.IntentService; import android.app.Service; import android.util.Log; import org.java_websocket.client.WebSocketClient; import org.java_websocket.drafts.Draft_17; import org.java_websocket.handshake.ServerHandshake; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import xxx.xxx.xxx.data.Item; public class SmartHomeNGConnector { private WebSocketClient mWebSocketClient; List<Item> monitoredItems; private URI uri; public SmartHomeNGConnector(String uri) { try { this.uri = new URI(uri); } catch (URISyntaxException e) { e.printStackTrace(); return; } this.clearMonitoredItems(); this.connectWebSocket(); } public void connectWebSocket() { this.mWebSocketClient = new WebSocketClient(this.getUri(), new Draft_17()) { @Override public void onOpen(ServerHandshake serverHandshake) { Log.i("WebSocket", "Opened"); } @Override public void onMessage(String s) { final String message = s; Log.i("WebSocket", "SmartHomeNGConnector receiving data: "+s); try { JSONObject jObject = new JSONObject(s); // json String cmd = jObject.getString("cmd"); Log.i("WebSocket", "CMD: "+cmd); if (cmd.equals("item") && jObject.has("items")) { JSONArray items = jObject.getJSONArray("items"); // get data object for (int i = 0; i < items.length(); i++) { JSONArray item = items.getJSONArray(i); if (item.length() == 2) { String itemPath = item.getString(0); String value = item.getString(1); findMonitoredItem(itemPath).setValue(value); Log.i("WebSocket", "Item set: "+itemPath + " " + value); } } } } catch (JSONException e) { e.printStackTrace(); } } @Override public void onClose(int i, String s, boolean b) { Log.i("WebSocket", "Closed " + s); } @Override public void onError(Exception e) { Log.i("WebSocket", "Error " + e.getMessage()); } }; this.mWebSocketClient.connect(); } public void monitor() { if (this.monitoredItems.size() > 0) { String listString = ""; for (int i = 0; i < this.monitoredItems.size(); i++) { listString += this.monitoredItems.get(i).getItemPath(); if (i < this.monitoredItems.size()-1) { listString += ","; } Log.i("WebSocket", this.monitoredItems.get(i).getItemPath()); } // items Log.i("WebSocket", "SmartHomeNGConnector sending data: "+"{\"cmd\":\"monitor\", \"items\": \""+listString+"\"}"); this.mWebSocketClient.send("{\"cmd\":\"monitor\", \"items\": \""+listString+"\"}"); Log.i("WebSocket", "SmartHomeNGConnector data sent!"); } } /** * Does a write-request to an itempath with a value */ public void write(String itempath, String value) { Log.i("WebSocket", "SmartHomeNGConnector sending data: "+"{\"cmd\":\"item\" , \"id\":\"" + itempath + "\" , \"val\":" + value + "}"); this.mWebSocketClient.send("{\"cmd\":\"item\" , \"id\":\"" + itempath + "\" , \"val\":" + value + "}"); Log.i("WebSocket", "SmartHomeNGConnector data sent!"); } /** * Does a write-request to an itempath with a value */ public void write(String itempath, int value) { Log.i("WebSocket", "SmartHomeNGConnector sending data: "+"{\"cmd\":\"item\" , \"id\":\"" + itempath + "\" , \"val\":" + value + "}"); this.mWebSocketClient.send("{\"cmd\":\"item\" , \"id\":\"" + itempath + "\" , \"val\":" + value + "}"); Log.i("WebSocket", "SmartHomeNGConnector data sent!"); } /** * Triggers a logic */ public void trigger(String name, String value) { this.mWebSocketClient.send("{\"cmd\":\"item\" , \"'name'\":\"" + name + "\" , \"val\":" + value + "}"); } /** * Triggers a logic */ public void trigger(String name, int value) { this.mWebSocketClient.send("{\"cmd\":\"item\" , \"'name'\":\"" + name + "\" , \"val\":" + value + "}"); } public URI getUri() { return this.uri; } public List<Item> getMonitoredItems() { return this.monitoredItems; } public void clearMonitoredItems() { this.monitoredItems = new ArrayList<Item>(); } public Item findMonitoredItem(String itemPath) { for (int i = 0; i < this.monitoredItems.size(); i++) { if (this.monitoredItems.get(i).getItemPath().equals(itemPath)) { return this.monitoredItems.get(i); } } return null; } public void addMonitoredItem(Item item) { if (this.findMonitoredItem(item.getItemPath())==null) { this.monitoredItems.add(item); } } }