Tastatursimulation zum Steuern von Linphone

Gorion

Gorion

Jungspund
Hallo Gemeinde :D,
ich sitze vor einem für mich grösseren Problem fest. Ich suche jetzt schon seit letzter Woche eine Möglichkeit, wie ich eine Tastatureingabe simulieren kann, hab auch verschiedene Ansätze schon ausprobiert aber keines will so richtig funktionieren.
Das Problem:
Linphone läuft auf einem Microcontroller unter uClinux (also linphonec) und wird per Tastatureingabe gesteuert, mit Kommandos wie "call 123" kann ich mein anderes IP-Phone zum Test anrufen.
Ich möchte jetzt diesen Befehl "call 123" ersetzen durch eine von einem Programm geschickte "Tastatursimulation".
Wenn ich hingehe und im uClinux mit mkfifo <fifodatei> eine Pipe erzeuge und linphonec mit tail -f <fifodatei> ./linphonec starte, kann ich auf einem anderen terminal Tastatureingaben über echo "call 123" > <fifodatei> an linphone schicken. Linphonec führt die Kommandos auch richtig aus.
Wenn ich aber hingehe und in einem C-Programm einen printf("call 123\n"); auf die Konsole ausgebe, führt linphonec das Kommando nicht aus.
Wie kann ich also die Eingabe über ein C-Programm machen?
Oder wie kann ich bash-shells in einem C-Programm aufrufen?
*ratlosbin*
Vielen Dank für eure Antworten
Michael
 
Mahltid,
Code:
man 3 popen
könnte helfen.
Etwas schmuddelig, aber Du kannst den Ansatz mit dem echo auf deine pipe auch gleich verwursten...

Ist nur ein bisserl Arbeit den Shellstring zu formatieren.
MfG
 
Du meinst also den Shell-String direkt erzeugen und in meine Pipe schicken. Das iss natürlich ein Ansatz.
Danke ich halt euch auf dem laufenden.
:D
 
Also ich habs jetzt auch mal probiert über system() so ein Kommando auszuführen, das klappt eigentlich recht gut, nur mein Problem ist dann folgendes:
Ich krieg im Linphone-Terminal Fenster ne Meldung
#tail: broken pipe
Ich denke, dass meine Kommandos meines C-Programms nicht oder nur teilweise von tail gelesen werden.
Weiss da jmnd weiter?
 
Moin moin,

Also ich habs jetzt auch mal probiert über system() so ein Kommando auszuführen ... Ich denke, dass meine Kommandos meines C-Programms nicht oder nur teilweise von tail gelesen werden.

ja, ungepuffert in pipes streamen macht man aber auch nicht ;)

man 3 popen schrieb:
The return value from popen() is a normal standard I/O stream ...
Writing to such a stream writes to the standard input of the command ... Conversely, reading from a "popened" stream reads the command's standard output, and the
command's standard input is the same as that of the process that called popen() ... Note that output popen() streams are fully buffered by default.

Code:
[color=red]Edit: So das sollte eigentlich gehen...[/color]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
        FILE *fp;

        if ( argc != 3 ) {
                printf("USAGE: %s [PATH] [command]\n", argv[0]);
                exit(1);
        }

        if((fp = fopen(argv[1], "w")) == NULL) {
                perror("fopen");
                exit(1);
        }

        if(! (strlen(argv[2])>255))
                fputs(argv[2], fp);
        else
                printf("\nWARNING: linebuffer exceeding limits ... QUIT\n");

        fclose(fp);
        return(0);
}

Das Ganze via:

Code:
gcc -Wall -o pipesnd ./quelltex.c

und dann mit:

Code:
#: ./pipesnd /dev/deinfifo "ls -al /"


Sry, das es so lange gedauert hat, mußte noch ein paar andere Dinge klären, und hatte erst heute morgen Zeit. *peinlich*
MfG
 
Zuletzt bearbeitet:
Danke für deine Bemühungen :D
Werd ich gleich ma ausprobieren! Kann dann nur hoffen, dass meine Crosstoolchain mit der -Wall option kklar kommt ;)
 
Die kannste weglassen, die setzt ja nur den Warning-Level hoeher.
 
Habs gemerkt. Iss eigentlich überflüssig aber der Crosscompiler schluckts :)
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Also mein Code sieht momentan so aus
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
   FILE *fp;
   printf("start...\n");
   if ( argc != 3 ) 
   {
      printf("USAGE: %s [PATH] [command]\n", argv[0]);
      exit(1);
   }
   printf("Opening file...\n");
   if((fp = fopen(argv[1], "w")) == NULL) 
   {
      printf("can't open file\n");
      printf("%s\n",argv[1]);
      perror("fopen");
      exit(1);
   }
   printf("before executing\n");
   if(! (strlen(argv[2])>255))
   {
      printf("Executing Command\t--->%s\n",argv[2]);
      fputs(argv[2], fp);
   }
   else
      printf("\nWARNING: linebuffer exceeding limits ... QUIT\n");
  
   fclose(fp);

   return 0;

}
mein Problem iss jetzt noch folgendes, ich kreig die Kommandos nicht in linphone rein, bzw linphone reagiert gar nicht drauf.
Ich definier ja meine test_fifo über
Code:
mkfifo test_fifo
Das liefert mir ja eine Named Pipe zurück.
Der Programmaufruf von linphone erfolgt so
Code:
tail -f /flash/bwwprog/test_fifo | ./linphonec -c .linphonec
Meine Vermutung ist jetzt, dass pipesnd gar nicht in meine FIFO schreibt oder dass tail die Kommandos gar nicht richtig ausliest.
Dazu noch zu sagen ist, dass ich mit
Code:
echo "command" > /flash/myprog
linphone fernsteuern kann. Was macht also dieses > was mein proggi nicht macht.
Irgendwer ne Idee?
 
Zuletzt bearbeitet:
Also ich hab die Lösung jetzt. Das Problem war, dass der fopen nicht mit der Option "w" gemacht werden kann. Ich hab die fifo-Datei jetzt mit "a" für appending geöffnet und siehe da, die Zauberei hat begonnen :)
Nochmals vielen Dank für eure Tips hat mir echt geholfen
 
Zurück
Oben