Perpustakaan yang sepenuhnya teruji ini memungkinkan Anda untuk menyandikan data Anda di sisi Arduino dan memecahkan kode di sisi TTN. Ini menyediakan enkoder berbasis C dan dekoder berbasis JavaScript.
Karena versi 2.2.0 ada juga encoder untuk sisi TTN.
Sisi Arduino:
# include " LoraMessage.h "
LoraMessage message;
message
.addUnixtime( 1467632413 )
.addLatLng(- 33.905052 , 151.26641 );
lora_send_bytes (message.getBytes(), message.getLength());
delete message;Sisi TTN:
function decodeUplink ( input )
{
// decoder function according to https://www.thethingsindustries.com/docs/integrations/payload-formatters/javascript/uplink/
// input has the following structure:
// {
// "bytes": [1, 2, 3], // FRMPayload (byte array)
// "fPort": 1
// }
var data = decode ( input . bytes , [ unixtime , latLng ] , [ 'time' , 'coords' ] ) ;
return { data : data }
}
// include content from src/decoder.js:
var bytesToInt = function ( bytes ) {
var i = 0 ;
for ( var x = 0 ; x < bytes . length ; x ++ ) {
i |= + ( bytes [ x ] << ( x * 8 ) ) ;
}
return i ;
} ;
...Sisi TTN:
// include src/encoder.js
var bytes = encode ( [ timestamp , [ latitude , longitude ] ] , [ unixtime , latLng ] ) ;
// bytes is of type Buffer // include src/encoder.js
// include src/LoraMessage.js
var bytes = new LoraMessage ( encoder )
. addUnixtime ( 1467632413 )
. addLatLng ( - 33.905052 , 151.26641 )
. addBitmap ( true , true , false , true )
. getBytes ( ) ;
// bytes = <Buffer 1d 4b 7a 57 64 a6 fa fd 6a 24 04 09 d0>dan kemudian decoding seperti biasa:
var result = decoder . decode (
bytes ,
[ decoder . unixtime , decoder . latLng , decoder . bitmap ] ,
[ 'time' , 'coords' , 'heaters' ]
) ;
// result =
// { time: 1467632413,
// coords: [ -33.905052, 151.26641 ],
// heaters:
// { a: true,
// b: true,
// c: false,
// d: true,
// e: false,
// f: false,
// g: false,
// h: false } } Serialize/Deserializes A Unix Time (detik)
# include " LoraEncoder.h "
byte buffer[ 4 ];
LoraEncoder encoder (buffer);
encoder.writeUnixtime( 1467632413 );
// buffer == {0x1d, 0x4b, 0x7a, 0x57}Dan kemudian di frontend TTN, gunakan metode berikut:
unixtime ( input . bytes . slice ( x , x + 4 ) ) // 1467632413Serialize/Deserializes Koordinat (lintang/bujur) dengan presisi 6 desimal.
# include " LoraEncoder.h "
byte buffer[ 8 ];
LoraEncoder encoder (buffer);
encoder.writeLatLng(- 33.905052 , 151.26641 );
// buffer == {0x64, 0xa6, 0xfa, 0xfd, 0x6a, 0x24, 0x04, 0x09}Dan kemudian di frontend TTN, gunakan metode berikut:
latLng ( input . bytes . slice ( x , x + 8 ) ) // [-33.905052, 151.26641]Serializes/Deserializes Integer 8bit yang tidak ditandatangani.
# include " LoraEncoder.h "
byte buffer[ 1 ];
LoraEncoder encoder (buffer);
uint8_t i = 10 ;
encoder.writeUint8(i);
// buffer == {0x0A}Dan kemudian di frontend TTN, gunakan metode berikut:
uint8 ( input . bytes . slice ( x , x + 1 ) ) // 10Serialize/Deserializes Integer 16bit yang tidak ditandatangani.
# include " LoraEncoder.h "
byte buffer[ 2 ];
LoraEncoder encoder (buffer);
uint16_t i = 23453 ;
encoder.writeUint16(i);
// buffer == {0x9d, 0x5b}Dan kemudian di frontend TTN, gunakan metode berikut:
uint16 ( input . bytes . slice ( x , x + 2 ) ) // 23453Serialize/Deserializes Integer 32bit yang tidak ditandatangani.
# include " LoraEncoder.h "
byte buffer[ 4 ];
LoraEncoder encoder (buffer);
uint32_t i = 2864434397 ;
encoder.writeUint32(i);
// buffer == {0xdd, 0xcc, 0xbb, 0xaa}Dan kemudian di frontend TTN, gunakan metode berikut:
uint32 ( input . bytes . slice ( x , x + 4 ) ) // 2864434397Serializes/Deserializes Bacaan suhu antara -327.68 dan +327.67 (inklusif) dengan ketepatan 2 desimal.
# include " LoraEncoder.h "
byte buffer[ 2 ];
LoraEncoder encoder (buffer);
encoder.writeTemperature(- 123.45 );
// buffer == {0xcf, 0xc7}Dan kemudian di frontend TTN, gunakan metode berikut:
temperature ( input . bytes . slice ( x , x + 2 ) ) // -123.45Serialize/deserializes membaca kelembaban antara 0 dan 100 (inklusif) dengan ketepatan 2 desimal.
# include " LoraEncoder.h "
byte buffer[ 2 ];
LoraEncoder encoder (buffer);
encoder.writeHumidity( 99.99 );
// buffer == {0x0f, 0x27}Dan kemudian di frontend TTN, gunakan metode berikut:
humidity ( input . bytes . slice ( x , x + 2 ) ) // 99.99Serializes/Deserializes Float 4-byte penuh.
# include " LoraEncoder.h "
byte buffer[ 4 ];
LoraEncoder encoder (buffer);
encoder.writeRawFloat( 99.99 );
// buffer == {0xe1, 0xfa, 0xc7, 0x42}Dan kemudian di frontend TTN, gunakan metode berikut:
rawfloat ( input . bytes . slice ( x , x + 4 ) ) // 99.99Serialisasi/deserialisasi bitmap yang mengandung antara 0 dan 8 bendera yang berbeda.
# include " LoraEncoder.h "
byte buffer[ 1 ];
LoraEncoder encoder (buffer);
encoder.writeBitmap( true , false , false , false , false , false , false , false );
// buffer == {0x80}Dan kemudian di frontend TTN, gunakan metode berikut:
bitmap ( input . bytes . slice ( x , x + 1 ) ) // { a: true, b: false, c: false, d: false, e: false, f: false, g: false, h: false } Decoder memungkinkan Anda untuk menulis lebih dari satu nilai ke array byte:
# include " LoraEncoder.h "
byte buffer[ 19 ];
LoraEncoder encoder (buffer);
encoder.writeUnixtime( 1467632413 );
encoder.writeLatLng(- 33.905052 , 151.26641 );
encoder.writeUint8( 10 );
encoder.writeUint16( 23453 );
encoder.writeUint32( 2864434397 );
encoder.writeTemperature( 80.12 );
encoder.writeHumidity( 99.99 );
encoder.writeRawFloat( 99.99 );
encoder.writeBitmap( true , false , false , false , false , false , false , false );
/* buffer == {
0x1d, 0x4b, 0x7a, 0x57, // Unixtime
0x64, 0xa6, 0xfa, 0xfd, 0x6a, 0x24, 0x04, 0x09, // latitude,longitude
0x0A, // Uint8
0x9d, 0x5b, // Uint16
0xdd, 0xcc, 0xbb, 0xaa, // Uint32
0x1f, 0x4c, // temperature
0x0f, 0x27, // humidity
0xe1, 0xfa, 0xc7, 0x42, // 4-byte float
0x80 // bitmap
}
*/ LoraMessage kelas kenyamananAda kelas kenyamanan yang mewakili loramessage yang dapat Anda tambahkan bacaan ke:
# include " LoraMessage.h "
LoraMessage message;
message
.addUnixtime( 1467632413 )
.addLatLng(- 33.905052 , 151.26641 )
.addUint8( 10 )
.addUint16( 23453 )
.addUint32( 2864434397 )
.addTemperature( 80.12 )
.addHumidity( 99.99 )
.addRawFloat( 99.99 )
.addBitmap( false , false , false , false , false , false , true , false );
send (message.getBytes(), message.getLength());
/*
getBytes() == {
0x1d, 0x4b, 0x7a, 0x57, // Unixtime
0x64, 0xa6, 0xfa, 0xfd, 0x6a, 0x24, 0x04, 0x09, // latitude,longitude
0x0A, // Uint8
0x9d, 0x5b, // Uint16
0xdd, 0xcc, 0xbb, 0xaa, // Uint32
0x1f, 0x4c, // temperature
0x0f, 0x27, // humidity
0xe1, 0xfa, 0xc7, 0x42, // 4-byte float
0xfd // Bitmap
}
and
getLength() == 28
*/decode Metode decode memungkinkan Anda untuk menentukan topeng untuk buffer byte yang masuk (yang dihasilkan oleh pustaka ini) dan menerapkan fungsi decoding yang sesuai.
decode ( byte Array , mask Array [ , mapping Array ] ) Tempel semuanya dari src/decoder.js ke dalam metode decoder dan gunakan seperti ini:
function ( bytes ) {
// code from src/decoder.js here
return decode ( bytes , [ latLng , unixtime ] , [ 'coords' , 'time' ] ) ;
} Ini memetakan buffer byte yang masuk dari 12 byte ke urutan satu latLng (8 byte) dan satu urutan unixtime (4 byte) dan memetakan yang pertama ke coords kunci dan yang kedua ke time kunci.
Anda dapat menggunakan: 64 A6 FA FD 6A 24 04 09 1D 4B 7A 57 untuk pengujian, dan itu akan menghasilkan:
{
"coords" : [
-33.905052 ,
151.26641
],
"time" : 1467632413
}Siapkan dekoder Anda di konsol:
Metode decode sudah melakukan sebagian besar transformasi yang diperlukan, jadi dalam kebanyakan kasus Anda dapat meneruskan data melalui:
yarnyarn run test:cyarn testyarn coverage (lihat coverage/lcov-report )CI akan dimulai setelah Anda membuat permintaan tarik secara otomatis.
Tambahkan ketergantungan lora-serialization ke file main/idf_component.yml dalam proyek ESP-IDF Anda:
dependencies:
lora-serialization:
git: https://github.com/thesolarnomad/lora-serialization.git
Serta ke main/CMakeLists.txt
idf_component_register( ...
REQUIRES .... lora-serialization
)