B4A Library Simple WIFI library

Discussion in 'Additional libraries, classes and official updates' started by HotShoe, Mar 8, 2014.

  1. B4AinNY

    B4AinNY Member Licensed User

    Question about when Connection is complete
    I've just started exploring this library.

    After enabling WiFi it of course takes some time for the connection to be complete.
    Is there some way to generate an event when the WiFi connection is completed after calling EnableWifi(True) ?
    Or should I just run a loop checking isWificonnected until either connection is made, or some amount of time has elapsed ?
  2. B4AinNY

    B4AinNY Member Licensed User

    My goal in using this library is to allow me to turn WiFi off in case I am connected to a WiFi network that doesn't support Internet, and then to turn it back on and link to a specific SSID for printing to a WiFi Printer as needed ( in case of truly mobile environment such as in a truck such a printer is unlikely to be on an Internet connected network ) . Anyone wanting to see the code I'm working on for that can see at


    I'd welcome comments / corrections / suggestions

    - Jeff
  3. B4AinNY

    B4AinNY Member Licensed User

    A few questions about the library
    1. After an Activity is resumed, which should be used - StartScan or UpdateWiFiList ?

    2. Is there a practical difference between reading the list of WiFi networks
      (a) from .Wifis,
      or (b) from Results parameter of ScanDone ?

    3. Can Scan be called modally so that code after StartScan is not executed until the ScanDone event is complete and/ or WiFis list is filled ?

      - My guess is not, so I am planning to end my subroutine immediately after calling ScanStart or UpdateWiFiList and then have the ScanDone event call a follow up Subroutine so my following code only executes after the scan is complete.

      Is this reasonable or is there a better approach ?

    4. It seems that once I have started calling StartScan and UpdateWiFiList,
      that the ScanDone event is repeatedly triggered.
      I don't have any timer in my app,
      and I am not repeatedly calling the UpdateWiFiList
      but the event keeps getting triggered.

      Is this the designed behavior or a problem ?

    - Jeff
  4. HotShoe

    HotShoe Well-Known Member Licensed User

    The eclipse project and all source code for MLwifi has been attached to the first post. Feel free to modify and redistribute it to the B4A community.

    --- Jem
    Jmu5667 and ellpopeb4a like this.
  5. HotShoe

    HotShoe Well-Known Member Licensed User

    StartScan should only be called once at the beginning of the app. It is not necessary to call it again after a resume event. UpdateWifiList checks the results of the background scans that are done automatically by the Android OS. ScanDone will be called each time one of those background scans gets done so you can automatically update your wifi list presented to the user more easily. This way you can always have an up-to-date list of AP's around you.


    --- Jem
  6. B4AinNY

    B4AinNY Member Licensed User

    Thank you - that's very helpful.
    1. Is there a practical difference between reading the list of WiFi networks
      (a) from .Wifis, or (b) from Results parameter of ScanDone ?

    2. It seems that ScanDone will not get triggered and .WiFis will not be updated until the subroutine that called either ScanStart or UpdateWiFiList is done ( at least that's what I'm finding in my tests). So what I do is to set a process global boolean to indicate whether I need to continue with some coding after ScanDone completes. I can then check for that variable in ScanDone and if set I call subroutine to do the follow up processing. Does this make sense ?
    - Jeff
  7. HotShoe

    HotShoe Well-Known Member Licensed User

    No, wifis is only there for older code.

    That sounds reasonable, but scandone should be called by the OS scans (every 15 secs to 2 minutes depending on the build).

    --- Jem
  8. B4AinNY

    B4AinNY Member Licensed User

    ARGH ! I like a good challenge but I'm getting frustrated.

    I'm having problems disconnecting from one WiFi network and connecting to another.

    In trying the Disconnect method, this returns true, but reading the .SSID continues to return the same SSID that should now be disconnected.
    Then in calling bSuccess = WifiScanner.connectToAP(EntryNumber) I get an error.

    | java.lang.NullPointerException: Attempt to invoke virtual
    | method 'boolean java.lang.String.equals(java.lang.Object)'
    | on a null object reference

    I have of course verified the EntryNumber is correct ( by reading WiFiCap( EntryNumber)

    Here is are some details.

    Subroutine 1
      MLWiFi.EnableWiFi ( 
    '  loop waiting for isWiFiConnected = True

    2  ( Called from ScanDone)
    Dim DesiredSSID  as string =  ( whatever the desired SSID is )
    if  not ( MLWiFi.SSID = desiredSSID ) then
    ' If false I loop through .Wifis to find entry number
      ' this is successful, I get the desired entry number
      ' and I verify this looking at  .WifiCap

      bSuccess = WifiScanner.Disconnect
    log (bSuccess)    ' This returns success

    ' ***  BUT Reading Wifi.SSID  still gives the disconnected SSID

      bSuccess = WifiScanner.connectToAP(EntryNumber)

      This call generates Debug output
      |  Results SSID = 
      |  Stored.ssid = 
    "attwifi" Searched ssid = "linksys"
      |  Stored.ssid = 
    "DIRECT-4D-HP OfficeJet Pro 6960" Searched ssid = "linksys"
      |  Stored.ssid = 
    "BAFB60" Searched ssid = "linksys"
      |  Stored.ssid = 
    "HOME 2" Searched ssid = "linksys"
      |  Stored.ssid = 
    "5BoroGreen" Searched ssid = "linksys"
      |  Stored.ssid = 
    "DIRECT-8CED802E" Searched ssid = "linksys"
      |  Stored.ssid = 
    "DIRECT-70-HP OfficeJet 250" Searched ssid = "linksys"
      |  Stored.ssid = 
    "linksys" Searched ssid = "linksys"
      |  java.lang.NullPointerException: Attempt 
    to invoke virtual
    'boolean java.lang.String.equals(java.lang.Object)'
      on a null object reference

    and then returns false
    SSID still returns the originally connected SSID
  9. Jmu5667

    Jmu5667 Well-Known Member Licensed User

    Hello to anyone who is linked to this thread.

    I implemented MLWifi lib in one of our core app's, and I must say, WOW !

    We have just installed the app on Android 7, API 24, and it runs very smoothly.

    Jem has made the source available, most kind of him, so hopefully some java guru, @DonManfred , will take ownership, or maybe a group of guru's.




    Jem come back we miss you :)
  10. Jmu5667

    Jmu5667 Well-Known Member Licensed User


    In relation to disconnecting, I think you will find that Android still maintains the AP details as being the most recent wifi AP you are using, it doe'nt matter is you are connected or not.

    After you disconnected did you connect to a different AP ?


  11. Stern0m1

    Stern0m1 Member Licensed User

    This library didnt work for me. I belive there is an issue how its dealing with the password. it adds the Access Point but cant connect. When I manually change the password it connects. There is some wrong how its storing the password.

    But anyways by analyzing the source code I code what I wanted, Big thanks to HotShoe!
  12. sorex

    sorex Expert Licensed User

    I have been using this lib in a project for a while (still 1.07) so I went to update the project a bit with the latest version (2.17).

    The only difference was the change of .hasIpAddress to .IpAddress... so far so good.

    While we have 3 different wifi networks here I wanted to modify the project to be sure it connects to the right access point all the time.

    But I can't get it to work.

    It lists everything as expected but when I use the .connectToApp I just get a false result
    and it just connects to the one it was connected before.

    The connection is saved on the devices so when I manually switch to that AP it connects without prompting for a password.

    Any idea? :)

    Edit: I just tried with your example app and that one doesn't connect either to any of the networks here.
    Last edited: Feb 15, 2017
  13. bgsoft

    bgsoft Well-Known Member Licensed User

    Hi Jem:

    First of all, thank you for your contribution of the library and the source code.

    I needed some new methods that your library did not have, for an application I'm implementing, and instead of creating a library from scratch, I preferred to take advantage of your library and add those methods that I needed.

    To be able to hang the files and give support as much as I can, I have created a new thread that is here:

    Thank you very much for your contribution.

    HotShoe likes this.
  14. sorex

    sorex Expert Licensed User

    darn... that came a few hours late.

    I just updated and deployed my project with that WifiConnect (1.59) library (https://www.b4x.com/android/forum/threads/wifi-connect-library-wep-wpa-open.27254/page-2#post-360262)
    as I couldn't get this lib to auto connect to any access points. (see post above)

    might have been debug mode that prevented this tho, I didn't verify this but the other lib only worked right in release mode.
    (some part of the lib didn't get included in debug mode or something)

    I will test this update tomorrow.
  15. Neojoy

    Neojoy Member Licensed User

    I have tested your lib and works like a charm to get the wifi network list but only if GPS is on, if GPS is off it returns a empty list. Any idea?

    This happened with wifi classical library "ABwifi" as well.

  16. FrankBerra

    FrankBerra Active Member Licensed User

  17. DonManfred

    DonManfred Expert Licensed User

  18. Neojoy

    Neojoy Member Licensed User

    Thank you guys :)

    I found over the web more peoples with same trouble, but no solution.
    It looks like it's a feature from Android 6 and above like FrankBerra said
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice