Hallo zusammen,
Im folgenden findet Ihr einen PHP Code Schnipsel, mit dem man den RS485 RFID Reader von der Firma RSS auslesen kann ...

... und somit recht einfach einen RFID Zugang mit Personenerkennung und mit Zeitprofilen realisieren kann (z.B. Putzfrau ist nur von Montag - Freitag von 10-12 Uhr berechtigt). Außerdem können natürlich auch unterschiedliche Transponder unterschiedliche Funktionen ausführen oder auch derselbe Transponder unterschiedliche Aktionen in Abhängigkeit der Zeit.
Ich verwende einen RS232/RS485 Konverter und auch eine RS485 Schnittstellenkarte. Mit ser2net werden die ankommenden Daten auf einen TCP Socket gemappt, den ich dann per php auslese.
Das Mapping der seriellen Schnittstelle auf einen TCP Socket erfolgt mit ser2net wie folgt:
/usr/local/sbin/ser2net -C "<TCPPORT>:raw:0:/dev/<COMPORT>:4800 NONE 1STOPBIT 8DATABITS -XONXOFF LOCAL RTSCTS"
wobei <COMPORT> = ttyS0 für COM1 oder ttyS1 für COM2
und <TCPPORT> = z.B. 5331
Hier nun der PHP Code, der die IDs der RFID-Tags vom Socket liest. Dabei sendet der RSS-Leser immer ein Leerzeichen bevor die 10 Byte der ID des RFID-Tags beginnen. D.h. die Routine liest zeichenweise bis zum ersten Empfang eines Leerzeichens, speichert dann die darauf folgenden 10 Zeichen in einen String und vergleicht diesen String mit den zuvor definierten gültigen IDs.
Bei erfolgreichen Vergleich hat man dann verschiedenste Möglichkeiten, was man tun kann. Hier einige Varianten die recht nah liegen:
- per IPC eine Message an einen anderen Prozess senden. Bei mir ist dies der eibserver Prozess, der meine gesamte Logik abbildet. In php lautet der Befehl msg_send(). Dazu muss der empfangende Prozess natürlich vorher eine entsprechende Message-Queue einrichten.
- per netcat ein IP-Telegramm schicken (wohin auch immer)
- per groupswrite (siehe eibd) Telegramm auf den EIB/KNX senden
- etc. ...
Viel Spass damit ...
Rückfragen gerne an mich.
Im folgenden findet Ihr einen PHP Code Schnipsel, mit dem man den RS485 RFID Reader von der Firma RSS auslesen kann ...

... und somit recht einfach einen RFID Zugang mit Personenerkennung und mit Zeitprofilen realisieren kann (z.B. Putzfrau ist nur von Montag - Freitag von 10-12 Uhr berechtigt). Außerdem können natürlich auch unterschiedliche Transponder unterschiedliche Funktionen ausführen oder auch derselbe Transponder unterschiedliche Aktionen in Abhängigkeit der Zeit.
Ich verwende einen RS232/RS485 Konverter und auch eine RS485 Schnittstellenkarte. Mit ser2net werden die ankommenden Daten auf einen TCP Socket gemappt, den ich dann per php auslese.
Das Mapping der seriellen Schnittstelle auf einen TCP Socket erfolgt mit ser2net wie folgt:
/usr/local/sbin/ser2net -C "<TCPPORT>:raw:0:/dev/<COMPORT>:4800 NONE 1STOPBIT 8DATABITS -XONXOFF LOCAL RTSCTS"
wobei <COMPORT> = ttyS0 für COM1 oder ttyS1 für COM2
und <TCPPORT> = z.B. 5331
Hier nun der PHP Code, der die IDs der RFID-Tags vom Socket liest. Dabei sendet der RSS-Leser immer ein Leerzeichen bevor die 10 Byte der ID des RFID-Tags beginnen. D.h. die Routine liest zeichenweise bis zum ersten Empfang eines Leerzeichens, speichert dann die darauf folgenden 10 Zeichen in einen String und vergleicht diesen String mit den zuvor definierten gültigen IDs.
Bei erfolgreichen Vergleich hat man dann verschiedenste Möglichkeiten, was man tun kann. Hier einige Varianten die recht nah liegen:
- per IPC eine Message an einen anderen Prozess senden. Bei mir ist dies der eibserver Prozess, der meine gesamte Logik abbildet. In php lautet der Befehl msg_send(). Dazu muss der empfangende Prozess natürlich vorher eine entsprechende Message-Queue einrichten.
- per netcat ein IP-Telegramm schicken (wohin auch immer)
- per groupswrite (siehe eibd) Telegramm auf den EIB/KNX senden
- etc. ...
PHP-Code:
#!/usr/bin/php
<?php
// define IP address and port of ser2net daemon
$ip = "192.168.0.10";
$port = 5331;
// define valid tags
$rfid_tags = array(
// Please enter here your RFID tags IDs
"1" => "0000000001", // 1 - Person A
"2" => "0000000002", // 2 - Person B
"3" => "0000000003" // 3 - Person C
// etc. ...
);
static $last_access_tag = "";
static $last_access_time = 0;
static $value = 1;
// open socket
$sock = @fsockopen($ip,$port);
// initilize last time when a char was read from socket
$last_read_time = 0;
// was socket successfully opened?
if ($sock) {
// is socket readable?
while (!feof($sock))
{
// read character from socket
$char = fgetc($sock);
// save time
$read_time = time();
// if time between 2 chars are at least 2 sec. then reset the id to be read from socket
if ($read_time - $last_read_time > 1)
{
$i=0;
$last_read_time = $read_time;
}
// save read character into string
$str[$i] = $char;
// reader transmits at the beginning of an ID a space
// if first char read is not space, than do not change index i and restart reading process
if ($str[0]!= " ") continue;
// otherwise increase index until 11 chars are read
$i = ($i+1)%12;
if ($i!=0) continue;
// than generate a string
$data = implode($str);
echo "DATA: ".$data."\n";
// delete spaces at beginning and at the end of the string
unset($key);
$key = trim($data);
// log raw data
echo "received DATA / ID : ".bin2hex($data)." / $key\n";
// check wether received ID is a valid key
unset($tag);
if ($tag = array_search($key,$rfid_tags))
{
// logging of timestamp and valid transponder identification
$time = time();
echo "Current-Access-Time: ".strftime("%d.%m.%Y - %H:%M:%S",$time)."\n";
echo "Last-Access-Time : ".strftime("%d.%m.%Y - %H:%M:%S",$last_access_time)."\n";
// allow access only if transponder was not read in the last five seconds or
// if it is a new transponder (not the same transponder read last time)
// this prevents to send an ACCESS SIGNAL (e.g. door opener) more then once
// if the reader reads the ID multiple times per second
if (($tag != $last_access_tag) || ($time - $last_access_time)>5)
{
// save last access tag
$last_access_tag = $tag;
// save last access time
$last_access_time = $time;
// log access
echo "Received EM4102 Unique ID: ".$key." from Transponder ".$tag."\n";
echo "ACCESS GRANTED!!!\n\n";
// do here what you want to do when a valid transponder was identified
//
// put your code here
//
// logging if a transponder was read more than once in one transaction
} else echo"Duplicate Transponder ID received\n\n";
}
else {
// log the access attempt of an invalid transponder
echo "Current-Time : ".strftime("%d.%m.%Y - %H:%M:%S")."\n";
echo "Last-Access-Time : ".strftime("%d.%m.%Y - %H:%M:%S",$last_access_time)."\n";
echo "Received EM4102 Unique Key: ".$key." from UNKNOWN Transponder\n";
echo "ACCESS DENIED!!!\n\n";
}
}
} else echo "Could not open socket at ".$ip.":".$port."\n";
?>
Rückfragen gerne an mich.
Kommentar