bestimmte Zeile aus Registervariable in Stringvariable schreiben

Hallo Leute

ich ecke gerade wieder mal an. Hab meinen Fingerprint über einen Cutter an die Registervariable übergeben. Nun schreibt es mir aber nicht das gewünschte in die Variable. Ich brauche nur die erste Zeile (41 D3 0E… siehe Anhang). Kann mir da jemand behilflich sein?

<?php
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($IPS_SENDER == "RegisterVariable")
{
  // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($IPS_INSTANCE);
  // neu empfangene Daten an $data anhängen
  $data .= $IPS_VALUE;

  // wenn das Trennzeichen ; in $data gefunden worden ist
  if (strpos(strTohex($data), 'da'))
  {
      // $data in durch ; separierte Datensätze zerlegen
      $datasets = explode('da', strtohex($data));

      // alle nicht durch ; terminierten Datensätze ausgeben
      for ($i = 0; $i < count($datasets) - 1; $i++)
      {
         
                SetValueString(36584 /*[Anwesenheit\Variablen\BioGate Ankunft]*/, $datasets[$i]);

         echo "empfangener Datensatz: ".$datasets[$i]."
";
      }


  }

  // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
  RegVar_SetBuffer($IPS_INSTANCE, $data);
}

function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}


?>

Was hast denn im Cutter für Trennzeichen angegeben oder anderst rum gefragt, wie sieht dein Protokoll aus.

der Cutter ist noch sehr sehr jungfräulich. Hab da noch keine Trennzeichen drin. Wie wird der „befüllt“?

wie sieht dein Protokoll aus.

Das kann ich dir vielleicht sagen, wenn Du das beantwortest.

welches Protokoll meinst du? :confused:

Na das von deinem Fingerprint. Die Daten haben doch eine Bedeutung.

Ohh, tschuldigung, da hät ich eigentlich draufkommen können. Hier ist das Protokollbeschrieben.

Ich les jetzt keine fast 400 Seiten. :confused: Auf Seite 13 geht es los, jenachdem was Du verwendest hast Du Start und Endadresse, dies kannst Du im Script auswerten. Den Cutter kannst Du entsorgen und die Regvar direkt mit deinem Eingang verbinden.

Ich les jetzt keine fast 400 Seiten

Das hab ich auch nicht erwartet und hätte mich auch fassungslos gemacht.
Ich schau mal, was ich hinkriege. Danke Dir für deine Mühe.

Hallo Jürg

Richte doch mal einen Cutter ein:
(ist wiedermal seltsames Protokoll, 0x0a als Endezeichen, obwohl 0x0a auch in den Daten vorkommen könnte… :frowning:

  • Benutze feste Länge
  • Eingabelänge 15
  • Synch-Zeichen 41 HEX

Das Script der Registervariable (mal für’s Erste):


<?php 
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist 
if ($IPS_SENDER == "RegisterVariable") 
{ 
  // empfangene Daten  
  $data = $IPS_VALUE; 

  // Daten in hex umwandeln
  $dataStr = strToHex($data);
  IPS_LogMessage( "KEY"," Data:".$dataStr);
} 

function strToHex($string) 
{ 
    $hex=''; 
    for ($i=0; $i < strlen($string); $i++) 
    { 
        $hex .= dechex(ord($string[$i])); 
    } 
    return $hex; 
} 
?>  

Gruss
Tinu

Was du brauchst aus der Spez:

  • Seite 14: Genereller Packet-Aufbau
  • Seite 16: Packet über Schnittstelle
  • Seite 61: Kommandos
  • Seite 139/140: Leseantwort 0x11

Dies ergibt dann mit deinen aufgezeichneten Daten:
1 Byte (str[0]): 0x41 - Start
2 Byte (str[1]/str[2]): 0xD3 0x0e - Id des Lesers
1 Byte (str[3]): 0x11 - Kommando (Identify by Scan)
4 Byte (str[4]/str[5]/str[6]/str[7]) 0x01 0x00 0x00 0x00 - Identified User ID00000001 (low byte first)
4 Byte (str[8]/str[9]/str[10]/str[11]) 0x37 0x00 0x00 0x00 - Order of fingerprints enrolled in the same ID
1 Byte (str[12]): 0x62 - Flag = SCAN_SUCCESS
1 Byte (str[13]): 0xcd Checksum
1 Byte (str[14]): 0x0a End

Ist jetzt die überlassen, was du alles prüfst (z.B. Kommando (str[3] == 0x11) und Flag (str[12] == 0x62) …).
Checksumme usw. nach Bedarf :wink:

Gruss
Tinu

Unter Mithilfe von Tinu sind jetzt die Fingerprints von Biometrix eingebunden. Der Host-Controller lässt sich seriell oder über TCP/IP ansprechen.

Wenn’s jemand gebrauchen kann:

Cutter einrichten:

  • Benutze feste Länge
  • Eingabelänge 15
  • Synch-Zeichen 41 HEX

Registervariable auf den Cutter

Script anlegen:

<?php

  //             0  1  2  3  4  5  6  7  8  9  10 11 12 13 14
  //$testData = "41 D3 0E 11 01 00 00 00 37 00 00 00 62 CD 0A";
  
  
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($IPS_SENDER == "RegisterVariable")
{
  // empfangene Daten
  $data = $IPS_VALUE;
  
  // Checksumme
  $chk = 0x00;
  for ($i=0; $i < strlen($data)-2; $i++)
  {
    $chk += ord($data[$i]);
  }

  
  // richtige^s Format ?
  if ((strlen($data) == 15) && (ord($data[14]) == 10) && (($chk & 255) == ord($data[13])))
  {
    // Seriennummer Leser
    $idLeser = ord($data[1]) + ord($data[2]) * 256;
  
    // Kommando
    if (ord($data[3]) == 17)  // 0x11
    {
		$idPerson = str_pad(dechex(ord($data[6])), 2, '0', STR_PAD_LEFT);
		$idPerson .= str_pad(dechex(ord($data[5])), 2, '0', STR_PAD_LEFT);
		$idPerson .= str_pad(dechex(ord($data[4])), 2, '0', STR_PAD_LEFT);

		// Resultat Lesung OK ?
		if (ord($data[12]) == 97)  // 0x61
		{
        IPS_LogMessage( "BioGate"," Sucess:".$idPerson);
        SetValue(36584 /*[Anwesenheit\Variablen\BioGate Ankunft]*/, $idPerson);
        SetValue(17048 /*[Anwesenheit\Variablen\Tür ID]*/, $idLeser);
		}
		else if (ord($data[12]) == 98)  // 0x62
		{
        //IPS_LogMessage( "BioGate"," ScanSuccess:".strToHex($data));
		}
		else
		{
        IPS_LogMessage( "BioGate"," Lesefehler:".strToHex($data));
		}
    }
  }
  else
    IPS_LogMessage( "BioGate"," Fehler Datenformat:".strToHex($data));
}

function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= str_pad(dechex(ord($string[$i])), 2, '0', STR_PAD_LEFT);
    }
    return $hex;
}
?>

So haben wir für uns die perfekte Anwesenheitskontrolle geschaffen.