Custom Payload Codec


I am trying to use the custom javascript decoding to read my sensor data.

I only need to convert the base64 encoded data into bytes. But I seem to be getting stuck when I use simple functions like atob etc.

Anyone has written a payload function decode to convert base64 to binary/hex data?

Thanks much!

Please note that an array of bytes are passed as argument to the Decode function, not a base64 encoded string.

Hmmm, it is a bit confusing. My device sends a 3 byte data. On the application server, device - > live event logs , for the ‘data’ key , the value is ‘AQUA’. When I decode this base64 string to bytes (used online decoder like , I get the 3 byte sensor data.

My payload function for now is very simple :

function Decode(fPort, bytes) {
return {“myresult”:bytes};

payload: {} 10keys
object:{} 1 key

Shouldn’t myresult object show the bytes, instead shows the same BASE64 data? I am sorry if my confusion is silly, I am very new to the world of LoRa itself. :sweat:

Thanks very much,

Note that Go by default encodes a byte array to base64 when encoding an object to JSON. So within the context of:

function Decode(fPort, bytes) {
return {“myresult”:bytes};

bytes is an array containing the decrypted payload bytes. Thus bytes[0] returns the first byte, etc…


ah got it now… thanks much!!! :grinning:

1 Like

To me give a base64 string because I send “Hello, world!” and I get “SGVsbG8sIHdvcmxkIQ==” that is the base64 for “Hello, world!”.

I declared in the Arduino skecth:

static uint8_t mydata[] = “Hello, world!”;

Is there a way to understand how decode bytes param from “function Decode(fPort, bytes)”?

I tried a lot of base64 decode javascript function but nothing worked. What kind of javascript LoRa Server implements? What version of the standard?

I used the javascript decode function from here:

but it says:

error:"js vm error: TypeError: 'replace' is not a function".


It uses a package called otto, which runs an ES5 version.

you don’t need to decode base64, you just need to decode your byte depending how you encode your byte in de end-device .

Hi. would you mind to share me how you did it please.
Thank you

still not understanding why my custom codec won’t decode the data/bytes.
I have a data field that is about 64 characters (base64 looking), data is encoded in bytes, so why does my payload return just 1… like the number 1 when i do
return bytes;


I wasn’t using the correct signature for my function. I needed this:
function (fport, bytes)

All good now. Thanks!

char * str = "Hello, world!";
for(int i = 0 ; i < strlen(str) ; i++ )
 printf("%02x", str[i]);

by using the c code above to transfer the “Hello, world!”
we will get 48656c6c6f2c20776f726c6421

use the lora module to tranfer this hex
mac tx cnf 1 48656c6c6f2c20776f726c6421

function Decode(fPort, bytes) {
   var data = {
   for (var i = 0; i < bytes.length; i++) {
      data.cmd+= String.fromCharCode(bytes[i]);
   return data;

my appID is 1 we can sub the topic to see into the payload
use mosquitto_sub or any mqtt client like mqtt.fx
mosquitto_sub -t “application/1/#” -v

the payload will show the string:
“objectJSON”:"{“cmd”:“Hello, world!”}",

Hi Moonlca, this seems like a very good answer, if you could expand on it a little more, more than one of us would appreciate it.
I think we need more examples like this.
Thank you

Hi, I too have a same query while I am creating my decode code in Custom Payload Codec I have tried to convert data using my code.Before I start my I checked by returning {“Data” : bytes} I am getting output as * objectJSON:“Data : Payload” Payload as base64 encoded String instead of array of bytes. And I don’t why I am getting Base64. Can you check my query and tell how I can proceed.
Thank You