xcode WLAN Spots anzeigen

 

xcodeneuling

Das hat mir schon sehr geholfen. Der Videocast war sehr gut, besser zu verstehen als in den büchern die ich hier rumliegen hab :)

Also ich habe jetzt eine Tabelle die ich über ein Array mit Daten fülle. Ist es möglich die SSIDs von WLANs, die beim Scannen gefunden werden in ein Array zu packen und damit dann die Tabelle zu füllen?

Das Problem was ich habe ist, wie gelange ich an die SSIDs?

btw. habe mir die Lizenz für 99$ besorgt und Teste die Anwendungen nun auf meinem iPhone, ich muss wirklich sagen, dass es mir nochmals einen Motivationsschub gegeben hat. Es ist ein gutes Gefühl die soeben erstellte Anwendung auf dem einegen iPhone abzuspielen :)
Auch ist es so besser für das WLAN scannen, weil ich nicht sicher bin ob der Simulator diese Funktion bietet.

Profilfoto von flexo

flexo

Folgende Methode aufrufen: Apple80211Scan(struct Apple80211 *handle, CFArrayRef *list, CFDictionaryRef *parameters);

Im Array “list” steht die Information:
list The (returned) CFArrayRef of CFDictionaryRefs containing information on each discovered network


Die Simulation dürfte dies wohl nicht können.

Ja, es ist wirklich ganz spannend wenn das Programm auf dem iPhone läuft anstatt im Simulator. Auch wenn es nur ein “Pippifax”-Programm ist.

 

xcodeneuling

Also, ich habe nun diese Methode dort aufgerufen, wo ich vorher die Tabelle mit Daten gefüllt habe. list als NSArray deklariert und es startet ohne fehler. Allerdings erscheint keine Tabelle. So sieht es im code aus:

- (id)initWithStyle:(UITableViewStyle)style {
    // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
    if ((self = [super initWithStyle:style])) {
        //dataArray = [[NSArray alloc]initWithObjects:@"SSID1",@"SSID2",@"Wlan",@"Test",@"Automa",@"Bla", nil];
        int Apple80211Scan(struct Apple80211 *handle, CFArrayRef *list, CFDictionaryRef *parameters);
        dataArray = list;
        
    }
    return self;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    
    // Configure the cell…
    cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];
    
    return cell;
}

Irgendwie sieht es auch für mich nicht richtig aus.

Profilfoto von flexo

flexo

Also der Ort für den Aufruf würde ich nicht dort hinein tun. Mach doch eine neue Methode. Diese kannst du dann später auch aufrufen z.B. mit einem Refresh-Knopf.

Im Programm rufst du die Methode in viewDidLoad auf.

Du kannst dir den Inhalt des Arrays ausgeben lassen in der Konsole mit NSLog (jaja, debuggen geht auch): NSLog(@“list%@”, list);
Immer interessant ist auch die Anzahl Elemente im Array:  NSLog(@“list count: %i”, [list count]);

Wenn du die Zeile dataArray = [[NSArray alloc]initWithObjects:@“SSID1”....  “entkommentierst”, erscheint dann etwas?

Also so wie ich das sehe, rufst du die Methode etwas falsch auf. Sollte eher so sein:  Apple80211Scan(airportHandle,&results;,parameters);

Wobei du airportHandle und parameters irgendwo definieren musst. 
Interessant ist diese Datei: http://code.google.com/p/iphone-wireless/source/browse/trunk/Stumbler/MSNetworksManager.m
Besonders die Methode - (void)scan (so eine Methode solltest du auch haben). Wobei der Code halt etwas umfangreich ist und vielleicht etwas schwer zu verstehen.

Falls du sicher bist, dass etwas im Array ist, hilft dir vielleicht dies weiter mit der Tabelle: http://code.google.com/p/iphone-wireless/source/browse/trunk/Stumbler/MSNetworkDetailsView.m

Evt. schaue ich mir dies auch mal an, dann kann ich dir auch richtig helfen :-)

 

xcodeneuling

Ja, die tabelle funktioniert. Hatte noch mit ein paar problemen mit views zu kämpfen. Weil ich die tabelle zuerst programmatisch erstellt habe, konnte ich sie im interface builder nicht finden und dadurch war die tabelle immer im vordergrund. Das habe ich gelöst, indem ich eine tabelle mit dem builder erstellt habe. Diese funktioniert auch mit dem dataArray.
Das Array ist nicht leer, es enhält die drei daten @“SSID”...  kein NSDictionary.

 

xcodeneuling

So nach etwas sucherei und herumspielns geht der scanner :) habe den code aus diesem beispiel übernommen:

http://code.google.com/p/iphone-wireless/issues/detail?id=20#c22

mit der CFShow kann ich die SSID in der debugger Console anzeigen.

[networks setObject:[scan_networks objectAtIndex: i] forKey:[[scan_networks objectAtIndex: i] objectForKey:@"BSSID"]];
CFShow([[scan_networks objectAtIndex: i] objectForKey:@"SSID_STR"]);

Das sieht jetzt schon sehr gut aus. Wie kann ich diese SSID in die Tabelle einfügen? Meine Tabelle sieht so aus:

// Tabelle

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    //return 2;
    return [dataArray count];
    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
        
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    
    // Configure the cell…
    cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];
    
    return cell;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    if (section == 0)
        return @"Gefundene WLANs:";
    else {
        return @"Keine WLANs gefunden.";
    }

}

//tabelle ende

Profilfoto von flexo

flexo

Indem du dataArray füllst mit dem Suchresultat? Auf der Seite hat es sogar ein Beispiel wie man dies mit einer for-Schleife macht. Wobei er kein NSArray verwendet sondern ein NSMutableDictionary.

Wollen dann ein Printscreen sehen wenns funktioniert :-)

Tipp: Für eine bessere Übersicht im Code kann man #pragma mark - verwenden. z.B. : #pragma mark Meine Tabelle

 

xcodeneuling

ja… ich weiss, dass ich die gefundenen wlans in das dataArray hinzufügen muss. Aber irgendwie will das nicht klappen.
Also ich habe aus meinem code das alte dataArray auskommentiert, das die “gefakten” SSIDs anzeigte.
Das neue dataArray sieht jetzt so aus:

dataArray = ([[scan_networks objectAtIndex: i] objectForKey:@"SSID_STR"]);

Spuckt keine errors raus, application startet aber tabelle bleibt leer.

/edit:
Hmm ich müsste das array ja auch noch leeren, wenn ich mich bewege und andere wlans scanne oder?
/edit die 2te:
Müsste es nicht ein NSMutableArray sein?

Anmelden um neue Antworten zu verfassen

Allegra Leser! Nur angemeldete Nutzer können bei diesem Beitrag Antworten hinterlassen. Jetzt kostenlos registrieren oder mit bestehendem Benutzerprofil anmelden.