Homegear-RPC und Java

Hallo vctender1,

mal ne Frage am Rande. Hab gelesen das Du auch mit Java auf Homegear RPC zugreifst.
Benutzt Du JsonRpc oder XmlRpc? Welche Java API benutzt Du dabei?

Habe ein ähnliches Problem mit Spring und Jsonrpc4j.

Gruss
Guido

Ich benutze den XmlRpcClient von org.apache , aber das hat mit meinem Problem eigentlich nichts zu tun. Ich nutze die Kombination schon seit vielen Monaten. Die Probleme traten aber erst mit dem OrangePi auf (oder es liegt am Homegear Nightly).

Leider trat der Fehler noch nicht wieder auf, kommt offenbar doch sporadisch. Ein Thread Dump wird sicherlich etwas Aufklärung geben.

OFFTOPIC:

Bei der Apache XmlRpc Api. Wie hast die die Methode system.listMethods implementiert.
Bei mir klappt das irgendwie nicht.

class SystemHandler {
		public List<String> listMethods() {
			return rpcMethodList;
		}
	}

PropertyHandlerMapping phm = new PropertyHandlerMapping();
		phm.addHandler("system", SystemHandler.class);
		phm.addHandler(EventHandler.class.getName(), EventHandler.class);
		phm.addHandler(ErrorHandler.class.getName(), ErrorHandler.class);

Irgendeinen Tip?

Leider sieht man nicht, wie deine Variable (return-Wert) definiert ist. Es müssen die Methoden sein, die Homegear aufrufen möchte. Das sieht bei mir so aus:

public String[] listMethods() {
	String[] reply = new String[6];
	reply[0] = "newEvent";
	reply[1] = "updateEvent";
	reply[2] = "deleteEvent";
	reply[3] = "event";
	reply[4] = "system.listMethods";
	reply[5] = "system.multicall";
	return reply;
}

public String[] listMethods(String interfaceId) {
	return listMethods();
}

Über Multicall kommen letztlich auch wieder Events.
Die Registrierung erfolgt via:

CustomHandlerMapping phm = new CustomHandlerMapping();
phm.setVoidMethodEnabled(true);
phm.addHandler("system", RpcSystemHandler.class);
phm.addHandler("anonymous", RpcRequestHandler.class);

server.getXmlRpcServer().setHandlerMapping(phm);
server.setParanoid(false);

Die Klasse RpcRequestHandler ist dann quasi die Klasse mit der Implementierung für die externen Aufrufe:

public void event(String interfaceID, int peerID, int channel, String parameterName, Long value) {
  ...
}

public void event(String interfaceID, int peerID, int channel, String parameterName, Double value) {
  ...
}

usw.

Welche Methode aufgerufen wird, hängt dann vom Übergabewert ab. Zustände sind in der Regel Boolean, Feuchtigkeit / Temperatur dann numerisch, usw.

Hast du die Klasse selber implementiert?

Ansonsten sieht es bei mir ja fast gleich aus.
Welche XmlRpc Version benutzt du? Ich habe Version 3.1.3

Und die server.setParanoid Methode gibt es bei mir nicht.

Das ist die Return Liste von system.listMethods

    private static List<String> rpcMethodList = new ArrayList<String>();
    	static {
    		rpcMethodList.add("system.listMethods");
    		rpcMethodList.add("event");
    		rpcMethodList.add("error");
    		// rpcMethodList.add("listDevices");
    		// rpcMethodList.add("newDevices");
    	}
class SystemHandler {
		public List<String> listMethods() {
			return rpcMethodList;
		}
	}

Ja die Klasse stammt von mir, ich weiß ehrlich gesagt nicht mehr, wozu die notwendig war. Offenbar ist die Klasse aber fürs Mapping auf den Handler relevant:

public class CustomHandlerMapping extends PropertyHandlerMapping {
    public final String ANONYMOUS_HANDLER = "anonymous";
	
	@Override
	public XmlRpcHandler getHandler(String pHandlerName) throws XmlRpcNoSuchHandlerException, XmlRpcException {
		if (pHandlerName.indexOf(".") < 0) {
			pHandlerName = ANONYMOUS_HANDLER+"."+pHandlerName;
		}
		
		return super.getHandler(pHandlerName);
	}

}

Hier die Maven Dependency für die Version, ich habe auch die 3.1.3:

<dependency>
	<groupId>org.apache.xmlrpc</groupId>
	<artifactId>xmlrpc-client</artifactId>
	<version>3.1.3</version>
</dependency>
<dependency>
	<groupId>org.apache.xmlrpc</groupId>
	<artifactId>xmlrpc-server</artifactId>
	<version>3.1.3</version>
</dependency>