php连接arduino telnet服务器非常慢

时间:2014-02-19 19:27:54

标签: php sockets arduino telnet ethernet

使用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>

2 个答案:

答案 0 :(得分:0)

我发现了问题的确切位置...... 问题发生取决于每次发生请求时它连接的fsockopen的C层而不是我使用了一个持久性函数pfsockopen真正发生的事情是pfsockopen连接速度更快并且在请求期间始终保持连接处于活动状态

答案 1 :(得分:0)

你应该使用Socket,见here Telnet是一个不同的协议,可以提出一些问题,请参阅here