Android Tutorial [B4X] AsyncStreams Tutorial

Discussion in 'Tutorials & Examples' started by Erel, Feb 3, 2011.

Thread Status:
Not open for further replies.
  1. Erel

    Erel Administrator Staff Member Licensed User

    Yes, it is safe. The array is internally copied.
     
  2. mbatgr

    mbatgr Active Member Licensed User

    I have the following code. This is a working code I used to send one digit number to the server (VB6) except that times the is a delay and the server received a message with more digits instead of 1 (i send a digit when i press a particular button, so pressing in a row eg 3 buttons, I expect the server to receive 3 messages with 1 digit length. But because of the delay I receive a message with 3 digits!. Is there I can do in the code to trap this situation?
    Thanking you the colleges in advance :)

    Sub btnConnect_Click
    Select Case btnConnect.Text
    Case "Connect"
    btnConnect.Text = "Disconnect"
    Socket1.Initialize("Socket1")
    Socket1.Connect("xxx.xxx.x.xxx",9000,15000)
    Case "Disconnect"
    btnConnect.Text = "Connect"
    Socket1.Close
    Case Else
    End Select
    End Sub

    Sub Socket1_Connected(Connected As Boolean)As Boolean
    If Connected = True Then
    ToastMessageShow("Connected",True)
    AStreams.Initialize(Socket1.InputStream,Socket1.OutputStream,"Astreams")
    SendData("+") 'send + as a sign of succesfull link
    Else
    ToastMessageShow("Server not available",True)
    btnConnect.Text = "Connect"
    End If
    btnConnect.Enabled = True
    End Sub

    Sub AStreams_NewData (Buffer() As Byte)
    Dim msg As String
    msg = BytesToString(Buffer, 0, Buffer.Length, "Windows-1252")
    log(msg)
    End Sub

    Sub SendData(msg As String)
    Dim Buffer() As Byte
    Buffer = Msg.GetBytes("Windows-1252")
    AStreams.Write(Buffer)
    End Sub

    Sub Buttons_Click
    Dim btn As Button
    Dim msg As String
    Dim b As Beeper

    btn = Sender
    b.Beep
    msg = btn.Tag

    SendData(msg)

    End Sub
     
  3. mbatgr

    mbatgr Active Member Licensed User

    Also while the code above is working, sometimes when the program runs for the very first time I got a crash
    The reference line where the eroor happens is the "AStreams.Initialize(Socket1.InputStream,Socket1.OutputStream,"Astreams")"


    LogCat connected to: 07961702
    --------- beginning of /dev/log/system


    --------- beginning of /dev/log/main


    ** Activity (main) Create, isFirst = true **


    1920 x 1104, scale = 2.0 (320 dpi)


    ** Activity (main) Resume **


    ** Activity (main) Pause, UserClosed = false **


    sending message to waiting queue (socket1_connected)


    running waiting messages (1)


    Error occurred on line: 123 (main)
    main$ResumeMessagerun (java line: 252)


    java.lang.NullPointerException
    at anywheresoftware.b4a.objects.SocketWrapper.getInputStream(SocketWrapper.java:133)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:485)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:229)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:174)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:93)
    at anywheresoftware.b4a.BA$3.run(BA.java:312)
    at anywheresoftware.b4a.BA.setActivityPaused(BA.java:382)
     
  4. Erel

    Erel Administrator Staff Member Licensed User

    Please start a new thread for your question. Also make sure to use [ code ] tags when posting code.
     
  5. mbatgr

    mbatgr Active Member Licensed User

    sorry erel, i was tired on the front of my pc :)
    I just stareted a new conversation about
     
  6. shmulik taiber

    shmulik taiber Member Licensed User

    Hello Erel .
    I've managed to communicate between Arduino and Nexus 7 using the Bluetooth example - without the prefix mode .
    however, the data sometimes gets broken into parts, and I'm trying to get a fixed size in an orderly fashion for an array of sensor data - which means prefix mode .
    I've attempted to adhere to the protocol from the arduino side - with 4 first Bytes as size indicators- for example buf (2,2,2,2,0,0) to get 2 data bytes of zero . the program finds my arduino, connects, but shows nothing.
    any advise ?
     
  7. Erel

    Erel Administrator Staff Member Licensed User

    The prefix is wrong. It should be 0, 0, 0, 2, 0, 0 (assuming that big endian is used).
     
  8. shmulik taiber

    shmulik taiber Member Licensed User

    Thank you Erel .
    There is some progress, although not the promised land of full communication :)
    now, in the screen at least something appears after the "You" - line after line of a trapezoid with a question mark in it.......
    my arduino code is as simple as can be, serial.write buf (0,0,0,2,0,0), baud rate 38,400, delay(1000) .
    I'm so desperate I'm going to take cyanide pills.... at least my wife won't mind since I've seriously neglected her in the time consuming attempt to crack this thing....
     
  9. Erel

    Erel Administrator Staff Member Licensed User

    Note that there you do not need to use prefix mode. You can for example use AsyncStreamsText class. Just make sure to send an end of line character after each message.
     
  10. shmulik taiber

    shmulik taiber Member Licensed User

    Hi Erel .
    The example you have for text class is not for Bluetooth, and I don't know the right structure for it . there is no documentation of it in the auto complete.... besides, the array of bytes (prefix) is more suitable for my control needs .
    I can send an array of data and commands in one stroke .
    It connects, but gives me line after line of "you" without anything . this is arduino simple code :

    void setup() {

    Serial.begin(38400);

    }

    void loop() {

    byte buf[6]={0,0,0,2,3,4};

    Serial.write(buf,6)
    ;
    delay(1000);

    }

    what gives ?
     
  11. Erel

    Erel Administrator Staff Member Licensed User

    AsyncStreamsText (like AsyncStreams) is not tied to any specific connection type. You can use it with Bluetooth in the same way you use AsyncStreams.

    What do you expect it to display with 3, 4? These are not valid characters.
     
  12. shmulik taiber

    shmulik taiber Member Licensed User

    Thnx again .
    I was hoping to see 3 and 4 displayed . the array "buf" has 6 bytes . as far as I understood, the first four are for prefix and the remaining two are the real data which is converted in BytesToString (in the Bluetooth example) for Logging . At least that's what I thought .
    What do you mean by not valid ?
     
  13. Erel

    Erel Administrator Staff Member Licensed User

    3 is the byte value not the '3' character. You can use ASCII encoding and send 51, 52: http://www.asciitable.com/

    It will also work with UTF8.
     
  14. shmulik taiber

    shmulik taiber Member Licensed User

    Yesss ! Connected and got real data ! Now i'll try the gauges thingee and try to create an old style cluster to monitor my non-ecu engine using arduino .
    Erel - you da man !
     
    Erel likes this.
  15. whcir

    whcir Member Licensed User

    Hi,

    Using the Testclientsocket example flyingbag posted, and everthing seems to be working fine. temperature is sent from a microcontroller and received on my tablet, only problem is after many hours (over night) the tablet stops updating with the new data sent and there are no errors. used a computer with a tcp/ip terminal to make sure the data is still being transmitted, and it is, so its something on the android side. any help would appreciated. restarting the app, and it works again
     
  16. Erel

    Erel Administrator Staff Member Licensed User

    How are you preventing the device from sleeping?
     
  17. whcir

    whcir Member Licensed User

    Hi Erel,

    Under the developer options I checked the option "stay awake". Is there something else I need to do so the tablet dosent go to sleep? The version of android my tablet is running is 4.1.1
     
  18. Erel

    Erel Administrator Staff Member Licensed User

    You should use PhoneWakeState.KeepAlive (phone library).
     
  19. Turbo3

    Turbo3 Active Member Licensed User

    I am using the ASteam_NewData (Buffer() As Byte) to receive a byte stream from a BT device (non-prefix).

    I noticed that sometimes the data coming from one BT device is being truncated at 255 bytes. The stream is ASCII characters with CR (0x0d) but no line feeds. What is the size limit on the receive Buffer? If it is 255 bytes can I increase it?

    Normally I see data of 10 to 40 bytes in the Buffer for each interrupt except for this one device so I was thinking it is the device that must be truncating the data. I just want to be sure it is not something on my side or if it is how to increase the Async receive buffer.
     
  20. Erel

    Erel Administrator Staff Member Licensed User

    AsyncStreams doesn't buffer anything (in standard mode). It just passes the data when it is available.
     
Thread Status:
Not open for further replies.
Loading...
  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