ห้องสมุดที่ผ่านการทดสอบอย่างสมบูรณ์นี้ช่วยให้คุณสามารถเข้ารหัสข้อมูลของคุณทางด้าน Arduino และถอดรหัสทางด้าน TTN มันมีทั้งตัวเข้ารหัสที่ใช้ C-based และตัวถอดรหัสที่ใช้ JavaScript
ตั้งแต่เวอร์ชัน 2.2.0 นอกจากนี้ยังมีตัวเข้ารหัสสำหรับด้าน TTN
ด้าน Arduino:
# include " LoraMessage.h "
LoraMessage message;
message
.addUnixtime( 1467632413 )
.addLatLng(- 33.905052 , 151.26641 );
lora_send_bytes (message.getBytes(), message.getLength());
delete message;ด้าน 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 ;
} ;
...ด้าน 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>แล้วถอดรหัสตามปกติ:
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 } } serializes/deserializes เวลา UNIX (วินาที)
# include " LoraEncoder.h "
byte buffer[ 4 ];
LoraEncoder encoder (buffer);
encoder.writeUnixtime( 1467632413 );
// buffer == {0x1d, 0x4b, 0x7a, 0x57}จากนั้นในส่วนหน้า TTN ให้ใช้วิธีการต่อไปนี้:
unixtime ( input . bytes . slice ( x , x + 4 ) ) // 1467632413serializes/deserializes พิกัด (ละติจูด/ลองจิจูด) ที่มีความแม่นยำ 6 ทศนิยม
# include " LoraEncoder.h "
byte buffer[ 8 ];
LoraEncoder encoder (buffer);
encoder.writeLatLng(- 33.905052 , 151.26641 );
// buffer == {0x64, 0xa6, 0xfa, 0xfd, 0x6a, 0x24, 0x04, 0x09}จากนั้นในส่วนหน้า TTN ให้ใช้วิธีการต่อไปนี้:
latLng ( input . bytes . slice ( x , x + 8 ) ) // [-33.905052, 151.26641]serializes/deserializes จำนวนเต็ม 8 บิตที่ไม่ได้ลงชื่อ
# include " LoraEncoder.h "
byte buffer[ 1 ];
LoraEncoder encoder (buffer);
uint8_t i = 10 ;
encoder.writeUint8(i);
// buffer == {0x0A}จากนั้นในส่วนหน้า TTN ให้ใช้วิธีการต่อไปนี้:
uint8 ( input . bytes . slice ( x , x + 1 ) ) // 10serializes/deserializes จำนวนเต็ม 16 บิตที่ไม่ได้ลงชื่อ
# include " LoraEncoder.h "
byte buffer[ 2 ];
LoraEncoder encoder (buffer);
uint16_t i = 23453 ;
encoder.writeUint16(i);
// buffer == {0x9d, 0x5b}จากนั้นในส่วนหน้า TTN ให้ใช้วิธีการต่อไปนี้:
uint16 ( input . bytes . slice ( x , x + 2 ) ) // 23453serializes/deserializes จำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อ
# include " LoraEncoder.h "
byte buffer[ 4 ];
LoraEncoder encoder (buffer);
uint32_t i = 2864434397 ;
encoder.writeUint32(i);
// buffer == {0xdd, 0xcc, 0xbb, 0xaa}จากนั้นในส่วนหน้า TTN ให้ใช้วิธีการต่อไปนี้:
uint32 ( input . bytes . slice ( x , x + 4 ) ) // 2864434397serializes/deserializes การอ่านอุณหภูมิระหว่าง -327.68 และ +327.67 (รวม) ด้วยความแม่นยำ 2 ทศนิยม
# include " LoraEncoder.h "
byte buffer[ 2 ];
LoraEncoder encoder (buffer);
encoder.writeTemperature(- 123.45 );
// buffer == {0xcf, 0xc7}จากนั้นในส่วนหน้า TTN ให้ใช้วิธีการต่อไปนี้:
temperature ( input . bytes . slice ( x , x + 2 ) ) // -123.45serializes/deserializes การอ่านความชื้นระหว่าง 0 ถึง 100 (รวม) ด้วยความแม่นยำ 2 ทศนิยม
# include " LoraEncoder.h "
byte buffer[ 2 ];
LoraEncoder encoder (buffer);
encoder.writeHumidity( 99.99 );
// buffer == {0x0f, 0x27}จากนั้นในส่วนหน้า TTN ให้ใช้วิธีการต่อไปนี้:
humidity ( input . bytes . slice ( x , x + 2 ) ) // 99.99serializes/deserializes ลอย 4 ไบต์เต็ม
# include " LoraEncoder.h "
byte buffer[ 4 ];
LoraEncoder encoder (buffer);
encoder.writeRawFloat( 99.99 );
// buffer == {0xe1, 0xfa, 0xc7, 0x42}จากนั้นในส่วนหน้า TTN ให้ใช้วิธีการต่อไปนี้:
rawfloat ( input . bytes . slice ( x , x + 4 ) ) // 99.99serializes/deserializes บิตแมปที่มีระหว่าง 0 ถึง 8 ธงที่แตกต่างกัน
# include " LoraEncoder.h "
byte buffer[ 1 ];
LoraEncoder encoder (buffer);
encoder.writeBitmap( true , false , false , false , false , false , false , false );
// buffer == {0x80}จากนั้นในส่วนหน้า TTN ให้ใช้วิธีการต่อไปนี้:
bitmap ( input . bytes . slice ( x , x + 1 ) ) // { a: true, b: false, c: false, d: false, e: false, f: false, g: false, h: false } ตัวถอดรหัสช่วยให้คุณเขียนมากกว่าหนึ่งค่าไปยังอาร์เรย์ไบต์:
# 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 ชั้นเรียนสะดวกมีคลาสความสะดวกที่แสดงถึง loramessage ที่คุณสามารถเพิ่มการอ่านให้:
# 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 วิธี decode ช่วยให้คุณสามารถระบุหน้ากากสำหรับบัฟเฟอร์ไบต์ขาเข้า (ที่สร้างขึ้นโดยไลบรารีนี้) และใช้ฟังก์ชั่นการถอดรหัสตามนั้น
decode ( byte Array , mask Array [ , mapping Array ] ) วางทุกอย่างจาก src/decoder.js ลงในวิธีตัวถอดรหัสและใช้เช่นนี้:
function ( bytes ) {
// code from src/decoder.js here
return decode ( bytes , [ latLng , unixtime ] , [ 'coords' , 'time' ] ) ;
} สิ่งนี้จะแมปบัฟเฟอร์ไบต์ที่เข้ามา 12 ไบต์กับลำดับของหนึ่ง latLng (8 ไบต์) และหนึ่ง unixtime (4 bytes) ลำดับและแมปแรกกับ coords คีย์และครั้งที่สองถึง time สำคัญ
คุณสามารถใช้: 64 A6 FA FD 6A 24 04 09 1D 4B 7A 57 สำหรับการทดสอบและจะส่งผลให้:
{
"coords" : [
-33.905052 ,
151.26641
],
"time" : 1467632413
}ตั้งค่าตัวถอดรหัสของคุณในคอนโซล:
วิธีการถอดรหัสได้ทำการแปลงที่จำเป็นที่สุดแล้วดังนั้นในกรณีส่วนใหญ่คุณสามารถส่งข้อมูลผ่าน:
yarnyarn run test:cyarn testyarn coverage (ดู coverage/lcov-report )CI จะเริ่มต้นเมื่อคุณสร้างคำขอดึงโดยอัตโนมัติ
เพิ่มการพึ่งพา lora-serialization ในไฟล์ main/idf_component.yml ในโครงการ ESP-IDF ของคุณ:
dependencies:
lora-serialization:
git: https://github.com/thesolarnomad/lora-serialization.git
เช่นเดียวกับ main/CMakeLists.txt
idf_component_register( ...
REQUIRES .... lora-serialization
)