I. objectives
The APP monitors the status information of wifi connected to Android devices (mobile phones, TV or other devices) and uploads it to the server regularly to analyze the status and signal strength of wifi in the environment where the devices are located at a specific time point.
2, Use scenario
In the actual scene composed of multiple intelligent WiFi devices, the device occasionally fails to control. It is necessary to analyze the reasons for the failure of device control based on the current WiFi state and signal strength in the scene. Therefore, I hope to install this APP on an Android device in the scene, monitor the WiFi status information and upload it to the server.
Premise: the Android device with this APP is connected to the same router with other WiFi devices in the scene.
3, Options
Scheme 1: judge signal strength according to connected wifi information
According to the connected wifi information provided by Android system to developers, the signal strength of wifi environment can be measured. The description and description of relevant parameters (Methods of wifi info class) are as follows:
parameter | Parameter (method) | describe | Explain |
---|---|---|---|
mac | getBSSID() | Gets the current access point for the basic service set identifier (BSSID) | |
wifi_name | getSSID() | Get the name of wifi | |
rssi | getRssi() | Obtain the strength of wifi received signal | Unit: dBm, value range - 100 ~ 0, smaller absolute value, stronger signal |
ip | getIpAddress() | Get the IP address of wifi | IP of the connected route |
link_speed | getLinkSpeed() | Get current link speed | |
frequency | getFrequency() | Get current frequency | |
channel | getFrequency() | channel | Current channel can be judged by frequency |
In addition, the function of channel can refer to the following link for details:
http://cnzhx.net/blog/13-channels-of-wifi/
Among them, the strength of wifi signal is mainly measured according to the value returned by getRssi(), - 50dBm – 0 means the signal is good, - 70dBm~-50dBm means the signal is poor, less than - 70dBm means the signal range is poor, and there is a possibility that there is no connection.
However, the value returned by getRssi() method can only be used to measure the signal strength of the device connected to the router's internal network. As for whether the device can access the external network and the speed of accessing the external network, a new scheme is needed to determine the signal strength.
Scheme 2: use the "PING" command to check whether the network request is connected
Ping sends an ICMP(Internet Control Messages Protocol) to the destination and reports whether the desired ICMP echo (ICMP echo response) is received, which is used to check whether the network is smooth or the network connection speed.
By analyzing the relevant parameters in the result of each PING command, we can judge whether the network request is connected and how fast the access is. For example, packet loss rate, time consumption per packet and average time consumption.
4, Technical realization
// Declaring authority <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
// Scheme 1: judge the signal strength according to the connected wifi information //(1) Get an instance of WiFi Manager WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService (Context.WIFI_SERVICE); //(2) Get an instance of WiFi info WifiInfo wifiInfo = wifiManager.getConnectionInfo(); //(3) Get related parameters String wifiName = wifiInfo.getSSID(); //wifi name String wifiBSSID = wifiInfo.getBSSID(); //Network access point int wifiRssi = wifiInfo.getRssi(); //rssi value: signal strength String wifiIP = Formatter.formatIpAddress(wifiInfo.getIpAddress()); //Access routing IP int wifiLinkSpeed = wifiInfo.getLinkSpeed(); //Link speed int wifiFrequency = wifiInfo.getFrequency(); //Current frequency
//Scheme 2: use the "PING" command to check whether the network request is connected String ip = "www.baidu.com";// The address of ping. Baidu is currently ping Process p = Runtime.getRuntime().exec("ping -c 4 -w 5 " + ip);// ping website 4 times InputStream input = p.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(input)); String content = ""; while ((content = in.readLine()) != null) {stringBuffer.append(content);} status = p.waitFor(); //Result of ping, 0-success, 1-failure //stringBuffer.toString(): the result returned by ping, including packet loss rate, time consumption of each packet, average time consumption, etc
Five, summary
An APP is installed on Android device to realize WiFi status monitoring. Two schemes need to be combined:
1. Obtain the status information of the signal strength of the connected wifi router, and measure the signal strength of the intranet connected to the router
2. Judge whether it can access the external network and the speed of accessing the external network through the result of ping the external network address