Wifi wechseln (java Problem)

  • 7 Antworten
  • Neuester Beitrag
Diskutiere Wifi wechseln (java Problem) im Automatisierung - Tasker im Bereich Tools.
S

sumerland

Neues Mitglied
Hallo,

ich möchte mit meinem Z2 (4.4.4) zuhause zwischen AP und Repeater wechseln, je nachdem, welcher stärker ist. Es gibt zwar diverse Tools im play store, die aber alle nicht ordentlich funktionieren. Also meine Idee das ganz mit Tasker zu machen:

Ankunft zuhause -> ortsbezogenes Wifi verbindet sich mit einer der beiden SSID (AP und Repeater haben unterschiedliche SSID)

Wenn Intent android.net.wifi.RSSI_CHANGED dann WifiManager startScan(), danach Abfrage der Ergebnisse (getScanResults), greppen der Signalstärken der beiden SSID und speichern in Variablen. Wenn das Signal von anderer SSID um einen bestimmten Wert besser ist als das Signal von verbundener SSID, dann verbinde mit anderer SSID.

Soweit so gut. Man könnte auch sparen, und nur bei jeder 5ten oder 10ten RSSI Änderung den Scan starten.

Ich scheitere leider schon daran, den java call aus den Beispielen (Tasker: Java Support) nachzuvollziehen.

Example
  1. Variable Set, %service, wifi
  2. Java Function, wiman = CONTEXT.getSystemService( %service )
  3. Java Function, %enabled = wiman.isWifiEnabled()
  4. Java Function, wiman.setEnabled( true ), If %enabled eq false
1 haut hin, bei zwei bekomme ich aber schon Fehler - vermutlich bin ich zu doof, richtig abzuschreiben. Was gehört in "Java Function" in das Feld "Class Or Object", was in "Function"? Komme mir bei der Frage selbst ziemlich dämlich vor, aber mit ein wenig Starthilfe bekomme ich das sicher hin :)

Ich denke mal, dass ich 1 und 2 übernehmen kann. In 3 gehört dann der startScan. In einem neuen Event kann ich auf eine Änderung von android.net.wifi.SCAN_RESULTS warten und wie vorher, diesmal aber mit getScanResults die Ergebnisse in eine Variable legen.

Grüße
Torsten
 
schmetty2

schmetty2

Stammgast
Hallo,

wenn Du dieselbe SSID verwendest macht Android das automatisch und unterbrechungsfrei.

mfg
 
S

sumerland

Neues Mitglied
Hi,

das hatte ich bereits probiert, leider hing das Telefon oft weiter mit -70dBm am Router während der Repeater mit -35dBm Signal in 1m Entfernung ignoriert wurde. Mit der App Wifi Roaming Fix hatte ich ganz gute Erfolge bei gleich benannten SSID, allerdings ging das sehr zu Lasten des Akkus. Als Alternative für unterschiedliche SSID hatte sich swifi empfohlen, aber das hatte nach ein paar Stunden den Bug, dass der Kontakt zum Router alle paar Sekunden abbrach, trotz tadellosem Signal. Ich bin gerade mit Wifi Manager von dem Aqua Mail Programmierer unterwegs - das macht einen sehr guten Eindruck (inkl. 5GHz Priorisierung), allerdings macht das regelmäßige Wifi Scans. Ich dachte, ich würde es mit Tasker geschmeidiger hinbekommen, wenn ich bei bestehender Verbindung zu meinen Wunsch-SSIDs nur auf Signaländerungen reagiere. Aber dafür muss ich das java Interface verstehen.
 
vetzki

vetzki

Guru
So könntest du scannen und das ergebnis z.b. in einem tasker array speichern

Code:
j (27)
    A1: Java Function [ Return:wiman Class Or Object:CONTEXT Function:getSystemService {Object} (String) Param:wifi Param: Param: Param: Param: Param: Param: ]
    A2: Java Function [ Return: Class Or Object:wiman Function:startScan {boolean} () Param: Param: Param: Param: Param: Param: Param: ]
    A3: Java Function [ Return:list Class Or Object:wiman Function:getScanResults {List} () Param: Param: Param: Param: Param: Param: Param: ]
    A4: Java Function [ Return:%length Class Or Object:list Function:size
{int} () Param: Param: Param: Param: Param: Param: Param: ]
    A5: Variable Subtract [ Name:%length Value:1 Wrap Around:0 ]
    A6: For [ Variable:%ind Items:0:%length ]
    A7: Java Function [ Return:scanres Class Or Object:list Function:get
{Object} (int) Param:%ind Param: Param: Param: Param: Param: Param: ]
    A8: Java Function [ Return:%result Class Or Object:scanres Function:toString
{String} () Param: Param: Param: Param: Param: Param: Param: ]
    <tasker kein array0 möglich>
    A9: Variable Add [ Name:%ind Value:1 Wrap Around:0 ]
    A10: Array Push [ Name:%results Position:%ind Value:%result Fill Spaces:Off ]
    A11: End For
    A12: Flash [ Text:%results(:) Long:Off ]
Bei A8 könntest du auch SSID usw. bei "scanres" verwenden (also z.b. scanres.SSID)
 
Zuletzt bearbeitet:
A

androidkoller

Stammgast
Hallo vetzki,

hast du das so getestet?

In A1 muss noch nach WifiManager gecastet werden, sonst funktioniert A2 nicht.

Code:
 A1: Java Function [ Return:(WifiManager) wiman Class Or Object:CONTEXT Function:getSystemService {Object} (String) Param:wifi
Grüße, Jürgen.
 
S

sumerland

Neues Mitglied
Vielen Dank euch beiden! Ich hoffe, ich kann mich morgen hinsetzen und das ausprobieren.
 
vetzki

vetzki

Guru
Das könnte funktionieren
Code:
java2 (33)
    A1: Array Clear [ Name:%confNetworks ]
    A2: Array Clear [ Name:%scanResult ]
    A3: Java Function [ Return:wiman Class Or Object:CONTEXT Function:getSystemService {Object} (String) Param:wifi Param: Param: Param: Param: Param: Param: ]
    A4: Java Function [ Return:%enabled Class Or Object:wiman Function:isWifiEnabled {boolean} () Param: Param: Param: Param: Param: Param: Param: ]
    A5: If [ %enabled ~ true ]
    A6: Java Function [ Return: Class Or Object:wiman Function:startScan {boolean} () Param: Param: Param: Param: Param: Param: Param: ]
    A7: Java Function [ Return:li_networks Class Or Object:wiman Function:getConfiguredNetworks {List} () Param: Param: Param: Param: Param: Param: Param: ]
    A8: Java Function [ Return:%length Class Or Object:li_networks Function:size {int} () Param: Param: Param: Param: Param: Param: Param: ]
    A9: Variable Subtract [ Name:%length Value:1 Wrap Around:0 ]
    A10: For [ Variable:%index Items:0:%length ]
    A11: Java Function [ Return:result Class Or Object:li_networks Function:get
{Object} (int) Param:%index Param: Param: Param: Param: Param: Param: ]
    A12: Java Function [ Return:%resultuid Class Or Object:result.networkId Function:toString
{String} () Param: Param: Param: Param: Param: Param: Param: ]
    A13: Java Function [ Return:%resultssid Class Or Object:result.SSID Function:toString
{String} () Param: Param: Param: Param: Param: Param: Param: ]
    A14: Variable Add [ Name:%index Value:1 Wrap Around:0 ]
    A15: Array Push [ Name:%confNetworks Position:%index Value:%resultuid*%resultssid Fill Spaces:Off ]
    A16: End For
    A17: Variable Join [ Name:%confNetworks Joiner:, Delete Parts:On ]
    A18: Java Function [ Return:scan Class Or Object:wiman Function:getScanResults {List} () Param: Param: Param: Param: Param: Param: Param: ]
    A19: Java Function [ Return:%length Class Or Object:scan Function:size
{int} () Param: Param: Param: Param: Param: Param: Param: ]
    A20: Variable Subtract [ Name:%length Value:1 Wrap Around:0 ]
    A21: For [ Variable:%index Items:0:%length ]
    A22: Java Function [ Return:result Class Or Object:scan Function:get
{Object} (int) Param:%index Param: Param: Param: Param: Param: Param: ]
    A23: Java Function [ Return:%resultssid Class Or Object:result.SSID Function:toString
{String} () Param: Param: Param: Param: Param: Param: Param: ]
    A24: Java Function [ Return:%resultlvl Class Or Object:result.level Function:toString
{String} () Param: Param: Param: Param: Param: Param: Param: ]
    A25: Variable Add [ Name:%index Value:1 Wrap Around:0 ]
    A26: Array Push [ Name:%scanResult Position:%index Value:%resultlvl*%resultssid Fill Spaces:Off ]
    A27: End For
    A28: Array Process [ Variable:%scanResult Type:Sort Alpha ]
    A29: Variable Join [ Name:%scanResult Joiner:, Delete Parts:On ]
    A30: Else
    A31: Flash [ Text:Error Wifi Enabled %enabled Long:Off ]
    A32: Java Function [ Return: Class Or Object:wiman Function:setWifiEnabled {boolean} (boolean) Param:true Param: Param: Param: Param: Param: Param: ]
    A33: Wait [ MS:0 Seconds:10 Minutes:0 Hours:0 Days:0 ]
    A34: Goto [ Type:Action Number Number:1 Label: ]
    A35: End If
    A36: JavaScriptlet [ Code:// übles heckmeck für network id

var a_confn = global('confNetworks').split(",");
var a_scanres = global('scanResult').split(",");

var a_scanres_ssids = [],a_confn_nids = [], a_confn_ssids = [];

a_scanres.forEach(function(item) {
    var o = item.split('*');
    a_scanres_ssids.push(o[1]);
});

a_confn.forEach(function(item) {
    var o = item.split('*');
    a_confn_nids.push(o[0]);
    a_confn_ssids.push(o[1]);
});

for (var i = 0; i < a_scanres_ssids.length;i++) {
// erst ', dann ", dann wieder '
    var inconfn = a_confn_ssids.indexOf('"'+a_scanres_ssids[i]+'"')
    if (inconfn != -1) {
       //alert ("found nid "+a_confn_nids[inconfn])
       break;
    }
}

setLocal('connectto',a_confn_nids[inconfn]); Libraries: Auto Exit:On Timeout (Seconds):45 ]
    A37: Flash [ Text:%connectto Long:Off ]
    A38: Java Function [ Return: Class Or Object:wiman Function:enableNetwork {boolean} (int,boolean) Param:%connectto Param:true Param: Param: Param: Param: Param: ]
If ... else (A5 + 30) nicht nötig (ohne auch nicht das isEnabled (A4 +5))
A36 nicht schön (mir fiel nichts besseres ein) a37 nur zur kontrolle.
Ginge generell sicher noch schöner

edit:
die globalen variablen können auch local sein (dann sollte die beiden "array clears" auch nicht nötig sein), hatte ich zur besseren kontrolle
und bei A38 könnte noch ein "wenn bereits zum netzwerk verbunden nichts tun" rein
 
Zuletzt bearbeitet: