PHP 双门双向门禁控制板实时监控源码
本示例使用设备 实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com)?PHP header(content-type:text/html;charsetGBK); $ThisIpget_local_ip(); //获取电脑IP地址 $server udp://.$ThisIp.:39192; $socket stream_socket_server($server, $errno, $errstr, STREAM_SERVER_BIND); if (!$socket) { die($errstr ($errno)); } echo 系统绑定的IP :.$ThisIp.:39192\n; $LastFramesStr ; //保存最后接收到的信息用于比较是否重复接收的信息 do{ //监听UDP端口并将接收到的信息显示正式项目只解析数据不需要显示 $inMsg stream_socket_recvfrom($socket, 1024, 0, $peer); $Fields explode(,,$inMsg ); //将接收到的信息 分字段解析 echo From Ip:.$peer.\n; echo Getdata:.$inMsg.\n\n ; switch($Fields[0]){ case 100: //*设备接收到000搜索指令后返回的设备信息*/ if(sizeof($Fields)9){ $DevBufferIpAddrStr $Fields[1]; /*终端IP*/ $DevBufferMaskStr $Fields[2]; /*掩码*/ $DevBufferGatewayStr $Fields[3]; /*网关*/ $DevBufferRemoteAddrStr $Fields[4]; /*远程服务器IP*/ $DevBufferPort $Fields[5]; /*端口*/ $DevBufferNumberDecStr $Fields[6]; /*设备序号*/ }else{ $DevBufferIpAddrStr $Fields[1]; /*终端IP*/ $DevBufferMaskStr $Fields[2]; /*掩码*/ $DevBufferGatewayStr $Fields[3]; /*网关*/ $DevBufferGatewayStrMAC $Fields[4]; /*网关MAC*/ $DevBufferRemoteAddrStr $Fields[5]; /*远程服务器IP*/ $DevBufferRemoteAddrMACStr $Fields[6]; /*远程服务器IPMAC*/ $DevBufferMACSearchStr $Fields[7]; /*MAC搜索标识*/ $DevBufferPort $Fields[8]; /*端口*/ $DevBufferNumberDecStr $Fields[9]; /*设备模块序号*/ if(strArr.length10){ $DevBufferSerialNumStr $Fields[10]; /*设备唯一硬件序号*/ } if(strcmp($DevBufferRemoteAddrStr,255.255.255.255)!0 strcmp($DevBufferRemoteAddrStr,$ThisIp)!0 ){ echo 消费机的远程服务器IP不是指向当前网卡请在消费机上 功能1\7IP地址及端口设定 设定正确的网络参数\n\n; } } break; case 101: ///*接收到设备的开的信号*/ $DevRecFramesStr $Fields[1]; /*包序列号 */ $DevBufferIpAddrStr $Fields[2]; /*终端IP */ $DevBufferRemoteAddrStr $Fields[3]; /*远程电脑指机IP*/ $DevBufferMachinStr $Fields[4]; /*机号*/ $DevBufferDatetimeStr $Fields[5]; /*设备日期时间*/ if(sizeof($Fields)6){ /*2018年以后的设备有唯一硬件序号*/ $DevBufferSerialNumStr$Fields[6]; } $SendInfStr001,.$DevRecFramesStr; //确定接收到信息否则设备会连续发送三次 SendInfToIp($socket,$SendInfStr,$peer); $GetDTsubstr($DevBufferDatetimeStr,0,16); $SysDTsubstr(date(Y-m-d H:i:s,time()),0,16); if (strcmp($GetDT,$SysDT)!0){ /*设备时钟与系统不符更新设备时间*/ $SendInfStr003, . $DevBufferMachinStr ., . date(Y-m-d H:i:s, time()); SendInfToIp($socket,$SendInfStr,$peer); } break; case 150: $DevRecFramesStr $Fields[1]; /*包序列号 */ $DevBufferIpAddrStr $Fields[2]; /*终端IP */ $DevBufferRemoteAddrStr $Fields[3]; /*远程电脑指机IP*/ $DevBufferMachinStr $Fields[4]; /*机号*/ $DevBufferCardidStr $Fields[5]; /*卡号*/ $DevBufferReaderStr $Fields[6]; /*读头号*/ $DevBufferDoorNoStr $Fields[7]; /*门或继电器号*/ $DevBufferDelayStr $Fields[8]; /*门磁未关秒数0表示已关*/ $DevBufferPasswPropStr $Fields[9]; /*密码属性0密码无效1刷卡后按密码,2补签密码,3开门密码4防迫胁密码*/ $DevBufferPassWStr $Fields[10]; /*密码(最多8位数字)*/ $DevBufferUseTimeStr $Fields[11]; /*刷卡时间*/ if(sizeof($Fields)12){ /*2018年以后的设备有唯一硬件序号*/ $DevBufferSerialNumStr$Fields[12]; } $SendInfStr001,.$DevRecFramesStr; //确定接收到信息否则设备会连续发送三次 SendInfToIp($socket,$SendInfStr,$peer); $LastFramesStr$peer.$inMsg; //将接收到的信息接保存用于对比是否重复接收到的信息 //可以在这里加上业务对数据库的查、增、删操作要分析是否重复接收的信息 //用050指令返回开门成功 //用051指令返回开门失败正式系统开发时要有重发机制 */ //$SendInfStr051, . $DevBufferMachinStr . , . $DevBufferCardidStr . ,卡号: . $DevBufferCardidStr . \\n姓名:张三丰 \\n状态:无效卡\\n,20,1,3; $SendInfStr050, . $DevBufferMachinStr . , . $DevBufferCardidStr . ,卡号: . $DevBufferCardidStr . \\n姓名:张三丰 \\n状态:欢迎关临\\n,20,1,0, . $DevBufferReaderStr . , . $DevBufferDoorNoStr . ,5,20 ; SendInfToIp($socket,$SendInfStr,$peer); default: //更多的字段信息及反馈指令请仔细查看设备的通讯协议说明...... } } while ($inMsg ! false); //判断字符串是否一个合法的日期时间-------------------------------------------------------------------------------------------------------- function CheckDateTime($data) { if(date(Y-m-d H:i:s,strtotime($data))$data){ return true; }else{ return false; } } //确定接收到设备上传的数以免设备重复发送-------------------------------------------------------------------------------------------------- function SendInfToIp($socket,$SendInfStr,$peer) { stream_socket_sendto($socket,$SendInfStr,0,$peer); //$handle stream_socket_client(udp://.$peer, $errno, $errstr); //fwrite($handle, $SendInfStr); echo SendTo IP:.$peer.\n; echo SendInfor:{$SendInfStr}\n\n; } //获取本机IP地址------------------------------------------------------------------------------------------------------------------------ function get_local_ip() { $preg /\A((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.){3}(([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\Z/; //获取操作系统为win2000/xp、win7的本机IP真实地址 $Netdrivarray(); exec(ipconfig, $out, $stats); if (!empty($out)) { foreach ($out AS $row) { if (strstr($row, IP) strstr($row, :) !strstr($row, IPv6)) { $tmpIp explode(:, $row); if (preg_match($preg, trim($tmpIp[1]))) { $Netdriv[]trim($tmpIp[1]); echo trim($tmpIp[1]).\n; } } } } //获取操作系统为linux类型的本机IP真实地址 //exec(ifconfig, $out, $stats); //if (!empty($out)) { // if (isset($out[1]) strstr($out[1], addr:)) { // $tmpArray explode(:, $out[1]); // $tmpIp explode(, $tmpArray[1]); // if (preg_match($preg, trim($tmpIp[0]))) { // return trim($tmpIp[0]); // } // } //} if (!empty($Netdriv)) { return $Netdriv[0]; //如果有多张网块可以修改数组取值来绑定相应的网卡 }else{ return 127.0.0.1; } } ?