CUxD <-> BIN-RPC <-> Methode "event"

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

Benutzeravatar
uwe111
Beiträge: 4820
Registriert: 26.02.2011, 22:22
Hat sich bedankt: 3 Mal
Danksagung erhalten: 246 Mal
Kontaktdaten:

Re: CUxD <-> BIN-RPC <-> Methode "event"

Beitrag von uwe111 » 26.04.2013, 08:38

thue hat geschrieben: Einige Dinge sind in der aktuellen Implementierung etwas merkwürdig, z.B. das listDevices; da stimmt etwas in der Auflistung nicht. Ich müsste aber jetzt erst einmal alle Methoden meines homematic-Treibers durchtesten, um einen kompletten Überblick zu erhalten.
Ja, bitte tue das. Wenn Du mir dann eine Zusammenfassung mit den Unstimmigkeiten geben könntest, wäre es schön.

Viele Grüße,

Uwe.
Alle sagten: Das geht nicht. Dann kam einer, der wußte das nicht und hat's einfach gemacht.
SPENDEN :wink: Download: CUxD 2.11, SSH KeyDir

ayngush
Beiträge: 345
Registriert: 02.02.2012, 12:05
Danksagung erhalten: 7 Mal

Re: CUxD <-> BIN-RPC <-> Methode "event"

Beitrag von ayngush » 29.04.2013, 15:51

Erste Gehversuche erfolgreich...

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

const double mantisseFaktor = (1 << 30);

void detectType(int Type);
void getInt(unsigned char *Buffer);
void getBool(unsigned char *Buffer);
void getString(unsigned char *Buffer);
void getDouble(unsigned char *Buffer);
void getArray(unsigned char *Buffer);
void getStruct(unsigned char *Buffer);

unsigned char buffer[] = {0X42,0X69,0X6e,0X00,0X00,0X00,0X00,0Xf8,0X00,0X00,0X00,0X10,0X73,0X79,0X73,0X74,0X65,0X6d,0X2e,0X6d,0X75,0X6c,0X74,0X69,0X63,0X61,0X6c,0X6c,0X00,0X00,0X00,0X01,0X00,0X00,0X01, 0X00,0X00,0X00,0X00,0X02,0X00,0X00,0X01,0X01,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X0a,0X6d,0X65,0X74,0X68,0X6f,0X64,0X4e,0X61,0X6d,0X65,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X05, 0X65,0X76,0X65,0X6e,0X74,0X00,0X00,0X00,0X06,0X70,0X61,0X72,0X61,0X6d,0X73,0X00,0X00,0X01,0X00,0X00,0X00,0X00,0X04,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X04,0X43,0X55,0X78,0X44, 0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X0c,0X43,0X55,0X58,0X32,0X38,0X30,0X31,0X30,0X30,0X31,0X3a,0X31,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X08,0X43,0X4d,0X44,0X5f,0X52,0X55,0X4e, 0X4c,0X00,0X00,0X00,0X02,0X01,0X00,0X00,0X01,0X01,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X0a,0X6d,0X65,0X74,0X68,0X6f,0X64,0X4e,0X61,0X6d,0X65,0X00,0X00,0X00,0X03,0X00,0X00,0X00, 0X05,0X65,0X76,0X65,0X6e,0X74,0X00,0X00,0X00,0X06,0X70,0X61,0X72,0X61,0X6d,0X73,0X00,0X00,0X01,0X00,0X00,0X00,0X00,0X04,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X04,0X43,0X55,0X78, 0X44,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X0c,0X43,0X55,0X58,0X32,0X38,0X30,0X31,0X30,0X30,0X31,0X3a,0X31,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X08,0X43,0X4d,0X44,0X5f,0X52,0X45, 0X54,0X4c,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X01,0X30};
unsigned int BufferPosition = 0;
unsigned int byteShift = 4;
unsigned char byte4[4];
int ebene = 0;

int main(int argc, char *argv[]) {
	int dataLength = 0;
	int dataType = 0;	
	int dataCount = 0;
	int msgType = 0;
	int msgLength = 0;
	char *msgString;
	int i;
	
	// Header Auslesen
	byteShift = 4;
	memcpy(byte4, &buffer[BufferPosition], byteShift);
	BufferPosition = BufferPosition + byteShift;
	dataType = 0 + byte4[3];
	printf("Art: %s\n", (dataType==1)?"Response":"Request");
	
	// Datenlänge ermitteln
	byteShift = 4;
	memcpy(byte4, &buffer[BufferPosition], byteShift);
	BufferPosition = BufferPosition + byteShift;
	dataLength = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
	printf("Datenlaenge: %d Byte\n", dataLength);
	
	switch(dataType) {
		
		// Request
		case 0:
			byteShift = 4;
			memcpy(byte4, &buffer[BufferPosition], byteShift);
			BufferPosition = BufferPosition + byteShift;
			msgLength = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
			
			msgString = (char *) malloc((msgLength+1)*sizeof(char));
			
			byteShift = msgLength;
			memcpy(msgString, &buffer[BufferPosition], byteShift);
			BufferPosition = BufferPosition + byteShift;
			msgString[byteShift] = '\0';
			printf("Request Method: %s (%d Bytes)\n", msgString, msgLength);
			
			byteShift = 4;
			memcpy(byte4, &buffer[BufferPosition], byteShift);
			BufferPosition = BufferPosition + byteShift;
			dataCount = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
			
			for(i = 1; i <= dataCount; i++) {
				byteShift = 4;
				memcpy(byte4, &buffer[BufferPosition], byteShift);
				BufferPosition = BufferPosition + byteShift;
				dataType = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
				printf("Element %d(%d): \n",i,dataCount);
				detectType(dataType);
			}
		break;
	}
	free(msgString);
	return 0;
}

void detectType(int Type) {
	switch (Type) {
		case 1:
			return getInt(buffer);
		break;
		
		case 2:
			return getBool(buffer);
		break;
		
		case 3:
			return getString(buffer);
		break;
		
		case 4:
			return getDouble(buffer);
		break;
		
		case 256:
			return getArray(buffer);
		break;
		
		case 257:
			return getStruct(buffer);
		break;
	}
}
void getInt(unsigned char *Buffer) {
	int data;
	int j;
	
	byteShift = 4;
	memcpy(byte4, &Buffer[BufferPosition], byteShift);
	BufferPosition = BufferPosition + byteShift;
	data = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
	
	for(j=1;j<=ebene;j++) printf("  ");
	printf("Int value: %d\n",data);
}
void getBool(unsigned char *Buffer) {
	int data;
	int j;
	
	byteShift = 1;
	memcpy(byte4, &Buffer[BufferPosition], byteShift);
	BufferPosition = BufferPosition + byteShift;
	data = 0 + byte4[0];
	
	for(j=1;j<=ebene;j++) printf("  ");
	printf("Bool value: %d\n",data);
}
void getString(unsigned char *Buffer) {
	int stringLength;
	char *data;
	int j;
	
	byteShift = 4;
	memcpy(byte4, &Buffer[BufferPosition], byteShift);
	BufferPosition = BufferPosition + byteShift;
	stringLength = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
	
	data = (char *) malloc((stringLength+1)*sizeof(char));
	
	byteShift = stringLength;
	memcpy(data, &Buffer[BufferPosition], byteShift);
	BufferPosition = BufferPosition + byteShift;
	data[stringLength] = '\0';
	
	for(j=1;j<=ebene;j++) printf("  ");
	printf("String value: %s (%d Bytes)\n",data,stringLength);
	free(data);
}
void getDouble(unsigned char *Buffer) {
	unsigned int Exponent, MantisseInt;
	double data, Mantisse;
	int j;
	
	byteShift = 4;
	memcpy(byte4, &Buffer[BufferPosition], byteShift);
	BufferPosition = BufferPosition + byteShift;
	MantisseInt = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
	
	memcpy(byte4, &Buffer[BufferPosition], byteShift);
	BufferPosition = BufferPosition + byteShift;
	Exponent = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
	
	Mantisse = MantisseInt / mantisseFaktor;	
	data = ldexp(Mantisse, Exponent);
	
	for(j=1;j<=ebene;j++) printf("  ");
	printf("Double value: %d\n",data);
}
void getArray(unsigned char *Buffer) {
	int arrayCount;
	int dataType; 
	int i, j;
	
	byteShift = 4;
	memcpy(byte4, &Buffer[BufferPosition], byteShift);
	BufferPosition = BufferPosition + byteShift;
	arrayCount = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
	
	ebene = ebene + 1;
	
	for(i=1; i<=arrayCount; i++) {
		byteShift = 4;
		memcpy(byte4, &Buffer[BufferPosition], byteShift);
		BufferPosition = BufferPosition + byteShift;
		dataType = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
		
		for(j=1;j<=ebene;j++) printf("  ");
		printf("Array value %d(%d): \n",i,arrayCount);
		ebene = ebene + 1;
		detectType(dataType);
		ebene = ebene - 1;
	}
	ebene = ebene - 1;
}
void getStruct(unsigned char *Buffer) {
	int structCount;
	int stringLength;
	int dataType;
	char *data;
	int i, j;
	
	byteShift = 4;
	memcpy(byte4, &Buffer[BufferPosition], byteShift);
	BufferPosition = BufferPosition + byteShift;
	structCount = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
	
	ebene = ebene + 1;
	
	for(i=1; i<=structCount; i++) {
		byteShift = 4;
		memcpy(byte4, &Buffer[BufferPosition], byteShift);
		BufferPosition = BufferPosition + byteShift;
		stringLength = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
		
		data = (char *) malloc((stringLength+1)*sizeof(char));
		
		byteShift = stringLength;
		memcpy(data, &Buffer[BufferPosition], byteShift);
		BufferPosition = BufferPosition + byteShift;
		data[stringLength] = '\0';
		
		byteShift = 4;
		memcpy(byte4, &Buffer[BufferPosition], byteShift);
		BufferPosition = BufferPosition + byteShift;
		dataType = (byte4[0] << 24) + (byte4[1] << 16) + (byte4[2] << 8) + byte4[3];
		
		for(j=1;j<=ebene;j++) printf("  ");
		printf("Struct member %d(%d) (%s): \n",i,structCount,data);
		free(data);
		
		ebene = ebene + 1;
		detectType(dataType);
		ebene = ebene - 1;
	}
	ebene = ebene - 1;
}
Baue dann nach diesen Erkenntnissen am Client / Server / XML-Parser Geraffel.
Falls das am Ende tatsächlich alles laufen sollte...

Wenn da jemand Verbesserungen findet, ich meine, das Teil macht ja nichts außer die Daten logisch zu durchlaufen und ein wenig stdout vollzuschreiben... immer her damit, ich bin definitiv kein C-Entwickler ;)

Grüße

Antworten

Zurück zu „CUxD“