我目前正在使用局域网上的考勤设备进行考勤管理系统项目,我拥有ZKTeco公司的SC700型号。不幸的是,该设备不是通过 Web 服务器实现的,因此唯一的交互方法是使用 UDP 端口 4370。这也意味着我不能使用这个美妙的图书馆 https://github.com/cobisja/tad-php
该项目是定制的,用PHP(Codeigniter 3)编写,我使用了github(https://github.com/dnaextrim/php_zklib)的dnaextrim库与设备进行交互。到目前为止一切顺利,除了 SetUser 功能外,一切正常。我可以将具有ID,名称,密码,角色的新用户从我的应用程序设置到设备,但我无法设置他要使用的卡的RFID。
该函数构建一个 74 个字符长的字符串并将其发送到设备,如下所示
function zksetuser($self, $uid, $userid, $name, $password, $role, $card) {
$command = CMD_SET_USER;
//$command_string = str_pad(chr( $uid ), 2, chr(0)).chr($role).str_pad($password, 8, chr(0)).str_pad($name, 28, chr(0)).str_pad(chr(1), 9, chr(0)).str_pad($userid, 8, chr(0)).str_repeat(chr(0),16);
$byte1 = chr((int) ($uid % 256));
$byte2 = chr((int) ($uid >> 8));
$command_string = $byte1 . $byte2 . chr($role) . str_pad($password, 8, chr(0)) . str_pad($name, 24, chr(0)) . str_pad($card, 13, chr(0)) . str_pad($userid, 8, chr(0)) . str_repeat(chr(0), 16);
$chksum = 0;
$session_id = $self->session_id;
$u = unpack('H2h1/H2h2/H2h3/H2h4/H2h5/H2h6/H2h7/H2h8', substr($self->data_recv, 0, 8));
$reply_id = hexdec($u['h8'] . $u['h7']);
$buf = $self->createHeader($command, $chksum, $session_id, $reply_id, $command_string);
socket_sendto($self->zkclient, $buf, strlen($buf), 0, $self->ip, $self->port);
try {
@socket_recvfrom($self->zkclient, $self->data_recv, 1024, 0, $self->ip, $self->port);
$u = unpack('H2h1/H2h2/H2h3/H2h4/H2h5/H2h6', substr($self->data_recv, 0, 8));
$self->session_id = hexdec($u['h6'] . $u['h5']);
return substr($self->data_recv, 8);
} catch (ErrorException $e) {
return FALSE;
} catch (exception $e) {
return False;
}
}
参数$card是由我实现的,所以我可以传递卡的 RFID 号码,但问题是设备将我发送的 RFID "转换"为另一个号码!我无法弄清楚它对此转换进行了哪些操作,或者我应该怎么做才能将用户与他的 RFID 卡映射。
以前有没有人使用 PHP 使用 ZKTeco SC700 解决这个问题?
这对我有用!
function reverseHex3($hex)
{
$tmp = '';
for ($i = strlen($hex); $i >= 0; $i--) {
$tmp .= substr($hex, $i, 2);
$i--;
}
return $tmp;
}
$cardno = hex2bin(reverseHex3(dechex($card)));
$command_string = implode('', [
$byte1,
$byte2,
chr($role),
str_pad($password, 8, chr(0)),
str_pad($name, 24, chr(0)),
str_pad($cardno, 4, chr(0)),
str_pad(chr(1), 9, chr(0)),
str_pad($userid, 9, chr(0)),
str_repeat(chr(0), 15)
]);