<?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";
?>
2 回答
如果你的意思是:“我有一个需要访问服务器串口的PHP应用程序”:PHP可以访问服务器上的串口(在本例中是你的覆盆子pi) . PHP将其视为普通文件 .
来自PHP Fopen page:
如果你的意思是:“我有一个网站,不知何故需要发送一些东西到客户端的串口”然后唯一的解决方案是浏览器应用程序 .
Chrome应用程序可以使用Chrome Serial API . Video Example
我想到了几个解决方案;基本上你会希望你的php页面解析数据并创建一个可以打印的 trusted 输出(即PDF文件,如果你的打印机支持这个) .
您的下一个任务是如何将此 trusted 输出发送到打印机 . 同样,存在几种解决方案 .
让您的php脚本执行系统可执行文件,例如
cat output.pdf > /dev/ttyxxx
(很明显,我不知道如何从unix打印) . 请注意,可执行文件完全不依赖于输入,即您希望降低注入攻击的风险等 . 这一点要求您创建的output.pdf值得信赖 .有一个cron-job查找输出文件并将它们发送到打印机 . 与上述相同的考虑适用 . 这可能更好,因为如果多个php会话试图打印文档,它可以避免瓶颈 .
围绕上面构建一个较小的框架,可以报告错误是否发生等等 . 但仍然,基本上选项1魔术 .
总而言之,将流程分为两个步骤 . 接受输入,解析和检查错误/恶意输入,并为打印机创建所需输出的人 . 这可以在受保护的环境中完成,如果被黑客入侵,则不会暴露系统(至少不会超过通常的php) . 然后,步骤2负责将输出发送到硬件,bash-script,executable或python .