B4A Library XMPP/JABBER - Best protocol to IM for B4A

Discussion in 'Additional libraries, classes and official updates' started by Alberto Iglesias, Mar 21, 2015.

  1. Alberto Iglesias

    Alberto Iglesias Well-Known Member Licensed User

    XMPP/JABBER - Best protocol to Instant Messengers for B4A

    This library was made based on XMPP Protocol

    Installation instructions:
    - Copy the .xml and .jar(s) files to your custom libraries folder
    - Select in your REFERENCED LIBRARIES


    Version history:
    V1.0.0 (First public release - Donationware):
    - Initial version

    - Fix bug username

    - Create 4 for events (ErrorSendMessage,ErrorConnect,ErrorLogin,PresenceChanged)
    Create Methods: ChangeStatus, ActivatePresence
    - Implemented correction in case the Name is Null

    *Obs: PresenceChanged depends of each server.
    Was observed in tests that some servers do not support the "presence listener"

    - Fix bug when use XMPP and MQTT together

    - Fix bug when use XMPP in some cases with threads

    Alberto Iglesias - alberto@visualnet.inf.br
    Version: 1.0.4
    • XMPP
      • deliverycomplete (Message As String)
      • messageArrived (Message As String)
      • onConnect ()
      • onDisconnect ()
      • onDisconnect (Status as boolean As )
      • onInitialized ()
      • onLogin ()
      • ErrorSendMessage(Error As String)
      • ErrorConnect(Error As String)
      • ErrorLogin(Error As String)
      • PresenceChanged(Presence As String)
      • Host As String
        Name or IP of the Jabber/XMPP Server
      • JavaDebug As Boolean
        Enable/Disable Debug from Java Code
      • Port As Int
        Port of the Jabber/XMPP Server
      • About As String
        About the developer
      • Connect
        Connect to the Jabber/XMPP Server
      • ChangeStatus(int iStatus)
        Change the status of your client
      • CreateChat (userJID As String)
        Create Chat with the JIB User
      • Disconnect
        Disconnect from Jabber/XMPP Server
      • GetHost As String
        Returns the host name of the server where the XMPP server is running
      • GetRoster As List
        Get Roster List
      • GetUser As String
        Get the connection current user
      • Initialize (eventname As String)
        Initializing XMPP Object
      • IsConnected As Boolean
        Get a connection status
      • IsSecureConnection As Boolean
        Check if the connection is secure
      • Login (Username As String, Password As String)
        Login into to the Jabber/XMPP Server
      • SendMessage (message As String)
        Send a message into the chat
      • Version As String
        Get the Library Version
      • android.permission.ACCESS_WIFI_STATE
      • android.permission.INTERNET




    You can try your APP using web client in https://jwchat.org/


    * This version is fully functional, the only one difference is when sending a message the text "Donationware" is delivery with your message.
    Please consider a simple €10 donation and I send to you the Library without "Donationware" text in a sendmessage method.


    Version 1.0.4

    Look others libraries in http://www.visualnet.inf.br/store

    * Put in this link because this forum accept only 512k maximum.

    Attached Files:

    Last edited: Jun 19, 2016
    tuhatinhvn, Husam, Reids and 10 others like this.
  2. NJDude

    NJDude Expert Licensed User

    That's nice, however your example is hard to follow, you should explain better what to do.
  3. Alberto Iglesias

    Alberto Iglesias Well-Known Member Licensed User

    It´s easy:

    1) Create your account in any Jabber server: In my test case I create in thir URL https://jabber.chaotic.de:5282/register/new
    2) Connect with server
    3) Login with your account created
    4) Imagine you chat with somebody, the use the CreateChat method passing another person UserID ( In my case I created 2 accounts to tests)
    5) Now is like you have a IM program with chat window open, then you can send and receive messages

    Have a lot of servers use this protocol, like Google Talk, etc.
  4. coslad

    coslad Well-Known Member Licensed User

    Alberto can explain us why to use xmpp in place of mqtt ?
  5. itgirl

    itgirl Active Member Licensed User

    Long waited one , i have to play around with this one , thank you ;)
  6. Alberto Iglesias

    Alberto Iglesias Well-Known Member Licensed User

    Hello Coslad, Mqtt and xmpp are different concepts. One is not change for another.

    MQTT is for generic use, can be used for IM too, but XMPP is more specific and matured for IM.

    For example, I use MQTT for a project to future cars connected and with this project I never used XMPP.

    For create Chat Groups, IM programs, I recommend XMPP.

    valentino s, cimperia and ellpopeb4a like this.
  7. coslad

    coslad Well-Known Member Licensed User

    Thanks Alberto , now it is a little bit more clear .
    I tried your sample code but .....:

    When i send the "createchat" command :
    The server doesn't give me back nothing , so i don't know if the other user is on line or not .
    At this point if i send a message , and , the other users are not online the message is lost.
    The Event objXmpp_DeliveryComplete if fired but the message is lost.
    am i wrong ?
  8. Alberto Iglesias

    Alberto Iglesias Well-Known Member Licensed User

    No... It´s right!

    When you Create a Chat, then in background just "open" a session then you chat... So, this event do not show nothing.

    After create a Chat, try to send a message, it´s a method callback you in a DeliveryComplete
  9. coslad

    coslad Well-Known Member Licensed User

    ok i'll try.

    now , if for example i would like to implement this function i a my app, is there a server which accept registration request direct from my application .
    i explain better : like every im apps the user register his account from app inside and not from a web page.
    Another question , it seems that xmpp doesn't supports multi user chat, right ?
  10. Alberto Iglesias

    Alberto Iglesias Well-Known Member Licensed User

    ellpopeb4a likes this.
  11. Alberto Iglesias

    Alberto Iglesias Well-Known Member Licensed User

    Hey Coslad,

    Each server have your own API to create accounts, depends of those API, and not the library.

    You can createchat with one or more users, but the login is for one user, it´s the same like a IM program, like ICQ, Messenger, Google talk, etc
  12. coslad

    coslad Well-Known Member Licensed User

    Hi Alberto i'm tryng your library but i found some troubles :

    1) The getroster comand return the error :

    java.lang.NullPointerException at java.lang.String.concat(String.java:678)

    even if the client is connected and a chat is active .

    2) I have User1 and User2 , User1 is the android app and User2 is the Xpmm web client.
    User1(app) is connected and logged in the server
    User2(web) is connected and logged too,

    User2(web) sees that User1(app) is online
    User2(web) send a message , the message is not delivered ,only when User1(app) set a "CreateChat" and send message to User2 (web) the message is delivered ,only after this the User2(web) can send message to User1(app)

    3)User1(app) is connected , User2(web) is not connected

    User1(app) createChat and send a message , it returns the event "Delivered"but delivered to who ? (User2 is not connected)
  13. Alberto Iglesias

    Alberto Iglesias Well-Known Member Licensed User

    Hi Coslad,

    For the 1st question I will try in here, maybe don´t having any users in chat, you get this null, I don´t know, I will check this.

    For the 2nd, I think is problem the server because in my tests with server "jabber.chaotic.de" I don´t see this behavior.

    Try with my tests accounts in both sides, please:

    Server: jabber.chaotic.de

    User1: visualnet@jabber.chaotic.de
    Pwd: MyJabber2015

    User2: visualfriend@jabber.chaotic.de
    Pwd: MyJabber2015
  14. coslad

    coslad Well-Known Member Licensed User

    Ok i have made a try.

    1)User1 (App) , User2 (WEB)

    User1 > connect > Login --Nothing else
    User2(web) >Login > in the list is listed visulalfriend so i sended a message from the web to phone , but nothing happen


    User1(app) "createchat" and sent a message to visualnet (message is delivered)
    User2(Web) > send message to visualfriend and the message is delivered

    Now i have closed the web browser and have tryed to send a message from User1(app ) to User2(web offline) , the application says : objxmpp_deliverycomplete , but the user2 is offline

    PS: The "Getroaster" with this two user works fine!
    Maybe is there a sort of autorization before i can add a user to my list ?
  15. coslad

    coslad Well-Known Member Licensed User

    Alberto with this two user the GetRoaster crash



    Web :


    can you try ?
  16. Alberto Iglesias

    Alberto Iglesias Well-Known Member Licensed User

    do you have in the same server? jabber.chaotic.de?

    Can you send to me the server/user/pass to try in here? and debug of course....
  17. coslad

    coslad Well-Known Member Licensed User

    The server is jabber.chaotic.de

    as written in the post above :

    User 1: pippo
    Pass1: pippo

    User2: pluto
    Pass2: pluto

    as web client i use https://jwchat.org/
    If you set the user1(pippo) as user into your sample app and the user2 not in the app but in the web , clicking to getroaser the app crash.

    obviously i set the user2 (pluto@jabber.chaotic.de) in the command "createchat"
  18. Alberto Iglesias

    Alberto Iglesias Well-Known Member Licensed User

    OK. I do some tests right now
  19. Alberto Iglesias

    Alberto Iglesias Well-Known Member Licensed User

    Hey Coslad,

    In the asmack library I found when get the name, and is null, catch a exception..

    Now I put a catch in a new version of library, try now with version 1.0.1 (I put in the first post)

    public Collection<RosterEntry> getRosterEntries() {
    Collection<RosterEntry> entries = roster.getEntries();
    for (RosterEntry entry : entries) {
    Log.d("SmackXMPP", "RosterEntry " + entry);
    Log.d("SmackXMPP","User: " + entry.getUser());
    Log.d("SmackXMPP","Name: " + entry.getName());
    Log.d("SmackXMPP","Status: " + entry.getStatus());
    Log.d("SmackXMPP","Type: " + entry.getType());
    Presence entryPresence = roster.getPresence(entry.getUser());
    Log.d("SmackXMPP", "Presence Status: " + entryPresence.getStatus());
    Log.d("SmackXMPP", "Presence Type: "+ entryPresence.getType());
    Presence.Type type = entryPresence.getType();
    if (type == Presence.Type.available)
    Log.d("SmackXMPP", "Presence AVIALABLE");
    Log.d("SmackXMPP", "Presence : "+ entryPresence);

    return entries;

  20. coslad

    coslad Well-Known Member Licensed User

    Ok Alberto now it works !, but ....................

    Why Name is = Null ?

    If i use your username and password the name is .visualfriend@jabber.chaotic.de , but if i use pluto@jabber.chaotic.de as user , the name is null !
    And, remain the problem that if pluto(web app) sees pippo (app) online and send a message , the message is not delivered untill pippo(app) send the createchat.
    Furthermore, the web app immediately realizes if a user changes state from offline to online, while in the library there 'an event

    anyway, good job!
  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