通过web与客户端串行端口通信


Communicateur with client-sided serial port through web

我的PHP网站有问题(它使用的是API,这就是为什么它必须是PHP)。

这个网站是在一个树莓pi b+上启动的,它连接到一个热敏打印机(通过串行端口),我使用了一个python脚本来测试打印机。

现在我的问题是:有可能通过网络发送数据来让树莓打印一些数据吗?那么,向客户端的端口"/dev/ttyxxx"发送写之类的指令?

感谢您的帮助

如果您的意思是:"我有一个PHP应用程序需要访问服务器的串行端口":PHP可以访问服务器上的串行端口(在本例中,是您的树莓派)。PHP将其视为一个普通文件。

从PHP Fopen页面:

<?php
// Set timeout to 500 ms
$timeout=microtime(true)+0.5;
// Set device controle options (See man page for stty)
exec("/bin/stty -F /dev/ttyS0 19200 sane raw cs8 hupcl cread clocal -echo -onlcr ");
// Open serial port
$fp=fopen("/dev/ttyS0","c+");
if(!$fp) die("Can't open device");
// Set blocking mode for writing
stream_set_blocking($fp,1);
fwrite($fp,"foo'n");
// Set non blocking mode for reading
stream_set_blocking($fp,0);
do{
  // Try to read one character from the device
  $c=fgetc($fp);
  // Wait for data to arive 
  if($c === false){
      usleep(50000);
      continue;
  }  
  $line.=$c;
}while($c!="'n" && microtime(true)<$timeout); 
echo "Responce: $line";  
?>

如果你的意思是:"我有一个网站,不知何故需要向客户端的串行端口发送一些东西"那么唯一的解决方案就是浏览器应用程序。

Chrome应用程序可以使用Chrome串行API。视频示例

我想到了几个解决方案;基本上,您希望php页面解析数据,并创建一个可以打印的可信输出(即PDF文件,如果您的打印机支持的话)。

您的下一个任务是如何将此可信输出发送到打印机。同样,存在几种解决方案。

  1. 让php脚本执行一个系统可执行文件,例如cat output.pdf > /dev/ttyxxx(这里很清楚,我不知道如何从unix打印)。请注意,可执行文件根本不依赖于输入,即您希望降低注入攻击等的风险。这一点要求您创建的output.pdf是可信的。

  2. 让cron作业查找输出文件并将其发送到打印机。与上述考虑因素相同。这可能会更好,因为如果多个php会话试图打印一个文档,它可以避免瓶颈。

  3. 围绕以上内容构建一个较小的框架,如果出现错误等,可以进行报告。但是,基本上是选项1+magic。

总而言之,将流程分为两个步骤。一个接受输入、解析和检查错误/恶意输入并为打印机创建所需输出的程序。这可以在受保护的环境中完成,如果被黑客入侵,不会暴露系统(至少不会比通常的php多)。然后,步骤2负责将输出发送到硬件,无论是bash脚本、可执行文件还是python。