{"id":6659,"date":"2018-03-26T07:42:28","date_gmt":"2018-03-26T12:42:28","guid":{"rendered":"http:\/\/appcrawler.com\/wordpress\/?p=6659"},"modified":"2018-03-26T07:42:28","modified_gmt":"2018-03-26T12:42:28","slug":"android-log-network-ssids-and-dbm","status":"publish","type":"post","link":"http:\/\/appcrawler.com\/wordpress\/2018\/03\/26\/android-log-network-ssids-and-dbm\/","title":{"rendered":"Android &#8211; Log network SSID&#8217;s and DBM"},"content":{"rendered":"<p>Technically, this could be used to trilaterate over time and heatmap where associates spend their time, as well as what activity occurs where.  To do this, we would need the coordinates of all AP&#8217;s in the given store.<\/p>\n<p>The endpoint was an AWS Lambda function which pushed the data into an AWS dynamodb table.<\/p>\n<p>Main Activity<\/p>\n<pre>\r\npackage com.appcrawler.networklogger;\r\n\r\nimport android.support.v7.app.AppCompatActivity;\r\nimport android.support.v4.app.ActivityCompat;\r\nimport android.os.Bundle;\r\nimport java.util.HashMap;\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\nimport android.util.Log;\r\nimport android.widget.TextView;\r\n\r\nimport org.apache.http.client.HttpClient;\r\nimport org.apache.http.client.methods.HttpPost;\r\nimport org.apache.http.client.entity.UrlEncodedFormEntity;\r\nimport org.apache.http.message.BasicNameValuePair;\r\nimport org.apache.http.NameValuePair;\r\nimport org.apache.http.HttpResponse;\r\nimport org.apache.http.impl.client.DefaultHttpClient;\r\n\r\npublic class MainActivity extends AppCompatActivity {\r\n\r\n  @Override\r\n  protected void onCreate(Bundle savedInstanceState) {\r\n    super.onCreate(savedInstanceState);\r\n    boolean permissionGranted = ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == android.content.pm.PackageManager.PERMISSION_GRANTED;\r\n    ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 200);\r\n    setContentView(R.layout.activity_main);\r\n    final WifiReceiver LocalWireless = new WifiReceiver(this.getApplicationContext());\r\n\r\n\r\n    try {\r\n\r\n      while (true) {\r\n        Thread.sleep(15000);\r\n        HashMap<String, Integer> wireless = LocalWireless.getWifiStrength();\r\n        for (String key : wireless.keySet()) {\r\n          Log.d(\"NETWORKLOGGER\",key + \" \" +wireless.get(key));\r\n          String[] s = {key, wireless.get(key).toString()};\r\n          new PostNetwork().execute(s);\r\n        }\r\n      }\r\n    }\r\n    catch (Exception e) {\r\n      Log.d(\"ERROR\",e.getMessage());\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<p>The wifi receiver<\/p>\n<pre>\r\npackage com.appcrawler.networklogger;\r\n\r\nimport android.content.Context;\r\nimport android.net.wifi.WifiManager;\r\nimport android.net.wifi.ScanResult;\r\nimport java.util.HashMap;\r\nimport java.util.List;\r\nimport android.util.Log;\r\n\r\nclass WifiReceiver {\r\n    Context cxt=null;\r\n    public WifiReceiver(Context c){\r\n        this.cxt=c;\r\n    }\r\n\r\n    public HashMap<String,Integer> getWifiStrength(){\r\n        WifiManager wifiManager = (WifiManager) cxt.getSystemService(Context.WIFI_SERVICE);\r\n        List<ScanResult> wifiList = wifiManager.getScanResults();\r\n        Log.d(\"WIFI\",wifiList.toString());\r\n\r\n        HashMap<String, Integer> wireless=new HashMap<String, Integer>();\r\n\r\n        for(int i=0; i< wifiList.size() ;i++) {\r\n            ScanResult scanResult= wifiList.get(i);\r\n            \/\/int level = WifiManager.calculateSignalLevel(scanResult.level, 500);\r\n            int level = wifiList.get(i).level;\r\n\r\n            String SSID = scanResult.SSID;\r\n            wireless.put(SSID,level);\r\n        }\r\n        return wireless;\r\n    }\r\n}\r\n<\/pre>\n<p>The async class<\/p>\n<pre>\r\npackage com.appcrawler.networklogger;\r\n\r\nimport org.apache.http.HttpResponse;\r\nimport org.apache.http.NameValuePair;\r\nimport org.apache.http.client.HttpClient;\r\nimport org.apache.http.client.methods.HttpPost;\r\nimport org.apache.http.impl.client.DefaultHttpClient;\r\nimport org.apache.http.message.BasicNameValuePair;\r\nimport org.apache.http.client.entity.UrlEncodedFormEntity;\r\nimport org.apache.http.entity.StringEntity;\r\nimport org.json.JSONObject;\r\nimport android.os.AsyncTask;\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\nimport android.util.Log;\r\nimport java.io.BufferedReader;\r\nimport java.io.InputStreamReader;\r\n\r\npublic class PostNetwork  extends AsyncTask<String, String, String>{\r\n\r\n  @Override\r\n  public String doInBackground(String... params) {\r\n      HttpClient httpclient = new DefaultHttpClient();\r\n      HttpPost httppost = new HttpPost(\"https:\/\/your_api_endpoint_to_which_you_post_the_json_below\");\r\n      httppost.addHeader(\"content-type\", \"application\/json\");\r\n      HttpResponse response = null;\r\n      StringBuilder str = new StringBuilder();\r\n      try {\r\n          JSONObject json = new JSONObject();\r\n          json.put(\"network\", params[0]);\r\n          json.put(\"dbm\", params[1]);\r\n          StringEntity param = new StringEntity(json.toString());\r\n          httppost.setEntity(param);\r\n          response = httpclient.execute(httppost);\r\n          BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), \"UTF-8\"));\r\n\r\n          String line = null;\r\n          try {\r\n              while ((line = reader.readLine()) != null) {\r\n                  str.append(line + \"\\n\");\r\n              }\r\n          } catch (Exception e) {\r\n              throw e;\r\n          }\r\n          Log.d(\"RESPONSE\",str.toString());\r\n      }\r\n      catch (Exception e) {\r\n        Log.d(\"ERROR\",e.getMessage());\r\n      }\r\n      return response.toString();\r\n  }\r\n\r\n  @Override\r\n  protected void onPostExecute(String result) {}\r\n\r\n  @Override\r\n  protected void onPreExecute() {}\r\n\r\n  @Override\r\n  protected void onProgressUpdate(String... text) {}\r\n\r\n}\r\n<\/pre>\n<p>The android manifest<\/p>\n<pre>\r\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    package=\"com.appcrawler.networklogger\">\r\n    <uses-permission android:name=\"android.permission.INTERNET\" \/>\r\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" \/>\r\n    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" \/>\r\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" \/>\r\n\r\n    <application\r\n        android:allowBackup=\"true\"\r\n        android:icon=\"@mipmap\/ic_launcher\"\r\n        android:label=\"@string\/app_name\"\r\n        android:roundIcon=\"@mipmap\/ic_launcher_round\"\r\n        android:supportsRtl=\"true\"\r\n        android:theme=\"@style\/AppTheme\">\r\n        <activity android:name=\".MainActivity\">\r\n            <intent-filter>\r\n                <action android:name=\"android.intent.action.MAIN\" \/>\r\n                <category android:name=\"android.intent.category.LAUNCHER\" \/>\r\n                <action android:name=\"android.net.conn.CONNECTIVITY_CHANGE\" \/>\r\n            <\/intent-filter>\r\n        <\/activity>\r\n    <\/application>\r\n<\/manifest>\r\n<\/pre>\n<p>The build.gradle for the app<\/p>\n<pre>\r\napply plugin: 'com.android.application'\r\n\r\nandroid {\r\n    compileSdkVersion 26\r\n    useLibrary 'org.apache.http.legacy'\r\n    defaultConfig {\r\n        applicationId \"com.appcrawler.networklogger\"\r\n        minSdkVersion 26\r\n        targetSdkVersion 26\r\n        versionCode 1\r\n        versionName \"1.0\"\r\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\r\n        multiDexEnabled true\r\n    }\r\n    dependencies {\r\n        compile 'org.apache.httpcomponents:httpcore:4.4.1'\r\n        compile 'org.apache.httpcomponents:httpclient:4.5'\r\n    }\r\n    buildTypes {\r\n        release {\r\n            minifyEnabled false\r\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\r\n        }\r\n    }\r\n\r\n    packagingOptions {\r\n      exclude 'META-INF\/DEPENDENCIES'\r\n    }\r\n}\r\n\r\n\r\ndependencies {\r\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\r\n    implementation 'com.android.support:appcompat-v7:26.1.0'\r\n    implementation 'com.android.support.constraint:constraint-layout:1.0.2'\r\n    testImplementation 'junit:junit:4.12'\r\n    androidTestImplementation 'com.android.support.test:runner:1.0.1'\r\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Technically, this could be used to trilaterate over time and heatmap where associates spend their time, as well as what activity occurs where. To do this, we would need the coordinates of all AP&#8217;s in the given store. The endpoint&hellip;<\/p>\n<p class=\"more-link-p\"><a class=\"more-link\" href=\"http:\/\/appcrawler.com\/wordpress\/2018\/03\/26\/android-log-network-ssids-and-dbm\/\">Read more &rarr;<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"footnotes":""},"categories":[100,97,99],"tags":[],"_links":{"self":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/6659"}],"collection":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/comments?post=6659"}],"version-history":[{"count":6,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/6659\/revisions"}],"predecessor-version":[{"id":6670,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/6659\/revisions\/6670"}],"wp:attachment":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/media?parent=6659"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/categories?post=6659"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/tags?post=6659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}