mts75 Geschrieben May 31, 2015 at 00:25 Share Geschrieben May 31, 2015 at 00:25 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.) Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
Nic Geschrieben May 31, 2015 at 09:53 Share Geschrieben May 31, 2015 at 09:53 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 Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
photron Geschrieben June 1, 2015 at 08:56 Share Geschrieben June 1, 2015 at 08:56 Hier ein Beispiel wie man ein Program auf dem RED Brick über die Python API startet: http://www.tinkerforge.com/en/doc/Software/Bricks/RED_Brick_Python.html#start-program Leider ist die Dokumentation der RED Brick API noch unvollständig und es gibt bisher nur dieses eine Python Beispiel. Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
mts75 Geschrieben June 1, 2015 at 21:37 Autor Share Geschrieben June 1, 2015 at 21:37 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)); } } Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
photron Geschrieben June 2, 2015 at 08:38 Share Geschrieben June 2, 2015 at 08:38 Okay, hier das Start-Program Beispiel in Java: http://www.tinkerforge.com/de/doc/Software/Bricks/RED_Brick_Java.html#start-program Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.