Socket -> PHP <-> telit module

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
Hallo tweaker forumleden

Allereerst wil ik zeggen dat ik uit de embedded wereld kom en al m'n vragen op circuitsonline zet. Maar deze vraag heeft weinig met elektronika te maken, vandaar mijn vraag hier.

Voor mijn laatste schoolopdracht (niet afstuderen) moet ik een temperatuur laten zien op een webpagina. De module die deze temperatuur moet meten kan overal geplaatst worden. De module bestaat uit een sensor, microcontroller bordje, een telit (gsm-gps module) en een accu. Nu heeft deze telit module de mogelijkheid om een TCP/IP protocol op te zetten met een At commando. Hierin kan dan bijvoorbeeld een ip adres en een poort worden opgegeven.

Ik ben allereerst begonnen met de website uit te werken. Ik moet zeggen dat ik een 'noob' ben op dit gebied.

Ik heb gehoord dat het versturen van data via een socket kan. Ik ben dus op internet gaan zoeken naar socket in PHP. Hierbij heb ik code gevonden op de PHP site. Om deze code te testen heb ik de server apache geinstalleerd en werkt verder goed. De code die ik gebruik staat op http://nl.php.net/manual/en/sockets.examples.php

Hierbij heb ik adress en port verandert naar 127.0.0.1 en port 80. Dit omdat ik gezien heb dat de server werkt met port 80. Ik heb geen idee of dit goed is, maar als ik het resultaat bekijk is het fout. Ik krijg de volgende foutmelding.

#!/usr/local/bin/php -q
Warning: socket_bind() [function.socket-bind]: unable to bind address [0]: Elk socketadres (protocol/netwerkadres/poort) kan normaal slechts één keer worden gebruikt. in C:\xampp\xampp\htdocs\hallo.php on line 19
socket_bind() failed: reason: Elk socketadres (protocol/netwerkadres/poort) kan normaal slechts één keer worden gebruikt.
Warning: socket_listen() [function.socket-listen]: unable to listen on socket [0]: Er is een ongeldig argument opgegeven. in C:\xampp\xampp\htdocs\hallo.php on line 23
socket_listen() failed: reason: Er is een ongeldig argument opgegeven.
Warning: socket_accept() [function.socket-accept]: unable to accept incoming connection [0]: Er is een ongeldig argument opgegeven. in C:\xampp\xampp\htdocs\hallo.php on line 28
socket_accept() failed: reason: Er is een ongeldig argument opgegeven.

Het komt erop neer dat port 80 al in gebruik is. Ook heb ik ander poorten geprobeerd maar dat werkt niet.

Mijn vragen hierbij zijn:
Ben ik goed bezig, of zouden jullie het op een andere manier doen?
Wat doe ik fout met het voorbeeld van de PHP site?

Acties:
  • 0 Henk 'm!

  • itarix
  • Registratie: Juli 2005
  • Laatst online: 08:47

itarix

404 soul not found

Port 80 is de standaard port die de webserver gebruikt en 127.0.0.1 is een loopback aderes waarmee je de machine waar je achter zit direct aanspreekt.

Volgens mij is het de bedoeling dat je in het script het portnummer en ip adres van je temperatuur module invult.

Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Nu online

Onbekend

...

carbidsjitter schreef op zondag 25 oktober 2009 @ 19:49:
Hierbij heb ik adress en port verandert naar 127.0.0.1 en port 80. Dit omdat ik gezien heb dat de server werkt met port 80. Ik heb geen idee of dit goed is, maar als ik het resultaat bekijk is het fout. Ik krijg de volgende foutmelding.
Hieruit begrijp ik dat php moet connecten met 127.0.0.1?
Dit is je interne ip-adres en voor elke computer van buitenaf niet benaderbaar.
Je de gewone ip-adressen moeten gebruiken.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 07-10 16:34
Volgens mij ben je nu 2 dingen door elkaar aan het doen.

Je kunt Apache gebruiken om PHP als module in te draaien, waarna je middels het HTTP protocol met je PHP-script kunt communiceren. Je zult dan een GET-request voor dat script moeten doen;
code:
1
2
3
GET /phpscript.php HTTP/1.0
Host: localhost
Connection: close


In PHP heb je dan verder niets met sockets te maken en geef je de gegeven terug welke je aan de vragende kant wilt weten.

Alternatief is PHP in CLI-mode te draaien, zonder Apache. Je kunt dan een PHP-script opstarten die als server luisterd op een bepaalde poort. Met je telit-module kun je naar die poort verbinden en direct communiceren in een eigen protocol. Je kiest dan een willekeurige poort die nog vrij is om naar te luisteren.

Maar. Als je gegevens uit je module op een webpagina wilt tonen heb je waarschijnlijk een derde methode nodig; PHP onder Apache draaien en vanuit je PHP-script verbinden naar je telit-module.
Dat kan redelijk eenvoudig met de fsockopen() functie, mits je module een IP-adres heeft.

Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
frickY schreef op zondag 25 oktober 2009 @ 20:10:
Je kunt Apache gebruiken om PHP als module in te draaien
Kun je hier wat meer over uitleggen?

De voorbeeld code die ik heb gebruikt was puur en alleen om de socket verbinding op gang te brengen en te testen. Boven de code staat dat als je wat intypt, dat dit via de server op jou scherm komt. Daarom gebruikte ik het IP van de local Host.

Even voor de duidelijkheid,. de temperatuur module is nog in de maak en heb ik hier niet liggen. Ik wil eerst de webpagina op gang hebben.
frickY schreef op zondag 25 oktober 2009 @ 20:10:
Maar. Als je gegevens uit je module op een webpagina wilt tonen heb je waarschijnlijk een derde methode nodig; PHP onder Apache draaien en vanuit je PHP-script verbinden naar je telit-module.
Dat kan redelijk eenvoudig met de fsockopen() functie, mits je module een IP-adres heeft.
Dit principe had ik in gedachten. ik zal in de datasheet opzoeken of de module een ip adres heeft.

Als ik straks daadwerkelijk met de telit module wil connecten, heb ik dan ook een externe server nodig? of kan ik mijn eigen laptopje als server laten draaien? Ik heb eventueel wel een webdomain om de php code op te draaien.

In iedergeval bedankt voor de snelle reply's

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 07-10 16:34
Apache is een webserver. Deze opent een poort (80) om naar HTTP-verkeer te luisteren.
PHP is een script-engine om dynamische output te genereren. Je kunt deze in Apache laden als module zodat HTTP-verzoeken middels PHP-scripts afgehandeld kunnen worden. Dat is hoe PHP normaliter wordt toegepast; voor dynamische websites.

Wil je dat je telit module om de zoveel tijd jouw PHP-script aanroept en de gegevens doorgeeft, en dat het PHP-script dit ergens opslaat zodat deze later weergegeven kunnen worden.
Of wil je dat zodra iemand het PHP-script opent deze realtime een verbinding maakt met de telit module en de temperatuur uitleest?

In het eerste geval zul je in PHP een servertje moeten maken die luistert op een poort tot de telit module hier mee verbind, of Apache gebruiken en het HTTP-protocol gebruiken vanuit je module, dan kun je de hele server-logica overslaan, dat zit al in Apache.
In het tweede geval dient de telit-module als server te fungeren waarnaar het PHP-script een verbinding kan maken.

Apache/PHP kun je gewoon op je eigen laptop draaien.

[ Voor 5% gewijzigd door frickY op 25-10-2009 22:02 ]


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
carbidsjitter schreef op zondag 25 oktober 2009 @ 19:49:
Hierbij heb ik adress en port verandert naar 127.0.0.1 en port 80. Dit omdat ik gezien heb dat de server werkt met port 80. Ik heb geen idee of dit goed is, maar als ik het resultaat bekijk is het fout.

[...]

Het komt erop neer dat port 80 al in gebruik is. Ook heb ik ander poorten geprobeerd maar dat werkt niet.
Wat voor poorten heb je zoal geprobeerd? Windows of een ander OS gaat zelf ook een deel poorten in beslag nemen voor weet ik veel wat voor applications en services. Best is dat je zeker niet onder de 1024 of zo neemt. Test bv eens met poort 5555 of 9999 of 10000 zoals in het voorbeeld.

Een poort is bedoelt zodat indien je een bericht van buitenaf naar je pc stuurt dat er gelinkt kan worden aan een bepaald proces of service. En dat je meerdere services bv telnet/tcp/http/... kan draaien op 1 enkele pc/server. Daarom dat je ook niet meer dan 1 proces kan laten luisteren op de zelfde poort, wat jij volgens mij probeert te doen.

[ Voor 19% gewijzigd door kluyze op 26-10-2009 10:16 ]


Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
Ik heb niet zoveel tijd, maar heb de voorgestelde poorten nog geprobeerd maar het werkt niet grrr. Als de basis het niet doet hoef ik ook niet verder gaan.

Iemand ander nog een ideel wat het kan zijn?

Ik heb het over de code in mijn eerste link.

De eerste regel in deze code, wat betekend dat ?

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 00:48

MueR

Admin Devschuur & Discord

is niet lief

Je zal moeten connecten naar het IP/poort van de module. Weet je die? Zo ja, inkloppen dan, zo nee, opzoeken dan.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 07-09 11:44

Bergen

Spellingscontroleur

[b][message=32806805,noline]Ik heb het over de code in mijn eerste link.

De eerste regel in deze code, wat betekend dat ?
Deze?

code:
1
#!/usr/local/bin/php -q

Dat vertelt de shell dat de rest van het script door /usr/local/bin/php moet worden verwerkt.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

carbidsjitter schreef op zondag 25 oktober 2009 @ 21:54:
[...]

De voorbeeld code die ik heb gebruikt was puur en alleen om de socket verbinding op gang te brengen en te testen. Boven de code staat dat als je wat intypt, dat dit via de server op jou scherm komt. Daarom gebruikte ik het IP van de local Host.
Je kan niet met localhost verbinden en verwachten daar meteen een antwoord te krijgen. Als je tegen een apparaat aan wil lullen, dan zul je moeten weten hoe dat apparaat heet (IP-adres) en waar de deur zit (poortnummer). Gewoon maar verbinden met de lokale pc op dezelfde poort als je webserver slaat als een tang op een varken en kán gewoon niet een resultaat hebben dat jij wil.
Even voor de duidelijkheid,. de temperatuur module is nog in de maak en heb ik hier niet liggen. Ik wil eerst de webpagina op gang hebben.
Hoe wil je socketconnectiecode die tegen een apparaat aan moet lullen testen als het apparaat niet bestaat?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Het voorbeeld op die site is een server script dat via de commandline opgestart moet worden. Daarna moet je via bv een telnet sessie naar het ip adres en poort dat je ingesteld hebt in de php code.


Ow en aangezien je C:/ krijgt in de foutmelding zal je wel op windows werken. Dan moet die eerste lijn ook aangepast worden. Natuurlijk heb je op windows geen /usr/local/bin map.
Of je doet die weg en start het script met 'php <naam van het bestand>' of je veranderd die regel zodat die wijst naar jouw php executable.

[ Voor 44% gewijzigd door kluyze op 26-10-2009 19:31 ]


Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
kluyze schreef op maandag 26 oktober 2009 @ 19:27:
Het voorbeeld op die site is een server script dat via de commandline opgestart moet worden. Daarna moet je via bv een telnet sessie naar het ip adres en poort dat je ingesteld hebt in de php code.
Kijk, dat maakt veel duidelijk.

Ik dacht namelijk dat apache dat deed voor mij, de php code uitvoeren en luisteren naar de ingestelde poort als ik de betreffende website open. Maar als ik het topic doorlees. Luistert apache alleen op poort 80 naar HTTP request (wat dat ook moge zijn)

Sorry voor mijn onwetendheid, maar het zijn ook allemaal nieuw termen en technieken voor mij.

Ik heb dus geprobeerd om de php bestand van de eerst link die ik gegeven heb, via de command line te openen, maar dit geeft een foutmelding. De eerste foutmelding is:

Socket_bind() failed: reason: Het aangevraagde adres is niet geldig in de context van het adres. Weet iemand wat dit kan zijn?

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 00:48

MueR

Admin Devschuur & Discord

is niet lief

Ja. Je probeert naar een ongeldig IP/port te connecten. Heb je ondertussen al uitgezocht welk adres je moet hebben? Waar zit die module?

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien een domme vraag, maar wat doet jou embedded systeem? Maakt dit apparaat de verbinding? of Moet deze op een bestaande verbinding zich aanmelden? Gebruik je een socket?

Ik neem aan dat je een complete grafiek wil maken (terminste een tabel met info?) van de temperatuur. Dan is het handig op jou webserver een Listining socket te draaien in cli php. Bind de socket van het embedded apparaat naar de php server. Je zou ook de php listining server standalone draaien, Dan heb je geen apache nodig. In je php script kun je dan naar bijvoorbeeld Mysql je data wegschrijven. Via een apparte site wel met apache, php en mysql kun je die data dan ophalen en weergeven in een tabel.


Wegschrijven van data: Embedded systeem -> PHP listen socket -> MySQL
Ophalen van data: Apache -> PHP -> MySQL

[ Voor 22% gewijzigd door Verwijderd op 04-11-2009 10:11 ]


Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
Ik heb met een klasgenoot gesproken en heeft mij ook geholpen. Zoals sommigen hier al zeiden/adviseerden, zend ik nu data over via het http protocol naar de 'php code' en zet deze in de database.

Wanneer ik de website opvraag wordt de data opgehaald en in een tabel gezet.

Ik simuleer de verbinding nu nog via putty en werkt allemaal goed.

Ik zit aan de 'client side' nog met een klein probleempje. Ik moet via de website ook de sample tijd kunnen instellen, dus hoe vaak de module een meting moet verrichten, deze loopt van 10 sec, 20 sec, etc. Als deze ingesteld is, moet er een timer in beeld zijn op de website. Als deze afloopt refresht de pagina, zodat de nieuwe meting in beeld is. Dit geprogrammeerd met javascript.

Het probleem is nu dat wanneer de pagina refresht is, zijn automatische alle variablen weer geherinitaliseerd. dus ook mijn refreshtijd. De pagina refresht dan niet meer met dezelfde tijd als de module z'n data verzend. Deze wil ik graag na het refreshen ook hetzelfde houden.

Is het ook op een of andere manier mogelijk dat ik deze tijd op de server zet (mischien in de database) en deze ophaal met javascript. ?

Ik dacht hier net aan, maar is het ook mogelijk als de module z'n data verstuurd dat dan de pagina ook wordt geupdate ? Dat is de mooiste oplossing, maar ik weet niet of dat mogelijk is.

In iedergeval bedankt voor de hulp.

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
carbidsjitter schreef op zondag 06 december 2009 @ 22:30:
Ik heb met een klasgenoot gesproken en heeft mij ook geholpen. Zoals sommigen hier al zeiden/adviseerden, zend ik nu data over via het http protocol naar de 'php code' en zet deze in de database.

Wanneer ik de website opvraag wordt de data opgehaald en in een tabel gezet.

Ik simuleer de verbinding nu nog via putty en werkt allemaal goed.

Ik zit aan de 'client side' nog met een klein probleempje. Ik moet via de website ook de sample tijd kunnen instellen, dus hoe vaak de module een meting moet verrichten, deze loopt van 10 sec, 20 sec, etc. Als deze ingesteld is, moet er een timer in beeld zijn op de website. Als deze afloopt refresht de pagina, zodat de nieuwe meting in beeld is. Dit geprogrammeerd met javascript.

Het probleem is nu dat wanneer de pagina refresht is, zijn automatische alle variablen weer geherinitaliseerd. dus ook mijn refreshtijd. De pagina refresht dan niet meer met dezelfde tijd als de module z'n data verzend. Deze wil ik graag na het refreshen ook hetzelfde houden.

Is het ook op een of andere manier mogelijk dat ik deze tijd op de server zet (mischien in de database) en deze ophaal met javascript. ?

Ik dacht hier net aan, maar is het ook mogelijk als de module z'n data verstuurd dat dan de pagina ook wordt geupdate ? Dat is de mooiste oplossing, maar ik weet niet of dat mogelijk is.

In iedergeval bedankt voor de hulp.
dit kan je met sessies doen :), je kan natuurlijk ook het tijdstip van de laatste refresh in de database gooien en deze opvragen.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 08-10 07:49
Zo'n constant proces doe je waarschijnlijk sowiewo liever met een cron dan met een javascript refresh?

Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
Ik heb een mooi voorbeeldje gevonden om data in javascript van de server te halen. Dit ga ik gebruiken. http://www.w3schools.com/php/php_ajax_database.asp

Dat moet te doen zijn. Nog even en ik kan eindelijk m'n diploma ophalen ;)

Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
Ik heb weer een klein probleempje, ik zal in het kort proberen uit te leggen.

Ik heb op mijn internet pagina een knop zitten. Als je hier op drukt wordt een waarde (refresh tijd) van een pulldown menu doorgegeven via xmlhttp naar de database waar de sampletijd in staat. Deze waarde wordt gelijk teruggegeven. Als ik de database teruglees via phpmyadmin staat deze er ook goed in.

De refresh tijd loopt in beeld af en zodra deze nul bereikt wordt via xmlhttp de temperaturen die in de database staan opgevraagd en in een tabel op de pagina gezet

Als ik nu in de database van de temperaturen via phpmyadmin wat verander dan zie ik dit niet terug wanneer de tabel via xmlhttp wordt geupdate. Dit is dus het probleem.

Hetzelfde geld voor de sample tijd. De eerste keer op de knop drukken gaat het wel goed. Maar als ik de sampletijd verander via het pulldown menu en de knop, dan verandert deze wel in de database en de goede waarde wordt meteen weer teruggegeven. Maar bij een update van de sampletijd (wordt ook opgevraagd als de refreshtijd afloopt) wordt de oude waarde weer opgehaald.

De fout lijkt dus aan de server zijde te liggen, omdat de gestuurde waarde die meteen terug gegeven wordt goed is, maar bij een nieuwe update van de tabel worden de oude waarde die in de database stond gepakt.

samenvattend:
Wanneer data opgevraagd wordt via xmlhttp van een gewijzigde (gecontroleerd met phpmyadmin) database worden oude waardes terug gegeven.

Weet iemand waar aan dat kan liggen? Moet ik op een of andere manier de server/database updaten?

[ Voor 5% gewijzigd door carbidsjitter op 19-12-2009 20:00 ]


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Als het alleen bij het herladen of iets dergelijks is kan je misschien eens kijken of het ligt aan een caching probleem ergens. Met de headers aan te passen kan je een caching probleem wel oplossen.

Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
De pagina wordt trouwens nooit gerefresht, allleen de tabel. En met headers, wat bedoel je hiermee? die je meestuurt met de data die je terug geeft ?

code:
1
header("Content-type: text/plain");

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Ik haal uit je bericht dat je een xml http request doet, dus ajax gebruikt. Die pagina die je daarmee opvraagt of het script dat je daarmee laat runnen, de uitkomst van dat script kan gecached worden door eventueel je server, een proxy en/of je browser.

Probeer eens in het script dat je aanroept via je xmlhttp iets gelijk de het volgende te zetten (snel even eerste link genomen op google, dus de juistheid kan ik niet garanderen.)
PHP:
1
2
3
4
5
header("Expires: Mon, 26 Jul 1990 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
Op php.net/header staat ook een klein stukje over het voorkomen van caching. Scrollen tot 'Example #2 Caching directives'

[ Voor 11% gewijzigd door kluyze op 19-12-2009 20:23 ]


Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
Ik werk inderdaad met ajax. Ik heb de 3e regel toegevoegd, hij pakt de refresh tijd nu niet uit de database, maar de tabel veranderd nu wel mee op de website. Misschien pakt hij de refreshtijd niet omdat ik 2 xml requests vlak achter elkaar heb. Dit lijkt dus wel het probleem te zijn. Bedankt in iedergeval :)

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Kan je die requests samen voegen?

Hoe haal je die refreshtijd uit je dropdown? Kan je die waarde die je wilt opsturen eerst eens in een alert steken? Misschien doe je daar iets mis.

Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
De waarde van de pulldown menu komt goed door.

Ik had het eerst zo gemaakt dat de applicatie wacht in een while totdat de xml data terug is en pas daarna weer verzenden mag. Hierop gaf de browser een waarschuwing

Ik heb nu een buffertje gemaakt met de verzendopdrachten voor de xml, deze werkt de applicatie nu een voor een af. Hij gaat nu pas naar de volgende verzendopdracht als de oude voltooid is.

Al met al is het toch nog vrij uitgebreid geworden, ik zal nu de telit regelen zodat ik daar verder mee kan gaan.

Acties:
  • 0 Henk 'm!

  • carbidsjitter
  • Registratie: Oktober 2009
  • Laatst online: 07-10 20:55
De waarde uit de dropdown is goed, die request kan ik niet zo bij elkaar doen.

Maar ik heb het opgelost door met een buffertje te werken. Zodra de readystate van de xml request 4 is wordt de volgende reqeust verzonden. Het werkt gelukkig nu.
Pagina: 1