static wifi_error setHotlistAPsUsingScanResult(wifi_bssid_hotlist_params *params){ printMsg("testHotlistAPs Scan started, waiting for event ...\n"); EventInfo info; memset(&info, 0, sizeof(info)); getEventFromCache(info); wifi_scan_result results[256]; memset(results, 0, sizeof(wifi_scan_result) * 256); printMsg("Retrieving scan results for Hotlist AP setting\n"); int num_results = 256; int result = wifi_get_cached_gscan_results(wlan0Handle, 1, num_results, results, &num_results); if (result < 0) { printMsg("failed to fetch scan results : %d\n", result); return WIFI_ERROR_UNKNOWN; } else { printMsg("fetched %d scan results\n", num_results); } for (int i = 0; i < num_results; i++) { printScanResult(results[i]); } for (int i = 0; i < stest_max_ap; i++) { memcpy(params->ap[i].bssid, results[i].bssid, sizeof(mac_addr)); params->ap[i].low = -htest_low_threshold; params->ap[i].high = -htest_high_threshold; } params->num_ap = stest_max_ap; return WIFI_SUCCESS; }
static jobject android_net_wifi_getScanResults( JNIEnv *env, jclass cls, jint iface, jboolean flush) { wifi_scan_result results[256]; int num_results = 256; wifi_interface_handle handle = getIfaceHandle(env, cls, iface); ALOGD("getting scan results on interface[%d] = %p", iface, handle); int result = wifi_get_cached_gscan_results(handle, 1, num_results, results, &num_results); if (result == WIFI_SUCCESS) { jclass clsScanResult = (env)->FindClass("android/net/wifi/ScanResult"); if (clsScanResult == NULL) { ALOGE("Error in accessing class"); return NULL; } jobjectArray scanResults = env->NewObjectArray(num_results, clsScanResult, NULL); if (scanResults == NULL) { ALOGE("Error in allocating array"); return NULL; } for (int i = 0; i < num_results; i++) { jobject scanResult = createObject(env, "android/net/wifi/ScanResult"); if (scanResult == NULL) { ALOGE("Error in creating scan result"); return NULL; } setStringField(env, scanResult, "SSID", results[i].ssid); char bssid[32]; sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], results[i].bssid[2], results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]); setStringField(env, scanResult, "BSSID", bssid); setIntField(env, scanResult, "level", results[i].rssi); setIntField(env, scanResult, "frequency", results[i].channel); setLongField(env, scanResult, "timestamp", results[i].ts); env->SetObjectArrayElement(scanResults, i, scanResult); env->DeleteLocalRef(scanResult); } return scanResults; } else { return NULL; } }
static int SelectSignificantAPsFromScanResults() { wifi_scan_result results[256]; memset(results, 0, sizeof(wifi_scan_result) * 256); printMsg("Retrieving scan results for significant wifi change setting\n"); int num_results = 256; int result = wifi_get_cached_gscan_results(wlan0Handle, 1, num_results, results, &num_results); if (result < 0) { printMsg("failed to fetch scan results : %d\n", result); return WIFI_ERROR_UNKNOWN; } else { printMsg("fetched %d scan results\n", num_results); } for (int i = 0; i < num_results; i++) { printScanResult(results[i]); } wifi_significant_change_params params; memset(¶ms, 0, sizeof(params)); params.rssi_sample_size = swctest_rssi_sample_size; params.lost_ap_sample_size = swctest_rssi_lost_ap; params.min_breaching = swctest_rssi_min_breaching; for (int i = 0; i < stest_max_ap; i++) { memcpy(params.ap[i].bssid, results[i].bssid, sizeof(mac_addr)); params.ap[i].low = results[i].rssi - swctest_rssi_ch_threshold; params.ap[i].high = results[i].rssi + swctest_rssi_ch_threshold; } params.num_ap = stest_max_ap; printMsg("Settting Significant change params rssi_sample_size#%d lost_ap_sample_size#%d" " and min_breaching#%d\n", params.rssi_sample_size, params.lost_ap_sample_size , params.min_breaching); printMsg("BSSID\t\t\tHIGH\tLOW\n"); for (int i = 0; i < params.num_ap; i++) { mac_addr &addr = params.ap[i].bssid; printMsg("%02x:%02x:%02x:%02x:%02x:%02x\t%d\t%d\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], params.ap[i].high, params.ap[i].low); } wifi_significant_change_handler handler; memset(&handler, 0, sizeof(handler)); handler.on_significant_change = &onSignificantWifiChange; int id = getNewCmdId(); return wifi_set_significant_change_handler(id, wlan0Handle, params, handler); }
static void retrieveScanResults() { wifi_scan_result results[256]; memset(results, 0, sizeof(wifi_scan_result) * 256); printMsg("Retrieve Scan results available -->\n"); int num_results = 256; int result = wifi_get_cached_gscan_results(wlan0Handle, 1, num_results, results, &num_results); if (result < 0) { printMsg("failed to fetch scan results : %d\n", result); return; } else { printMsg("fetched %d scan results\n", num_results); } printScanHeader(); for (int i = 0; i < num_results; i++) { printScanResult(results[i]); } }