Hello Orne,
whenever I try to send an oddd lenght payload I receive en error of type “illegal base64 at byte …”
It seems to be related to the fact that the data is []byte type and so the JSON payload is read as base64
Hello Orne,
whenever I try to send an oddd lenght payload I receive en error of type “illegal base64 at byte …”
It seems to be related to the fact that the data is []byte type and so the JSON payload is read as base64
Are you sure this is not a base64 encoding issue at your side? Example: https://play.golang.org/p/VlfhZitMOjZ
In lora-app-server, mqtt_handler.go:
dec := json.NewDecoder(bytes.NewReader(msg.Payload()))
if err := dec.Decode(&pl); err != nil {
log.WithFields(log.Fields{
“data_base64”: base64.StdEncoding.EncodeToString(msg.Payload()),
}).Errorf(“handler/mqtt: tx payload unmarshal error: %s”, err)
return
}
if the data field sent is for exampe “03” the Decode function returns error:
level=error msg=“handler/mqtt: tx payload unmarshal error: illegal base64 data at input byte 0”
How did you get to the "03"
base64 encoded string? E.g. in my above example (url) the array of bytes []byte{1, 2, 3}
results in the base64 encoded string "AQID"
(encoded to HEX this would be "010203"
).
Yes, sorry you’re right.
I receive a json with “data”:“03” which is the payload to be transmtitted. The problem is that the unmarshalling expects a base64 payload which shoud be AW==
The application sending the payload is out of my control, so I cannot chenge it to send base64 payload
Shall I change the payload type in String instead of []byte?
I suspect that "data": "03"
means that data
is encoded as HEX? In that case the only thing you need to do is decode and re-encode to base64. To summarize:
HEX IN => decode HEX to byte array => encode byte array to base64 => base64 OUT
No need to make modifications to LoRa App Server.
Sorry I don’t undertsand.
The situation during a downlink transmission is::
an external app send this JSON payload
{
“confirmed”: false,
“data”: “03”,
“devEUI”: “xxxxxxxxxxxxxxxx”,
“fPort”: 7,
“reference”: “string”
}
to MQTT topic
Lora-app-server/mqtt_handler receive this payload and it rties to parse to dataDownPyaload whichi contain a member Data of type [byte]
then
dec := json.NewDecoder(bytes.NewReader(msg.Payload()))
if err := dec.Decode(&pl); err != nil { …
the Decode function fails because it is assuming the value of Data as encoded base64…but it is not (“03”)
Where shall I put the conversion? The entry point is the payload received by mqtt but I cannot manipulate it becasue it is given as []byte with msg.Payload()
I changed the type of Data inside the dataDownPayload as String and I made a conversion to be able to send payload non base64 encoded such as “03”
Thanks for this post. It helped me a lot!!!
in the go playground link
for Hexa format , i just add “0x” in front of the value and its work well!