Hallo,
ich bin Anfänger und habe meine erste App geschrieben.
Mit dieser App kann ich das Rolltor und das Licht meines CarPorts bedienen.
Das funktioniert mit UDP-Kommandos, die ich über das WLAN im Heimnetz versende.
Die App funktioniert bis auf ein kleines Problem perfekt:
Wenn ich von aussen ( nicht in Reichweite meines Heimrouters ) den Empfangsbereich meines Routers "betrete",
braucht mein Handy relativ lange, um sich mit dem Router zu verbinden.
Diese Zeit würde ich gerne verkürzen, mir fehlt aber die rettende Idee.
Momentan mache ich folgendes:
Wenn ein Button ( zum Beispiel Tor-Auf ) gedrückt wird, wird zuerst folgende Funktion ( oder heißt das Methode ?)
aufgerufen:
Diese Funktion soll:
1. Das WLAN Interface des Handys einschalten, falls es ausgeschaltet ist. ( Es ist aber eingeschaltet )
2. Wenn keine Verbindung zu einem Router besteht, eine Verbindung aufbauen.
3. Prüfen, ob ich mit meinem eigenen Router verbunden bin
Wenn das alles erledigt ist, wird das Kommando gesendet ( was dann sehr spät gemacht wird )
Hier die Funktion:
public boolean wifiCheckConnection()
{
boolean connectionState = false; // not connected to home router
WifiManager WifiObj = (WifiManager)getSystemService(getApplicationContext().WIFI_SERVICE);
WifiInfo wifiInfoObj = WifiObj.getConnectionInfo();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String ssidConnected; // ssid of the router, we are connected to
String ssidHome; // ssid of the expected home router
int counter = 100; // timeout counter
while ((connectionState == false) && (counter > 0))
{
--counter;
// ----------------------------------------------------------------
// check, if wifi is enabled
// ----------------------------------------------------------------
if (!WifiObj.isWifiEnabled())
{
// wifi is not enabled : enable wifi
WifiObj.setWifiEnabled(true);
// enabling wifi takes time, check for enable state in next timer tick
try
{
Thread.sleep(100);
}
catch(InterruptedException exception)
{
exception.printStackTrace();
}
continue;
}
// ----------------------------------------------------------------
// check, if wifi is connected to any router
// ----------------------------------------------------------------
if (wifiInfoObj.getSupplicantState() == SupplicantState.DISCONNECTED)
{
// wifi is not connected to any router : try reconnect to an available router
WifiObj.reconnect();
// reconnect takes time, check for established connection in next timer tick
try
{
Thread.sleep(100);
}
catch(InterruptedException exception)
{
exception.printStackTrace();
}
continue;
}
if (wifiInfoObj.getSupplicantState() != SupplicantState.COMPLETED)
{
// reconnect takes time, check for established connection in next timer tick
try
{
Thread.sleep(100);
}
catch(InterruptedException exception)
{
exception.printStackTrace();
}
continue;
}
// ---------------------------------------------------------------
// wifi is connected to a router : check, if this is the home router
// ---------------------------------------------------------------
// get router name of router, we are connected to
ssidConnected = wifiInfoObj.getSSID().replace("\"", "");
// get the name of the home router from the perferences
ssidHome = prefs.getString("ssid_1", "MyHomeSSID");
if (ssidConnected.equals(ssidHome))
{
connectionState = true;
continue;
}
// ----------------------------------------------------------------------
// connected with WIFI router, but it is NOT the home router
// ----------------------------------------------------------------------
counter = 0;
}
return connectionState;
}
Alles anzeigen
Jetzt zu meinen Fragen:
1. Macht die Funktion so Sinn, oder geht das geschickter?
2. Ich habe die Idee, diese Funktion nicht erst bei einem Button-Event aufzurufen,
sondern schon dann, wenn der Power-Button des Handys gedrückt wird. Würde das was bringen, oder
versucht das Handy sowieso schon eine Verbindung aufzubauen, wenn der Power-Button gedrückt wird, und es dauert eben einfach so lange?
Vielen Dank im Voraus, und bitte nicht über meinen Code (Kot) lachen. Bin Anfänger.