Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: Mistofelees - 18.07.23 - klo:10.56
-
GPS-tracker gt02 lähettää login messagen TCP-pakettina ja jää odottamaan vastausviestiä. Vasta saatuaan tämän vastauksen se lähettää paikkatietoa.
Elisan prepaid-kortti ei salli kaksisuuntaista yhteyttä, eli ei päästä yhteyspyyntöä trackeriin päin.
Ilmeisesti kuitenkin trackeri pitää TCP-porttia hetken auki.
Miten saisi tuon vastausviestin lähetettyä ?
Olen jo saanut kirjoitettua ohjelman, joka laskee lähtevälle paketille ITU-CRC-tarkistussumman ja parhaillaan kirjoittelen ohjelmaa, joka rakentaa vaaditun vastauspaketin. Aiemmat yritykset ovat menneet puihin.
Kun login message tulee, saan netstatilla trackerin IP:n ja portin selville. Omituisesti tuo kertoo käyttämääni serverin porttiin olevan liitettynä kolme trackerin porttia.
-
Itseäni täydentäen:
Ei suju vieläkään. Apu kelpaa
Vaikuttaa, kuin ISP:n asetukset estäisivät liikenteen serveriltä trackerille
Tämän pitäisi olla kyllä mahdollista, koska muukin nettiyhteys toimii kännyköilä:
Kännykän http-client ottaa yhteyspyynnön serveriin, joka lähettää vastauksen.
Tämäkin SIM on testattu kännykässä.
ITU-CRC laskentatoimii nyt php:llä
login messagen vastauspaketti server-> tracker on nyt mielestäni kunnossa
Data luetaan komennolla
exec('nc -W1 -l 9995',$r)
Heti tämän jälkeen haetaan IP ja trackerin portti:
exec("netstat -tn | grep 9995 | awk '{print $5}'",$IPPort)
Tämä antaa tuloksen:
tcp 0 0 192.168.0.240:9995 82.203.160.169:63489 TIME_WAIT
Kaikki nämä komennot itkevät siitä, että lähetettävässä datassa on NULL-tavuja:
<Tietenkin, koska data sisältää 0x00: (0x78 0x78 0x5, 0x1, 0x0, 0x1 0x0d 0x0a)>
$r=exec("echo \"$mj\"|nc -w1 $ip $port");
$r=system("echo \"$mj\"|nc -w1 $ip $port");
$r=shell_exec("echo \"$mj\"|nc -w1 $ip $port");
$fp = fsockopen($ip, $port, $errno, $errstr, 30); fwrite($fp, $mj); fclose($fp);
Tuottaa allaolevan virheilmoituksen Kokeiltu sekä serverin, että trackerin porttiosoitteella.
PHP Warning: fsockopen(): Unable to connect to 83.100.46.***:9995 (Connection timed out) in /home/www/gt02_tracker/KOE/portwatch.php on line 93
PHP Fatal error: Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, bool given in /home/www/gt02_tracker/KOE/portwatch.php:94
Stack trace:
#0 /home/www/gt02_tracker/KOE/portwatch.php(94): fwrite()
#1 {main}
thrown in /home/www/gt02_tracker/KOE/portwatch.php on line 94
-
Vastaus pitää lähettää siihen portiin, josta viesti tuli. Tuota porttia 9995 ei siellä asiakkaan päässä todennäköisesti kuuntele kukaan.
https://fi.wikipedia.org/wiki/Osoitteenmuunnos
Tai ehkä ymmärrän ongelman jotenkin väärin. Jos yrität lähettää palvelimelle useamman viestin, niin siinä pitäisi ehkä käyttää samaa pistoketta (socket), eikä avata jokaista viestiä varten uutta.
-
Kiitos vastauksesta !
Se herätti ajatuksia. Taidat olla jäljillä.
Nyt olen vastaanottanut dataa NC:llä ja odotan vastausta erikseen sitä varten avatulla socketilla.
Saattaapi olla, että tässä on kaksi sockettia auki, eikä toinen socketti tiedä, että toinen on jo auki.
Pitäpä kokeilla, että avaa socketin ja sekä kuuntelee, että lähettää sen kautta !
Menee huomiselle. Tänään on jo silmät ristissä.
KOKEILTU. Ei auennut vielä:
- Avasin ensin yhteyden NC:llä:
exec('nc -W1 -l 9995',$r)
- kuuntelin netstatilla, jotta sain IP:n ja trackerin portin:
exec("netstat -tn | grep 9995 | awk '{print $5}'",$ip,$retval);
$ar=array(); $ar=explode(":",$ip[0]); $IP=$ar[0];$port=$ar[1];
- Yritin avata socketin:
$fp = fsockopen($IP, $port, $errno, $errstr, 30);
- virheilmotus:
PHP Warning: fsockopen(): Unable to connect to 87.94.108.24:11276 (Connection timed out) in /home/www/gt02_tracker/KOE/watch.php on line 97
-
KOKEILTU. Ei auennut vielä:
- Avasin ensin yhteyden NC:llä:
exec('nc -W1 -l 9995',$r)
- kuuntelin netstatilla, jotta sain IP:n ja trackerin portin:
exec("netstat -tn | grep 9995 | awk '{print $5}'",$ip,$retval);
$ar=array(); $ar=explode(":",$ip[0]); $IP=$ar[0];$port=$ar[1];
- Yritin avata socketin:
$fp = fsockopen($IP, $port, $errno, $errstr, 30);
- virheilmotus:
PHP Warning: fsockopen(): Unable to connect to 87.94.108.24:11276 (Connection timed out) in /home/www/gt02_tracker/KOE/watch.php on line 97
Kuten Tomi jo sanoi, vastaus trackerin suuntaan pitää lähettää saman socketin kautta, jolla viesti on vastaanotettu. Et voi myöskään käyttää nc:n luomaa socketia ylemmän tason prosessissa (parent process). Netstatin ja nc:n sijaan palvelinohjelma pitää kirjoittaa kokonaan PHP:llä (tai millä tahansa TCP-socketeja tukevalla kielellä). Silloin voit suoraan vastata trackerin viestiin kuuntelevan socketin kautta ja sitten vastaanottaa dataa ilman kikkailua.
-
-" vastaus trackerin suuntaan pitää lähettää saman socketin kautta, jolla viesti on vastaanotettu. "
Olen tätä nyt jonkin verran yrittänyt saada toimimaan PHP:n työkaluilla- Vielä ei ole onnistunut.
Yksi ongelma on sekin, että trackerin IP-osoite muuttuu jatkuvasti, jopa kesken ohjelman ajon.
Ainoa tapa, jolla osaan hakea IP:n, on netstat.
- Haen netstat:llä IP:n
- Odottelen hieman
- Yritän avata yhteyden: $fp = fsockopen($IP, $PORT, $errno, $errstr, 20);
-- Virheilmoitus:
PHP Warning: fsockopen(): Unable to connect to 87.94.108.198:31746 (Connection timed out) in /home/www/gt02_tracker/KOE/watch.php on line 112
Err 110, Connection timed out
Taistelu jatkuu. Pakkohan tämän on toimia.
-
Sockettien käytöstä:
Tarvitset asiakas-palvelin-arkkitehtuurin, jossa toinen puoli on asiakas ja toinen palvelin. Asiakas yhdistää ja palvelin kuuntelee. Asiakas tässä ilmeisesti on tuo tracker-ohjelma, eli sitä ei tarvitse toteuttaa itse, ja palvelin on se, mitä olet tekemässä.
Palvelimen puolella tuo menee jokseenkin näin:
- Luodaan ja bindataan palvelimen socket tietyssä portissa (9995), asiakkaan osoitetta ei tarvitse tietää
- Kuunnellaan sitä (listen)
- Hyväksytään uusi yhteys asiakkaalta (accept), jolloin saadaan uusi asiakaskohtainen socket
- Vastaanotetaan ja lähetetään dataa tällä uudella socketilla
- Lopuksi suljetaan uusi socket
- Toistetaan kohdasta 2
https://www.php.net/manual/en/function.socket-accept.php
Muokkaus: Vähän korjattu yhdyssanoja
-
Miksi ei valmis opensource server https://www.traccar.org/ (https://www.traccar.org/) käy? gt02 on tuetuissa laitteissa.
Ainakin sillä näkisi, että tracker saa yhteyden serverille. Serverillä pitää siis olla julkinen IP, johon tracker saa yhteyden.
gt02 portti, johon ottaaa yhteyden on 5022 eli se pitää olla auki palvelimella ja palvelin kuuntelee siis porttia 5022 (https://www.traccar.org/devices/ (https://www.traccar.org/devices/)
lisäys: PHP socket server esimerkki: https://habib-cst.medium.com/socket-programming-in-php-51afc18692cd (https://habib-cst.medium.com/socket-programming-in-php-51afc18692cd), josta siis tässä tarvitaan vain server osuus.
lisäys 2: gt02 tracking protocol: https://www.traccar.org/protocol/5022-gt02/GT02%20protocol%20_en_neutral.pdf (https://www.traccar.org/protocol/5022-gt02/GT02%20protocol%20_en_neutral.pdf)
-
Elisan prepaid-kortti ei salli kaksisuuntaista yhteyttä, eli ei päästä yhteyspyyntöä trackeriin päin.
Eiköhän tämä liity nimenomaan tietoturvaan ja Prepaid-liittymien ominaisuuksiin.
-
Miksi ei valmis opensource server https://www.traccar.org/ (https://www.traccar.org/) käy? gt02 on tuetuissa laitteissa.
Ainakin sillä näkisi, että tracker saa yhteyden serverille. Serverillä pitää siis olla julkinen IP, johon tracker saa yhteyden.
gt02 portti, johon ottaaa yhteyden on 5022 eli se pitää olla auki palvelimella ja palvelin kuuntelee siis porttia 5022 (https://www.traccar.org/devices/ (https://www.traccar.org/devices/)
Pistin Traccarin pystyyn ja portiksi 5023. Ohjelma löytää sijainnin ja piirtää kartalle.
Tuo portti 5023 ihmetyttää, koska GT06, GT02 voi asettaa lähettämään datan mihin porttiin tahansa.
Laitteen lähettämän login messagen pystyy lukemaan nc:llä portista 5022.
Sitäpaitsi alkuperäinen lähetyskäsky on " Adminip123456 www.19gps.net 7018 ", eli portti 7018
Kirjoitin myös php-scriptin netistä löytyneiden socket-ohjeiden mukaan. Jumittuu socket_accept()-komentoon. Jää odottamaan jotain portista. Taistelu jatkuu, koska oma Leaflettiin perustuva seurantaohjelma on omaan käyttöön paremppi, kuin Traccar. Omaan saan lisättyä lokitekstejä ja valokuvia matkoilta.
EI VIELÄ TOIMIVA:
<?php
$host = "127.0.0.1"; // your localhost IP
$port = 5023;
set_time_limit(0); // No Timeout
//Create socket
$socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')) or die("Create\n");
// Bind the socket to port and host
$result = socket_bind($socket, $host, $port) or die("bind\n");
// Start listening to the socket
$result = socket_listen($socket, 3) or die("Listen\n");
// Accept incoming connection
$spawn = socket_accept($socket) or die("Accept\n");
// Read the message from the Client socket
$input = socket_read($spawn, 1024) or die("Read\n");;
// Close socket:
socket_close($spawn);
socket_close($socket);
?>
-
Kirjoitin myös php-scriptin netistä löytyneiden socket-ohjeiden mukaan. Jumittuu socket_accept()-komentoon. Jää odottamaan jotain portista.
Niin, eli jää odottamaan asiakkaan yhteydenottoa. Niinhän sen kuuluukin tehdä.
-
Kirjoitin myös php-scriptin netistä löytyneiden socket-ohjeiden mukaan. Jumittuu socket_accept()-komentoon. Jää odottamaan jotain portista.
Niin, eli jää odottamaan asiakkaan yhteydenottoa. Niinhän sen kuuluukin tehdä.
Kymmenen minuuttia on hieman liikaa, kun aikaväliksi on asetettu 20sek.
Taistelu jatkuu.
-
Pistin Traccarin pystyyn ja portiksi 5023. Ohjelma löytää sijainnin ja piirtää kartalle.
Tuo portti 5023 ihmetyttää, koska GT06, GT02 voi asettaa lähettämään datan mihin porttiin tahansa.
Laitteen lähettämän login messagen pystyy lukemaan nc:llä portista 5022.
Sitäpaitsi alkuperäinen lähetyskäsky on " Adminip123456 www.19gps.net 7018 ", eli portti 7018
Kirjoitin myös php-scriptin netistä löytyneiden socket-ohjeiden mukaan. Jumittuu socket_accept()-komentoon. Jää odottamaan jotain portista. Taistelu jatkuu, koska oma Leaflettiin perustuva seurantaohjelma on omaan käyttöön paremppi, kuin Traccar. Omaan saan lisättyä lokitekstejä ja valokuvia matkoilta.
EI VIELÄ TOIMIVA:
<?php
$host = "127.0.0.1"; // your localhost IP
$port = 5023;
?>
Koska Traccar-palvelimesi saa sijainnin GPS-trackeriltä niin kyllä se pitäisi onnistua toimivalla php-scrptilläkin (-:
Tuossa php-koodissa tuon osoitteen pitäisi olla julkinen IP:si, eikä local koneen sisäinen IP (127.0.0.1). (Käyttäämääsi IP:tä ei kannata tietenkään mainostaa julkisesti, muuten joku voi alkaa lähettää vääriä sijaintietoja ja menee hankalaksi selvittää, missä GP:trackerisi todellisuudessa on, kun saat monia eri sijainteja. Protokollan tuntien voi kirjoittaa virtuaalisen clientin, mikä jää harjoitustehtäväksi ;))
Olikos' siinä esimerkissä client samalla koneella kuin server )-; , koska samalta koneelta pääset 127.0.0.1 osoiteeseen, mutta et muualta.
Juu portin ja IP:n voi tosiaankin asettaa trackerilla tekstiviestillä, joten niiden pitää olla samat kuin PHP-koodissasi (-; . Muuta niiltä ei vaadita
Vain yksi ohjelma kerrallaan voi kuunnella porttia, joten Traccar-palvelin on pysäytettävä jos se on samalla koneella kuin php-scriptisi.
-
Laita localhostin osoitteen 127.0.0.1 tilalle 0.0.0.0, niin se odottelee viestejä kaikista osoitteista.
-
Kun pistin IP--osoitteeksi kodin ulkoisen osoitteen, sain virheilmoituksen:
PHP Warning: socket_bind(): Unable to bind address [99]: Cannot assign requested address in /home/bin/GPStracker/socket.php on line 20 bind
Kun pistin osoitteeksi 0.0.0.0, alkoi ohjelma ainakin ottaa jotain vastaan.
Tästä on hyvä punnertaa eteenpäin. Varsinaiset tiedon käsittelyohjelmat ovat jo lähes valmiina.
Kyseinen GPS-trakkeri väitti pakkauksen kannessa ja dokumenteissa olevansa GT02. GT06 on mainittuna pienellä. Käskykanta on melkein, mutta ei täysin erilainen, kuin aiemmin käyttämissäni GT06-trakkereissä, joissa niissäkin on ollut hajontaa.
Käytettävän serverin IP-osoitteen ja portin voi asettaa SMS-viestillä. Laite ei kuitenkaan kelpuuta niitä, kuten toinen käytössäni oleva GT06, vaan asetuksista piittaamatta käyttää kanavana annettuun IP-osoitteeseen porttia 5023.
NC:llä saa kyllä kopitettua login messageita, mutta socketeilla ei synny yhteyttä.
Laitteessa on myös USB-portti, jonka merkitys ei selvinnyt. Sieltä puskee PC:lle tekstimuotoista moskaa, josta ei saa mitään tolkkua.
PHP on mukava scripti-kieli. Ongelmana vaan on sama, kuin monessa muussakin: dokumentaation laatijat eivät hahmota, mikä on informaatiota ja mikä hehkuttelua. Mielessäni vertaan antiikkisiin VIC20, MsC ja QuickBasicin käsikirjoihin: käsky, sen formaatti, selitys ja yksinkertainen esimerkki. PHP:n docuissa sivuutetaan se yksinkertainen esimerkki ja aletaan hehkuttaa, miten kirjoittaja on ratkaissut jonkun ihmeellisen ongelman jollain piiiiitkällä koodilla, jossa ei edes mainita käsiteltävää komentoa.
SUURKIITOS KAIKILLE OSALLISTUNEILLE !
-
Kun pistin IP--osoitteeksi kodin ulkoisen osoitteen, sain virheilmoituksen:
PHP Warning: socket_bind(): Unable to bind address [99]: Cannot assign requested address in /home/bin/GPStracker/socket.php on line 20 bind
Kun pistin osoitteeksi 0.0.0.0, alkoi ohjelma ainakin ottaa jotain vastaan.
Tästä on hyvä punnertaa eteenpäin. Varsinaiset tiedon käsittelyohjelmat ovat jo lähes valmiina.
Sinä sen sanoit, miksi julkinen IP ei kelvannut. Palvelin on varmaan reitittimen takana ja reitittimelle on tehty porttiohjaus? Palvelin ei siis tiedä saavansa kyselyitä julkisen IP:n takana olevaan porttiin. Ei pitäis oikeakätisen vastailla huolimattomasti vasemmalla kädellä, ainakaan kahdesti ;)
Socketin kautta tulevia paketteja kannattaa käsitellä varovasti ja huolella. Ei mitään mitään puskurin ylivuotoja tai vastaavaa.
Esimerkki koodien server ja client kun olivat samalla koneella, eikä siis pahaa maailmaa kodin ulkopuolella otettu mitenkään huomioon!
-
Kun pistin osoitteeksi 0.0.0.0, alkoi ohjelma ainakin ottaa jotain vastaan.
Sinä sen sanoit, miksi julkinen IP ei kelvannut. Palvelin on varmaan reitittimen takana ja reitittimelle on tehty porttiohjaus?
Palvelin ei siis tiedä saavansa kyselyitä julkisen IP:n takana olevaan porttiin. Ei pitäis oikeakätisen vastailla huolimattomasti vasemmalla kädellä, ainakaan kahdesti ;)
Palvelin on tosiaan parin verkon ylläpitäjän reitittimen ja talon oman reitittimen takana. Puhkoin omaan palomuuriin reikiä sitä mukaan, kun kokeilin eri portteja.
Laite ei tosiaankaan tottele kuin porttia 5023, vaikka sille asettaisi muunkin portin sen asetuksista. Tämä oli suurin ongelma alusta alkaen. Toisena tuo IP-osoite 0.0.0.0.
En ole koskaan ennen tehnyt socketien asettelua. Aiemmin kaikki on pelannnut kevyemmin työkaluin, esim nc:tä, fuser:a ja netstat:a käyttäen.
Tämän hetken tilanne on se, että ohjelma ottaa kiltisti trackerilta tulevaa ryönää vastaan. Nyt se vaan pitää muokata tarvitsemaani muotoon. Tätä ei yhtään helpota palikan onneton virheitä täynnä oleva dokumentaatio.