Forum: Mikrocontroller und Digitale Elektronik Geräte schalten via Wlan (RN171-XV) über Webseite


von Ernesto F. (ernesto_fernandez)


Lesenswert?

Hallo zusammen.
Ich hoffe Ihr könnt mir weiter helfen.
Kurz zum Projekt:
Wie in der Überschrift schon beschreiben versuche ich über einen µC 
(Atmega8) der per UART mit einen Microchip RN171-XV W-LAN Modul 
verbunden ist über eine Webseite Geräte (aus Testgründen im Moment LED´s 
) zu schalten. Die aktuellen Zustände der Ausgänge werden in einer MySQL 
Datenbank gespeichert. Als Server dient ein Rasperry Pi . Auf diesem 
läuft ein Apache 2 Server mit PHP Modul, die Datenbank (MySQL-Server), 
ein Openvpn-Client und ein Wlan-Router (hostapd).

Zur Funktionsweise:
Über die Webseite wird per Button „ein“ Zeichen an das Wlan-Modul 
gesendet. Die Verbindung (alles in PHP) wird per „fsockopen“ aufgebaut 
und per „fputs“ wird das Zeichen gesendet. Dieses Zeichen wir vom µC 
interpretiert und sendet nach der Verarbeitung den aktuellen Zustand des 
Ausgangs zurück. Dies wird dann in der Datenbank abgespeichert. Über 
„fgets“ wird das Zeichen empfangen. Danach wird per „fclose“ die 
Verbindung zum Wlan-Modul wieder abgebaut.

Das Problem besteht darin, dass leider nicht immer die Verbindung zum 
Wlan-Modul wieder abgebaut wird. Manchmal funktioniert alles 
reibungslos. Aber immer öfter wir die Verbindung nicht abgebaut und ich 
muss warten bis ein (ich weiß im Moment nicht genau wie es richtig 
heißt. Ich nenne es mal ) „Timer Overflow“ eintritt und somit die 
Verbindung abgebaut wird. Während dieser Zeit wartet der Browser 
scheinbar auf eine Rückantwort die er nicht bekommt.

Könnt Ihr mir da irgendwie weiterhelfen?  Hier kurz die Funktion des 
senden und empfangen.
1
 
2
function sende ($ip,$bef)  // Funktion erstellen mit Parameterübergabe
3
{  
4
  //Schreiben und Lesen auf IP
5
  $fp=fsockopen($ip,80);  // stellt die Verbindng zu einem WLAN Modul ($ip) her mit dem Port 80 und speichert den Dateizeiger in eine Variable ($fp)
6
  fputs ($fp, $bef);    // schickt Daten ($bef) an die im Dateizeiger ($fp) gespeicherte Adresse
7
  $id1 =fgets($fp,128);  //ließt STRING, mit der maximalen Länge von 128 Zeichen, ein der von WLAN Modul ($fp) gesendet wird; alternativ kann auch "$buffer =fgetc($fp);" benutzt werden, ließt aber nur einen CHAR ein
8
  fclose($fp);
9
  $fp=fsockopen($ip,80);
10
  $buffer=fgets($fp,128);
11
  fclose ($fp); // schließt die Verbindung auf die der Dateizeiger ($fp) zeigt
12
  db($buffer,$id1);  // über gibt den Inhalt von $buffer an die Funktion db; diese Funktion befindet sich in der Datei db.php
13
  echo "$id1";
14
}

Gerne schiebe ich auch noch ein paar Codes hinterher.
Danke schon mal im Voraus.
Ernesto

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

ich kann gerade nicht so ganz nachvollziehen warum du 2x hintereinander 
eine Verbindung aufbaust? Das sollte doch auch mit einer kein Problem 
sein.
Welches fclose wird denn nicht ordentlich abgearbeitet das erste oder 
das zweite?

Sascha

von Ernesto F. (ernesto_fernandez)


Lesenswert?

Sascha Weber schrieb:
> Hallo,
>
> ich kann gerade nicht so ganz nachvollziehen warum du 2x hintereinander
> eine Verbindung aufbaust?

Hallo Sascha
Erstmal danke für die Antwort.
Ich habe mehrere Wlan-module die über die Webseite andesteuert werden. 
Bei der ersten Verbindung antwortet der µC mit einer von mir 
vorgegebenen ID als String.
Bei der zweiten Verbindung wird ein Zustand übermittelt als char (nur 
ein Zeichen.). Und da der Pi nicht der schnellst ist dachte ich das dies 
mit einer kleinen Zeitverzögerrung der Übertragung besser sei. 
(Gesteuert über den µc, zuerst String senden, 50ms warten dann char 
senden). Wenn ich alles direkt hintereinander sende überschlägt sich die 
Datenbank.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.