使用Ethernet Shield作为Telnet服务器构建arduino项目 使用php telnet类连接到服务器几乎需要3秒才能加载
添加发送命令的时间范围为3到3.06秒 虽然arduino通过正常的telnet clinets很好地响应
我不知道问题究竟在哪里
这是我的arduino代码
#include <SPI.h>
#include <Ethernet.h>
#define MAX_CMD_LENGTH 25
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xE3, 0x5B };
IPAddress ip(169, 254, 7, 155);
IPAddress gateway(169, 254, 7, 1);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server = EthernetServer(23);
EthernetClient client;
boolean connected = false;
String cmd;
void setup()
{
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
pinMode(13, OUTPUT);
pinMode(7, INPUT_PULLUP);
}
void loop()
{
client = server.available();
if (client == true) {
if (!connected) {
client.flush();
connected = true;
server.println("--- Please Type on or off ---");
}
if (client.available() > 0) {
readTelnetCommand(client.read());
}
}
// check for input
if(digitalRead(7) == LOW) {
while(digitalRead(7) == LOW);
server.println("Input triggered :-)");
}
delay(10);
}
void readTelnetCommand(char c) {
if(cmd.length() == MAX_CMD_LENGTH) {
cmd = "";
}
cmd += c;
if(c == '\n') {
if(cmd.length() > 2) {
// remove \r and \n from the string
cmd = cmd.substring(0,cmd.length() - 2);
parseCommand();
}
}
}
void parseCommand() {
if(cmd.equals("quit")) {
client.stop();
connected = false;
} else if(cmd.equals("help")) {
server.println("--- Telnet Server Help ---");
server.println("on : switch on the Main Power");
server.println("off : switch off the Main Power");
server.println("quit : close the connection");
} else if(cmd.equals("on")) {
digitalWrite(13, HIGH);
server.println("--- Led Has Been Activated Ya FOX ---");
} else if(cmd.equals("off")) {
digitalWrite(13, LOW);
server.println("--- Led Has Been Deactivated Ya FOX ---");
} else {
server.println("Invalid command, type help");
}
cmd = "";
}
我正在使用我在GitHub上找到的这个类 Php Telnet class
这是我用来打开和关闭led的简单php脚本
<?php
require_once 'telnet.class.php';
$status = '';
$telnet = new Telnet();
if(!$telnet->connect())
{
echo "failed to connect";
}
if($_SERVER["REQUEST_METHOD"] == "POST")
{
if(isset($_POST["on"]))
{
$telnet->exec('on');
$status = "its ON";
}
if(isset($_POST["off"]))
{
$telnet->exec('off');
$status = "its OFF";
}
}
?>
<div id="controlshit">
<form action="test.php" method="post">
<div>
<input type="submit" value="on" name="on">
</div>
<div>
<input type="submit" value="off" name="off">
</div>
</form>
<div id="status">
<p><?php echo $status; ?></p>
</div>
</div>
答案 0 :(得分:0)
我发现了问题的确切位置...... 问题发生取决于每次发生请求时它连接的fsockopen的C层而不是我使用了一个持久性函数pfsockopen真正发生的事情是pfsockopen连接速度更快并且在请求期间始终保持连接处于活动状态
答案 1 :(得分:0)