【问题标题】:Arduino UNO, C3300 + PHP Webservice challengeArduino UNO、C3300 + PHP Webservice 挑战
【发布时间】:2014-12-01 01:59:13
【问题描述】:

我正在开发一个带有 CC3000 WiFi 扩展板的 Arduino UNO 项目。

我已经到了可以毫无问题地发布到本地托管网络服务器(使用 MAMP 测试)的地步,但我似乎找不到发布到远程服务器的正确方法 - 我已经尝试了两种不同的方法(参见下面的代码),但似乎没有一种方法可以正确地发布到 Web 服务和数据库。

我想知道是否需要使用其他类型的连接,或者GET 请求是否有错误。

这是 Arduino 草图代码。 PHP 文件sensor.php 然后接收occupied=VALUE,然后将其传递给连接的 MySQL 数据库。 PHP文件在直接加载路径时有效,所以我很确定这是一个Arduino问题而不是服务器端问题。

提前致谢!

// Include required libraries
#include <Adafruit_CC3000.h>
#include <SPI.h>
#include <elapsedMillis.h>

// Define CC3000 chip pins
#define ADAFRUIT_CC3000_IRQ   3
#define ADAFRUIT_CC3000_VBAT  5
#define ADAFRUIT_CC3000_CS    10

#define WLAN_SSID       "NAME_OF_WIFI"        // cannot be longer than 32 characters!
#define WLAN_PASS       "XXXXXXXXX"
#define WLAN_SECURITY   WLAN_SEC_WPA2

//#define WEBSITE "http://www.webservice.com"
//#define SENSORPATH "/hello/sensor.php?"

// Create CC3000 & DHT instances
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
                                         SPI_CLOCK_DIV2);

// Local server IP, port, and repository (change with your settings !)
uint32_t ip = cc3000.IP2U32(XXX,XXX,X,XX);

int port = 8888;
String repository = "hello/";

int ledPin = 8;   // choose the pin for the LED
int ledPinSecond = 7;  
int inputPin = 2;              // choose the input pin (for PIR sensor)
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;   // variable for reading the pin status
String occupied;         

void setup(void)
{
  Serial.begin(115200);
  Serial.println("Wroom wroom start it up!");

  pinMode(ledPin, OUTPUT);    // declare LED as output
  pinMode(ledPinSecond, OUTPUT);    
  pinMode(inputPin, INPUT);     // declare sensor as input 

  // Initialise the CC3000 module
  if (!cc3000.begin())
  {
    Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
    while(1);
  }

  // Connect to  WiFi network
  char *ssid = WLAN_SSID;             /* Max 32 chars */
  Serial.print(F("\nAttempting to connect to ")); Serial.println(ssid);
  cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY);
  Serial.println("Connected to WiFi network!");

   if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
   Serial.println(F("Failed to connect to WiFi"));
   while(1);
  }  

  // Check DHCP
  Serial.println(F("Request DHCP"));
  while (!cc3000.checkDHCP())
  {
     Serial.println(F("DHCP requested - starting the void"));
    delay(3000);
  }  

}
void loop(void)
{
  //Adafruit_CC3000_Client www = cc3000.connectTCP(ip, 80);
 // if (www.connected()) {

  //  www.println(F("GET "));
  //  www.println(SENSORPATH);
   // www.println(F(" HTTP/1.0\r\n"));
   // www.println(F("Host: ")); 
   // www.println(WEBSITE); 
   // www.println(F("\n"));
   // www.println(F("Connection: close\n"));
   // www.println(F("\n"));
   // www.println();

   // Serial.println(F("Inserted data\n"));

  //} else {
  //  Serial.println(F("Testing: Connection failed"));    
  //  return;
  //}

    // Check connection, reset if connection is lost
   if(!cc3000.checkConnected()){while(1){}}

   val = digitalRead(inputPin);  // read input value
   Serial.print(F("Starting to detect motion"));
   //Detect motion 
    if (val == HIGH) {            // check if the input is HIGH
    digitalWrite(ledPin, LOW);  // turn LED ON
    digitalWrite(ledPinSecond, HIGH);
    occupied = "Occupied";
    delay(150);

    if (pirState == LOW) {
      // we have just turned on
      Serial.println(F("Motion detected!"));
      // We only want to print on the output change, not state
      pirState = HIGH;
       } 
     } else {
      digitalWrite(ledPin, HIGH); // turn LED OFF
      digitalWrite(ledPinSecond, LOW);
      occupied = "Free";
      delay(150);    

      if (pirState == HIGH){
      // we have just turned off
      Serial.println(F("Motion ended!"));
      // We only want to print on the output change, not state
      pirState = LOW;
      }  
    }

    Serial.print(F("Room state: "));
    Serial.println(occupied);
    // Send request
    String request = "GET www.webservice.com/"+ repository + "sensor.php?occupied=" + occupied + " HTTP/1.0\n";
    Serial.println(request);
    send_request(request);

    delay(1000);
    // Update every second

}

// Function to send a TCP request and get the result as a string
void send_request (String request) {

    // Connect    
    Serial.println("Starting connection to server...");
    Adafruit_CC3000_Client client = cc3000.connectTCP(ip, port);

    // Send request
    if (client.connected()) {
      client.println(request);      
      client.println(F(""));
      Serial.println("Connected & Data sent");
    } 
    else {
      Serial.println(F("Connection failed"));    
    }

    while (client.connected()) {
      while (client.available()) {

      // Read answer
      char c = client.read();
      }
    }
    Serial.println("Closing connection");
    Serial.println("");
    client.close();
}

这是一个日志

Wroom wroom start it up!

Attempting to connect to WiFi
Connected to WiFi network!
Request DHCP
DHCP requested - starting the void
Starting to detect motionRoom state: Free
GET www.webservice.com/hello/sensor.php?occupied=Free HTTP/1.0

Starting connection to server...
Connected & Data sent
Closing connection

Starting to detect motionRoom state: Free
GET www.webservice.com/hello/sensor.php?occupied=Free HTTP/1.0

Starting connection to server...
Connected & Data sent
Closing connection

Starting to detect motionRoom state: Free
GET www.webservice.com/hello/sensor.php?occupied=Free HTTP/1.0

Starting connection to server...
Connected & Data sent
Closing connection

Starting to detect motionRoom state: Free
GET www.webservice.com/hello/sensor.php?occupied=Free HTTP/1.0

Starting connection to server...
Connected & Data sent
Closing connection

Starting to detect motion
Room state: Free
GET www.webservice.com/hello/sensor.php?occupied=Free HTTP/1.0

Starting connection to server...
Connected & Data sent
Closing connection

Starting to detect motion
Motion detected!
Room state: Occupied
GET www.webservice.com/hello/sensor.php?occupied=Occupied HTTP/1.0

Starting connection to server...
Connected & Data sent
Closing connection

Starting to detect motion
Room state: Occupied
GET www.webservice.com/hello/sensor.php?occupied=Occupied HTTP/1.0

Starting connection to server...
Connected & Data sent
Closing connection

【问题讨论】:

  • 你有日志让我们看看吗?
  • @Namphibian 当然。很抱歉首先没有包括在内。开始。 Attempting to connect to WiFi Connected to WiFi network! Request DHCP DHCP requested Starting to detect motion Room state: Free GET www.webservice.com/hello/sensor.php?occupied=Free HTTP/1.0 Starting connection to server... Connected &amp; Data sent Closing connection 正如你所看到的,Arduino 循环脚本就像它应该做的那样,尽管 GET 从未真正发布到 Web 服务 - 这意味着它永远不会到达它。
  • 检查您在服务器上的访问日志
  • 在你的循环中while (client.connected()) { while (client.available()) { // Read answer char c = client.read(); } } 你没有记录任何暗示这绝对是arduino的连接问题。
  • 我不太了解该库,但您的草图中似乎缺少sendData(client,data,buffer_size); 命令。请参阅此链接:learn.adafruit.com/downloads/pdf/…。因此,当您连接时,您实际上并没有发送数据。

标签: php mysql web-services arduino arduino-uno


【解决方案1】:

也许您的服务器不喜欢 HTTP 1.0。如果您只想发送请求而不关心服务器的响应,请尝试使用带有标头 Connection: Closed 的 HTTP/1.1。

GET /hello/sensor.php?occupied=Free HTTP/1.1
Host: www.webservice.com
Connection: closed

否则,您应该使用Connection: keep-alive,因此请求实际上等待服务器响应,然后您就可以使用您的这部分 sn-p 读取它

// ...
while (client.connected()) {
  while (client.available()) {

  // Read answer
  char c = client.read();
  }
}
// ...

P.S.:请考虑检查自己是否可以访问该 url。只是为了确定这是一个 Arduino 问题。

【讨论】:

  • 请尝试解释为什么这个答案会起作用。我不想看到一个有效的答案被标记为低质量!
猜你喜欢
  • 1970-01-01
  • 2015-08-15
  • 2014-09-21
  • 2011-04-18
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
相关资源
最近更新 更多