MaJaProL:Clients

Aus II-Wiki
Wechseln zu: Navigation, Suche

Clienten Programmierung für den MaJaProl - Server

Hier werden Informationen zur Entwicklung von Clienten für den MaJaProL Server zusammengefasst.

Status

21.11.06

  • es ist gelungen, die mp_example.cpp auf Windows zu portieren. Aus Zeitgründen wird es aber vorerst keine DLL geben. (Es seiden es findet sich jemand.) Dafür warte ich gespannt auf den Java Serversimulator inklusive Clienten von Peter.


MaJaProL sim.png

16.11.06

  • Es existiert nun eine mp_client.h Libary, welche zumindest unter Linux funktioniert. Es ist eine DLL-Version für Windowssysteme geplant.
  • Herr G. beschäftigt sich mit der Entwicklung eines JAVA-Servers. Dieser soll den Client-Entwicklern die Möglichkeit geben sich ihre LED-Kunstwerke simulieren zu lassen. Einen ersten Hilfreichen Screenshot gibt es auch schon:

Beispielclient in C++

Grundlage des Ganzen bilden die Netzwerkfunktionen der [Simply-Direct-Media Libary (SDL)] und die von mir entwickelte Klasse [mp_client.h]. Letztere habe ich unter der GPL veröffentlicht. Es steht also jedem frei sie zu verbessern.

Zum Programmablauf

Der hier vorgestellte Quellcode beinhaltet alle Funktionen die für die Programmierung eines MaJaProL-Clienten benötigt werden:

  • Verbindungsaufbau: Der Client versucht sich mittels mp_connect() mit dem Server zu verbinden. D.h. er sendet ein Want-To-Connect Paket und wartet auf ein Ready-To-Recieve Paket.
  • Wurde die Verbindung aufgebaut, kann auf den color_vec-Speicherbereich zugegriffen werden. In diesem befindet sich nun die Farbbelegung des Servers. (Jedes Bit, das auf 1 steht verkörpert eine blaue LED. An sonsten ist sie weiß. Die Funktionen mp_get_vecsize() und mp_get_num_of_leds() liefern die Größe des Speicherbereiches in Byte bzw. die LED Anzahl zurück.
  • Nun kann der Client LED-Bereiche anfordern. Dazu setzt er die jeweiligen Bits im LTR-Vektor (LEDs-To-Reserve) auf 1 und sendet anschließend das LTR Packet an den Server.
  • Darauf hin kann die eigentliche LED-Datenübertragung beginnen. Im LTS_vec-Vektor können nun die einzelnen LED-Bits mit einer "1" gesetzt bzw. mit einer "0" ausgeschaltet werden. Anschliesend wird das Packet mit der Funtkion mp_send_LTS() gesendet.
  • mp_disconnect() sendet dem Server ein Close-ConeCtion-Paket und beendet dann das Programm.
  • Die try(), catch() Routinen sind nötig um qualifizierte Fehlerausgaben zu erhalten.
  • Sobald ein RTR Packet empfangen wurde (die Verbindung zum Server also aufgebaut ist, wird mit dem Aufruf von ext_mp_check_for_new_packets() sichergestellt, dass alle 5 Sekunden nach eingehendenn Server-Paketen geschaut wird und das Ping-Signals des Servers beantwortet wird.

Alle Funktionensaufrufe prüfen, ob ihr Aufruf auch Sinn macht. D.h. dass die Reihenfolge Connect->LTR_send->LTS_send eingehalten wird. Sollte die Verbindung zum Server aus irgendeinem Grund unterbrochen worden sein, so lassen sich die oben genannten Funktionen erst wieder nach einem erneuten Verbindungsaufbau mittels connect() ausführen.

Zum Code

Benötigt werden:

  • mp_client.h - die aktuelleste Version kann man zusammen mit dem Beispielclienten hier runterladen: (Login: guest | Passwort: guest)
  • SDL.h bzw. libSDL.so - gibt's hier [[1]].
  • SDL_net.h bzw. libSDL_net.so - gibt's hier [[2]].

(Man sollte wenn möglich immer die jeweiligen devel-Pakete der Linux Distributionen nutzen.)

Unter Linux wird das Ganze dann wie folgt kompilieren:

g++ -Wall mp_example.cpp -o mp_example -lSDL -lSDL_net

<source lang="c++"> //mp_example.cpp - sample program to demonstrate usage of mp_client.h //written by martin jeager - November 2006

  1. include "mp_client.h"
  2. include <iostream>

using namespace std;

int main(int argc, char* argv[]){

try{

//define some variables: int vecsize=0; //size of vectors in byte int ledcount=0; // number of LEDs handeled by the server Uint8 * p_color; //pointer at first Element of color-vector Uint8 * p_LTR; //pointer at first Element of LTR-vector Uint8 * p_LTS; //pointer at first Element of LTS-vector

//inititialising mp_client object (ServerIP|ServerPort|ServerID): mp_client *mpc; mpc=new mp_client("127.0.0.1",133,0x1);

//trying to connect to server: if(mpc->mp_connect()==true) cout << " Connection to server established\n"; else {cerr<<" Couldn't connect to server\n"; return -1;}

ext_mp_check_for_new_packets(mpc); //activate Packet-Checking-Thread

//getting information about server LEDs: ledcount=mpc->mp_get_num_of_leds(); vecsize=mpc->mp_get_vecsize();

//set pointer addresses p_color=mpc->mp_get_color_vec(); p_LTR=mpc->mp_get_LTR_vec(); p_LTS=mpc->mp_get_LTS_vec();

//reserve the last 32 LEDs for this client (set all bits to 1): for (int k=(vecsize-1);k>=(vecsize-1-4);k--){ //-1 because of vector array starts at 0 p_LTR[k]=0xFF;}

//send LTR Vector to server if (mpc->mp_send_LTR()==true) cout << " LTR Vector was send to server\n"; else {cerr<<" Couldn't Send LTR-Vector to server\n";}

//now light all 32 LEDs (set all bits in the last 4 Bytes to high at LTS vector): for (int k=(vecsize-1);k>=(vecsize-1-4);k--){ //-1 because of vector array starts at 0 p_LTS[k]=0xFF;} //0xFF = 255

//send LTS Vector to server if (mpc->mp_send_LTS()==true) cout << " LTS Vector was send to server\n"; else {cerr<<" Couldn't Send LTS-Vector to server\n";}

//close connection to server: if (mpc->mp_disconnect()==true) cout << " Successfully disconnected from server\n"; else cerr <<" Couldn't disconnect from server\n";

}
catch(int fn){//catch exceptions
 		ext_mp_exception_handler(fn); //function is needed to get error messages shown
}

return 0; }


</source>