PHP实现连接设备、通讯和发送命令的方法


Posted in PHP onOctober 13, 2015

本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:

开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:

1. 采用php socket技术使用TCP/IP连接设备

参数$service_port 连接端口
参数$address 发送IP地址
参数$in 发送命令

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为返回值

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 发送命令

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 为返回值

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 发送命令

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进制转换的:

function hexToStr($hex) {
  $string = "";
  for ($i = 0; $i < strlen($hex) - 1; $i+=3) {
    $string.=chr(hexdec($hex[$i] . $hex[$i + 1]));
  }
  return $string;
}

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
分享一个php 的异常处理程序
Jun 22 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
Dec 17 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
php禁用cookie后session设置方法分析
Oct 19 PHP
PHP实现负载均衡下的session共用功能
Apr 17 PHP
微信公众号开发之获取位置信息php代码
Jun 13 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 PHP
JS操作XML中DTD介绍及使用方法分析
Jul 04 PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
Oct 21 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
Jul 08 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 #PHP
JavaScript与HTML结合的基本使用方法整理
Oct 12 #PHP
apache和PHP如何整合在一起
Oct 12 #PHP
php实现Mysql简易操作类
Oct 11 #PHP
php实现微信公众平台账号自定义菜单类
Oct 11 #PHP
php实现微信公众号无限群发
Oct 11 #PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
Oct 10 #PHP
You might like
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
php 表单验证实现代码
2009/03/10 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
2014/11/06 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
初始Nodejs
2014/11/08 NodeJs
浅谈JavaScript函数节流
2014/12/09 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
js数字计算 误差问题的快速解决方法
2017/02/28 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
Python实现的多线程http压力测试代码
2017/02/08 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
银行办理业务介绍信
2014/01/18 职场文书
尽职尽责村干部自我鉴定
2014/01/23 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
2014年行政部工作总结
2014/11/19 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
护士业务学习心得体会
2016/01/25 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
python元组打包和解包过程详解
2021/08/02 Python