Jump to content

Programme im RED ohne BrickV / Rechner starten


mts75

Recommended Posts

Wie starte ich ein Java-Programm auf dem RED, wenn ich keinen Rechner mit BrickV am Laufen habe habe?

Gibt's da ne technische Möglichkeit? Ein standardisierter URL-Aufruf wäre z.B. nicht schlecht. Oder geht nur, per SSH zu verbinden und das irgendwie als Befehl abzusenden?

 

(Ich würde das entweder auf dem Handy, lieber aber über IP-Symcon/Homematic über Hausautomation scripten wollen. Dann würde ein Klick auf eine Fernbedienung reichen, weil das ja alles ständig in der Nähe verfügbar ist.)

 

Link zu diesem Kommentar
Share on other sites

Normalerweise deploye ich mein Programm mittels des BrickV einmalig und setze den Scheduler entsprechend um die Ausführung immer, im Interval oder Cron Job autom. zu starten.

http://www.tinkerforge.com/de/doc/Hardware/Bricks/RED_Brick_Program_Tab.html#red-brick-program-tab

 

Wenn das Programm manuell oder bei Bedarf gestartet werden soll bietet sich z.B. die RED-API an:http://www.tinkerforge.com/de/doc/Software/Bricks/RED_Brick_Java.html#BrickRED::startProgram__i und http://www.tinkerunity.org/forum/index.php/topic,2827.msg17982.html#msg17982

Link zu diesem Kommentar
Share on other sites

So, habe mich mal durchgekämpft und das in Java versucht. Funktionieren tuts aber die Api ist so m.E. noch nicht wirklich Endanwenderfreundlich.

Vielleicht kann man ja noch mal was komfortableres vor die eigentliche RED-API hängen mit High-Level Funktionen wie "sendFile" "getFile" "startProgram" etc. Jeden String so blockweise abzuholen und an diverse Resourcenfreigaben denken zu müssen sollte vor den Nutzern am besten versteckt werden.

 

Vielleicht kann ein Wissender von Euch Profis das mal qualitätssichern und als temporäre Musterlösung in die Java-Doku zum RED stellen ... dann haben es bestimmt auch die C#-Leute einfacher.

 

Ich werden mir zum Programme starten aber vermutlich einen Launcher mit Joystick- und Display-Bricklet schreiben, dann kann man Programme schön direkt wählen und diesen Launcher immer mit dem RED starten und dauerhaft laufen lassen. Wie ich die eigentlichen Programme von Java aus starte, weiß ich ja jetzt in etwa ...  :)

 

import com.tinkerforge.*;

import java.util.HashMap;

/**
* Demonstrates, how to start a Program on RED Brick by name.
* Created by Markus Arndt, 01.06.2017
*/
public class StartProgram {

private final static HashMap<Integer, String> ERROR_CODES = new HashMap<Integer, String>();

static {
	ERROR_CODES.put(0, "Success");
	ERROR_CODES.put(1, "UnknownError");
	ERROR_CODES.put(2, "InvalidOperation");
	ERROR_CODES.put(3, "OperationAborted");
	ERROR_CODES.put(4, "InternalError");
	ERROR_CODES.put(5, "UnknownSessionID");
	ERROR_CODES.put(6, "NoFreeSessionID");
	ERROR_CODES.put(7, "UnknownObjectID");
	ERROR_CODES.put(8, "NoFreeObjectID");
	ERROR_CODES.put(9, "ObjectIsLocked");
	ERROR_CODES.put(10, "NoMoreData");
	ERROR_CODES.put(11, "WrongListItemType");
	ERROR_CODES.put(12, "ProgramIsPurged");
	ERROR_CODES.put(128, "InvalidParameter");
	ERROR_CODES.put(129, "NoFreeMemory");
	ERROR_CODES.put(130, "NoFreeSpace");
	ERROR_CODES.put(131, "AccessDenied");
	ERROR_CODES.put(131, "AlreadyExists");
	ERROR_CODES.put(133, "DoesNotExist");
	ERROR_CODES.put(134, "Interrupted");
	ERROR_CODES.put(135, "IsDirectory=");
	ERROR_CODES.put(136, "NotADirectory");
	ERROR_CODES.put(137, "WouldBlock");
	ERROR_CODES.put(138, "Overflow");
	ERROR_CODES.put(139, "BadFileDescriptor");
	ERROR_CODES.put(140, "OutOfRange");
	ERROR_CODES.put(141, "NameTooLong");
	ERROR_CODES.put(142, "InvalidSeek");
	ERROR_CODES.put(143, "NotSupported");
	ERROR_CODES.put(144, "TooManyOpenFiles");
}

private final static String HOST = "192.168.178.33"; // Change to IP width BrickDeamon 
private final static int PORT = 4223;
private final static String UID_RED = "2SBmHu";      // Change to UID from RED-Brick
private final static String PROGRAM_NAME = "Robi";   // Change to Name from Program to start

public static void main(String[] args) throws Exception {
	IPConnection ipConnection = new IPConnection();
	BrickRED red = new BrickRED(UID_RED, ipConnection);

	ipConnection.connect(HOST, PORT);
	boolean started = startProgram(ipConnection, red, PROGRAM_NAME);
	ipConnection.disconnect();

	if(! started)
		System.out.printf("Program " + PROGRAM_NAME + " could not be found/started.");
}

public static boolean startProgram(IPConnection ipConnection, BrickRED brickRED, String programName) throws TimeoutException, NotConnectedException {
	BrickRED.CreateSession session = brickRED.createSession(10);
	checkError(session.errorCode);
	BrickRED.Programs listPrograms = brickRED.getPrograms(session.sessionId);
	checkError(listPrograms.errorCode);
	BrickRED.ListLength listProgramsSize = brickRED.getListLength(listPrograms.programsListId);
	checkError(listProgramsSize.errorCode);

	// Iterate over Program-List from RED Brick
	boolean startet = false;
	for(int i = 0; i < listProgramsSize.length; i++) {
		BrickRED.ListItem currentProgram = brickRED.getListItem(listPrograms.programsListId, i, session.sessionId);
		checkError(currentProgram.errorCode);
		BrickRED.ProgramIdentifier programIdentifier = brickRED.getProgramIdentifier(currentProgram.itemObjectId, session.sessionId);
		checkError(programIdentifier.errorCode);
		BrickRED.StringLength programIdentifierLength = brickRED.getStringLength(programIdentifier.identifierStringId);
		checkError(programIdentifierLength.errorCode);

		// Request all Blocks with 63-Bytes
		String currentProgramName = "";
		while (currentProgramName.length() < programIdentifierLength.length) {
			BrickRED.StringChunk stringPart = brickRED.getStringChunk(programIdentifier.identifierStringId, currentProgramName.length());
			checkError(stringPart.errorCode);
			currentProgramName += stringPart.buffer;
		}
		checkError(brickRED.releaseObject(programIdentifier.identifierStringId, session.sessionId));
		System.out.println("Found Programm: " + currentProgramName);

		// Program found?
		if(currentProgramName.equalsIgnoreCase(programName)) {
			checkError(brickRED.startProgram(currentProgram.itemObjectId));
			System.out.println("Program started: " + currentProgramName);
			startet = true;
		}
		checkError(brickRED.releaseObject(currentProgram.itemObjectId, session.sessionId));
	}

	checkError(brickRED.releaseObject(listPrograms.programsListId, session.sessionId));
	checkError(brickRED.expireSession(session.sessionId));
	return startet;
}

private static void checkError(int errorCode) {
	if(errorCode != 0)
		throw new RuntimeException("RED-Brick responsed folowing Error " + errorCode + "-" + ERROR_CODES.get(errorCode));
}
}

 

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...