Kirjoittaja Aihe: [ratkaistu] Vastausviesti TCP-viestiin ?  (Luettu 6300 kertaa)

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
[ratkaistu] Vastausviesti TCP-viestiin ?
« : 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.
« Viimeksi muokattu: 28.07.23 - klo:12.26 kirjoittanut Mistofelees »

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #1 : 18.07.23 - klo:22.02 »
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

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #2 : 18.07.23 - klo:22.46 »
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.
« Viimeksi muokattu: 18.07.23 - klo:22.51 kirjoittanut Tomin »
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #3 : 18.07.23 - klo:23.15 »
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
« Viimeksi muokattu: 19.07.23 - klo:11.45 kirjoittanut Mistofelees »

nm

  • Käyttäjä
  • Viestejä: 16430
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #4 : 22.07.23 - klo:02.39 »
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.

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #5 : 25.07.23 - klo:00.35 »
-" 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.


Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #6 : 25.07.23 - klo:06.16 »
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
« Viimeksi muokattu: 25.07.23 - klo:11.20 kirjoittanut Tomin »
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

Efraiminpoika

  • Käyttäjä
  • Viestejä: 166
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #7 : 25.07.23 - klo:16.19 »
Miksi ei valmis opensource server 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/
 
lisäys: PHP socket server esimerkki: 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
« Viimeksi muokattu: 25.07.23 - klo:16.47 kirjoittanut Efraiminpoika »
eläkeläisäijä

A. Hellaakoski: Tien kulkija tien on vanki. Vapaa on vain umpihanki.

juyli

  • Käyttäjä / moderaattori
  • Viestejä: 1200
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #8 : 26.07.23 - klo:00.35 »
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.

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #9 : 27.07.23 - klo:19.16 »
Miksi ei valmis opensource server 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/

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:
Koodia: [Valitse]
<?php
$host 
"127.0.0.1"// your localhost IP 
$port 5023
set_time_limit(0); // No Timeout
//Create socket
$socket socket_create(AF_INETSOCK_STREAMgetprotobyname(&#39;tcp&#39;)) 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($socket3) 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($spawn1024) or die("Read\n");;
// Close socket:
socket_close($spawn);
socket_close($socket);
?>

« Viimeksi muokattu: 28.07.23 - klo:00.52 kirjoittanut Mistofelees »

nm

  • Käyttäjä
  • Viestejä: 16430
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #10 : 28.07.23 - klo:00.28 »
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ä.

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #11 : 28.07.23 - klo:00.54 »
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.

Efraiminpoika

  • Käyttäjä
  • Viestejä: 166
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #12 : 28.07.23 - klo:08.00 »
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:
Koodia: [Valitse]
<?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.


eläkeläisäijä

A. Hellaakoski: Tien kulkija tien on vanki. Vapaa on vain umpihanki.

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #13 : 28.07.23 - klo:09.23 »
Laita localhostin osoitteen 127.0.0.1 tilalle 0.0.0.0, niin se odottelee viestejä kaikista osoitteista.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #14 : 28.07.23 - klo:12.22 »
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 !
« Viimeksi muokattu: 28.07.23 - klo:12.55 kirjoittanut Mistofelees »

Efraiminpoika

  • Käyttäjä
  • Viestejä: 166
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #15 : 28.07.23 - klo:14.07 »
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!
eläkeläisäijä

A. Hellaakoski: Tien kulkija tien on vanki. Vapaa on vain umpihanki.

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: Vastausviesti TCP-viestiin ?
« Vastaus #16 : 29.07.23 - klo:14.05 »

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.
« Viimeksi muokattu: 29.07.23 - klo:14.08 kirjoittanut Mistofelees »