B4A Library Simple WIFI library Updated V. 3.07 09-05-2018

This library is based on the library Jem:https://www.b4x.com/android/forum/threads/simple-wifi-library.38601/

Which Jem can no longer maintain.

I needed some methods that the library did not have, for an application I'm doing, and instead of creating a library from scratch, I preferred to take advantage of Jem's library and create those methods that I needed.

I've modified the source code, I have corrected some errors and added new methods that I needed.

I’ve tested on Android 4x, 5x and 6x on different devices and it gives me no error.

Author: V-2.17 by Jem Miller - Missing Link Software

Permissions:
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.INTERNET
android.permission.WAKE_LOCK


______________________________________________________________________

V-3.07 by bgsoft

Corrected compatibility issues with API level <21
______________________________________________________________________

V-3.06 by bgsoft

Corrected compatibility issues with API level <23

______________________________________________________________________
V-3.05 by bgsoft

Events:

Modified

ScanDone (Results() As String, Count As Int) Results()

returns a string array containing all scanned Access Points in the area of the device, sorted 'by Signal strength. These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength (dBm) , "Saved" (if this network was previously saved for use on this device) or “”, BSSID, Signal Percentage (0-100%), Frequency (Mhz), Center Frequency 0 (Mhz), Center Frequency 1 (Mhz), Channel Width (Mhz), Channel number, Band (2.4 Ghz / 5Ghz), Distance (m).



Field:

Modified

Wifis As String()

A string array containing all scanned Access Points in the area of the device, sorted 'by Signal strength. These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength (dBm) , "Saved" (if this network was previously saved for use on this device) or “”, BSSID, Signal Percentage (0-100%), Frequency (Mhz), Center Frequency 0 (Mhz), Center Frequency 1 (Mhz), Channel Width (Mhz), Channel number, Band (2.4 Ghz / 5Ghz), Distance (m).


______________________________________________________________________

V-3.04 by bgsoft

New Constants:


CHANNEL_WIDTH_20MHZ = 0

Channel Width 20Mhz

CHANNEL_WIDTH_40MHZ = 1

Channel Width 40Mhz

CHANNEL_WIDTH_80MHZ = 2

Channel Width 80Mhz

CHANNEL_WIDTH_160MHZ = 3

Channel Width 160Mhz

CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4

Channel Width 80Mhz + 80Mhz


Events:

Modified

ScanDone (Results() As String, Count As Int) Results()

returns a string array containing all scanned Access Points in the area of the device, sorted 'by Signal strength. These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength (dBm) , "Saved" (if this network was previously saved for use on this device) or “”, BSSID, Signal Percentage (0-100%), Frequency (Mhz), Channel Width (Mhz), Channel number, Band (2.4 Ghz / 5Ghz), Distance (m).


Field:

Modified


Wifis As String()

A string array containing all scanned Access Points in the area of the device, sorted 'by Signal strength. These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength (dBm) , "Saved" (if this network was previously saved for use on this device) or “”, BSSID, Signal Percentage (0-100%), Frequency (Mhz), Channel Width (Mhz), Channel number, Band (2.4 Ghz / 5Ghz), Distance (m).


____________________________________________________________________________
V-3.03 by bgsoft

Events:


Modified

ScanDone (Results() As String, Count As Int)
Results() Sorted by Signal strength.


Method:

NEW
StopScan *** Erase by Error in version 3.02

NEW
WifiAPDistance As Double
Returns the estimated distance to WIFI Access Point, depending on the signal level and frequency
Returns 0 on error.

Modified
StartScan (EventName As String, NoEventOnSystemScan As Boolean)
Recovered parameter "NoEventOnSystemScan", Erase in version 3.02
Does not start Wifi if it is stopped.

Field:

Modified
Wifis As String()
A string array containing all scanned Access Points in the area of the device, sorted 'by Signal strength. These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength, and "Saved" if this network was previously saved for use on this device.


____________________________________________________________________________
V-3.02 by bgsoft

Constants:

WIFI_2_4GHZ_BAND As Int = 1

2.4GHz WIFI Band

WIFI_5GHZ_BAND As Int = 2

5GHz WIFI Band

WIFI_MODE_FULL As Int = 1

In this WIFI lock mode, WIFI will be kept active, and will behave normally. It will attempt to automatically establish a connection to a remembered access point that is within range, and will do periodic scans if there are remembered access points but none are in range.

WIFI_MODE_SCAN_ONLY As Int = 2

In this WIFI lock mode, WIFI will be kept active, but the only operation that will be supported is initiation of scans, and the subsequent reporting of scan results. No attempts will be made to automatically connect to remembered access points, nor will periodic scans be automatically performed looking for remembered access points.
Scans must be explicitly requested by an application in this mode.

WIFI_MODE_FULL_HIGH_PERF As Int = 3

In this WIFI lock mode, WIFI will be kept active as in mode WIFI_MODE_FULL but it operates at high performance with minimum packet loss and low packet latency even when the device screen is off.
This mode will consume more power and hence should be used only when there is a need for such an active connection.


Events:

isOnline_PingDone(isOnline As Boolean)

Launches when "isOnlinePing5" finishes or when "isOnlinePing6" finishes or timeout
isOnline: Returns True if Internet is available


Methods:

WifiFrequency As Int

Returns the Link Frequency (MHz) of the connected WIFI Access Point
Returns 0 on error.

WifiChannel As Int

Returns the Link Channel of the connected WIFI Access Point
2.4GHz Band: 1 - 13, 14 (Japan only)
5GHz Band: 0 - 200
Returns -1 on error.

WifiBand As Int

Returns the Link Band of the connected WIFI Access Point
WIFI_2_4GHZ_BAND: 2.4GHz Band
WIFI_5GHZ_BAND: 5GHz Band
Returns 0 on error.

is5GHzBandSupported As Boolean

Returns true if this WIFI adapter supports 5 GHz band

holdWifiOn As Boolean

Allows an application to keep the WIFI radio awake. Normally the WIFI radio may turn off when the user has not used the device in a while.
WIFI radio will keep awake until "releaseWifiOn" is called.
Returns True on success

holdWifiOn2(lockType As Int) As Boolean

Allows an application to keep the WIFI radio awake. Normally the WIFI radio may turn off when the user has not used the device in a while.
WIFI radio will keep awake until "releaseWifiOn" is called.
lockType: WIFI_MODE_FULL, WIFI_MODE_SCAN_ONLY, WIFI_MODE_FULL_HIGH_PERF
Returns True on success

releaseWifiOn As Boolean

Unlocks the WIFI radio, previously locked by calling "holdWifiOn" or "holdWifiOn2", allowing it to
turn off when the device is idle.
Returns True on success

isWifiHeldOn As Boolean

Checks if WIFI is held On by a call to "holdWifiOn" or "holdWifiOn2"


isOnlinePing5(timeout As Long) As Boolean

Checks for Internet connection by sending a Ping to Google DNS server (Ip: 8.8.8.8)
Launches the event "isOnline_PingDone(isOnline As Boolean)" with the ping result
timeout: Maximum waiting time in milliseconds
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if success

isOnlinePing6(IpHost As String, timeout As Long) As Boolean

Checks for Internet connection by sending a Ping to IpHost
Launches the event "isOnline_PingDone(isOnline As Boolean)" with the ping result
IpHost: Ip address or Host name
timeout: Maximum waiting time in milliseconds
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if success

__________

V-3.01 by bgsoft

I have added the "stopScan" method to stop "_ScanDone" events from scans made automatically by the system, in the background.

I have also modified the "startScan" method, adding the parameter "NoEventOnSystemScan" that allows to disable the events coming from Scans made automatically by the system, in the background.

Two new isOnlinePing3 and isOnlinePing4 methods, equivalent to isOnlinePing and isOnlinePing2 but adding a timeout parameter, in milliseconds.

NEW

isOnlinePing3(timeout As Long) As Boolean

Checks for Internet connection by sending a Ping to Google DNS server (Ip: 8.8.8.8)
timeout: Maximum waiting time in milliseconds
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if Internet is available

isOnlinePing4(IpHost As String, timeout As Long) As Boolean

Checks for Internet connection by sending a Ping to IpHost
IpHost: Ip address or Host name
timeout: Maximum waiting time in milliseconds
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if Internet is available

stopScan

Stops events launched on system background scans, if enabled in "startScan".
Call "updateWifiList" to re-activate this events.

UPDATED
startScan(EventName As String, NoEventOnSystemScan As Boolean)

Initializes all objects and scans for WIFI networks. Builds a string array of results (wifis) that can be accessed directly or with a call to updateWifiList.
EventName: Name of the Event to launch when Scan finish (EventName_ScanDone)
NoEventOnSystemScan: Launches events only on requested scans (true) or on all scans (false), including system background scans.
THIS METHOD SHOULD ONLY BE CALLED ONCE!

______________________________________________________________________________________

V-3.00 by bgsoft

Class MLwifi

Methods:


APIversion As Int
Returns the Version of Android running on the device as an integer such as 19, 21, 23, etc

EnableWifi(Enabled As Boolean)
Turns WIFI On or Off. Pass True to Enable WIFI or False to Disable

isWifiEnabled As Boolean
Returns whether WIFI is Enabled (true) or Disabled (false)

WifiMACAddress As String
Returns the MAC Address of the WIFI interface or empty string

WifiIpAddress As String
Returns the IP Address of the WIFI interface or empty string

WifiSSID As String
Returns the current WIFI SSID or empty string

WifiSignal As Int
Returns the WIFI signal strength in dBm as an integer or 0 on error

WifiStrength As Int
Returns the WIFI signal strength in percentage as an integer (0 to 100)
Returns 0 on error
This method fails in some devices. Use WifiSignalPct() instead

CalcWifiPct(int WifiSignal)
Calculates WIFI signal percentage from the WIFI signal level as an integer (0 to 100)
Signal Range: -100dBm -> 0%, -50dBm -> 100%

WifiSignalPct As Int
Returns the WIFI signal strength in percentage as an integer (0 to 100)
Returns 0 on error

WifiLinkSpeed As Int
Returns the LinkSpeed of the connected WIFI Access Point
Returns 0 on error.

isWifiConnectedOld As Boolean
Checks if WIFI is connected. This only checks for WIFI connection to a router
It does NOT test for Internet availability
Returns True if WIFI is connected or False if 2G, 3G, 4G, WIMAX or no connection
This method uses "getNetworkInfo()" that was deprecated in API level 23

isWifiConnected As Boolean
Checks if WIFI is connected. This only checks for WIFI connection to a router
It does NOT test for Internet availability
Returns True if WIFI is connected or False if 2G, 3G, 4G, WIMAX or no connection

isMobileConnected As Boolean
Checks if Phone Data is connected. This only checks for connection to a phone network.
It does NOT test for Internet availability.
Returns True if 2G, 3G or 4G Data is connected or False if WIFI, WIMAX or no connection

ActiveNetworkTypeName As String
Returns the Type (0:MOBILE, 1:WIFI, 6:WIMAX, 7:BLUETOOTH, 9:ETHERNET, etc) of the current Active Network or -1

ActiveNetworkType As Int
Returns the Type Name (WIFI, MOBILE, etc) of the current Active Network or empty string

isOnline As Boolean
Checks for Internet connection
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if Internet is available
ERROR!!!. This method only checks if the device is connected to any network (WIFI, Phone Data, etc),
but the network can be not connected to Internet (ADSL router not connected to phone line, etc)

isOnlinePing As Boolean
Checks for Internet connection by sending a Ping to Google DNS server (Ip: 8.8.8.8)
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if Internet is available

isOnlinePing2(String IpHost) As Boolean
Checks for Internet connection by sending a Ping to any Internet server
IpHost: Ip address or Host name
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if Internet is available

saveWifiAP(String ssid, int security, String password, boolean connect) As Boolean
Saves the configuration of a WIFI AP onto the device
ssid: Access Point SSID
security: Access Point security type (0:NONE, 1:WEP, 2:WAP)
password: Access Point password/phrase ("" for an open network)
connect: true -> Connect to the WIFI AP after saving
Returns True on success

isSavedWifiAP(String ssid) As Boolean
Checks if a WIFI AP is saved on the device
ssid: Access Point SSID
Returns True if this SSID is saved

removeWifiAP(String ssid) As Boolean
Remove a saved WIFI AP on the device
ssid: Access Point SSID
Returns True on success

disconnectWifiAP() As Boolean
Disconnects the current WIFI AP connection
Returns True on success

connectWifiAP(String ssid) As Boolean
Connects to a WIFI AP already configured on the device
ssid: Access Point SSID
Returns true on success

Class MLscan

Events:

ScanDone(Results() As String, Count As Int)
Launches when Scan finishes and a new list of Access Points is ready
Results(): A string array containing all scanned Access Points in the area of the device.
These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength, and "Saved" if this network was previously
saved for use on this device.
Count: The number of elements in the Results() array

Fields:

wifis As String[]

A string array containing all scanned Access Points in the area of the device.
These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength, and "Saved" if this network was previously
saved for use on this device.

Methods:

startScan(EventName As String)
Initializes all objects and scans for WIFI networks. Builds a string array
of results (wifis) that can be accessed directly or with a call to updateWifiList.
EventName: Name of the Event to launch when Scan finish (EventName_ScanDone)
THIS METHOD SHOULD ONLY BE CALLED ONCE!
Call only after startScan has already been called and a string array of Access Points
has been built. This method returns a string array containing the access points from the
most recent scan, including background scans done automatically by the Android WifiManager.
Calls the ScanDone event when a new list is ready.
Returns the string array of comma separated WIFI access points by SSID. Each entry may
contain the following:
SSID, Security Type, Signal level (in dBm), and the word "Saved" if the network was
previously saved for use on this device.
updateWifiList

getBSSID(EntryNumber As Int) As String
Returns the BSSID for the selected entry.
EntryNumber: If you display the string array wifis or the array returned in the getWifiList method UNSORTED,
you can pass the Position variable from your ListView_Click event.
Otherwise, you must pass the entry number from the string array since that is what is used as a reference.

WifiCap(EntryNumber As Int) As String
Returns a String containing info about the selected entry. A startScan must have already been done.
The string contains the SSID, the BSSID, and the Capabilities of the Network Access Point,
comma separated (SSID,BSSID,CapabilityString). The capabilities part can be quite long.
EntryNumber: If you display the string array wifis or the array returned in the getWifiList method UNSORTED,
you can pass the Position variable from your ListView_Click event.
Otherwise, you must pass the entry number from the string array since that is what is used as a reference.
Returns a string of comma separated entries of SSID,BSSID, and capability string. Returns an empty string on error.

isSavedWifiAP(EntryNumber As Int) As Boolean
Checks the stored networks on the device to see if this entry is a previously saved Access Point
EntryNumber: The entry number in the wifis array to check. If you display the string array wifis or
the array returned in the getWifiList method UNSORTED, you can pass the Position variable from
your ListView_Click event.
Otherwise, you must pass the entry number from the string array since that is what is used as a reference.
Returns True if this is a stored network

connectWifiAP(EntryNumber As Int) As Boolean
Connects to a network already configured on the device. The device will use saved values to connect.
EntryNumber: If you display the string array wifis or the array returned in the getWifiList method UNSORTED,
you can pass the Position variable from your ListView_Click event.
Otherwise, you must pass the entry number from the string array since that is what is used as a reference.
Returns true on success

listSavedNetworks As List
Builds a list of all saved networks on the device.
Returns a comma separated list of: SSID,BSSID,Network ID number.

saveWifiAP(EntryNumber As Intr, securityType As String, Password As String) As Boolean
Saves the configuration of a WIFI AP onto the device and connects to it.
EntryNumber: If you display the string array wifis or the array returned in the getWifiList method UNSORTED,
you can pass the Position variable from your ListView_Click event.
Otherwise, you must pass the entry number from the string array since that is what is used as a reference.
securityType: The Access Point security type (returned in the scan result string array)
Password: The password/phrase for the WIFI access point. Pass "" for an open network. Handles WEP HEX or text phrases
Returns True if the connection is successful

removeWifiAP(NetId As Int) As Boolean
Remove a saved WIFI AP on the device
NetId - The network ID number to delete (returned in the listSavedNetworks method)
Returns True on success



Regards
 

Attachments

  • MLWifi_3_0.zip
    13.7 KB · Views: 500
  • MLWifi_3_01.zip
    27.6 KB · Views: 439
  • ML_Wifi_3_02.zip
    17.4 KB · Views: 444
  • MLWifi_3_03.zip
    18.8 KB · Views: 923
  • MLwifi 3_04.zip
    19.5 KB · Views: 314
  • MLwifi_3.05.zip
    19.6 KB · Views: 358
  • MLwifi_3.06.zip
    19.7 KB · Views: 337
  • MLwifi_3.07.zip
    19.8 KB · Views: 1,274
Last edited:

DonManfred

Expert
Licensed User
Longtime User

Paulo Rosa

Member
Licensed User
Hi @bgsoft,

Regarding the method updateWiFiList,

According to the documentation, "This method returns a string array containing the access points from the most recent scan, including background scans done automatically by the Android WifiManager."

I would like to suggest that you include a (possibly optional) parameter which when true make updateWiFiList force the Android WiFiManager to do a new Wi-Fi AP scan. The reason for this request is that in some situations, the AP list can be eventually outdated as the phone is moved around in an environment with several APs (like my house which has four APs...).

I'm aware that recent Android versions are gradually limiting the number of times an app can force the WiFiManager to do a AP scan. But that's not a problem, for my app would not call repeatedly for a forced scan and that would be done only in foreground.

Regards,

Hi, @bgsoft, any chances?

Best,
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hi Paulo:

Sorry I have not answered you before, but these last months I am very busy.

What you ask is already done. Just make another updateWiFiList call again.

In the initialization already contains that parameter, I put it in version 3.01 :

V-3.01
UPDATED
startScan(EventName As String, NoEventOnSystemScan As Boolean)

Initializes all objects and scans for WIFI networks. Builds a string array of results (wifis) that can be accessed directly or with a call to updateWifiList.
EventName: Name of the Event to launch when Scan finish (EventName_ScanDone)
NoEventOnSystemScan: Launches events only on requested scans (true) or on all scans (false), including system background scans.
THIS METHOD SHOULD ONLY BE CALLED ONCE!


Regarding your question of the difference between WiFiSignalPct and WiFiStrength, it is already in version 3.0, they are the same:

WifiStrength As Int
Returns the WIFI signal strength in percentage as an integer (0 to 100)
Returns 0 on error
This method fails in some devices. Use WifiSignalPct() instead

Regards
 

danebn11

Member
Licensed User
Hello,
I am using this Library since 1,5 years and it works very well.
Now I have a new Smartphone and if it is connected to wifi, "wifi.WifiSSID" returns <unknown ssid>.
Has anyone else the same problem?
 

JMB

Active Member
Licensed User
Longtime User
Hello,
I am using this Library since 1,5 years and it works very well.
Now I have a new Smartphone and if it is connected to wifi, "wifi.WifiSSID" returns <unknown ssid>.
Has anyone else the same problem?


Others may be able to provide a better answer, but I seemed to get this when I wasn't connected to Wifi, but to the cellular network.
 

rraswisak

Active Member
Licensed User
Hello,
I am using this Library since 1,5 years and it works very well.
Now I have a new Smartphone and if it is connected to wifi, "wifi.WifiSSID" returns <unknown ssid>.
Has anyone else the same problem?
Just turn on your device location to reveal ssid
 

Computersmith64

Well-Known Member
Licensed User
Longtime User
At the risk of being accused of double-posting a question, I'm going to post here because my post in the Bugs & wishlist forum has so far been unanswered. I won't repeat the entire post (Simple Wifi (MLWifi) not working correctly with Android 9) - however the upshot is that on Android 9 devices, the library is reporting isWifiConnected as false, even when an app is connected to an access point.

From another post, it seems that this might only happen if the AP doesn't have internet access - however I haven't looked into this because in my case I'm seeing the issue when a B4A app is trying to connect to a B4R app that's creating an access point that isn't connected to the internet anyway. In my other post (referred to above) there is a B4A app & a B4R app that when run together will reproduce the issue.

- Colin.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
At the risk of being accused of double-posting a question, I'm going to post here because my post in the Bugs & wishlist forum has so far been unanswered. I won't repeat the entire post (Simple Wifi (MLWifi) not working correctly with Android 9) - however the upshot is that on Android 9 devices, the library is reporting isWifiConnected as false, even when an app is connected to an access point.

From another post, it seems that this might only happen if the AP doesn't have internet access - however I haven't looked into this because in my case I'm seeing the issue when a B4A app is trying to connect to a B4R app that's creating an access point that isn't connected to the internet anyway. In my other post (referred to above) there is a B4A app & a B4R app that when run together will reproduce the issue.

- Colin.

Hi, I tested with a samsung galaxy s8 + with android 9 and isWifiConnected works correctly.
Even if the mobile data is stopped or the location.
I already answered in the other post (Bugs & wishlist)

regards
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hi, I have tested your project on a Samsung Galaxy 8+ with Android 9 and is WIFIConnected works correctly.
Even if the mobile data is stopped or the location.

I have placed at the beginning of Public Sub ConnectToAP

B4X:
  LogColor ("testWiFi.isWifiConnected" & testWiFi.isWifiConnected, Colors.Blue)

And it returns TRUE


regards
 

Computersmith64

Well-Known Member
Licensed User
Longtime User
[
Hi, I tested with a samsung galaxy s8 + with android 9 and isWifiConnected works correctly.
Even if the mobile data is stopped or the location.
I already answered in the other post (Bugs & wishlist)

regards
Per my reply in our PMs, I tested the updates you sent me & they do not work on an Android 9 device if the connected AP is not also connected to the internet.

- Colin.
 

Philip Prins

Active Member
Licensed User
Longtime User
This library is based on the library Jem:https://www.b4x.com/android/forum/threads/simple-wifi-library.38601/

Which Jem can no longer maintain.

I needed some methods that the library did not have, for an application I'm doing, and instead of creating a library from scratch, I preferred to take advantage of Jem's library and create those methods that I needed.

I've modified the source code, I have corrected some errors and added new methods that I needed.

I’ve tested on Android 4x, 5x and 6x on different devices and it gives me no error.

Author: V-2.17 by Jem Miller - Missing Link Software

Permissions:
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.INTERNET
android.permission.WAKE_LOCK


______________________________________________________________________

V-3.07 by bgsoft

Corrected compatibility issues with API level <21
______________________________________________________________________

V-3.06 by bgsoft

Corrected compatibility issues with API level <23

______________________________________________________________________
V-3.05 by bgsoft

Events:

Modified

ScanDone (Results() As String, Count As Int) Results()

returns a string array containing all scanned Access Points in the area of the device, sorted 'by Signal strength. These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength (dBm) , "Saved" (if this network was previously saved for use on this device) or “”, BSSID, Signal Percentage (0-100%), Frequency (Mhz), Center Frequency 0 (Mhz), Center Frequency 1 (Mhz), Channel Width (Mhz), Channel number, Band (2.4 Ghz / 5Ghz), Distance (m).



Field:

Modified

Wifis As String()

A string array containing all scanned Access Points in the area of the device, sorted 'by Signal strength. These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength (dBm) , "Saved" (if this network was previously saved for use on this device) or “”, BSSID, Signal Percentage (0-100%), Frequency (Mhz), Center Frequency 0 (Mhz), Center Frequency 1 (Mhz), Channel Width (Mhz), Channel number, Band (2.4 Ghz / 5Ghz), Distance (m).


______________________________________________________________________

V-3.04 by bgsoft

New Constants:


CHANNEL_WIDTH_20MHZ = 0

Channel Width 20Mhz

CHANNEL_WIDTH_40MHZ = 1

Channel Width 40Mhz

CHANNEL_WIDTH_80MHZ = 2

Channel Width 80Mhz

CHANNEL_WIDTH_160MHZ = 3

Channel Width 160Mhz

CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4

Channel Width 80Mhz + 80Mhz


Events:

Modified

ScanDone (Results() As String, Count As Int) Results()

returns a string array containing all scanned Access Points in the area of the device, sorted 'by Signal strength. These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength (dBm) , "Saved" (if this network was previously saved for use on this device) or “”, BSSID, Signal Percentage (0-100%), Frequency (Mhz), Channel Width (Mhz), Channel number, Band (2.4 Ghz / 5Ghz), Distance (m).


Field:

Modified


Wifis As String()

A string array containing all scanned Access Points in the area of the device, sorted 'by Signal strength. These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength (dBm) , "Saved" (if this network was previously saved for use on this device) or “”, BSSID, Signal Percentage (0-100%), Frequency (Mhz), Channel Width (Mhz), Channel number, Band (2.4 Ghz / 5Ghz), Distance (m).


____________________________________________________________________________
V-3.03 by bgsoft

Events:


Modified

ScanDone (Results() As String, Count As Int)
Results() Sorted by Signal strength.


Method:

NEW
StopScan *** Erase by Error in version 3.02

NEW
WifiAPDistance As Double
Returns the estimated distance to WIFI Access Point, depending on the signal level and frequency
Returns 0 on error.

Modified
StartScan (EventName As String, NoEventOnSystemScan As Boolean)
Recovered parameter "NoEventOnSystemScan", Erase in version 3.02
Does not start Wifi if it is stopped.

Field:

Modified
Wifis As String()
A string array containing all scanned Access Points in the area of the device, sorted 'by Signal strength. These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength, and "Saved" if this network was previously saved for use on this device.


____________________________________________________________________________
V-3.02 by bgsoft

Constants:

WIFI_2_4GHZ_BAND As Int = 1

2.4GHz WIFI Band

WIFI_5GHZ_BAND As Int = 2

5GHz WIFI Band

WIFI_MODE_FULL As Int = 1

In this WIFI lock mode, WIFI will be kept active, and will behave normally. It will attempt to automatically establish a connection to a remembered access point that is within range, and will do periodic scans if there are remembered access points but none are in range.

WIFI_MODE_SCAN_ONLY As Int = 2

In this WIFI lock mode, WIFI will be kept active, but the only operation that will be supported is initiation of scans, and the subsequent reporting of scan results. No attempts will be made to automatically connect to remembered access points, nor will periodic scans be automatically performed looking for remembered access points.
Scans must be explicitly requested by an application in this mode.

WIFI_MODE_FULL_HIGH_PERF As Int = 3

In this WIFI lock mode, WIFI will be kept active as in mode WIFI_MODE_FULL but it operates at high performance with minimum packet loss and low packet latency even when the device screen is off.
This mode will consume more power and hence should be used only when there is a need for such an active connection.


Events:

isOnline_PingDone(isOnline As Boolean)

Launches when "isOnlinePing5" finishes or when "isOnlinePing6" finishes or timeout
isOnline: Returns True if Internet is available


Methods:

WifiFrequency As Int

Returns the Link Frequency (MHz) of the connected WIFI Access Point
Returns 0 on error.

WifiChannel As Int

Returns the Link Channel of the connected WIFI Access Point
2.4GHz Band: 1 - 13, 14 (Japan only)
5GHz Band: 0 - 200
Returns -1 on error.

WifiBand As Int

Returns the Link Band of the connected WIFI Access Point
WIFI_2_4GHZ_BAND: 2.4GHz Band
WIFI_5GHZ_BAND: 5GHz Band
Returns 0 on error.

is5GHzBandSupported As Boolean

Returns true if this WIFI adapter supports 5 GHz band

holdWifiOn As Boolean

Allows an application to keep the WIFI radio awake. Normally the WIFI radio may turn off when the user has not used the device in a while.
WIFI radio will keep awake until "releaseWifiOn" is called.
Returns True on success

holdWifiOn2(lockType As Int) As Boolean

Allows an application to keep the WIFI radio awake. Normally the WIFI radio may turn off when the user has not used the device in a while.
WIFI radio will keep awake until "releaseWifiOn" is called.
lockType: WIFI_MODE_FULL, WIFI_MODE_SCAN_ONLY, WIFI_MODE_FULL_HIGH_PERF
Returns True on success

releaseWifiOn As Boolean

Unlocks the WIFI radio, previously locked by calling "holdWifiOn" or "holdWifiOn2", allowing it to
turn off when the device is idle.
Returns True on success

isWifiHeldOn As Boolean

Checks if WIFI is held On by a call to "holdWifiOn" or "holdWifiOn2"


isOnlinePing5(timeout As Long) As Boolean

Checks for Internet connection by sending a Ping to Google DNS server (Ip: 8.8.8.8)
Launches the event "isOnline_PingDone(isOnline As Boolean)" with the ping result
timeout: Maximum waiting time in milliseconds
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if success

isOnlinePing6(IpHost As String, timeout As Long) As Boolean

Checks for Internet connection by sending a Ping to IpHost
Launches the event "isOnline_PingDone(isOnline As Boolean)" with the ping result
IpHost: Ip address or Host name
timeout: Maximum waiting time in milliseconds
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if success

__________

V-3.01 by bgsoft

I have added the "stopScan" method to stop "_ScanDone" events from scans made automatically by the system, in the background.

I have also modified the "startScan" method, adding the parameter "NoEventOnSystemScan" that allows to disable the events coming from Scans made automatically by the system, in the background.

Two new isOnlinePing3 and isOnlinePing4 methods, equivalent to isOnlinePing and isOnlinePing2 but adding a timeout parameter, in milliseconds.

NEW

isOnlinePing3(timeout As Long) As Boolean

Checks for Internet connection by sending a Ping to Google DNS server (Ip: 8.8.8.8)
timeout: Maximum waiting time in milliseconds
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if Internet is available

isOnlinePing4(IpHost As String, timeout As Long) As Boolean

Checks for Internet connection by sending a Ping to IpHost
IpHost: Ip address or Host name
timeout: Maximum waiting time in milliseconds
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if Internet is available

stopScan

Stops events launched on system background scans, if enabled in "startScan".
Call "updateWifiList" to re-activate this events.

UPDATED
startScan(EventName As String, NoEventOnSystemScan As Boolean)

Initializes all objects and scans for WIFI networks. Builds a string array of results (wifis) that can be accessed directly or with a call to updateWifiList.
EventName: Name of the Event to launch when Scan finish (EventName_ScanDone)
NoEventOnSystemScan: Launches events only on requested scans (true) or on all scans (false), including system background scans.
THIS METHOD SHOULD ONLY BE CALLED ONCE!

______________________________________________________________________________________

V-3.00 by bgsoft

Class MLwifi

Methods:


APIversion As Int
Returns the Version of Android running on the device as an integer such as 19, 21, 23, etc

EnableWifi(Enabled As Boolean)
Turns WIFI On or Off. Pass True to Enable WIFI or False to Disable

isWifiEnabled As Boolean
Returns whether WIFI is Enabled (true) or Disabled (false)

WifiMACAddress As String
Returns the MAC Address of the WIFI interface or empty string

WifiIpAddress As String
Returns the IP Address of the WIFI interface or empty string

WifiSSID As String
Returns the current WIFI SSID or empty string

WifiSignal As Int
Returns the WIFI signal strength in dBm as an integer or 0 on error

WifiStrength As Int
Returns the WIFI signal strength in percentage as an integer (0 to 100)
Returns 0 on error
This method fails in some devices. Use WifiSignalPct() instead

CalcWifiPct(int WifiSignal)
Calculates WIFI signal percentage from the WIFI signal level as an integer (0 to 100)
Signal Range: -100dBm -> 0%, -50dBm -> 100%

WifiSignalPct As Int
Returns the WIFI signal strength in percentage as an integer (0 to 100)
Returns 0 on error

WifiLinkSpeed As Int
Returns the LinkSpeed of the connected WIFI Access Point
Returns 0 on error.

isWifiConnectedOld As Boolean
Checks if WIFI is connected. This only checks for WIFI connection to a router
It does NOT test for Internet availability
Returns True if WIFI is connected or False if 2G, 3G, 4G, WIMAX or no connection
This method uses "getNetworkInfo()" that was deprecated in API level 23

isWifiConnected As Boolean
Checks if WIFI is connected. This only checks for WIFI connection to a router
It does NOT test for Internet availability
Returns True if WIFI is connected or False if 2G, 3G, 4G, WIMAX or no connection

isMobileConnected As Boolean
Checks if Phone Data is connected. This only checks for connection to a phone network.
It does NOT test for Internet availability.
Returns True if 2G, 3G or 4G Data is connected or False if WIFI, WIMAX or no connection

ActiveNetworkTypeName As String
Returns the Type (0:MOBILE, 1:WIFI, 6:WIMAX, 7:BLUETOOTH, 9:ETHERNET, etc) of the current Active Network or -1

ActiveNetworkType As Int
Returns the Type Name (WIFI, MOBILE, etc) of the current Active Network or empty string

isOnline As Boolean
Checks for Internet connection
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if Internet is available
ERROR!!!. This method only checks if the device is connected to any network (WIFI, Phone Data, etc),
but the network can be not connected to Internet (ADSL router not connected to phone line, etc)

isOnlinePing As Boolean
Checks for Internet connection by sending a Ping to Google DNS server (Ip: 8.8.8.8)
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if Internet is available

isOnlinePing2(String IpHost) As Boolean
Checks for Internet connection by sending a Ping to any Internet server
IpHost: Ip address or Host name
This method does not check or care what type of network is used
It can be WIFI, 2G, 3G, 4g, WIMAX, etc. It just tests for Internet connectivity
Returns True if Internet is available

saveWifiAP(String ssid, int security, String password, boolean connect) As Boolean
Saves the configuration of a WIFI AP onto the device
ssid: Access Point SSID
security: Access Point security type (0:NONE, 1:WEP, 2:WAP)
password: Access Point password/phrase ("" for an open network)
connect: true -> Connect to the WIFI AP after saving
Returns True on success

isSavedWifiAP(String ssid) As Boolean
Checks if a WIFI AP is saved on the device
ssid: Access Point SSID
Returns True if this SSID is saved

removeWifiAP(String ssid) As Boolean
Remove a saved WIFI AP on the device
ssid: Access Point SSID
Returns True on success

disconnectWifiAP() As Boolean
Disconnects the current WIFI AP connection
Returns True on success

connectWifiAP(String ssid) As Boolean
Connects to a WIFI AP already configured on the device
ssid: Access Point SSID
Returns true on success

Class MLscan

Events:

ScanDone(Results() As String, Count As Int)
Launches when Scan finishes and a new list of Access Points is ready
Results(): A string array containing all scanned Access Points in the area of the device.
These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength, and "Saved" if this network was previously
saved for use on this device.
Count: The number of elements in the Results() array

Fields:

wifis As String[]

A string array containing all scanned Access Points in the area of the device.
These are comma separated entries consisting of the following:
SSID, Security Type, Signal strength, and "Saved" if this network was previously
saved for use on this device.

Methods:

startScan(EventName As String)
Initializes all objects and scans for WIFI networks. Builds a string array
of results (wifis) that can be accessed directly or with a call to updateWifiList.
EventName: Name of the Event to launch when Scan finish (EventName_ScanDone)
THIS METHOD SHOULD ONLY BE CALLED ONCE!
Call only after startScan has already been called and a string array of Access Points
has been built. This method returns a string array containing the access points from the
most recent scan, including background scans done automatically by the Android WifiManager.
Calls the ScanDone event when a new list is ready.
Returns the string array of comma separated WIFI access points by SSID. Each entry may
contain the following:
SSID, Security Type, Signal level (in dBm), and the word "Saved" if the network was
previously saved for use on this device.
updateWifiList

getBSSID(EntryNumber As Int) As String
Returns the BSSID for the selected entry.
EntryNumber: If you display the string array wifis or the array returned in the getWifiList method UNSORTED,
you can pass the Position variable from your ListView_Click event.
Otherwise, you must pass the entry number from the string array since that is what is used as a reference.

WifiCap(EntryNumber As Int) As String
Returns a String containing info about the selected entry. A startScan must have already been done.
The string contains the SSID, the BSSID, and the Capabilities of the Network Access Point,
comma separated (SSID,BSSID,CapabilityString). The capabilities part can be quite long.
EntryNumber: If you display the string array wifis or the array returned in the getWifiList method UNSORTED,
you can pass the Position variable from your ListView_Click event.
Otherwise, you must pass the entry number from the string array since that is what is used as a reference.
Returns a string of comma separated entries of SSID,BSSID, and capability string. Returns an empty string on error.

isSavedWifiAP(EntryNumber As Int) As Boolean
Checks the stored networks on the device to see if this entry is a previously saved Access Point
EntryNumber: The entry number in the wifis array to check. If you display the string array wifis or
the array returned in the getWifiList method UNSORTED, you can pass the Position variable from
your ListView_Click event.
Otherwise, you must pass the entry number from the string array since that is what is used as a reference.
Returns True if this is a stored network

connectWifiAP(EntryNumber As Int) As Boolean
Connects to a network already configured on the device. The device will use saved values to connect.
EntryNumber: If you display the string array wifis or the array returned in the getWifiList method UNSORTED,
you can pass the Position variable from your ListView_Click event.
Otherwise, you must pass the entry number from the string array since that is what is used as a reference.
Returns true on success

listSavedNetworks As List
Builds a list of all saved networks on the device.
Returns a comma separated list of: SSID,BSSID,Network ID number.

saveWifiAP(EntryNumber As Intr, securityType As String, Password As String) As Boolean
Saves the configuration of a WIFI AP onto the device and connects to it.
EntryNumber: If you display the string array wifis or the array returned in the getWifiList method UNSORTED,
you can pass the Position variable from your ListView_Click event.
Otherwise, you must pass the entry number from the string array since that is what is used as a reference.
securityType: The Access Point security type (returned in the scan result string array)
Password: The password/phrase for the WIFI access point. Pass "" for an open network. Handles WEP HEX or text phrases
Returns True if the connection is successful

removeWifiAP(NetId As Int) As Boolean
Remove a saved WIFI AP on the device
NetId - The network ID number to delete (returned in the listSavedNetworks method)
Returns True on success



Regards
 

Myr0n

Active Member
Licensed User
Longtime User

rosippc64a

Active Member
Licensed User
Longtime User
Hi All!
I use the mlwifi 3.07 lib in the demo program. My android version is 7.1.2. The demo use only libs core and mlwifi. the demo works like a charm.

If I use the mlwifi lib in a complex program what use 36 other libs also (only b4a official libs), I think the mlwifi should works the same, isn't it?
I think it should. And the MLwifi works too, but the MLScan doesn't. :-(
B4X:
Dim wifi As MLwifi '<- works good
Dim scan As MLScan '<-works bad
MLWifi doing its job perfectly, but the MLScan reports 0 wifi network on the same device where the demo worked well.
No error, only reports 0. I use the same code, the same activity as in demo.
Can you imagine, that some other library prevents its work?
 
Last edited:

rosippc64a

Active Member
Licensed User
Longtime User
SOLVED!!!!
Though there was no clue in demo program (nor in manifest) about adding any extra permission, but I found in forum that I have to ask permission:
B4X:
        If Not(rp.Check(rp.PERMISSION_ACCESS_FINE_LOCATION)) Then
            rp.CheckAndRequest(rp.PERMISSION_ACCESS_FINE_LOCATION)
            Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
            Log($"${Permission} status: ${rp.Check(rp.PERMISSION_ACCESS_FINE_LOCATION)}"$)
            pDoEvents
        End If
so everithing is working!
 

RickKik

New Member
Hi. Is there any simple example how to use this lib?
for example, so that my phone could connect to some network
 

sorex

Expert
Licensed User
Longtime User
you can use it like this

B4X:
If wifi.WifiSSID.Contains(MyLocationWifiSSID)=False Then
LogColor($"Connected to wrong SSID (${wifi.WifiSSID}) > Switching to ${MyLocationWifiSSID}/${MyLocationWifiPassword}"$,Colors.Red)
wifi.disconnectWifiAP
wifi.saveWifiAP(MyLocationWifiSSID,2,MyLocationWifiPassword,True)
End If

which switches to the correct access point if not connected or connected to a wrong one. you can put that in a timer and check every minute or so.
 
Top