-
Notifications
You must be signed in to change notification settings - Fork 1
gps position sharing server
License
mduszyk/gpshub
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
-------------------------------------------------------------------------------- 1. Gpshub general info -------------------------------------------------------------------------------- Gpshub is a server written in C++, it allows sharing gps positions between hosts connected to the network. Each host declares a list of buddies (other hosts) who are allowed to get its position data. Server uses UDP connection for transfering gps data what should ensure the smallest possible amount of data transfered. Its goal is to enable applications to display real-time positions of other devices. .-----------. .------>| gpshub |<-----. | '-----------' | .-----. ^ .-----. | gps | | | gps | '-----' | '-----' .-----. | gps | '-----' gps - host which shares position with others, position data come from gps device .------------. .--------. | gpshub |<----TCP-----| gps | | |<----UDP-----| | '------------' '--------' TCP - command channel UDP - gps data channel -------------------------------------------------------------------------------- 2. Requirements -------------------------------------------------------------------------------- - Linux - epoll I/O event notification facility - sys/epoll.h since Linux kernel 2.5.44, added to glibc in version 2.3.2 -------------------------------------------------------------------------------- 3. Usage: -------------------------------------------------------------------------------- gpshub [-t TCP_PORT] [-u UDP_PORT] [-l LOG_LEVEL] [-f LOG_FILE] [-n THREAD_NUMBER] [-v] [-h] -t, --tcp set tcp port, default: 9990 -u, --udp set udp port, default: 9991 -l, --log-level set log level, default: DEBUG2 available levels: ERROR, WARNING, INFO, DEBUG, DEBUG1, DEBUG2 -f, --log-file set log output file, default: stdout accepted values: stdout, stderr, filename -n, --thread-number set number of consumer threads, default: 1 accepted values grather than 0 -v, --version print version -h, --help print this help -------------------------------------------------------------------------------- 4. Architecture -------------------------------------------------------------------------------- Gpshub consists of two servers: - TCP command server - UDP GPS data server Those servers are implemented in one thread each, using non-blocking I/O for command server and single UDP loop for GPS data server. This kind of design makes better sense if handling single client is short in time, because long handling would make other clients to wait for longer period of time. Command server handles commands which are simple so processing single command should be fast. Even if some other client would have to wait a bit longer for processing command that's not so bad (or it is assumed not so bad at this stage of development). Gps data server is more critical as it handles most of the whole server's load. This is why UDP server socket loop only updates user's position - what is simple, it requires only to read GPS data package and update coordinates of user identified by id sent in the package. The rest of the job of broadcasting this position to user's buddies is moved to other thread (or more than one thred if configured). This is why after updating user's position main UDP loop puts user's id to blocking queue. Then this id is pulled by Broadcasting thread and position is sent to user's buddies. User's id can be on queue only once at a time. Below diagram presents gpshub's architecture. Boxes represent main logical components, threads are represented in boxes where title is separated from notes. Colors are miningless - they are put automatically to this wiki's code block. .--------------------------------. .------------------------------. | Command server thread (TCP) | | Gps data server thread (UDP) | |--------------------------------| |------------------------------| | - non-blocking sockets (epoll) | .----| - UDP socket loop | | - handle incomming connection | | | - update user position | | - handle disconnects | | | - put user id to queue | | - process commands | | '------------------------------' '--------------------------------' | | | update put update | | | | | v | v .-------------------------. | .--------------------. | Shared data | | | blocking queue | | - id to user hash map |<-------' '--------------------' | - nick to user hash map | ^ ^ '-------------------------' | | ^ ^ | | | | .------------pull--------' pull | | | | | | | | | | .----------------------. .----------------------. | | | Broadcast thread #1 | . . . | Broadcast thread #n | | | |----------------------| |----------------------| | '-read--| - broadcast position | | - broadcast position | | | | | | | '----------------------' '----------------------' | | '------------------------read--------------------------' -------------------------------------------------------------------------------- 5. UDP Protocol -------------------------------------------------------------------------------- Use case: - client initializes UDP connection - client sends GPS coordinates to the server - server sends buddies positions to client Protocol init package: .-----------------.-------------. | unsigned int id | int token | '-----------------'-------------' id - user identifier token - token generated by the server (sent through TCP) gps data package: .-----------------.---------------.--------------.----------------. | unsigned int id | int longitude | int latitude | [int altitude] | '-----------------'---------------'--------------'----------------' id - user identifier longitude - value > 0 E, value < 0 W latitude - value > 0 N, value < 0 S altitude - optional, if not sent then altitude is 0 -------------------------------------------------------------------------------- 6. TCP Prtocol -------------------------------------------------------------------------------- Use case: - client registers nick - client sends buddies list, server sends back buddies ids list - client adds buddy - client removes buddy - server sends UDP init request with token - server acknowledges UDP init Protocol General package format: .---------------.-----------------------.------------------. | char pkg_type | unsigned short length | char* data_bytes | '---------------'-----------------------'------------------' pkg_type - identifies operation length - package length (with header) data_bytes - package data bytes Client --> Server: pkg_type operation data_bytes 1 register nick char* nick 2 add buddies char* buddies_names (csv) 3 remove buddies char* buddies_names (csv) Server --> Client: pkg_type operation data_bytes 101 register nick ack char status | [int userid] (userid if success) 105 initialize udp request int token 106 ack of initialize udp char status 150 buddies ids int buddyid1 | char* buddy_name1 | ... (byddy_name '\0' terminated)
About
gps position sharing server
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published