B4R Question Out of bound error MQTT Payload ConvertBytesToArray

Discussion in 'B4R Questions' started by H.L.M. Feijen, Jul 11, 2019.

  1. H.L.M. Feijen

    H.L.M. Feijen Member Licensed User

    Hello all,

    In experimenting with MQTT, B4R- and B4Xserializator I encountered a problem with the ConvertBytesToArray member.
    I send the type mb from B4A to NodeMCu B4R.

    B4A side :
    Sub Proces Globals
    ...
    Dim Ser as B4xSerializator
    Type MyButton(Which As String, State As String)
    ...
    End Sub
    ...
    Public Sub ToggleButtonChanged(mb As MyButton)
    client.Publish("esp",Ser.ConvertObjectToBytes(mb))
    End Sub

    B4R (NodeMcu 12E) side:
    Sub Proces Globals
    ….
    Private ObjectsBuffer(500) As Object
    Private Ser As B4RSerializator
    …..
    End Sub
    …...
    Sub Mqtt_MessageArrived (Topic As String, Payload() As Byte)
    Log("Message arrived. Topic=", Topic, " payload: ", Payload)
    If Topic = "esp" Then
    Dim Objects() As Object =Ser.ConvertBytesToArray(Payload,ObjectsBuffer)
    Log(Payload.Length)
    Log(Objects.Length)
    Log(ObjectsBuffer.Length)
    End If
    End Sub
    …....

    The monitor says:
    Connected to broker
    Message arrived. Topic=esp payload: x??`?b``H2I?K?H?-?I??M??S??L*-)??c#?2?# ?b??????#vFFV?XpIbI*##?#RT?
    #
    ??L?


    The line:
    Dim Objects() As Object =Ser.ConvertBytesToArray(Payload,ObjectsBuffer) creates the following error:
    Out of bounds error. Array length = 500, Index = 65535

    Blocking out “=Ser.ConvertBytesToArray(Payload,ObjectsBuffer)” gives the length of the arrays as 90, 0 and 500 respectively.

    Question:
    How to correct this error?
     
  2. Erel

    Erel Administrator Staff Member Licensed User

    1. Please use [code]code here...[/code] tags when posting code.
    2. Post the output of:
    Code:
    Dim bc As ByteConverter
    Log(bc.HexFromBytes(Payload))
     
  3. H.L.M. Feijen

    H.L.M. Feijen Member Licensed User

    Hello Erel,

    1. OK will do.
    2. Hex output: 789C936094626060483249D44BAD48CC2DC849D5CB4DCCCC5389CFAD4C2A2D29C9CF6306CA32F20209CF62CFBCCC92CCC49CCCAAD41476064656A058704962492A230B905552549A0A160ACFC84CCE6064079909D66F0800B9B71801
    Out of bounds error. Array length = 500, Index =65535
    From:
    Code:
    Sub Mqtt_MessageArrived (Topic As String, Payload() As Byte)
       
    Log("Message arrived. Topic=", Topic, " payload: ", Payload)
       
    Log(bc.HexFromBytes(Payload))
       
    If Topic= "esp" Then
         
    Dim Objects() As Object = Ser.ConvertBytesToArray(Payload, ObjectsBuffer)
        
    Log(Payload.Length)
        
    Log(Objects.Length)
        
    Log(ObjectsBuffer.Length)
    End Sub
     
    Last edited: Jul 13, 2019
  4. Erel

    Erel Administrator Staff Member Licensed User

  5. H.L.M. Feijen

    H.L.M. Feijen Member Licensed User

    1.Followed the link, extracted and pasted v.1.91 in B4R libraries folder. (B4R library window still shows version 1.90. Also after reload). Hex output tails not different.
    2. Is the invalid data result of the bug or should the content of Payload be changed?
     
  6. Erel

    Erel Administrator Staff Member Licensed User

    The data is invalid. It is not related to the now fixed bug in rRandomAccessFile.

    Invalid = not serialized with B4RSerializator or didn't arrive properly for some reason.
     
  7. H.L.M. Feijen

    H.L.M. Feijen Member Licensed User

    Sorry, forgot to copy the xml file
     
  8. Erel

    Erel Administrator Staff Member Licensed User

    Doesn't matter.
     
  9. H.L.M. Feijen

    H.L.M. Feijen Member Licensed User

    Hex output v1.9.1: 789C936094626060483249D44BAD48CC2DC849D5CB4DCCCC5389CFAD4C2A2D29C9CF6306CA32F20209CF62CFBCCC92CCC49CCCAAD41476464656A058704962492A230B905552549A0A160ACFC84CCE6064079909D66F0800B9E11802
    Same out of bound error.
    For your convenience the code:

    B4A side:
    Code:
    #Region  Project Attributes
       
    #ApplicationLabel: MyB4A_Relay3
       
    #VersionCode: 1
       
    #VersionName:
       
    #BridgeLogger: True
       
    'SupportedOrientations possible values: unspecified, landscape or portrait.
       #SupportedOrientations: unspecified
       
    #CanInstallToExternalStorage: False
    #End Region

    #Region  Activity Attributes
       
    #FullScreen: False
       
    #IncludeTitle: True
    #End Region

    Sub Process_Globals
       
    'These global variables will be declared once when the application starts.
       'These variables can be accessed from all modules.
       Dim Ser As B4XSerializator
       
    Type MyButton(Which As String, State As String)   
    End Sub

    Sub Globals
       
    'These global variables will be redeclared each time the activity is created.
       'These variables can only be accessed from this module.
       Private ToggleButton1 As ToggleButton
    End Sub

    Sub Activity_Create(FirstTime As Boolean)
       
    Activity.LoadLayout("1")
    End Sub

    Sub Activity_Resume
       SetState
    End Sub

    Sub SetState
       ToggleButton1.Enabled = Starter.connected
    End Sub

    Sub ToggleButton1_CheckedChange(Checked As Boolean)
       
    Dim mb As MyButton
       mb.Initialize
       mb.Which=
    "button1"
       
    If Checked Then
           mb.State=
    "true"
       
    Else
           mb.State=
    "false"
       
    End If
       Starter.client.Publish(
    "esp",Ser.ConvertObjectToBytes(mb))
    End Sub

    Sub Activity_Pause (UserClosed As Boolean)
       
    Activity.Finish
    End Sub
    B4R side:
    Code:
    #Region Project Attributes
       
    #AutoFlushLogs: True
       
    #CheckArrayBounds: True
       
    #StackBufferSize: 1000
    #End Region

    Sub Process_Globals
       
    Public Serial1 As Serial
       
    Private d1pins As D1Pins
       
    Private d6  As Pin       'not yet used
       Private mqtt As MqttClient
       
    Private wifi As ESP8266WiFi
       
    Private client As WiFiSocket
       
    Private ObjectsBuffer(500As Object
       
    Private Ser As B4RSerializator
       
    Dim bc As ByteConverter
    End Sub

    Private Sub AppStart
       Serial1.Initialize(
    115200)
       
    Log("AppStart")
       d6.Initialize(d1pins.D6, d6.MODE_OUTPUT)   
    'not yet used
       d6.DigitalWrite(False)
       
    If wifi.Connect2("TP-LINK_507A4F","02507A4F") = False Then
         
    Log("Error connecting to router!")
         
    Return
       
    End If
      
    'broker address is: 192.168.0.6:51042. Change as needed.
       mqtt.Initialize(client.Stream, Array As Byte(1921680100), _
         
    1883"esp2""Mqtt_MessageArrived""Mqtt_Disconnected")
       Connect(
    0)
    End Sub


    Sub Connect(unused As Byte)
      
    If mqtt.Connect = False Then
      
    Log("trying to connect again")
      CallSubPlus(
    "Connect"10000)
      
    Return
      
    End If
      
    Log("Connected to broker")
      mqtt.Subscribe(
    "esp"0)
     
    End Sub

    Sub Mqtt_MessageArrived (Topic As String, Payload() As Byte)
       
    Log("Message arrived. Topic=", Topic, " payload: ", Payload)
       
    Log(bc.HexFromBytes(Payload))
       
    If Topic= "esp" Then
           
    Dim Objects() As Object = Ser.ConvertBytesToArray(Payload, ObjectsBuffer)
       
    Log(Payload.Length)
       
    Log(Objects.Length)
       
    Log(ObjectsBuffer.Length)
       
    End If
    End Sub

    Sub Mqtt_Disconnected
      
    Log("Disconnected")
      mqtt.Close
      Connect(
    0)
    End Sub
     
  10. Erel

    Erel Administrator Staff Member Licensed User

  11. H.L.M. Feijen

    H.L.M. Feijen Member Licensed User

    Solved!
    Many thanks , Erel
     
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