Hm. mein Edit mit der php ini kam bestimmt zu spät. Ich nutze im /tmp Verzeichnis das Tempfilesystem. Als letzte Möglichkeit könnte man da per echo was reinschreiben und ein Programm als root ausgeführt schickt das dann an die ttyAMA0
Druckbare Version
Hm. mein Edit mit der php ini kam bestimmt zu spät. Ich nutze im /tmp Verzeichnis das Tempfilesystem. Als letzte Möglichkeit könnte man da per echo was reinschreiben und ein Programm als root ausgeführt schickt das dann an die ttyAMA0
Also Shell_exec funktioniert, da ich über das Webinterface auch meine GPIOs schalten kann.
Dies funktioniert und das habe ich auch bereits getestet.
Nur der Text wird halt nicht gesendet.
Wer ist der Empfänger? Ein Terminalprogramm oder schon eon AVR. Falls AVR: hast Du ein CHR(13) angehängt?
Ich arbeite gerade an einem Internet-Radiowecker. Soweit läuft schon alles. Bin aber noch in der Testphase. Im Moment zieht er sich updates.
Da ist noch kein Webserver drauf. Wenn es der Platz zulässt, mache ich morgen mal ein Backup und teste mit lighthttp. Mir fehlt eh noch ein WebIf, um die Einstellungen komfortabel zu machen. Weckzeiten und so geht per AVR problemlos. Die Senderliste soll aber noch per php änderbar werden.
Ne erstmal ist der Empfänger nur ein Terminalprogramm.
Das Pi soll aber später über UART mit einen meiner CAN-Knoten reden und dann empfangene Daten über ein Webinterface abrufbar machen.....nur bis dahin dauert es noch ein bischen :)
Ich arbeite die Punkte lieber erstmal Schritt für Schritt ab, damit nicht gleich x Fehler auf einmal auftreten und im Moment soll einfach nur der Text vom Pi an meinen PC gesendet werden wenn ich ein Button in meinem Webinterface betätige.
lighthttp ist bei mir jetzt drauf. allerdings sendet er wie bei dir nichts. Morgen gehts weiter, muss ins Bett...
Ok :)
Dank dir schon mal für die Mühe!
So, ich habe mal in der php.ini die Fehleranzeige eingeschaltet. Da kommt dann bei meinem Senden-Programm, die Meldung, dass er /dev/ttyAMA0 nicht öffnen kann. Über echo kommt keine Fehlermeldung. Leider komm ich grad nicht weiter, da meine 2GB Karte voll ist. Ich muss erstmal das Backup von gestern zurückspielen und dann gibt es Essen. Die Probleme hatte ich alle mit dem Apache nicht...
Hey,
danke fuer die Muehe.......wie hast du dir den Fehler anzeigen lassen?
Per PHP ueber den Shell_exec Befehl oder hast du das via C Programm getestet?
Aber die Erkenntnis bestaetigt meine Theorie, dass es sich um ein Rechteproblem handelt.
Nur die Frage ist....wie stelle ich es um.
Was sagt den dein Bauchgefuehl? Hat man mit Apache weniger Probleme als mit Lighttpd?
Weil Performancetechnisch ist das Raspberry Pi durch die Raspian Distribution ja recht gut dabei, sodass ich denke das da Apache nicht so ins Gewicht schlagen sollte.......
Der Fehler wird mir auf dem WebIf angezeigt, da ich $output einfach noch mit einblende.
Was mich stört ist, dass ich als user root arbeite. Es wird mir auch root als php-Benutzer angezeigt. Ich deinstalliere gerade php und danach lighthttp um dann (ab morgen) den apache zu testen.
So, Apache hat auch nicht geholfen.
Ich nutze jetzt das senden Programm, welches per sudo aufgerufen wird. Dazu muss noch die Passwortabfrage deaktiviert werden.
Also Befehlin die Konsole eingebenCode:visudo
Dort dann die Zeile
am Ende einfügen.Code:www-data ALL=(ALL) NOPASSWD: /var/scripte/senden
Jetzt wird für das eine Senden Programm kein Kennwort bei sudo verlangt.
Meine Webseite zum Testen:
Mein Senden Programm:Code:<html>
<head>
<title>Raspberry Pi PHP- Server - UART Test</title>
</head>
<body>
<h1>Raspberry Pi PHP- Server - UART Test</h1>
<div id="nav"><a href="index.php?safemode=1">Safemode?</a> <a href="index.php">Neu laden</a></div>
<div id="main"><h2>RasPi-Sendetest<h2><br>
<?php
header("Cache-Control: no-cache, must-revalidate");
echo "<br>";
echo "Befehl eingeben";
echo "<br>";
if (isset($_GET["safemode"])) {
if( ini_get('safe_mode') ){
echo "<br>Safemode an<br>";
}else{
echo "<br>Safemode aus<br>";
}
};
if (isset($_POST["befehl"])) {
if ($_POST["befehl"]!=""){
$befehl="sudo /var/scripte/senden ".$_POST["befehl"];
$output = shell_exec($befehl);
}
};
echo "<form method='post' action='index.php'>";
echo "<input type='text' maxlength='40' size='40' id='1' name='befehl' value='HalloWelt' />";
echo "<br>";
echo ".$output"
?>
<input type="submit" value="Senden"> </form>
</div>
</body>
Code:// Compile with: gcc /var/scripte/senden.c -o /var/scripte/senden
//#include <iostream>
//using namespace std;
#include <sys/types.h> //nicht benötigtes scheint keinen Platz zu verschwenden...
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#define BAUDRATE B19200
char MODEMDEVICE[]= "/dev/ttyAMA0"; // !!!
int fd; // File descriptor
struct termios newtio={};
unsigned char send(char c)
{
int res=write(fd, &c, 1);
if (res<0) printf("Fehler beim Senden\n");
return res;
}
int init()
{
/*** Init ***/
//O_RDONLY, O_WRONLY or O_RDWR -
//O_NDELAY (geht weiter, wenn keine Daten da sind und gibt "-1" zurueck)
// man 2 open fuer mehr Infos - see "man 2 open" for more info
// O_NOCTTY No ControllTeleType
fd = open(MODEMDEVICE, O_WRONLY | O_NOCTTY);
if (fd < 0){
printf("Fehler beim oeffnen von %s\n", MODEMDEVICE);
exit(-1);
}
memset(&newtio, 0, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //setzt die neuen Porteinstellungen
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0; /* set input mode (non-canonical, no echo, ...) */
newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 1; /* blocking read until 1 chars received */
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
return fd;
}
int einmal()
{
int i=0;
int anzahl=0;
int laenge=0;
char *ptr;
FILE *in;
extern FILE *popen();
char buff[30];
char rueckgabe[30]="";
if(!(in = popen("pidof senden", "r"))){
exit(1);
}
fgets(buff, sizeof(buff), in);
pclose(in);
laenge=strlen(buff);
for(i=0;i<laenge;i++)
{
if(buff[i]==' ') anzahl++;
}
return anzahl;
}
int main(int argc, char** argv)
{
char c;
char vBuf[100]="",*pBuf;
char buffer [100]="";
char buffer1 [100]="";
int i=0;
int anzahl;
anzahl=einmal();
if (anzahl>0){
anzahl++;
sleep(anzahl);
}
init();
if (argc == 1) { //Wenn nichts angegeben, dann Uhrzeit und Datum senden
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
strftime (buffer,80,"U%H:%M:%S",timeinfo); //Uhh:mm:ss
pBuf=buffer;
strcat(pBuf,"\r");
while(pBuf && *pBuf) //Zeichen einzeln senden
send(*pBuf++);
strftime (buffer,80,"D%d.%m.%y",timeinfo); //Dtt.mm.yy
pBuf=buffer;
strcat(pBuf,"\r");
sleep(1);
while(pBuf && *pBuf) //Zeichen einzeln senden
send(*pBuf++);
}else{ //Sonst Parameter einlesen und senden
if(strlen(argv[1])>75){ //Puffer im AVR ist auf 80 gestellt
strncpy(buffer,argv[1],76);
buffer[76]='\0';
}else{
strcpy(buffer,argv[1]);
if (argc >2){
for (i=2;i<argc;i++){
if(strlen(buffer)+strlen(argv[i])>75){
strcat(buffer," ");
strncat(buffer,argv[i],(76-strlen(buffer)));
buffer[76]='\0';
break; //exit for in c...
}else{
strcat(buffer," ");
strcat(buffer,argv[i]);
}
}
}
}
int o=0;
for(i=0;i<strlen(buffer);i++){
buffer1[o]=buffer[i];
if (buffer1[o]==164){ //ä
buffer1[o]= 228;
}
if (buffer1[o]==188){ //ü
buffer1[o]= 252;
}
if (buffer1[o]==182){ //ö
buffer1[o]= 246;
}
if (buffer1[o]==132){ //Ä
buffer1[o]= 196;
}
if (buffer1[o]==156){ //Ü
buffer1[o]= 220;
}
if (buffer1[o]==150){ //Ö
buffer1[o]= 214;
}
if (buffer1[o]==159){ //ß
buffer1[o]= 223;
}
if (buffer1[o]==138){ //&
buffer1[o]= 38;
}
if (buffer1[o] != 195){ //Initialisierung Umlaut
o++;
}
}
pBuf=buffer1;
strcat(pBuf,"\r"); //CHR(13) anfügen, damit der AVR auswertet
while(pBuf && *pBuf){ //Zeichen einzeln senden
send(*pBuf++);
}
}
close (fd);
return 0;
}