Avatar billede steen-h Mester
28. maj 2016 - 06:43 Der er 4 kommentarer og
2 løsninger

Arduino http request user-agent

Jeg har et problem med mit arduino project.
Jeg har et gsm modul hvor jeg lægger data i en database. Det har virket fint i flere år men nu har unoeuro strammet op på sikkerheden.
De siger at mit problem er at jeg ikke angiver en korrekt user-agent i koden.

Jeg har løst problemet et par gange med at slå deres sikkerhed fra men vil gerne lave en varig løsning med at angive en korrekt user-agent.

Men jeg kan ikke finde ud af hvordan jeg gør det.

Her er min kode

 


void ShowSerialData()
{
    while(gprsSerial.available()!=0)
        Serial.write(gprsSerial.read());
}


void ShowSerialData2(unsigned long duration){
    unsigned long startTime = millis();

    while(millis() - startTime  < duration){
        while(gprsSerial.available()){
          Serial.write(gprsSerial.read());
        }
    }
}







  gprsSerial.println("AT+CPIN?");
  delay(2000);
  ShowSerialData();

  gprsSerial.println("AT+CSQ");
  delay(2000);
  ShowSerialData();

  gprsSerial.println("AT+CREG=1");
  delay(5000); // Kan ikke skabe forbindelse til nettet uden dette delay
  ShowSerialData();

  gprsSerial.println("AT+CGATT?");  //Attach or Detach from GPRS Service (Result  1 = Attach , 2 = Detached )
  delay(3000);

  gprsSerial.println("AT+CSTT=\"internet\"");//start task and setting the APN,
  delay(2000);
  ShowSerialData();   

  gprsSerial.println("AT+CIICR");//bring up wireless connection
  delay(2000);
  ShowSerialData();
   
  gprsSerial.println("AT+CIFSR");//get local IP adress
  delay(2000);
  ShowSerialData();

  gprsSerial.println("AT+CIPSPRT=0");
  delay(300);
  ShowSerialData();

  gprsSerial.println("AT+CIPSTART=\"TCP\",\"www.minside.dk\",\"80\"");//start up the connection
  delay(4000);

  gprsSerial.println("AT+CIPSEND");//begin send data to remote server
  delay(3000);
   
  gprsSerial.print("GET /arduino/time.php");
  delay(10);

  gprsSerial.print(" HTTP/1.0\r\n");
  delay(500);

  gprsSerial.print("Host: www.minside.dk");
  delay(500);

  gprsSerial.print("\r\n\r\n");
  delay(500);

  gprsSerial.println((char)26);//sending
  gprsSerial.println();

  ShowSerialData2(15000);
Avatar billede erikjacobsen Ekspert
28. maj 2016 - 18:23 #1
Du kan formentlig bare:
gprsSerial.print("User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0");

... eller gi' dig ud for at være en anden browser.

Og så burde du måske også angive http 1.1 protokollen. Der er noget med at eksperten.dk - eller hvad den nu hedder - fjerner baglæns skråstreger fx foran r og n, men du ved hvad jeg mener:

gprsSerial.print(" HTTP/1.1\r\n");
Avatar billede arne_v Ekspert
29. maj 2016 - 00:16 #2
Hvis det web site insisterer på at det skal være en kendt browser, så er det den eneste løsning.

Hvis det web site kun insisterer på at der er en user-agent header, så ville jeg foretrække at bruge:

"User-Agent: Custom C program\r\n"

Hvilket:
1) er sandheden
2) aldrig bliver forældet
Avatar billede steen-h Mester
29. maj 2016 - 10:08 #3
gprsSerial.print("User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0");
giver følgende fejl

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>


#2
Virker fint.
Jeg vil undersøge hvilke krav unoeuro har, har selv haft de samme tanker.

arne_v læg et svar
Avatar billede erikjacobsen Ekspert
29. maj 2016 - 11:05 #4
Der manlger nok en \r\n  i min streng  (altså:  baglænsskråstreg-r-baglænsskråstreg-n )

Jeg forstår det som at man ikke længere lægger svar. Du kan udpege ethvert indlæg som en løsning.
Avatar billede steen-h Mester
31. maj 2016 - 19:41 #5
Jeg vil lige sige at det er et gsm modul med en SIM900

#4
Du har ret, dit forslag virkede også, ved ikke lige hvad der gik galt. Havde de 2 \r\n

Jeg har spurgt unoeuro hvad deres krav var.
De svarede:
Vi anbefaler at sætte en user-agent header, det er den bedste måde at gøre det på.

Så spurgte jeg:
Hvis jeg sætter en user-agent header med "User-Agent: Custom C program"
er det så en varig løsning ?

Da var svaret: Ja

Det er vel det jeg gør med de 2 løsninger.
Avatar billede erikjacobsen Ekspert
31. maj 2016 - 21:10 #6
Hmm. Ud over \r\n har du et sted opdelt en streng i 2, men lidt sleep imellem.

  gprsSerial.print("GET /arduino/time.php");
  delay(10);

  gprsSerial.print(" HTTP/1.0\r\n");
  delay(500);

Jeg er ikke klar over om det er nødvendigt i din opstilling, men min foreslåede user-agent string er jo ret lang. Måske skal den opdeles?  Eller du tager bare den korte version ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester