www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Winsock in GPRS
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programska oprema
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Djurodrljaca
Član
Član



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Čet Jun 15, 2006 11:11 pm    Naslov sporočila:  Winsock in GPRS Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Čet Jun 15, 2006 11:18 pm    Naslov sporočila:   Odgovori s citatom

Premalo informacij. Na podlagi napisanega ugibam, da uporabljas TCP, torej si oglej implementacije "keep-alive" za TCP.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Djurodrljaca
Član
Član



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Pet Jun 16, 2006 9:51 am    Naslov sporočila:   Odgovori s citatom

Uporabljam TCP. Sem si malo pogledal keepalive in upam da bo to pomagalo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Pet Jun 16, 2006 11:14 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Djurodrljaca
Član
Član



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Pet Jun 16, 2006 11:36 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Pet Jun 16, 2006 11:48 am    Naslov sporočila:   Odgovori s citatom

No, torej znas vse, kar potrebujes Very Happy 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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Djurodrljaca
Član
Član



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Pet Jun 16, 2006 11:54 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Pet Jun 16, 2006 12:27 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Djurodrljaca
Član
Član



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Pet Jun 16, 2006 12:58 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Pet Jun 16, 2006 4:52 pm    Naslov sporočila:   Odgovori s citatom

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 ... Rolling Eyes
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Djurodrljaca
Član
Član



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Sob Jun 17, 2006 10:33 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Djurodrljaca
Član
Član



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Pon Jun 19, 2006 5:56 pm    Naslov sporočila:   Odgovori s citatom

Sedaj mi komunikacija deluje (hvala sokrat za namig - UDP Wink ).

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() Evil or Very Mad

Edino pomembno je, da mi sedaj server pravilno deluje na UDP Very Happy .
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Pon Jun 19, 2006 7:58 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Djurodrljaca
Član
Član



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Pon Jun 19, 2006 8:47 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Pon Jun 19, 2006 10:00 pm    Naslov sporočila:   Odgovori s citatom

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) Wink

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programska oprema Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
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