PHP 双门双向门禁控制板实时监控源码

本示例使用设备: 实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com)

<?PHP
  header("content-type:text/html;charset=GBK");
  
  $ThisIp=get_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.length>10){
                                $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];
                  }
                  
                  $SendInfStr="001,".$DevRecFramesStr;      //确定接收到信息,否则设备会连续发送三次
                  SendInfToIp($socket,$SendInfStr,$peer);          
                  
                  $GetDT=substr($DevBufferDatetimeStr,0,16);
                  $SysDT=substr(date('Y-m-d H:i:s',time()),0,16);

                  if (strcmp($GetDT,$SysDT)!=0){            /*设备时钟与系统不符,更新设备时间*/
                      $SendInfStr="003," . $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];
                  }
                  $SendInfStr="001,".$DevRecFramesStr;      //确定接收到信息,否则设备会连续发送三次
                  SendInfToIp($socket,$SendInfStr,$peer);          
                  
                  $LastFramesStr=$peer.$inMsg;              //将接收到的信息接保存,用于对比是否重复接收到的信息
                  
                  //可以在这里加上业务对数据库的查、增、删操作,要分析是否重复接收的信息
                  //用050指令返回开门成功,
                  //用051指令返回开门失败,正式系统开发时要有重发机制 */
                  //$SendInfStr="051," . $DevBufferMachinStr . "," . $DevBufferCardidStr . ",卡号:" . $DevBufferCardidStr . "\\n姓名:张三丰  \\n状态:无效卡\\n,20,1,3"; 
                  
                  $SendInfStr="050," . $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真实地址
    $Netdriv=array();
    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';
    }
}  

?>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/193600.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每天一道算法题:51. N 皇后

难度 困难 题目 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n_ _皇后问题 的…

FPGA模块——AD高速转换模块(并行输出转换的数据)

FPGA模块——AD高速转换模块&#xff08;并行输出转换的数据&#xff09; &#xff08;1&#xff09;AD9280/3PA9280芯片&#xff08;2&#xff09;代码 &#xff08;1&#xff09;AD9280/3PA9280芯片 AD9280/3PA9280芯片的引脚功能&#xff1a; 工作电压2.7到5.5v 数据对应&a…

代码随想录算法训练营第五十七天|739. 每日温度、496.下一个更大元素 I

LeetCode 739. 每日温度 题目链接&#xff1a;739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 单调栈开始&#xff0c;为什么要用栈&#xff0c;因为栈是先入后出&#xff0c;当我们遍历从前往后的时候&#xff0c;每次遍历的元素都是添加至栈尾&#xff0c;方便我们进…

西南科技大学电路分析基础实验A1(一阶电路的设计)

目录 一、实验目的 二、实验设备 三、预习内容(如:基本原理、电路图、计算值等) 四、实验数据及结果分析(预习写必要实验步骤和表格) 1. 观测一阶电

搜索百度可以直接生成代码拉

先看效果图&#xff1a; 使用示例&#xff1a; 比如我要搜索“JS取一个数在两个数更近”的方法&#xff0c;直接搜“JS取一个数在两个数更近”&#xff0c;点击百度一下&#xff0c;就会出现想要的代码&#xff0c;如上图。

《金融科技行业2023年专利分析白皮书》发布——科技变革金融,专利助力行业发展

金融是国民经济的血脉&#xff0c;是国家核心竞争力的重要组成部分&#xff0c;金融高质量发展成为2023年中央金融工作的重要议题。《中国金融科技调查报告》中指出&#xff0c;我国金融服务业在科技的助力下&#xff0c;从1.0时代的“信息科技金融”、2.0时代的“互联网金融”…

坚鹏:数字金融——金融行业的数字科技和智能化转型培训圆满结束

中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力&#xff0c;是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市&#xff0c;2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点&#xff0c;服务个人客户超6.5亿户。2022年&#xff0c;在《银行家》…

力扣hot100 滑动窗口最大值 单调队列

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f37b; AC code class Solution {public int[] maxSlidingWindow(int[] nums, int k){int n nums.length;int[] res new int[n - k 1]; // 单调递减队列int[] q new int[n];// q数组维护的是元素在 nums 数组对应的下标int…

从零构建属于自己的GPT系列1:预处理模块(逐行代码解读)、文本tokenizer化

1 训练数据 在本任务的训练数据中&#xff0c;我选择了金庸的15本小说&#xff0c;全部都是txt文件 数据打开后的样子 数据预处理需要做的事情就是使用huggingface的transformers包的tokenizer模块&#xff0c;将文本转化为token 最后生成的文件就是train_novel.pkl文件&a…

动态网页从数据库取信息,然后展示。

把数据库的驱动放在bin目录下。 通过servlet 读取数据库的内容&#xff0c;生成session,然后跨页面传给展示页。 package src;import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSe…

sprintf函数

1.头文件&#xff1a;#include <stdio.h> 2.函数原型&#xff1a;int sprintf ( char * str, const char * format, ... ) 3.函数功能&#xff1a;将数据格式化为字符串&#xff0c;再写入到字符串中 4.参数分析&#xff1a; str&#xff1a;是字符串指针&#xff0c…

SpringBoot——国际化

优质博文&#xff1a;IT-BLOG-CN 一、Spring 编写国际化时的步骤 【1】编写国际化配置文件&#xff1b; 【2】使用ResourceBundleMessageSource管理国际化资源文件&#xff1b; 【3】在页面使用ftp:message取出国际化内容&#xff1b; 二、SpringBoot编写国际化步骤 【1】创…

JavaScript WebApi(二) 详解

监听事件 介绍 事件监听是一种用于在特定条件下执行代码的编程技术。在Web开发中&#xff0c;事件监听器可以用于捕获和响应用户与页面交互的各种操作&#xff0c;如点击、滚动、输入等。 事件监听的基本原理是&#xff0c;通过在特定元素上注册事件监听器&#xff0c;当事件…

每日一题:LeetCode-202.快乐数(一点都不快乐)

每日一题系列&#xff08;day 06&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

【古诗生成AI实战】之三——任务加载器与预处理器

本章内容属于数据处理阶段&#xff0c;将分别介绍任务加载器task和预处理器processor。 [1] 数据集 在深入探讨数据处理的具体步骤之前&#xff0c;让我们先了解一下我们将要使用的数据集的形式。 本项目采用的是七绝数据集&#xff0c;总计83072条古诗&#xff0c;其形式如下&…

单片机学习10——独立按键

独立按键输入检测&#xff1a; #include<reg52.h>sbit LED1P1^0; sbit KEY1P3^4;void main() {KEY11;while(1){if(KEY10) //KEY1按下{LED10; //LED1被点亮}else{LED11;}} } 按键 #include<reg52.h>#define uchar unsigned char #define uint unsigned intsbit …

Java LeetCode篇-深入了解关于数组的经典解法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 轮转数组 1.1 使用移位的方式 1.2 使用三次数组逆转法 2.0 消失的数字 2.1 使用相减法 2.2 使用异或的方式 3.0 合并两个有序数组 3.1 使用三指针方式 3.2 使用合…

浅谈UML的概念和模型之UML九种图

1、用例图&#xff08;use case diagrams&#xff09; 【概念】描述用户需求&#xff0c;从用户的角度描述系统的功能 【描述方式】椭圆表示某个用例&#xff1b;人形符号表示角色 【目的】帮组开发团队以一种可视化的方式理解系统的功能需求 【用例图】 2、静态图 类图&…

新形势下,2024年企业数字化转型该如何进行?

2023年已然接近尾声&#xff0c;各大企业都陆续开始了各种工作总结与来年规划。然而在大多传统企业中&#xff0c;负责数字化转型的部门人员则显得略微尴尬。 如何正确认识数字化、如何制定数字化年度目标以及如何快速体现数字化转型的价值&#xff0c;成为了数字化工作难以逾…

PlantUML语法(全)及使用教程-时序图

目录 1. 参与者1.1、参与者说明1.2、背景色1.3、参与者顺序 2. 消息和箭头2.1、 文本对其方式2.2、响应信息显示在箭头下面2.3、箭头设置2.4、修改箭头颜色2.5、对消息排序 3. 页面标题、眉角、页脚4. 分割页面5. 生命线6. 填充区设置7. 注释8. 移除脚注9. 组合信息9.1、alt/el…