PHP实现连接设备、通讯和发送命令的方法
本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:
开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:
1.采用phpsocket技术使用TCP/IP连接设备
参数$service_port连接端口
参数$address发送IP地址
参数$in发送命令
functionSend_socket_connect($service_port,$address,$in){
//创建TCP/IPsocket$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)ordie("couldnotcreatesocket!");
//设置超时时间
$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为返回值
functionSend_socket_xdcoder($service_port,$address,$in){
//创建TCP/IPsocket
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)ordie("couldnotcreatesocket!");
//设置超时时间
$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.采用phpsocket技术使用UDP协议连接设备,实现通讯和发送命令
参数$service_port连接端口
参数$address发送IP地址
参数$in发送命令
functionSend_socket_connect_udp($service_port,$address,$in){
//采用phpsocket技术使用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为返回值
functionSend_socket_xdcoder_udp($service_port,$address,$in){
//采用phpsocket技术使用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发送命令
functionrs232_connect($com,$baudrate,$in){
@set_time_limit(10);
//使用'windows下设置窜口参数';
exec("mode".$com."BAUD=".$baudrate."PARITY=nDATA=8STOP=1odsr=off");
//"打开端口串口$com";
$f=@fopen($com,'w+');
//判断串口是否正常打开
if(!$f){
//echo"<script>alert('Errorwhenopen$com!!');</script>";
die("Errorwhenopen$com");
}
//向串口发送数据;
fwrite($f,$in);
//关闭端口
fclose($f);
//串口操作结束
}
还有一个关于命令16进制转换的:
functionhexToStr($hex){
$string="";
for($i=0;$i<strlen($hex)-1;$i+=3){
$string.=chr(hexdec($hex[$i].$hex[$i+1]));
}
return$string;
}
希望本文所述对大家的php程序设计有所帮助。