تتيح لك هذه المكتبة التي تم اختبارها بالكامل وحدة تشفير بياناتك على جانب Arduino وفك تشفيرها على جانب TTN. يوفر كل من التشفير المستند إلى C وفك الترميز القائم على JavaScript.
منذ الإصدار 2.2.0 ، يوجد أيضًا تشفير لجانب TTN.
جانب أردوينو:
# 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 } } تسلسل/يستحضر وقت 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 ) ) // 1467632413تسلسل/تسلسل الإحداثيات (خط العرض/خط الطول) بدقة 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]تسلسل/تسلسل عدد صحيح 8bit غير موقعة.
# 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 ) ) // 10تسلسل/تخلص من عدد صحيح 16bit غير موقعة.
# 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 ) ) // 23453تسلسل/تخلص من عدد صحيح 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 ) ) // 2864434397تسلسل/يستحضر قراءة درجة الحرارة بين -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.45تسلسل/يستحضر قراءة الرطوبة بين 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.99تسلسل/هروب تعويم كامل 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.99تسلسل/يستحضر نقطات تحتوي على علامات مختلفة بين 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 بايت) ويخطط الأول إلى coords الرئيسي والثاني إلى time رئيسي.
يمكنك استخدام: 64 A6 FA FD 6A 24 04 09 1D 4B 7A 57 للاختبار ، وسيؤدي ذلك إلى:
{
"coords" : [
-33.905052 ,
151.26641
],
"time" : 1467632413
}قم بإعداد وحدة فك الترميز الخاصة بك في وحدة التحكم:
تقوم طريقة Decode بالفعل بمعظم التحولات اللازمة ، لذلك في معظم الحالات ، يمكنك فقط تمرير البيانات من خلال:
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
)