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 jboolean android_net_wifi_trackSignificantWifiChange( JNIEnv *env, jclass cls, jint iface, jint id, jobject settings) { wifi_interface_handle handle = getIfaceHandle(env, cls, iface); ALOGD("tracking significant wifi change on interface[%d] = %p", iface, handle); wifi_significant_change_params params; memset(¶ms, 0, sizeof(params)); params.rssi_sample_size = getIntField(env, settings, "rssiSampleSize"); params.lost_ap_sample_size = getIntField(env, settings, "lostApSampleSize"); params.min_breaching = getIntField(env, settings, "minApsBreachingThreshold"); const char *bssid_info_array_type = "[Landroid/net/wifi/WifiScanner$BssidInfo;"; jobjectArray bssids = (jobjectArray)getObjectField( env, settings, "bssidInfos", bssid_info_array_type); params.num_ap = env->GetArrayLength(bssids); if (params.num_ap == 0) { ALOGE("Error in accessing array"); return false; } ALOGD("Initialized common fields %d, %d, %d, %d", params.rssi_sample_size, params.lost_ap_sample_size, params.min_breaching, params.num_ap); for (int i = 0; i < params.num_ap; i++) { jobject objAp = env->GetObjectArrayElement(bssids, i); jstring macAddrString = (jstring) getObjectField( env, objAp, "bssid", "Ljava/lang/String;"); if (macAddrString == NULL) { ALOGE("Error getting bssid field"); return false; } ScopedUtfChars bssid(env, macAddrString); if (bssid.c_str() == NULL) { ALOGE("Error getting bssid"); return false; } mac_addr addr; parseMacAddress(bssid.c_str(), addr); memcpy(params.ap[i].bssid, addr, sizeof(mac_addr)); char bssidOut[32]; sprintf(bssidOut, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); params.ap[i].low = getIntField(env, objAp, "low"); params.ap[i].high = getIntField(env, objAp, "high"); ALOGD("Added bssid %s, [%04d, %04d]", bssidOut, params.ap[i].low, params.ap[i].high); } ALOGD("Added %d bssids", params.num_ap); wifi_significant_change_handler handler; memset(&handler, 0, sizeof(handler)); handler.on_significant_change = &onSignificantWifiChange; return wifi_set_significant_change_handler(id, handle, params, handler) == WIFI_SUCCESS; }