nRF Mesh , sending hundreds of bytes packets to the mesh nodes causes NRF_MESH_EVT_SAR_FAILED

Hi,

 

I am conducting a mesh test and it contains:

  1. An android smartphone,

- running nrf mesh 3.1.7 on github

- sending hundreds of bytes packets to the mesh nodes by “broadcasting”.

  1. At least 2 nodes

- using nRF52840DK

- based on nrf5_SDK_for_Mesh_v4.2.0_src  light_switch server

 

The result shows:

  1. Only the last provisioned node receives the full set of packets from smartphone.
  2. Other nodes report NRF_MESH_EVT_SAR_FAILED in mesh_evt_cb(access.c) unless the total packets is limited to 8 Bytes.

 

Could you help on

  1. How to solve NRF_MESH_EVT_SAR_FAILED?
  2. We speculated that because the app used the last node as a proxy node, and there is a limitation with the proxy relay in large packets. If yes, is there any way to make the direct broadcasting instead of proxying ?
  • Hi Stanley, 

    Could you please describe what exactly you did by doing "broadcasting" from the phone? 

    You are correct that the phone only connect to a proxy node to talk to the mesh network. Usually it's the last provisioned node. You can disconnect a proxy node and connect to other proxy node of your choice. 

    Please be aware that in most case a phone doesn't do mesh directly. It requires a BLE connection to a proxy node to be able to talk to other nodes. 

    There isn't a "broadcast" packet in mesh, you can send a packet to all nodes (address 0xFFFF) but it's not recommended. It's preferred if you setup a Group address and then subscribe the model on the nodes to this address. 

    Also, Bluetooth mesh is not designed for high throughput communication. So sending a large amount of bytes to all the nodes in the network expose the risk of network congestion as packet about 11bytes will be segmented. For example to transmit 100 bytes, there would be 12 segmented packets, this also require ACK packets for each of them. 

  • I believe I am using “group” as you mentioned instead of “broadcast”, since I use a comment (in Android-nRF-Mesh-Library) to send my packet to specified group address.

     

    Furthermore, a similar test is conducted by 3 of nRF52840DK, where

    - No.1 works as a generic onoff client;

    - No.2 works as a server, and is placed in the wireless working rang with No.1; and

    - No.3 works as a server, and placed far away from No1, but in the working range of No.2.

     

    The result is No.1 is able to publish 300 bytes to both No2 and No3 successfully by nrf mesh publish and subscribe addresses.

     

    My question is:

    1. Does it indicate that the proxy node has any relay restrictions?

     

  • Hi Stanley, 

    As far as I know the Proxy node should be able to do segmented relaying. 

    Could you show exactly how you send the message from the code in your app ? 

    Have you tried to send something smaller, for example 30 bytes ? To see if it's received by all nodes. We just need to know if it was the issue with larger message size or it's the issue with any segmented message. 

    I think there could be an issue when the source device need to resend a segmented message but it's connected via Proxy so there is a chance that the proxy couldn't relay the ACK and the re-transmission package. 

  • Thank you for your reply.

    In this model, I use sendVendorModelMessage to send my packet to specified group address and store the meshmessage as a VendorModelMessageAckedState.

     

    I have tried 30 bytes , but the other nodes could not received.

    It will occur as long as the payload exceeds 8 bytes.

  • Hi Stanley, 

    I had a discussion with the team here about the issue. They pointed out that on normal node (not the phone) the segmented multicast message has a retry number TRANSPORT_SAR_TX_RETRIES_DEFAULT (4) to resend the segmented messages and make sure they would arrive to the destinations. 

    It's not the case on the phone as sendmessage is called only one. 


    Could you try to do a test to send a message of , for example 12 bytes, and try to resend it (call sendmessage()) 4 times and check if it's arrived on the other nodes in the mesh network ? 

Related