verfaßt von MagicBird, Berlin, 30.03.2019, 14:18:42
Hallöchen Forum,
nun wollte ich meine selbstgebastelte HomeControl durch RFID erweitern und habe mir ein ESP8266 und RF522 modul gekauft. Im web fand ich ein Script das ich mit Hilfe anderer User Bereich Arudino modifiziert habe. So das der ESP den gelesenen RFID Code an eine php Datei auf mein PI schickt. Diese Datei schaut ob der übergebene Code schon exestiert oder nicht.
Nun dachte ich, wie kann ich eine Aktion ausführen lassen die ich der RFID hinterlege.
Wenn ich die rfid.php?rfid=code im Browser ausführe laufen alle Weiterleitungen und ich sehe den veränderten wert. Aber Via ESP kommt der Fehler 302
rfid.cpp esp8266
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <Wire.h>
#include <MFRC522.h>
#include <SPI.h>
#define RST_PIN 5 // RST-PIN for RC522 - RFID - SPI - Module GPIO15
#define SS_PIN 4 // SDA-PIN for RC522 - RFID - SPI - Module GPIO2
MFRC522 myCard(SS_PIN, RST_PIN); // Create MFRC522 instance
#define USE_SERIAL Serial
ESP8266WiFiMulti WiFiMulti;
void setup()
{
USE_SERIAL.begin(115200);
delay(3000);
//WiFi.mode(WIFI_STA);
WiFiMulti.addAP("IoT", "password88");
SPI.begin(); // SPI bus
myCard.PCD_Init(); // MFRC522
pinMode(15,OUTPUT);
USE_SERIAL.println("starting...");
Serial.println("connect WLAN...");
if (WiFiMulti.run() == WL_CONNECTED)
{
Serial.println("");
Serial.println("connect WLAN handshake.");
Serial.println("IP:");
Serial.println(WiFi.localIP());
}
}
void loop()
{
if ( ! myCard.PICC_IsNewCardPresent()) //Wenn eine neue Karte nicht gelesen wird, kehren Sie zum Anfang zurück
{
delay(250);
return;
}
if ( ! myCard.PICC_ReadCardSerial()) //Wählen Sie eine aus, wenn aktuell mehr als eine Karte verwendet wird (verhindert den Fehler).
{
delay(250);
return;
}
String contenthex= "";
for (byte i = 0; i < myCard.uid.size; i++)
{
contenthex.concat(String(myCard.uid.uidByte[i], HEX));
}
contenthex.toUpperCase();
myCard.PICC_HaltA(); //Kartenbezogene Verfahren
Serial.println("Code of card " + contenthex);
if((WiFiMulti.run() == WL_CONNECTED))
{
HTTPClient http;
USE_SERIAL.print("[HTTP] post "+contenthex+" on Host.\n");
contenthex.replace(" ", "");
String url;
url = String("http://192.168.5.90/smarthome/rfid/rfid.php?rfid="+contenthex);
http.begin(url); //HTTP
int httpCode = http.GET();
if(httpCode > 0)
{
USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
}
else
{
USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
}
rfid.php raspberry
<?php
require_once '../include/config.include.php';
require_once '../include/date_time.include.php';
if($_GET['rfid'] == true)
{
$statement = $pdo->prepare("SELECT COUNT(*) AS anzahl FROM $rfidtbl WHERE rfid = ?");
$statement->execute(array($_GET['rfid']));
$row = $statement->fetch();
if ($row['anzahl'] >= '1')
{
/* Lese Datenbankzeile für vorhandenen RFID Code und führe Aktion extern aus */
$sql = "SELECT * FROM $rfidtbl WHERE rfid = '".$_GET['rfid']."'";
$wert = $pdo->query($sql)->fetch();
$wertaktion = $wert['aktion'];
header("Location: http://192.168.5.90/smarthome/$wertaktion");
}
else
{
/* Schreibe neuen RFID Code in die Datenbank */
$datumdmy = date("d.m.Y");
$zeithi = date("H:i");
$statement = $pdo->prepare("INSERT INTO $rfidtbl (rfid, datum, zeit, counter) VALUES
rfid, :datum, :zeit, :counter)");
$statement->execute(array('rfid' => $_GET['rfid'], 'datum' => $datumdmy, 'zeit' => $zeithi, 'counter' => '0'));
}
}
else
{
echo "kein RFID vorhanden";
}
?>
$wertaktion steht lediglich das nächste Verzeichnis/datei.php/variable=wert
In der Monitorfunktion von Arduino bekomme ich beim senden den fehler 302
danke Lars
gesamter Thread: