Go Down

Topic: Arduino cliente comunicar com PHP via GET (Read 452 times) previous topic - next topic

IvanRufino

Estou tendo dificuldade para comunicar com Web service em PHP.

Tenho no meu PC instalado WAMP SERVER 3.0.6 e o código funciona quando utilizo local, aqui no meu PC quando tento usar o endereço na internet não funciona de jeito nenhum. já criei outro arquivo em outro endereço de hospedagem não consigo com o arduino, consigo acessar o Web Service com outras aplicações ou manualmente.

Se alguém puder me ajudar.

Segue a baixo um código que se funcionar nele consigo aplicar a solução no meu código.

A diferença e que quando uso aqui com WAMP eu utilizo:
byte servidor[] = { 192, 168, 0, 29 };  //Endereço WebService
int porta 9999

Ao invés de
char server[] = "controlefull.000webhostapp.com";


Utilizo:
Arduino uno
Arduino Ethernet Shield W5100
internet: 15M net Virtua
Win 8.1


//--------------------------------------------


#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "controlefull.000webhostapp.com";    //
IPAddress ip(192, 168, 0, 177);
EthernetClient client;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;
  }

 if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
   Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");
}

void loop() {

    if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET /login/statusplaca.php?equipamento=1&status=9");

  } else {
    Serial.println("connection failed");
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    while (true);
  }
  delay(1000);
}
//--------------------------------------------------------




Código do php.( Bem simples )


<?php            
            //Inicia Ações
      pegarGet();      
            
      //fubção para Pegar GET's
      function pegarGet(){
      include 'conecta.php';      
         
      $equipamento=$_GET['equipamento'] ?? '1';
      $status = $_GET['status'] ?? '9';
      $sql1 = $dbcon->query("UPDATE monitoramento SET   ativo = '$status' WHERE equipamento = '$equipamento'");
      
      if($sql1) {
           echo " - Registro_ok";
      } else {
           echo " - Registro_erro";
      }
      }
?>


horace

#1
Feb 03, 2018, 07:42 am Last Edit: Feb 03, 2018, 07:52 am by horace
I have found when attempting to connect to external web sites the first attempt sometimes fails
if so I wait a few seconds and attempt again - if it fails 10 times I give up

see post #23 of
http://forum.arduino.cc/index.php?topic=525702.new#new
for an example using WiFi

IvanRufino

A baixo meu código completo o que realmente estou tentando usar.

já adicionei tempo a cada situação, já tentei colocar HTTP/1.1 no final do meu GET ou a baixo ou antes, já tentei colocar o meu GET uma parte em cada linha, com println ou somente print, já tentei fazer outro web service em um site diferente.

quando executa ele entra na condição de conectado, mais ele fala com minha pagina em php, porque mesmo que eu abra ela sem passar parâmetros ela muda os valores da minha tabela e isso não esta acontecendo.


Alguém tem alguma ideia do que posso fazer?????



//----------------------------------------------------------
#include <SPI.h>
#include <Ethernet.h>

//declarando Variaveis
  long previousMillis = 0;  // Variável de controle do tempo
  long tempoInterval = 5000;  // Intervalo entre atualizações no Banco
  int quantidadeReles = 14;  //quantidade de reles
  int equipamento = 1;  //definindo ID do equipamento
  int aberto = 0; //estado do rele que aciona a conexao com o banco dados

//Definindo Reles
//rele01
  const int rele1 = 3;
  int estadorele1 = 0;
//rele02
  const int rele2 = 2;
  int estadorele2 = 0;
//rele03
  const int rele3 = A0;//4
  int estadorele3 = 0;
//rele04
  const int rele4 = A1;//5
  int estadorele4 = 0;
//rele05
  const int rele5 = A2;//6
  int estadorele5 = 0;
//rele06
  const int rele6 = A3;//7
  int estadorele6 = 0;
 
 
//rele07
  const int rele7 = A5;//9
  int estadorele7 = 0;
//rele08
  const int rele8 = 4;
  int estadorele8 = 0;
//rele9
  const int rele9 = 5;
  int estadorele9 = 0;
//rele10
  const int rele10 = 6;
  int estadorele10 = 0;
//rele11
  const int rele11 = 7;
  int estadorele11 = 0;
//rele12
  const int rele12 = 8;
  int estadorele12 = 0;
//rele13
  const int rele13 = 9;
  int estadorele13 = 0;


//declarando dados de rede
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
  IPAddress ip(192, 168, 0, 99); // ip in lan
  IPAddress gateway(192, 168, 0, 1); // internet access via router
  IPAddress subnet(255,255,255,0); //subnet mask
 //byte ip[] = { 192, 168, 0, 99 };  //Ip da Placa
 //byte servidor[] = { 192, 168, 0, 29 };  //Endereço WebService local
  const char servidor[] = "controlefull.000webhostapp.com";
 
  int portaweb = 80;
  EthernetClient client; //Tipo de Serviço a ser utilizado

 
void setup() {
  definindoPortas();  //Função que define o tipo e numero de cada porta
  iniciandoComunicacaoSerial();  //Inicializa Comunicação Monitor Serial
  Ethernet.begin(mac, ip);  //iniciando protocolo de rede
  delay(3000); //Tempo de espera antes de começar os processos
} // fim do setup

void loop() {
  atualizarStatus();
} // fim do loop

//Inicio das Funções
void atualizarStatus(){
  unsigned long currentMillis = millis(); //Tempo atual em ms
  //Lógica de verificação do tempo
  if (currentMillis - previousMillis > tempoInterval) {
    previousMillis = currentMillis; // Salva o tempo atual
    informaPlacaAtiva();
  }else{
    //Para Não   
  }
    //executa constantemente na Função
    verificarPortas();  //Verifica se existe algum rele aberto
}

void informaPlacaAtiva(){
  if (client.connect(servidor, portaweb)) {
    Serial.println("conectado");
    //manda informações para WebService
    client.println("GET /login/statusplaca.php?equipamento=1&status=9 HTTP/1.0");
//    client.print("equipamento=");
//    client.print(equipamento);
//    client.print("&status=");
//    client.println("1");
      client.stop();
    Serial.println("Placa Ativa");
  }else { //caso de erro ao se conectar
    client.stop(); //Finaliza conexão
    Serial.println("falha na conexao - informar placa ativa");
    delay(5000); //Tempo de espera antes de tentar conectar novamente     
  }
}
 
void conexao(String i){
  if (client.connect(servidor, portaweb)) {
    Serial.println("conectado");
    //manda informações para WebService
    client.print("GET /login/salvardados.php?");
    client.print("equipamento=");
    client.print(equipamento);
    client.print("&porta");
    client.print("=");
    client.print(i);
    client.print("&status=");
    client.println("0");
    client.stop();
  }else {//caso de erro ao se conectar
    client.stop(); //Finaliza conexão
    Serial.println("falha na conexao - informar placa ativa");
    delay(5000); //Tempo de espera antes de tentar conectar novamente     
  }
}
 
void verificarPortas(){
  int reles[quantidadeReles]; //Variavel com array contendo status de cada rele
  String ri;  //Armazena i como string
  //Criando array e setando valores
  reles[1] = digitalRead(rele1);
  reles[2] = digitalRead(rele2);
  reles[3] = digitalRead(rele3);
  reles[4] = digitalRead(rele4);
  reles[5] = digitalRead(rele5);
  reles[6] = digitalRead(rele6);
  reles[7] = digitalRead(rele1);
  reles[8] = digitalRead(rele8);
  reles[9] = digitalRead(rele9);
  reles[10] = digitalRead(rele10);
  reles[11] = digitalRead(rele11);
  reles[12] = digitalRead(rele12);
  reles[13] = digitalRead(rele13);

 
    for (int i=1; i <= quantidadeReles; i++){
      if(reles == aberto){
        ri = String(i); //variavel contendo valor de i como String
        conexao(ri);  //Chama função que atualiza status
      }
    }
}
 
void definindoPortas(){ 
  pinMode(rele1, INPUT);
  pinMode(rele2, INPUT);
  pinMode(rele3, INPUT);
  pinMode(rele4, INPUT);
  pinMode(rele5, INPUT);
  pinMode(rele6, INPUT);
  pinMode(rele7, INPUT);
  pinMode(rele8, INPUT);
  pinMode(rele9, INPUT);
  pinMode(rele10, INPUT);
  pinMode(rele11, INPUT);
  pinMode(rele12, INPUT);
  pinMode(rele13, INPUT);

}
 
void iniciandoComunicacaoSerial(){
  Serial.begin(9600);
}

robtillaart

Please please please please please use code tags.
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

IvanRufino

Desculpe,

Sou novo aqui no fórum.
e não tenho muita experiencia com arduino.

Não entendi o que quis dizer com

Please please please please please use code tags.

IvanRufino

Resolvi desta maneira:


//---------------------------

#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//byte mac[] =   {0xf0, 0x1f, 0xaf, 0x33, 0x62, 0x2f };
 
IPAddress ip(192,168,0,101);
EthernetClient client;
char server[] = "controlefull.000webhostapp.com";
 
void setup()
{
  Serial.begin(9600);
 
  // attempt a DHCP connection:
  Serial.println("Attempting to get an IP address using DHCP:");
  if (!Ethernet.begin(mac)) {
    // if DHCP fails, start with a hard-coded address:
    Serial.println("failed to get an IP address using DHCP, trying manually");
    Ethernet.begin(mac, ip);
  }
 
  Serial.print("My address:");
  Serial.println(Ethernet.localIP());
}
 
 
void loop()
{
    // connect to the server
    if (client.connect(server, 80))
    {
        // print to serial monitor
        Serial.println("connected...");
        Serial.println("ARDUINO: forming HTTP request message");
 
        // send data the server through GET request
        client.print("GET /statusplaca.php?equipamento=1&status=7");
        client.println(" HTTP/1.1");
        client.print("HOST: ");
        client.println(server);
        client.println();
 
        Serial.println("ARDUINO: HTTP message sent");       
 
        // give server some time to receive and store data
        // before asking for response from it
        delay(1000);
 
        // get the response from the page and print it to serial port
        // to ascertain that data was received properly
        if(client.available())
        {
            while(client.available())
            {
                char c = client.read();
                Serial.print(c);
            }
        }
        else
        {
            Serial.println("ARDUINO: no response received / no response received in time");
        }
 
        client.stop();
    }
    // do nothing forever after:
    while(true);
}

tecdiego

Deixa eu ver se eu entendi, você quer que o Arduino enviei uma informação para um servido web que está na sua casa?
Já verificou se a operadora libera a porta 80?
Normalmente eu configuro o apache para 8080!
Tenta isso e depois me avisa!
Coloca esse código:
Code: [Select]

Serial.println("conectado");
client.println("HTTP/1.1 200 OK");//acrescenta essa linha após imprimir conectado

Go Up