mysql — Arduino UNO, C3300 + PHP веб-сервис вызов

Я работаю над проектом Arduino UNO с WiFi-щитом CC3000.

Я дошел до того, что я без проблем могу отправлять сообщения на локально размещенный веб-сервер (протестирован с MAMP), но я не могу найти правильный способ отправки сообщений на удаленный сервер — я пробовал два разных подходы (см. код ниже), но ни один из них, кажется, не правильно отправляет сообщения в веб-службу и базу данных.

Мне интересно, нужно ли мне использовать другой тип соединения, или есть ошибка с GET запрос.

Это код Arduino Sketch. 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

4

Решение

Может быть, ваш сервер не любит HTTP 1.0. Попробуйте использовать HTTP / 1.1 с заголовком Connection: Closed, если вы просто хотите отправить запрос и не заботитесь об ответе сервера.

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

В противном случае вы должны использовать Connection: keep-alive так что запрос на самом деле ждать ответа сервера, и тогда вы сможете прочитать его, используя эту часть вашего фрагмента

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

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

П.С .: Подумайте сами, можете ли вы принять URL. Просто чтобы быть уверенным, что это проблема Arduino.

0

Другие решения

Других решений пока нет …