 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Čet Jun 15, 2006 11:11 pm Naslov sporočila: Winsock in GPRS |
|
|
Naredil sem server, ki uporablja winsock ter napravo, ki pošilja in sprejema podatke preko GPRS na ta server. Komunikacija lepo deluje, problem je edino v tem ker ne vem kako bi ugotovil, da se je naprava nepravilno odklopila od serverja (npr. če izklopiš napajanje napravi).
Sama komunikacija pa izgleda takole: naprava se najprej poveže na GPRS, potem pa se še poveže na server. Server to zazna in čaka na podatke. Ko server podatke prejme jih preveri in pošlje nazaj nek string. To se dogaja dokler naprava ne zapre povezave. To server zazna in spet čaka da se nanj priklopi naprava. Problem pa se pojavi ko se povezava nepravilno prekine (npr. z izklopom napajanja naprave), tedaj server še zmeraj čaka na podatke iz naprave, čeprav je povezava že prekinjena.
Zanima me, kako bi lahko na serverju zaznal nepravilen odklop od serverja, oz. kako bi nastavil nekakšen timeout, da mi server ne zašteka. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Čet Jun 15, 2006 11:18 pm Naslov sporočila: |
|
|
Premalo informacij. Na podlagi napisanega ugibam, da uporabljas TCP, torej si oglej implementacije "keep-alive" za TCP. |
|
Nazaj na vrh |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Pet Jun 16, 2006 9:51 am Naslov sporočila: |
|
|
Uporabljam TCP. Sem si malo pogledal keepalive in upam da bo to pomagalo. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Pet Jun 16, 2006 11:14 am Naslov sporočila: |
|
|
Jaz bi sicer stvar naredil z UDP (in lastnim preverjanjem integritete). Razumem, da je bolj enostavno preloziti nekaj dela na API, a je (po tvojem opisu sodec) connectionless protokol (kar UDP je) bolj primerna izbira. Naprava poslje, kadar je pac pri sebi, ko pa ni, pa ne povzroca tezav. Ce streznik zanima, ali je naprava ziva, potem ko "pinga" in caka na odgovor (ce bo sel po tej poti, potem vseeno dobro preberi opise implementacij keep-alive za TCP, saj je tam omenjenih nekaj tezav, na katere morda sam ne bi niti pomislil, zaradi katerih bi tvoja povezava delovala nezanesljivo). |
|
Nazaj na vrh |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Pet Jun 16, 2006 11:36 am Naslov sporočila: |
|
|
Sem probal nekaj s keepalive in mi še zmeraj enako kot prej - verjetno nisem pravilo nastavil.
UDP bi lahko bila rešitev, samo ne vem a je potrebno kaj dodatnega nastaviti v Wavecom Q2406 modulu, da uporablja UDP (nisem najbolj domač v teh protokolih), ker v njihovem spec sheet piše: "IP connectivity (TCP/IP with TCP/UDP sockets, POP3, SMTP, f*p)", tako da verjetno UDP zna uporabljati?
Bi pa bilo potrebno popraviti server, da bi deloval z UDP, kar še ne ne vem kako. Znam predvsem programirati v C-ju in še to bolj za uC kot pa PC. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Pet Jun 16, 2006 11:48 am Naslov sporočila: |
|
|
No, torej znas vse, kar potrebujes Konkretne izvedbe se sicer med seboj nekoliko razlikujejo, a zdaj je tako ali tako vse kopija/klon implementacije za *nixe. Najboljse branje na to temo je R. W. Stevens: "Unix Network Programming" (ce bos dobil staro knjigo, je samo ena, ce bos dobil novejso izdajo pa isces Vol 1.). Ko bos pokapiral osnove iz te bukve, se loti navodil za tvojo opremo.
V praksi samo odpres drugacno povezavo, vse drugo pa naprava skrije pred tabo, ce je UDP v njej ze implementiran (kar pravis, da je). Server bo se vedno prisluskoval, le da se tokrat ne vzpostavi stalna povezava, ampak potejejo samo datagrami (nepovezano in ne nujno v istem vrstnem redu in ne nujno zanesljivo - zaradi narave delovanja Interneta pac). |
|
Nazaj na vrh |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Pet Jun 16, 2006 11:54 am Naslov sporočila: |
|
|
Sokrat je napisal/a: |
V praksi samo odpres drugacno povezavo, vse drugo pa naprava skrije pred tabo, ce je UDP v njej ze implementiran (kar pravis, da je). Server bo se vedno prisluskoval, le da se tokrat ne vzpostavi stalna povezava, ampak potejejo samo datagrami (nepovezano in ne nujno v istem vrstnem redu in ne nujno zanesljivo - zaradi narave delovanja Interneta pac). |
Za UDP ne vem če je implementiram, ampak glede na tisti podatek iz spec sheet predvidevam da je.
Ali je potem UDP povezava stalno prikopljen ali pa se vsakič ko pošlje podatek odklopi?
Ker če se odklaplja bi bilo to lahko problematično, saj je pri tej napravi potreba po stalni povezavi - eno je zaradi stroškov (Mobitel zaračuna 1kB minimalo pa tudi če pošlješ sami 1B in potem prekineš povezavo) druga stvar je pa v tem, da bi moral server tudi pošiljati podatke nazaj v naprao (npr. kakšni ukazi), kar pa ne vem če bi delovalo, če se povezava prekine, ker imaš pri GPRS nek notranji IP in ne zunanjega v Internet in vsakič ko se povežeš na server, on zazna nek drugi IP naslov. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Pet Jun 16, 2006 12:27 pm Naslov sporočila: |
|
|
Se ne priklopi nikoli - conectionless dobesedno pomeni to, kar bi clovek sklepal, da pomeni. Naprava poslje paketek, ki ga routerji usmerjajo proti cilju, tam pa pade na port, kjer poslusa tvoj server (ki je seveda nastavljen tako, da poslusa). Ker je paket izbrane velikosti (ne 1 bajt, temvec UDP/IP header + vsebina), ves tocno koliko ti bo Mobitel zaracunal (TCP ima vecji header, pa se vec prometa ustvarja, ko vzdrzuje socket odprt, preverja konsistenco podatkov, itd.). Povezava v drugo smer gre po istem konceptu - ce nima server nic pametnega za povedati, potem je tiho, sicer pa poslje svoje in je to to.
Ce Mobitel res zaracuna za vsak datagram vsaj ceno za 1 KB (kar dvomim), potem nisi s TCPjem nic na boljsem, ampak te pride se drazje vse skupaj. |
|
Nazaj na vrh |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Pet Jun 16, 2006 12:58 pm Naslov sporočila: |
|
|
Kot sem že rekel se ne spoznam na te protokole, bom pa probal usposobiti server na UDP.
Bom pa opisal kako je z zaračunavanjem (s stališča GPRS naprave). Najprej odpreš povezavo (at#otcp), potem pošlješ nek podatek (manj kot 1kB) in zapreš povezavo ( [ETX] ali CTRL+C). To ti Mobitel zaračuna 1kB. Če pa se povežeš in pošiljaš podatke (več kot 1kB) in na konci zapreš povezav, pa ti Mobitel zaračuna količino pondatkov (+ header) in zaokroži na 1kB navzgor. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Pet Jun 16, 2006 4:52 pm Naslov sporočila: |
|
|
Zgolj ugibam, a za nepovezan prenos ti ne morejo racunati nic drugega, kot prenesene podatke. Kaj bi se sicer zgodilo z vsemi drugimi paketki (predvsem ICMP), ki ne potujejo skozi isti socket ("povezavo") kot tvoja komunikacija - bi vsakemu dodali se ~1500% in ga racunali kot 1 KB ? Najbrz ne bi upali take neumnosti narediti ...  |
|
Nazaj na vrh |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Sob Jun 17, 2006 10:33 pm Naslov sporočila: |
|
|
Sem našel novejšo dokumentacijo od GPRS modula in ugotovil, da imam podporo za UDP ter sem tudi že malo probal komunikacijo s serverjem, vendar mi ne deluje. Naredil sem server in clienta za UDP in to mi na računalnilku deluje, ne deluje pa komunikacija med GPRS napravo in serverjem (lahko da je kaj narobe z nastavitvami firewalla). Bom se še malo poigral z nastavitvami.
Na serverju pa za sprejem in oddajo podatkov preko UDP uporabljam funkciji recvfrom() in sendto(). |
|
Nazaj na vrh |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Pon Jun 19, 2006 5:56 pm Naslov sporočila: |
|
|
Sedaj mi komunikacija deluje (hvala sokrat za namig - UDP ).
Glede zaračunavanja bom pa še nekaj rekel. Tisto kar sem jaz razumel kot "povezati" je vzpostavitev GPRS povezave na GSM modulu. Tam je povezava na GPRS v dveh "nivojih". Prvi nivo je to da se registriraš na omrežje (dobiš IP znotraj GPRS omrežja in ne interneta), drugi nivo pa je nekakšna aktivna povezava na GPRS. Takrat ne moreš več uporabljati AT ukazov, ampak kar vse znake pošlje preko GPRS/interneta na prej vpisan IP in port (to je enako za TCP in UDP). No in pri Mobitelu je tako, da ko ti vzpostaviš povezavo (ta aktivna povezava na GPRS), ti oni zaračunajo minimalno 1kB.
Potem, ko sem povezavo nastavil, da ostane povezan na GPRS, pa sem imel problem v tem, da, ko mi je server potrdil pravilni sprejem podatkov, je namesto 6 znakov poslal kar 256 (tukaj se je skrival dodaten strošek prenosa podatkov) in to zato, ker sem v funkciji send() uporabil sizeof() namesto strlen().
sizeof() je očitno funkcija, ki vrne velikost bufferja in ne velikost stringa, in je uporabljen pri recv() funkciji, ker ne ve koliko znakov bo sprejel, no in jaz sem bil tako spreten, da sem sizeof() uporabil tudi v send()
Edino pomembno je, da mi sedaj server pravilno deluje na UDP . |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Pon Jun 19, 2006 7:58 pm Naslov sporočila: |
|
|
Ali v tvoji implementaciji ne vrne funkcija, ki sprejme podatke (recv()), tocnega stevila prebranih bajtov ? To bi namrec morala storiti na vsakem normalnem sistemu ...
strlen() sicer slucajno res deluje v tvojem primeru, saj gre najbrz za ustrezno formatirane podatke, ce pa bi posiljal binarne (ne-tekstovne) podatke, pa ne bi deloval oz. bi deloval eraticno. Jaz bi to na tvojem mestu spremenil, saj si zavestno vpeljal potencialen bug. |
|
Nazaj na vrh |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Pon Jun 19, 2006 8:47 pm Naslov sporočila: |
|
|
Pošiljam samo tekst in bo zmeraj samo tekst, tako da mislim, da s tem ne bo problemov
Glede recv(), tole je iz helpa:
Koda: |
int recv(
SOCKET s,
char* buf,
int len,
int flags
);
Parameters
s
[in] The descriptor that identifies a connected socket.
buf
[out] The buffer for incoming data.
len
[in] The length, in bytes, of buf.
flags
[in] The flag that specifies the way in which the call is made.
|
Najprej moram sprejemni buffer nafilati z ničlami, ker drugače mi doda še neke znake. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Pon Jun 19, 2006 10:00 pm Naslov sporočila: |
|
|
To, da "moras" buffer spraviti na 0x00 je samo posledica omenjenega buga, ki si ga sam zakrivil - nizi (stringi) v C-ju so terminirani z niclo ("\0" aka. 0x00) in ce se je prej v bufferju nahajal recimo kaksen drug (daljsi) niz, terminacijskega znaka pa ne posljes, potem bi zraven pobral se solato od prej.
Prva stvar: kot ti pise tudi v helpu, je recv() funkcija in ne procedura. To pomeni, da vrne neko vrednost - v tem primeru stevilo dejansko prejetih bajtov, ce je implementirana pravilno (nisi nam zaupal kje tece tvoj server oz. kaksno implementacijo IPja uporabljas). Vrednost, ki jo dobis, je neodvisna od oblike podatkov; torej je terminacija tukaj nepomembna, saj bos uposteval samo prvih N znakov v bufferju, ce bos prejel N znakov (N je manjse od dolzine bufferja).
Druga stvar: ce hoces kljub nesmiselnosti taksnega pocetja kljub temu uporabljati strlen(), potem poslan niz tekstnih (!) podatkov ustrezno terminiraj. Tako se bos izognil masivnim bzero() po celem bufferju, ki so nepotrebni in so v bistvu tudi anomalija v tvojem programu.
Tretja stvar: dodajanje bugov, flikanje z workaroundi in zanasanje na to, da bo stvar vedno delovala tako, kot si jo zamisljas danes, je po mojih izkusnjah slaba ideja. YMMV, ampak jaz takega cloveka recimo ne bi hotel zaposliti/angazirati, ker bi bilo samo vprasanje casa kdaj bi moral placevati za odpravo napak, katerih niti ni bilo potrebno vpeljati ze na zacetku. Ker najbrz delas to stvar zase, to pomeni, da bos za malomarnost placeval sam, morda le v urah prostega casa in zivcih, morda pa tudi v denarju (opurtunitetna in dejanska izguba)
Aha, pa se cetrta stvar: prej omenjena knjiga R. W. Stevensa je res primerno branje na to temo in bi ti prihranilo marsikatero tezavo ze do zdaj, najbrz pa tudi se kaksno v prihodnje. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 6 dni
Powered by phpBB © 2001, 2005 phpBB Group
|