Bonkers Napisano Grudzień 30, 2018 Udostępnij Napisano Grudzień 30, 2018 Witam, Mam problem z przesyłaniem informacji do shostowanej bazy danych. Bazę danych uruchomiłem na hostingu cba.pl, wcześniej przesyłałem dane do lokalnego serwera postawionego na xamppie i nie było z tym problemu. Całą procedurę wykonałem na podstawie tego co jest napisane w tym poradniku: https://electronicshobbyists.com/logging-data-to-database-using-arduino-ethernet-shield/ . Czy w podobny sposób można wykonać zapisywanie informacji do bazy na stronie, bo nie umiem jakoś do tego dojść czy to może wogóle działać. Wszystkie pliki .php, które wrzuciłem na stronę działają prawidłowo gdy się po przez nie wpisuje dane ręcznie. Jeżeli jednak chce je wpisać za pomocą arduino, to wtedy nie działa, chociaż pokazuje że jest połączenie. Próbowałem to też wykonać za pomocą tego poradnika: https://www.instructables.com/id/PART-1-Send-Arduino-data-to-the-Web-PHP-MySQL-D3js/ , ale też z marnym skutkiem. Miał ktoś kiedyś podobny problem? Poniżej wklejam fragmenty kodów dla obu przypadków. int SendToDatabase() { unsigned long cur_time = millis(); static unsigned long last_check; if(fabs(cur_time - last_check) >= 2*MIN) { if (cliente.connect("www.********.cba.pl", 80)) { //Connecting at the IP address and port we saved before if(resume_disp == 1 || resume_disp == 2) { Serial.println("connected"); cliente.print("GET /wr_data.php?"); //Connecting and Sending values to database cliente.print("temperature="); cliente.print(tempG, 1); cliente.print("&humidity="); cliente.print(humG); cliente.print("&pressure="); cliente.print(pressG); cliente.print("&temperature_out="); cliente.print(data.temperature, 1); cliente.print("&humidity_out="); cliente.print(data.humidity); cliente.print("&insolation="); cliente.print(data.insolation); cliente.print("&weather="); cliente.println(readWeatherEN(data)); } else { Serial.println("connected"); cliente.print("GET /wr_data.php?"); //Connecting and Sending values to database cliente.print("temperature="); cliente.print(tempG, 1); cliente.print("&humidity="); cliente.print(humG); cliente.print("&pressure="); cliente.println(pressG); } last_check = cur_time; cliente.stop(); //Closing the connection resume_connection = 1; return 1; } else { // if you didn't get a connection to the server: Serial.println("disconnected"); last_check += 5*SEK; resume_connection = 0; return ERR; } } return 0; } int SendToDatabase() { unsigned long cur_time = millis(); static unsigned long last_check; if(fabs(cur_time - last_check) >= 1*MIN) { if (cliente.connect("http://*********.cba.pl", 80)) { //Connecting at the IP address and port we saved before if(resume_disp == 1 || resume_disp == 2) { pdata = "temperature="+(int)tempG; pdata += "&humidity="+humG; pdata += "&pressure="+pressG; pdata += "&temperature_out=" + (int)data.temperature; pdata += "&humidity_out=" + data.humidity; pdata += "&insolation=" + data.insolation; pdata += "&weather=" + readWeatherEN(data); Serial.println("connected"); cliente.println("POST /add.php HTTP/1.1"); cliente.println("Host: http://*********.cba.pl"); // SERVER ADDRESS HERE TOO cliente.println("Content-Type: application/x-www-form-urlencoded"); cliente.print("Content-Length: "); cliente.println(pdata.length()); cliente.print(pdata); } last_check = cur_time; cliente.stop(); //Closing the connection resume_connection = 1; return 1; } else { // if you didn't get a connection to the server: Serial.println("disconnected"); last_check += 5*SEK; resume_connection = 0; return ERR; } } return 0; } Cytuj Link do komentarza Share on other sites More sharing options...
krzychb Grudzień 31, 2018 Udostępnij Grudzień 31, 2018 Wydaje mi się, że po nagłówku, przed przesłaniem danych "cliente.print(pdata)": cliente.print("Content-Length: "); cliente.println(pdata.length()); cliente.print(pdata); powinny być dwie nowe linie, a w kodzie widzę jedną. Zobacz na podobnym przykładzie. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Grudzień 31, 2018 Udostępnij Grudzień 31, 2018 @krzychbowszem, masz rację, wydaje Ci się 🙂 To dotyczy metody POST a nie GET (w tym przypadku dane są przesyłane w URL-u, wysyłanie danych po nagłówkach jest niedopuszczalne czyli content-length byłby zawsze równy 0. @Bonkers: prawidłowe minimalne informacje wysłane do serwera wyglądają tak: GET /costam.php?param1=costam¶m2=costam¶m3=costam HTTP/1.1\r\n Host: www.jakastamstrona.tld\r\n Connection: close\r\n \r\n Porównaj to z danymi które wysyłasz do cba.pl. Skąd np. serwer będzie wiedział że trzeba te wyniki przesłać do Twojej strony, a nie sąsiada? Pamiętaj, że na jednym adresie IP stoi kilka (a jak znam życie i cba to kilkaset) różnych stron... 1 Cytuj Link do komentarza Share on other sites More sharing options...
krzychb Grudzień 31, 2018 Udostępnij Grudzień 31, 2018 1 godzinę temu, ethanak napisał: To dotyczy metody POST a nie GET (w tym przypadku dane są przesyłane w URL-u, wysyłanie danych po nagłówkach jest niedopuszczalne czyli content-length byłby zawsze równy 0. @ethanak Odniosłem się do drugiego fragmentu kodu podanego przez @Bonkers, który zawiera POST. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
ethanak Grudzień 31, 2018 Udostępnij Grudzień 31, 2018 A, zwracam honor. Ale i tak jest błąd w Host: Cytuj Link do komentarza Share on other sites More sharing options...
Bonkers Grudzień 31, 2018 Autor tematu Udostępnij Grudzień 31, 2018 Póki co, zrobiłem to w ten sposób i dalej nie działa if (cliente.connect("www.********.cba.pl", 80)) { //Connecting at the IP address and port we saved before if(resume_disp == 1 || resume_disp == 2) { Serial.println("connected"); cliente.print("GET /wr_data.php?"); //Connecting and Sending values to database cliente.print("temperature="); cliente.print(tempG, 1); cliente.print("&humidity="); cliente.print(humG); cliente.print("&pressure="); cliente.print(pressG); cliente.print("&temperature_out="); cliente.print(data.temperature, 1); cliente.print("&humidity_out="); cliente.print(data.humidity); cliente.print("&insolation="); cliente.print(data.insolation); cliente.print("&weather="); cliente.print(readWeatherEN(data)); cliente.println( " HTTP/1.1\r\n"); cliente.println( "Host: www.********.cba.pl\r\n" ); cliente.println( "Connection: close\r\n" ); cliente.println("\r\n"); } Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Grudzień 31, 2018 Udostępnij Grudzień 31, 2018 println() sam z siebie dodaje \r\n, nie musisz tego robić ręcznie. Na oko powinno ruszyć jak to poprawisz. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Bonkers Grudzień 31, 2018 Autor tematu Udostępnij Grudzień 31, 2018 (edytowany) @ethanak Poprawiłem i dalej nic if (cliente.connect("www.*******.cba.pl", 80)) { //Connecting at the IP address and port we saved before if(resume_disp == 1 || resume_disp == 2) { Serial.println("connected"); cliente.print("GET /wr_data.php?"); //Connecting and Sending values to database cliente.print("temperature="); cliente.print(tempG, 1); cliente.print("&humidity="); cliente.print(humG); cliente.print("&pressure="); cliente.print(pressG); cliente.print("&temperature_out="); cliente.print(data.temperature, 1); cliente.print("&humidity_out="); cliente.print(data.humidity); cliente.print("&insolation="); cliente.print(data.insolation); cliente.print("&weather="); cliente.print(readWeatherEN(data)); cliente.println( " HTTP/1.1"); cliente.println( "Host: www.*******.cba.pl" ); cliente.println( "Connection: close" ); cliente.println(); } } Próbowałem też zrobić tak jak @krzychb radził, ale też ni widać efektu if (cliente.connect("www.*********.cba.pl", 80)) { //Connecting at the IP address and port we saved before if(resume_disp == 1 || resume_disp == 2) { pdata = "temperature="+(int)tempG; pdata += "&humidity="+humG; pdata += "&pressure="+pressG; pdata += "&temperature_out=" + (int)data.temperature; pdata += "&humidity_out=" + data.humidity; pdata += "&insolation=" + data.insolation; pdata += "&weather=" + readWeatherEN(data); Serial.println("connected"); cliente.print("POST /add.php HTTP/1.1\r\n"); cliente.print("Host: www.*********.cba.pl\r\n"); // SERVER ADDRESS HERE TOO cliente.print("Content-Type: application/x-www-form-urlencoded\r\n"); cliente.print("Content-Length: "); cliente.print(pdata.length() + (String)"\r\n" + (String)"Connection: close\r\n\r\n"); cliente.print(pdata); Edytowano Grudzień 31, 2018 przez Bonkers Cytuj Link do komentarza Share on other sites More sharing options...
Bonkers Grudzień 31, 2018 Autor tematu Udostępnij Grudzień 31, 2018 Problem rozwiązany 😀. Okazało się że główną przyczyną dlaczego to nie działało nie był kod, a zasilanie arduino. Dzięki @ethanak @krzychb za pomoc. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!