这篇文章主要介绍了PHP实现连接设备、通讯和发送命令的方法,涉及php基于socket实现设备连接及数据通信的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:
开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:
1. 采用php socket技术使用TCP/IP连接设备
参数$service_port 连接端口
参数$address 发送IP地址 参数$in 发送命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | function Send_socket_connect( $service_port , $address , $in ) { //创建 TCP/IP socket$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("could not create socket!"); //设置超时时间 $timeout = 2; $time = time(); //设置非阻塞模式 @socket_set_nonblock( $socket ); //超时判断 while (!@socket_connect( $socket , $address , $service_port )) { $err = socket_last_error( $socket ); // 连接成功,跳出循环 if ( $err === 10056) { break ; } //连接失败,判断超时时间,停止 if ((time() - $time ) >= $timeout ) { socket_close( $socket ); print ( '网络异常,请检查网络连接!!' ); exit (); } // 刷新频率(250毫秒) usleep(250000); } //设置阻塞模式 @socket_set_block( $socket ); //发送命令到设备 socket_write( $socket , $in , strlen ( $in )); //关闭连接 socket_close( $socket ); } |
Send_socker_xdcoder $buffer为返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | function Send_socket_xdcoder( $service_port , $address , $in ) { //创建 TCP/IP socket $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die ( "could not create socket!" ); //设置超时时间 $timeout = 2; $time = time(); //设置非阻塞模式 @socket_set_nonblock( $socket ); //超时判断 while (!@socket_connect( $socket , $address , $service_port )) { $err = socket_last_error( $socket ); // 连接成功 if ( $err === 10056) { break ; } //连接失败,判断超时时间,停止 if ((time() - $time ) >= $timeout ) { socket_close( $socket ); echo "<script>alert('网络异常,请检查网络连接!!');</script>" ; exit (); } // 刷新频率(250毫秒) usleep(250000); } //设置阻塞模式 @socket_set_block( $socket ); //发送命令到设备 socket_write( $socket , $in , strlen ( $in )); //接收设备命令返回数据 $buffer = socket_read( $socket , 1024, PHP_NORMAL_READ); //关闭连接 socket_close( $socket ); //输出返回值 return $buffer ; } |
2. 采用php socket技术使用UDP协议连接设备,实现通讯和发送命令
参数$service_port 连接端口
参数$address 发送IP地址 参数$in 发送命令 1 2 3 4 5 6 7 8 9 10 11 12 | function Send_socket_connect_udp( $service_port , $address , $in ) { //采用php socket技术使用UDP协议连接设备 $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); @socket_set_option( $socket , SOL_SOCKET, SO_RCVTIMEO, array ( "sec" => 2, "usec" => 0)); //发送命令 @socket_sendto( $socket , $in , strlen ( $in ), 0, $address , $service_port ); @socket_recvfrom( $socket , $buffer , 1024, MSG_WAITALL, $address , $service_port ); //关闭连接 if ( empty ( $buffer )) { echo "<script>alert('网络异常,请检查网络连接!!');</script>" ; } } |
Send_socket_xdcoder_udp $buffer 为返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function Send_socket_xdcoder_udp( $service_port , $address , $in ) { //采用php socket技术使用UDP协议连接设备 $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); @socket_set_option( $socket , SOL_SOCKET, SO_RCVTIMEO, array ( "sec" => 2, "usec" => 0)); //发送命令 @socket_sendto( $socket , $in , strlen ( $in ), 0, $address , $service_port ); @socket_recvfrom( $socket , $buffer , 1024, MSG_WAITALL, $address , $service_port ); //关闭连接 socket_close( $socket ); if (! empty ( $buffer )) { return $buffer ; } else { echo "<script>alert('网络异常,请检查网络连接!!');</script>" ; } } |
3. 采用RS232串口技术连接设备,实现通讯和发送命令
参数$com 串口号
参数$baudratr 波特率 参数$in 发送命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function rs232_connect( $com , $baudrate , $in ) { @set_time_limit(10); //使用 'windows下设置窜口参数'; exec ( "mode " . $com . " BAUD=" . $baudrate . " PARITY=n DATA=8 STOP=1 odsr=off" ); // "打开端口串口$com"; $f = @ fopen ( $com , 'w+' ); //判断串口是否正常打开 if (! $f ) { //echo "<script>alert('Error when open $com!!');</script>"; die ( "Error when open $com" ); } //向串口发送数据; fwrite( $f , $in ); //关闭端口 fclose( $f ); //串口操作结束 } |
还有一个关于命令16进制转换的:
1 2 3 4 5 6 7 | function hexToStr( $hex ) { $string = "" ; for ( $i = 0; $i < strlen ( $hex ) - 1; $i +=3) { $string .= chr (hexdec( $hex [ $i ] . $hex [ $i + 1])); } return $string ; } |
希望本文所述对大家的php程序设计有所帮助。