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


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

    1. package UdpDemo;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.DatagramSocket;
    5. import java.net.InetAddress;
    6. import java.text.SimpleDateFormat;
    7. import java.util.Date;
    8. import java.net.*;
    9. import java.util.*;
    10. //udp传输: 接收
    11. /**步骤:---
    12. * 1、建立udp socket,设置接收端口
    13. * 2、预先创建数据存放的位置,封装
    14. * 3、使用receive阻塞式接收
    15. * 4、关闭资源
    16. * */
    17. public class PosDemo {
    18. public static void main(String[] args) throws Exception{
    19. //Scanner input = new Scanner(System.in);
    20. String MyIpAdd=getIP(); //获取电脑网卡IP
    21. InetAddress Addip=InetAddress.getByName(MyIpAdd) ;
    22. DatagramSocket s = new DatagramSocket(39192); /** 1、建立udp socket端点 */
    23. System.out.println("当前软件绑定的网卡:"+MyIpAdd+"\n\n");
    24. String SendInfStr="000";
    25. byte[] SendBuf = SendInfStr.getBytes(); /** 2、提供发送数据,封装打包 000 为搜索在线设备的指令 */
    26. DatagramPacket dp = new DatagramPacket(SendBuf, SendBuf.length, InetAddress.getByName("255.255.255.255"), 39192);
    27. try {
    28. s.send(dp);
    29. System.out.println("SendTo ip::255.255.255.255\nport::39192\ndata::"+SendInfStr+"\n\n");
    30. } catch (IOException e) {
    31. System.out.println("发送失败: ");
    32. e.printStackTrace();
    33. }
    34. boolean i=true;
    35. while(i){
    36. String DevRecFramesStr;
    37. String DevBufferIpAddrStr;
    38. String DevBufferRemoteAddrStr;
    39. String DevBufferMachinStr;
    40. String DevBufferDatetimeStr;
    41. String DevBufferSerialNumStr;
    42. String DevBufferCardidStr;
    43. String DevBufferUseMoneryStr;
    44. String DevBufferUseTimeStr;
    45. String DevBufferStaryStr;
    46. String DevBufferRecordAddStr;
    47. String DevBufferAllNoStr;
    48. String DevBufferInputKeyStr;
    49. String DevBufferMaskStr;
    50. String DevBufferGatewayStr;
    51. String DevBufferGatewayStrMAC;
    52. String DevBufferRemoteAddrMACStr;
    53. String DevBufferPort;
    54. String DevBufferNumberDecStr;
    55. String DevBufferMACSearchStr;
    56. String DevBufferCommandStr;
    57. String DevBufferReaderStr;
    58. String DevBufferDoorNoStr;
    59. String DevBufferDelayStr;
    60. String DevBufferPasswPropStr;
    61. String DevBufferPassWStr;
    62. String DevBufferQrcodeInfStr;
    63. int j;
    64. byte [] bbuf = new byte [1024]; /**3、预先创建接收数据存放的位置,封装*/
    65. DatagramPacket rdp = new DatagramPacket(bbuf,bbuf.length);
    66. s.receive(rdp); /**4、使用receive阻塞式接收*/
    67. String ReceiveDataStr=new String(rdp.getData());
    68. String RemoteHostIP=rdp.getAddress().getHostAddress();
    69. int RemotePort=rdp.getPort();
    70. System.out.println("From ip::"+rdp.getAddress().getHostAddress()+"\nport::"+rdp.getPort()+"\ndata::"+ReceiveDataStr+"\n\n");
    71. String[] strArr = ReceiveDataStr.split("\\,"); /*分割接收到的数据后再分析、处理、返回指令 */
    72. switch(strArr[0]){
    73. case "100": /*设备接收到搜索指令后返回的设备信息*/
    74. if(strArr.length<9){
    75. DevBufferIpAddrStr= strArr[1]; /*终端IP*/
    76. DevBufferMaskStr= strArr[2]; /*掩码*/
    77. DevBufferGatewayStr= strArr[3]; /*网关*/
    78. DevBufferRemoteAddrStr= strArr[4]; /*远程服务器IP*/
    79. DevBufferPort= strArr[5]; /*端口*/
    80. DevBufferNumberDecStr= strArr[6]; /*设备序号*/
    81. }else{
    82. DevBufferIpAddrStr= strArr[1]; /*终端IP*/
    83. DevBufferMaskStr= strArr[2]; /*掩码*/
    84. DevBufferGatewayStr= strArr[3]; /*网关*/
    85. DevBufferGatewayStrMAC= strArr[4]; /*网关MAC*/
    86. DevBufferRemoteAddrStr= strArr[5]; /*远程服务器IP*/
    87. DevBufferRemoteAddrMACStr= strArr[6]; /*远程服务器IPMAC*/
    88. DevBufferMACSearchStr= strArr[7]; /*MAC搜索标识*/
    89. DevBufferPort= strArr[8]; /*端口*/
    90. DevBufferNumberDecStr= strArr[9]; /*设备模块序号*/
    91. if(strArr.length>10){
    92. DevBufferSerialNumStr= strArr[10]; /*设备唯一硬件序号*/
    93. }
    94. if(DevBufferRemoteAddrStr.compareTo("255.255.255.255")!=0 && DevBufferRemoteAddrStr.compareTo(MyIpAdd)!=0 ){
    95. System.out.println("消费机的远程服务器IP不是指向当前网卡,请在消费机上 功能1>\7IP地址及端口设定 设定正确的网络参数!\n\n");
    96. int Netcode=0;
    97. Netcode=Netcode+1; //+1 表示服务器MAC自动搜索 否则服务器MAC锁定
    98. Netcode=Netcode+2; //+2 表示网关MAC自动搜索 否则网关MAC锁定
    99. Netcode=Netcode+4; //+4 表示DHCP可自动获取IP 否则指定IP
    100. Netcode=Netcode+8; //+8 表示允许存储自动获取可用的IP 否则不存储
    101. //根据现场的网络环境修改以下网络参数并传送到消费机上
    102. //修改设备网络参数 消费机IP 掩码 网关 网关MAC 远程服务器IP(广播) 远程服务器MAC IP获取方式及MAC搜索方式 通讯端口 设备模块序号
    103. SendInfStr="004,"+DevBufferIpAddrStr+","+DevBufferMaskStr+","+DevBufferGatewayStr+","+DevBufferGatewayStrMAC+",255.255.255.255,"+DevBufferRemoteAddrMACStr+","+ Integer.toString(Netcode).trim()+","+DevBufferPort+","+DevBufferNumberDecStr ;
    104. SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort); //修改消费机网络参数的指令
    105. }
    106. }
    107. break;
    108. case "101": /*有设备开机的信号*/
    109. DevRecFramesStr = strArr[1]; /*包序列号 */
    110. DevBufferIpAddrStr = strArr[2]; /*终端IP */
    111. DevBufferRemoteAddrStr = strArr[3]; /*远程电脑指机IP*/
    112. DevBufferMachinStr = strArr[4]; /*机号*/
    113. DevBufferDatetimeStr = strArr[5]; /*日期时间*/
    114. if(strArr.length>6){ /*2018年以后的设备有唯一硬件序号*/
    115. DevBufferSerialNumStr=strArr[6];
    116. }
    117. SendInfStr="001,"+DevRecFramesStr; /*向设备发此数据表示已收到信息,否则设备会连续发三次*/
    118. SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);
    119. String SysNowTime=GetSysDT(); /*取系统时间*/
    120. if(DevBufferDatetimeStr.substring(0,16).compareTo(SysNowTime.substring(0,16))!=0){
    121. SendInfStr="003,"+DevBufferMachinStr+","+SysNowTime; /*设备时钟与系统不符,更新设备时间*/
    122. SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);
    123. }
    124. break;
    125. case "150": /*接收到实时考勤门禁机刷卡数据*/
    126. DevRecFramesStr = strArr[1]; /*包序列号 */
    127. DevBufferIpAddrStr = strArr[2]; /*终端IP */
    128. DevBufferRemoteAddrStr = strArr[3]; /*远程电脑指机IP*/
    129. DevBufferMachinStr = strArr[4]; /*机号*/
    130. DevBufferCardidStr= strArr[5]; /*卡号*/
    131. DevBufferReaderStr= strArr[6]; /*读头号*/
    132. DevBufferDoorNoStr= strArr[7]; /*门或继电器号*/
    133. DevBufferDelayStr= strArr[8]; /*门磁未关秒数,0表示已关*/
    134. DevBufferPasswPropStr= strArr[9]; /*密码属性(0密码无效,1刷卡后按密码,2补签密码,3开门密码,4防迫胁密码)*/
    135. DevBufferPassWStr= strArr[10]; /*密码(最多8位数字)*/
    136. DevBufferUseTimeStr= strArr[11]; /*刷卡时间*/
    137. if(strArr.length>12){ /*2018年以后的设备有唯一硬件序号*/
    138. DevBufferSerialNumStr=strArr[12];
    139. }
    140. SendInfStr="001,"+DevRecFramesStr; /*向设备发此数据表示已收到信息,否则设备会连续发三次*/
    141. SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);
    142. /*用050指令返回开门成功,051指令返回开门失败,正式系统开发时要有重发机制 */
    143. /*SendInfStr="051," + DevBufferMachinStr + "," + DevBufferCardidStr+ ",卡号:"+DevBufferCardidStr+"\\n姓名:张三丰 \\n状态:状态:无效卡\\n,20,1,3" */
    144. SendInfStr="050," + DevBufferMachinStr + "," + DevBufferCardidStr+ ",卡号:"+DevBufferCardidStr+"\\n姓名:张三丰 \\n状态:欢迎关临\\n,20,1,0," + DevBufferReaderStr + "," + DevBufferDoorNoStr + ",5,20" ;
    145. SendInfToDiv(s,SendInfStr,RemoteHostIP,RemotePort);
    146. default: //更多的指令说明请参看通讯协议说明
    147. }
    148. }
    149. s.close(); /**5、关闭资源*/
    150. }
    151. /*---------------------------------------------------------------------------------------------------------电脑向设备回复信息*/
    152. static void SendInfToDiv(DatagramSocket s,String Sendinf,String RemoIp,int RemoPro) throws Exception{
    153. //DatagramSocket s1 = new DatagramSocket(0); /** 1、建立udp socket端点 */
    154. byte[] SendBuf = Sendinf.getBytes("gb2312"); /** 2、提供发送数据,封装打包 */
    155. DatagramPacket dp1 = new DatagramPacket(SendBuf, SendBuf.length, InetAddress.getByName(RemoIp), RemoPro);
    156. try {
    157. s.send(dp1);
    158. System.out.println("SendTo ip::"+RemoIp+"\nport::"+String.valueOf(RemoPro)+"\ndata::"+Sendinf+"\n\n");
    159. } catch (IOException e) {
    160. System.out.println("发送失败: ");
    161. e.printStackTrace();
    162. }
    163. //s1.close();
    164. }
    165. /*---------------------------------------------------------------------------------------------------------判断字符串是不是一个日期时间格式*/
    166. static boolean IsDateTime(String inputstr) {
    167. Date date=null;
    168. SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    169. try{
    170. date=formatter.parse(inputstr);
    171. return true;
    172. }catch (Exception e) {
    173. return false;
    174. }
    175. }
    176. /*--------------------------------------------------------------------------------------------------------------------取电脑系统日期时间*/
    177. static String GetSysDT() {
    178. Date date=new Date();
    179. SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    180. String TimeStr=formatter.format(date);
    181. return TimeStr;
    182. }
    183. /*----------------------------------------------------------------------------------------------------------------------------取电脑IP*/
    184. public static String getIP() {
    185. Enumeration netInterfaces;
    186. ArrayList IpAddList = new ArrayList();
    187. try {
    188. netInterfaces = NetworkInterface.getNetworkInterfaces(); // 拿到所有网卡
    189. InetAddress ip;
    190. while (netInterfaces.hasMoreElements()) {
    191. NetworkInterface ni = netInterfaces.nextElement();
    192. Enumeration addresses = ni.getInetAddresses();
    193. while (addresses.hasMoreElements()) {
    194. ip = addresses.nextElement();
    195. if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(':') == -1) {
    196. IpAddList.add(ip.getHostAddress());
    197. System.out.println((IpAddList.size() - 1) + "" + " " + ni.getName() + " " + ip.getHostAddress());
    198. }
    199. }
    200. }
    201. } catch (Exception e) {
    202. }
    203. if (IpAddList.isEmpty()) {
    204. return "127.0.0.1";
    205. } else {
    206. return IpAddList.get(1); //如有多张网卡,请选择与设备相连的网卡,否则无法与设备正常通讯
    207. }
    208. }
    209. }

     

  • 相关阅读:
    优橙内推天津专场——5G网络优化(中高级)工程师
    枚举类型的使用
    Nginx 通过A域名代理B域名,保持A域名访问状态
    数据可视化(一)
    canal
    FIND_IN_SET 聚合使用
    中电金信:深度解析|数字化营销运营体系搭建
    mysql查询条件字段值末尾有空格也能查到数据问题
    浅谈企业中台商业模式及建设思路
    基础安全:CSRF攻击原理与防范
  • 原文地址:https://blog.csdn.net/zhangjin7422/article/details/134458264