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进行MySQL删除记录操作代码
Jun 07 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
Apr 09 PHP
PHP数据库调用类调用实例(详细注释)
Jul 12 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
Jun 03 PHP
PHP多例模式介绍
Jun 24 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
php构造函数与析构函数
Apr 23 PHP
PHP使用内置函数生成图片的方法详解
May 09 PHP
Laravel框架实现多数据库连接操作详解
Jul 12 PHP
Laravel手动返回错误码示例
Oct 22 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
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
js实现返回顶部效果
2017/03/10 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
Node.js应用设置安全的沙箱环境
2018/04/23 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
用python制作个视频下载器
2021/02/01 Python
什么是抽象
2015/12/13 面试题
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
工商治理实习生的自我评价
2014/01/15 职场文书
自我介绍演讲稿
2014/01/15 职场文书
倡议书格式模板
2014/05/13 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
经典祝酒词大全
2015/08/12 职场文书
利用Python多线程实现图片下载器
2022/03/25 Python