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