Mesh.publish() successful but returns false even though gateway receives message

xenon
Tags: #<Tag:0x00007fe21ff166d0>

#1

bool isSuccess = Mesh.publish(event, data);

is returning false yet the publish has been successful. Am I missing something?


#2

Mesh.publish returns a system error code, so 0 is success.

I just realized as the documentation was copy/pasted from Particle.publish, and it’s not correct.


#3

So SYSTEM_ERROR_NONE is the enumeration? Wow, incredible that hasn’t been spotted before!

I better stop for the evening and go and celebrate New Year - have a good New Year celebration and thanks for your help in 2018.

Edit: When you are on a roll! I noticed that if I send a Mesh message when the LED is flashing green the result code is still 0 and the message is not sent (not surprising) - is it likely that this always returns 0 success even though it isn’t?


#4

I’m seeing the same thing as you with my device. The result of Mesh.publish is always 0, even when it fails.


#5

It probably because mesh.publish uses UDP and as such there is no way to determine if a UDP packet reached its destination. Particle.publish is TCP based which does allow for confirmation of reciept


#6

I don’t use the returned bool from Mesh.publish() precisely because it is wrong.


#7

UPDATE:

Mesh.publish() uses CHECK and CHECK_TRUE macros (defined in https://github.com/particle-iot/device-os/blob/master/services/inc/check.h), which can return values other than SYSTEM_ERROR_NONE. Therefore my original message (below) was incorrect.

Original message

It seems at least as of https://github.com/particle-iot/device-os/blob/v1.4.4/wiring/src/spark_wiring_mesh.cpp#L227 that this is still returning success no matter the actual result.

@rickkas7, think there might be some bandwidth to update the documentation? It looks like there are some hard problems to solve before the function can return meaningful results.

I propose the following replacement

old version–>

Returns: 0 = success, non-zero = system error code)

Note that the return value for Mesh.publish is 0 (SYSTEM_ERROR_NONE) for success, where the return value for Particle.publish is true (1) for success.

new version–>

Returns (int): 0 

Return Code on Mesh.Publish
#8

The errors SYSTEM_ERROR_TOO_LARGE and SYSTEM_ERROR_INVALID_ARGUMENT in the CHECK_TRUE macro can be returned. Also, the CHECK macro can return non-zero error codes from the checked value.


#9

Thanks for the clarification, it wasn’t obvious through Github that CHECK_TRUE and CHECK were macros which wrap a return.