PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmieren von WLan-Orter



Adock
28.10.2010, 17:39
Moin,

meine Frage ist relativ simpel, unzwar ist es möglich mit Java ein Programm zu schreiben mit dem ich dann einen WLan-Router Orten kann? (Unter optimalen Bedingungen ohne Störquellen, etc.)

Also die Sendestärken direckt abfragen kann und dann über Triangulation den Standort bestimmen.

Kleine Info: Es wäre gut wenn dies in einem Zeitrahmen von einem halben Jahr möglich umzusetzen wäre, da dies eine Option für meine Projektarbeit fürs Abitur wäre.

Danke schonmal für die Antworten.

P.S.: Ich hoffe ich bin im richtigen Forum... Hätte es sonst im WLan-Forum gepostet.

dzdz
28.10.2010, 18:13
dir ist klar das du für Triangulation 3 punkte brauchst ?

wenn du die hast geht das selbstverständlich ^^

Adock
28.10.2010, 18:31
Jo, das mit den drei Punkten wäre kein Ding... Würde die erstmal selbst per Hand eingeben.. Also den ersten Messpunkt als (0|0|0) Definieren und dann halt die jeweiligen messpunkte manuel eingeben...
Wenn dies funktioniert würde ich es durch eine GPS Komponente ersetzen.

Steiger_mp
28.10.2010, 19:08
klar kannst du sowas schreiebn, musst nur deine wlan-Karte mit Java ansprechen, auf welchem weg auch immer.
ich finds immer süß,wenn sich leute ziele setzen,wenn der weg noch nicht zu 100% durchdacht wird.

Cristhecrusader
28.10.2010, 19:14
Naja meisten setzt man sich zuerst ein Ziel und findet dann einen Weg um das zu erreichen.
Oder machst du das anders?

dzdz
29.10.2010, 12:23
ich glaube du hast das mit dem punkten falsch verstanden ...

du brauchst drei gleichzeitig verfügbare punkte! dh drei-wlan router

und sonst klar ... man kann mit java auch hardware ansprechen

Sn0opY
29.10.2010, 12:27
hmm aber es gibt ja schon fertige tools ein kollege hatte mal eins mit dem man durchs haus gelaufen ist und später auf ner karte sone art wärmesignatur wie aus den scifi filmen hatte wo signal ist und wo schwach etc

und das auch nur mit 1 router =)

dzdz
29.10.2010, 12:30
gut ... dann hat dieses tool zur position bestimmung noch weitere werkzeuge benutzt ( sei es gps,2 weitere w-lans etc etc ..)

mit einem w-lan alleine kann man die position eines gerätes auch in relation zu diesem w-lan nicht festellen

Clode
29.10.2010, 12:32
ich glaube du hast das mit dem punkten falsch verstanden ...

du brauchst drei gleichzeitig verfügbare punkte! dh drei-wlan router

und sonst klar ... man kann mit java auch hardware ansprechen

Du hast es nicht verstanden. Es werden 3 Punkte benötigt, die von unterschiedlichen Positionen die Empfangs-/Sendestärke des WLAN-Routers beurteilen.
Das heißt man braucht 3 WLAN-Sticks..
Jetzt muss man nur wissen in welchem Abstand man diese voneinander aufbaut, bzw. wie empfindlich diese sind.

dzdz
29.10.2010, 12:36
^^ clode ...

du hast gerade den umkehrschluss gezogen ...

ob jetzt ein w-lan router oder drei w-lan sticks ist wayne

theoretisch geht es auch mit einem ...
mann müsste nur seine verschiebung messen ...

und mir schien es nicht so das der ts verstanden hat .. das er drei unterschiedliche Messpunkte braucht ...

Clode
29.10.2010, 12:39
Genau^^
Es geht auch mit einem, wenn man denn 3 verschiedene Messpunkte nimmt ;)
Am besten ist es halt, wenn man 3 Messpunkte gleichzeitig nehmen kann.

Adock
29.10.2010, 15:32
Also das mit dem mathematischen Anteil ist wie gesagt kein Problem, dass hab ich schon fast fertig. Meine Frage war eher auf die Fähigkeit von Java bezogen auf meine Netzwerkkarte zuzugreifen und dann die entsprechenden Daten herauszulesen.

An diesem Punkt scheitere ich bis jetzt etwas, da ich noch nirgends gefunden habe wie ich so etwas umsetzen kann und inwieweit es dann Platformabhängig wird.

maoshe
29.10.2010, 15:48
Cristhecrusader, ich gehe immer einfach los und überlege mit mein ziel erst dann, damit ich schneller dort ankomme :D

Atropos
29.10.2010, 16:00
WinPCap stellt unter Anderem auch eine WLAN-Schnittstelle zur Verfügung. Ist zwar in C aber die DLLs kannst du auch so ansprechen.
Ein Tutorial dazu habe ich jetzt nicht, aber Google hilft sicher ;)

Adock
29.10.2010, 16:10
Hm, das klingt doch schonmal gut... Wäre natürlich besser wenn es eine Java-Eigene Lösung dafür gebe.

The-God-of-all
29.10.2010, 16:15
Ich hatte mal ein paar Geräte in Java programmiert. Das Problem dabei ist, dass Java sehr Hardware fern ist und daher kaum Klassen zum steuern von Hardware oder ähnlichem hat. Ich habe bisher keine Klasse zum steuern von WLAN Hardware gesehen. Die Geräte für dich ich die Java Programme programmiert hatte hatte ich letzendlich über JNI (Java Native Interface) angesteuert, dass war dafür das einfachste. Ich hätte zwar auch eine der Java USB APIs verwenden gekonnt, das wäre aber um einiges komplizierter als mit JNI weil ich mit JNI eine fertige C Bibliothek in Java einbinden konnte. Das ganze war dadurch aber nicht mehr Plattform unabhängig. Du musst dich also erstmal schlau machen, wie du die WLAN Karte mit Java ansteuern kannst, vielleicht gibt es ja doch APIs dazu, ich vermute aber, dass nicht. Wenn nicht dann musst du entscheiden, ob du du komplett auf eine andere Hardware nahe Programmiersprache umsteigst oder ob du die Funktion für die WLAN Karte mit C oder C++ umsetzt und dann über JNI in Java aufrufst. Mit C sollte es möglich sein die WLAN Karte richtig anzusteuern, dazu gibt es sicherlich irgendeine Win API.

Eine andere Idee wäre es, wenn du das ganze Programm für ein Android Handy schreiben würdest. Das Android Handy wäre direkt Portabel, du könntest also rumlaufen um genug Messpunkte zu nehmen. Es hätte gleichzeitig auch noch den Vorteil, dass das Handy vermutlich ohnehin einen GPS Empfänger integriert hat, du hast also auch eine einfache Möglichkeit um die Position auszulesen. Android Programme werden ohnehin meistens in Java geschrieben und dank der riesigen Android API sollte es auch möglich sein, die WLAN Signal Stärke und die GPS Koordinaten ohne verwendung von Fremdbibliotheken auszulesen.

Du sagtest, dass du das Mathematische größtenteils bereits hast, das würde mich mal wirklich interessieren.
Wie viele Meßpunkte nimmst du? Wenn man annimmt, dass der Wlan Router in der gleichen Höhe wie man selbst steht dann würden theoretisch 2 Meßpunkte genügen, das würde aber sobald der Wlan Router in der Höhe verschoben ist zu einer falschen Ortung führen. Für einen 3 Dimensionalen Raum würde man also min. 3 Punkte brauchen. Aber auch bei 3 Punkten kann es wenn ich mir das richtig überlegt habe zwei Lösungen geben, wie reagierst du darauf wenn du zwei Punkte rausbekommst? Oder nimmst du 4 Punkte und kriegst damit ein eindeutiges Ergebnis raus?
Eine weitere Frage die ich mir stelle ist, wie gehst du mit Wänden und anderen Störungen aus? Eine Wand dämpft das Signal, dadurch könnte eine Wand eine falsches Ergebnis verursachen. Das gilt zumindest wenn du die Signalstärke zum berechnen verwendest. Aber was anderes fällt mir zu WLAN nicht ein weil so wie GPS mit der Signallaufzeit rechnen geht ja schwer weil man die nicht rausbekommt. Zumindest ist mir nicht bekannt, dass es bei WLAN eine Funktion gibt um die exakte Signallaufzeit herauszubekommen zumal es sich dabei vermutlich ohnehin um Zeiten im Nanosekunden Bereich handelt.
Das mit dere Signalstärke führt mich zur nächsten Frage: falls du sie zur Positionsbestimmung benutzt ist die überhaupt genau genug? Diese Werte kommen mir manchmal nämlich etwas komisch vor. Dann muss man auch wissen, wie die Signalstärke berechnet wird. Und dann zuletzt wie sieht das mit der Entfernungsberechnung aus, die Signalstärke ist ja eigentlich nur eine relative Größe, dass bedeutet, dass man keine genaue Entfernung hat sondern nur weiß, der Router ist von dem Punkt x entfernt und wenn die Signalstärke woanders 1/4 beträgt dass er das doppelt soweit entfernt ist (Die Leistung des Signals nimmt mit der Entfernung zum Quadrat ab). Also muss man irgendwie auch das x ausrechnen.

Atropos
29.10.2010, 16:16
Da Java auf einer virtuellen Maschine aufsetzt ist das nicht möglich. WinPCap ist in C++ geschrieben und ein DLL-Aufruf reicht ja oder?
Für soetwas kannst nun mal keine VM verwenden (zumindest keine wie die von Java oder .Net). Also ich könnte keine Arbeit in Java abliefern :P

Adock
29.10.2010, 16:56
@ The-God-of-all (http://free-hack.com/member.php?u=38126)

Also Mathematisch gesehen habe ich erstmal eine 2D Ebene vor zu benutzen und dann diesem Programm über Zeit neue Sachen hinzuzufügen.

1. Für die 2D Ortung benötige ich auch 3 "Kreise" damit ich den Router relativ genau Orten kann.
2. Das ganze Ding von Wlan orten ist sowieso nur eine relativ theoretische Sache die ich in einem relativ ungestörten Umfeld versuchen werde zu realisieren. (Ist nur mein 5. PE fürs Abi, also kann es im Zweifelsfall failen solange Doku gut ist und ich das Problem dann darstelle)
3. Ich werde mir genau einen Wlan-Router aus der Schule schnappen und die Relation von Sendeleistung und Entfernung versuchen experimentell aufzunehmen. Da es Unterschiede zwichen 802.11 n/b/g gibt. Außerdem ist anzumercken, dass ja schon die Verwendung von unterschiedlichen Antennen das ganze stark beeinflussen kann.


4. Eine andere alternative die ich aber für sehr schwer zu realisieren halte und die meinen Zeitplan locker sprengen würde, wäre ein System was auf die in meiner Schule verteilten Router zugreift und das diese dann nach anderen "Piraten"-Router suchen und mann dann die lokalisierung über triangulation macht und die Störungen bzw. timesteps durch ein pingen (durch das WLan nicht Lan) von Router zu Router berechnet und damit möglichst minimal hält.


So ich hoffe ich hab geholfen beim Verständniss :D

The-God-of-all
29.10.2010, 16:56
@ just_a_new_compilation ich verstehe nicht genau wodrauf du hinaus willst? Ich sagte ja bereits, dass Java nicht so einfach native Bibliotheken aufrufen kann, dafür gibt es aber JNI (Java Native Interface). Mithilfe von JNI kann man eine extra für Java entwickelte DLL laden und Funktionen in ihr aufrufen. Das Problem wird also sein, dass er die WinPCap Funktionen Kapseln muss, also eine DLL für JNI in C++ schreiben muss welche die Funktionen von WinPCap aufruft. Möglich ist das alles, nur eben nicht so einfach. Und in .Net kann man ja noch einfacher Funktionen aus einer DLL importieren. Es ist also mit genug Aufwand und kleinen Hilfsbibliotheken in C++ definitiv möglich sein Vorhaben in Java umzusetzen, es ist nur evtl. mehr Aufwand als in einer anderen Sprache.

@ Adock Danke, das war sehr informativ. Ein sehr interessantes Projekt.

Zu der Änderung der Signalstärke: Sie müsste Theoretisch gesehen Quadratisch zur Entfernung abnehmen weil sie sich ja im Raum ausbreitet und so die Oberfläche zur Entfernung quadratisch zunimmt. es ist also nur erforderlich eine Versuchsreihe aufzunehmen ob die von der Karte angezeigte Signalstärke auch quadratisch abnimmt und eben wie stark die Signalstärke bei einer bestimmten Entfernung bei einer bestimmten Konfiguration ist. Aber beim experimentieren wirst du da sicherlich genauere Ergebnisse herausbekommen.

Atropos
29.10.2010, 17:03
Sorry das ging an den Post vor dir.
Da war ich zu langsam.

Adock
29.10.2010, 17:07
@ All

Meine Frage ist jetzt gerade nur in diesem Moment ob es sich evtl. eher lohnt wenn ich eine andere Programmiersprache mir versuche beizubringen mit der es evtl. leichter umzusetzen ist. Oder ob ich mich halt durchkämpfe und das Ganze etwas komplizierter mache.

Was wären überhaupt meine Alternativen und welche ist "schneller" zu erlernen, bzw. was sind eure Erfahrungen?

Meine bisherigen Kenntnisse was Programmiersprachen angeht sind:
-PHP
-HTML
-Java
-ganz bissl Assembler

Atropos
29.10.2010, 17:28
Für C++ hast du die passenden Included von WinPCap welche verschieden Datentypen zur Verfügung stellen, welche bei der Untersuchung der Pakete helfen.
Also demnach C++ nur das lernst du nicht so schnell. Das ist meine Meinung dazu.

The-God-of-all
29.10.2010, 17:40
Ich kann mich da just_a_new_compilation anschließen, C++ wäre unter diesem Gesichtspunkt recht gut geeignet. Da du allerdings ja bereits generelle Programmierkenntnisse hast und dank Java wahrscheinlich auch schon etwas mit Objektorientierter Programmierung anfangen kannst musst du also eigentlich nur die Unterschiede lernen. Das wäre eigentlich vor allem, dass man die Syntax Unterschiede kennen lernen muss (zum Beispiel werden Vererbungen anders gekennzeichnet etc.) und ein paar wenige neue Elemente wie Zeiger die es in Java in der Form gar nicht gibt und das überladen von Operatoren. Aber im großen und ganzen ist C++ Java recht ähnlich und auch die Syntax ist ähnlich.
Ich weiß nicht, wie das Programm am Ende aussehen soll, ob du das Ergebnis grafisch ausgibst oder einfach nur berechnest und in der Konsole ausgeben willst. Ich persönlich habe es immer als angenehmer empfunden GUIs in Java zu programmieren weil man da alle Funktionen recht angenehm in der Java API hat aber das ist denke ich Geschmacksache. Konsolenprogramme tun sich nicht viel, ob man cout<<""; schreibt oder System.out.println(); schreibt dürfte keinen Unterschied machen. Höchstens, dass ich das Einlesen mit cin als ein wenig angenehmer als mit einem Buffered Reader empfinde... Aber auch das ist Geschmackssache.

Atropos
29.10.2010, 17:46
Nur wäre Printf() besser.
Bei C++ solltest du halt auch die Speicherverwaltung lernen, da du sonst gefährliche Stackoverflows zusammen bringst. Aber The-God-of-all hat da natürlich Recht;)

Adock
29.10.2010, 17:48
Also ich denke mal ich werde mir die Sache mit C++ nochmal durch den Kopf gehen lassen.

Ich habe aber auch gerade diesen Link gefunden(WiFiReading (http://www.placelab.org/toolkit/doc/javadoc/org/placelab/core/WiFiReading.html)), wobei ich hier nicht so ganz verstehe was mir das überhaupt sagen will... Irgendwie scheint es mir aber so als gäbe es doch eine Möglichkeit das ganze mit Java relativ angenehm umzusetzen.

Atropos
29.10.2010, 17:55
Ok ich nehme alle zurück. Diese Klasse bringt dir sogar eine Funktion zur Signalstärke ;).
Also probier's mal und über einen Bericht wie es gelaufen ist freue ich mich.

Adock
29.10.2010, 18:00
Ok, das wird aber noch nen bissl dauern... Muss erstmal noch so nen bissl was machen :D Werd mich aber melden und evtl. in nem halben Jahr meine Doku in Zensierter-Form (Ohne Namen etc.) hochladen damit alle was von haben.