Ankündigung

Einklappen
Keine Ankündigung bisher.

RS485 RFID Leser unter Linux

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [PHP] RS485 RFID Leser unter Linux

    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. ...


    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";

    ?>
    Viel Spass damit ...
    Rückfragen gerne an mich.

    #2
    USB RFID Leser unter Linux

    Hallo,
    ein sehr intressanter ansatz wurde hier beschrieben.

    Ich würde gerne eine Benutzerlogin für eine Locale Webanwendung (reine Linux Clients) mit php realisieren.

    Hat jemand bereits erfahrung mit USB angebunden geräten. Primär möchte ich den RFID Reader SCL011 von SCM einsetzen.

    Grüße
    Florian

    Kommentar

    Lädt...
    X