博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP实现连接设备、通讯和发送命令的方法
阅读量:5892 次
发布时间:2019-06-19

本文共 3945 字,大约阅读时间需要 13 分钟。

这篇文章主要介绍了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程序设计有所帮助。

转载地址:http://mqnsx.baihongyu.com/

你可能感兴趣的文章
关于mysql一边查一边更新
查看>>
ZOJ 3324 Machine
查看>>
HDU 2197 本原串
查看>>
归并排序:步骤讲解与代码实现
查看>>
如何在一台主机上管理自己的多个git repository
查看>>
[面试记录-附部分面试题]2014第一波的找工作的记录
查看>>
2015,平凡之路
查看>>
WEB前端基础知识
查看>>
Linux的分区类型
查看>>
心情笔记
查看>>
css动画-animation各个属性详解(转)
查看>>
CSS的盒子模型
查看>>
lavas安装
查看>>
地址总线 数据总线 和控制总线的作用
查看>>
微信群之Java技术红包问答
查看>>
BZOJ2663 [Beijing wc2012]灵魂宝石
查看>>
go面试题
查看>>
WS_CLIPCHILDREN与WS_CLIPSIBLINGS
查看>>
.NET 环境下运行tensorflow
查看>>
第二次结对编程作业——毕设导师智能匹配
查看>>