4.1. LoRaScript

LoRaScriptはTLG7921シリーズにアドオンを提供するためにJavaScriptとNode.jsに基づいた独自のプラグインメカニズムです。

Node.jsからすべてのAPIを提供する代わりに、LoRaScriptはNode.js APIと他のサードパーティAPIのセットのみを提供します。

(APIのリストは「4.1.1. LoRaScript API」にあります。)


 図4‐1 LoRaスクリプト

 

図4‐1はLoRaScriptコンソールです。

[Core Status]パネルには[Proc]にプラグインプロセスID、[Stat]にプロセスステータス(実行中または停止)、[Vmem]にメモリ使用量が表示されます。

[Packet Info]パネルに表示されるプラグインで受信されたパケット数、[Plugin File]はプラグインマネージャーによって読み込まれる現在のプラグインです。


[Plugin Editor]はオンラインスクリプトエディターです。

プラグインマネージャーがスクリプトを正しくロードするために2つの関数があります。

onInit()はプラグインの初期化で呼び出され、すべてが着信パケットを受信したときにonLoRaRx(data)が使用されます。

最初のパラメーターデータは、仕様[3]のrxpkコンポーネントに準拠するJSONオブジェクトです。

[Plugin Log]パネルはプラグインのログを表示します。(メソッドdebug_print()を使用)

プラグインでパケットを送信するにはsend_pkt(data)を呼び出します。dataも仕様[3]のtxpkコンポーネントに準拠する必要があります。

表4‐1はユーザーのプラグインコールバックとメソッドを示し、表4-2表4-3はそれぞれANNWS.01.2.1.W.SYS rxpkおよびtxpkコンポーネントを示します。


 表4‐1 LoRaScriptコールバックとメソッド
名前タイプ使用法
onInit()Callbackプラグインの初期化メソッド、プラグインはこのコールバックで初期手順を設定できます。
onLoRaRx(data)Callback着信パケットを受信すると呼び出されます。データは[3]に準拠するJSONオブジェクトです。
send_pkt(data)Method送信パケットの送信に使用され、データはJSONオブジェクトである必要があり[3]に準拠しています。
debug_print(message)Method[Plugin Log]パネルでメッセージを表示用です。

 表4-2 ANNWS.01.2.1.W.SYSのrxpk JSONコンポーネント
フィールドデータ型コメント
timestring(任意)

LoRaフレームの受信のTC時間。 精度は1マイクロ秒です。形式はISO 8601「コンパクト」形式です。

オブジェクトは受信ゲートウェイに正確な時刻のソースがある場合にのみ存在します。

tmstunsigned integer(必須)

LoRaフレームが受信された瞬間のゲートウェイ内部時間カウンターの値。(マイクロ秒単位の粒度)

値は約72分ごとにロールオーバーします。異なるゲートウェイによって生成されるタイムスタンプ値は無関係です。

frequnsigned float(Hz精度、必須)MHz単位の受信信号の中心周波数。
chanunsigned integer(必須)フレームが受信されたコンセントレータ「IF」チャネル。
rfchunsigned integer(必須)フレームが受信されたコンセントレーター無線周波数チェーン。
statsigned integer(必須)フレームに対するゲートウェイのCRCテストの結果。
1 =正解
-1 =正しくない
0 = CRCテストが実行されず
modustring(必須)使用される変調技術:LoRa変調を表す「LORA」、FSK変調を表す「FSK」
datrstring(必須)

データレート識別子。「modu」が「LORA」に等しい場合「datr」は「SFnBWm」を含みます。

「n」はフレームの「拡散係数」を表す整数で「m」はkHzの単位でフレームの帯域幅を表す整数です。

「modu」が「FSK」に等しい場合「datr」はフレームのビットレートをHz単位で表す整数で構成されます。

codrstring(「modu」が「LoRa」と等しい場合に必須)

ECCコードレート。「codr」は文字列「k / n」で構成されます。

「k」は搬送ビットを表し「n」は誤りチェック/訂正アルゴリズムで使用されるビットを含む受信ビットの総数を表します。

rssisigned integer(必須)測定された受信信号強度(dBm単位)
lsnrsigned float(必須)測定された受信信号対雑音比。(dB単位)
sizeunsigned integer(任意)受信したフレームのオクテットの数。
datastring(必須)

Base64にエンコードされたフレームペイロード。

Base64パディング文字は追加されません。

 

 表4-3 ANNWS.01.2.1.W.SYSのtxpk JSONコンポーネント
フィールドデータ型コメント
immeboolean(任意)trueの場合、ゲートウェイはすぐにフレームを送信するように指示されます
tmstunsigned integer(任意)

「imme」がtrueではなく「tmst」が存在する場合、ゲートウェイはその内部タイムスタンプカウンタが「tmst」の値と等しいときにフレームを送信するように命令されます。

timestring(必須)

UTC時刻。 精度は1マイクロ秒です。形式はISO 8601「コンパクト」形式です。

「imme」がfalseまたは存在せず、「tmst」が存在しない場合、ゲートウェイはフレームを送信するように指示されます。

frequnsigned float(Hz精度、必須)フレームをMHz単位で送信するときの中心周波数。
rfchunsigned integer(必須)ゲートウェイがフレームを送信するように指示されるアンテナ。
powesigned integer(任意)ゲートウェイがフレームを送信するために指示される出力電力。
modustring(任意)使用される変調技術:LoRa変調を表す「LORA」、FSK変調を表す「FSK」
datrstring(任意)

データレート識別子「modu」が「LORA」に等しい場合、「datr」は「SFnBWm」を含みます。

「n」はフレームの「拡散係数」を表す整数で「m」はkHzの単位でフレームの帯域幅を表す整数です。

「modu」が「FSK」に等しい場合、「datr」はフレームのビットレートをHz単位で表す整数を含みます。

codrstring (「modu」が「LoRa」と等しい場合に必須)

ECCコードレート。「codr」は文字列「k / n」で構成されます。

「k」は搬送ビットを表し「n」はエラーチェック/訂正アルゴリズムによって追加されたビットを含む送信ビットの

総数を表します。「modu」が「LORA」に等しい場合にのみ送信されます。

ipolboolean(必須)

trueの場合、ゲートウェイに送信ビットの極性を反転するように指示します。

 「modu」が「LORA」に等しい場合、LoRa Serverは値をtrueに設定します。それ以外の場合、値は省略されます。

sizeunsigned integer(任意)受信したフレームのオクテットの数。
datastring(任意)

Base64にエンコードされたフレームペイロード。 Base64パディング文字は追加されません。

ncrc

bool(任意)

Falseでない場合、トランスミッタによる物理層CRC生成を無効にします。


リスト4-1 rxpkの例
{
	"time":"2013-03-31T16:21:17.528002Z",
	"tmst":3512348611,
	"chan":2,
	"rfch":0,
	"freq":866.349812,
	"stat":1,
	"modu":"LORA",
	"datr":"SF7BW125",
	"codr":"4/6",
	"rssi":-35,
	"lsnr":5.1,
	"size":32,
	"data":"-DS4CGaDCdG+48eJNM3Vai-zDpsR71Pn9CPA9uCON84"
}


リスト4-2 txpkの例
{
	"imme":true,
	"freq":864.123456,
	"rfch":0,
	"powe":14,
	"modu":"LORA",
	"datr":"SF11BW125",
	"codr":"4/6",
	"ipol":false,
	"size":32,
	"data":"H3P3N2i9qc4yt7rK7ldqoeCVJGBybzPY5h1Dd7P7p8v"
}

 

base64をrxpkからASCII文字列に変換するためのLoRaScriptサンプルコードをリスト4-3に示し、base64エンコーディングでtxpkパケットを送信するためのリスト4-4に示します。

 

リスト4-3 LoRaScriptでBase64からASCIIへのrxpkデータ
function onLoRaRx(data) {
	//convert base64 to ascii encoding
	var asciiStr = new Buffer(data, 'base64').toString('ascii');
	debug_print("receive " + asciiStr);
}

リスト4-4 LoRaScriptでtcpパケットを作成して送信する
 
function onInit() {
	setInterval(period_send, 1000); // send a txpk in every 1 second
}

function period_send () {
	var msg = 'Hello World';
	var msg_size = Buffer.byteLength(msg, 'asci');
	var base64str = new Buffer(msg).toString('base64');
	var json_obj = {
		imme:true,
		freq:915.5,
		rfch:0, 
		powe:14, 
		modu:"LORA",
		datr:"SF7BW125", 
		codr:"4/6", 
		ipol:false, 
		size:msg_size,
		data:base64str
	};
	send_pkt(JSON.stringify(json_obj));
}


 

var lora_packet = require('lora-packet');
function onInit() {
	debug_print("on init");	 
}
function onLoRaRx (data) {
	debug_print("on Recv data");
	var raw = JSON.parse(data);
	var lorawan_packet = new Buffer(raw.data, 'base64');
	
	if(lorawan_packet.length>12){
		var device = new Buffer(4);
		for (var i=0; i<4; i++) {
			device[i] = lorawan_packet[4-i];
		}
		var packet = lora_packet.fromWire(lorawan_packet);
		var NwkSKey = new Buffer("2b7e151628aed2a6abf7158809cf4f3c", 'hex');
		if(lora_packet.verifyMIC(packet, NwkSKey)){
			var AppSKey = new Buffer("2b7e151628aed2a6abf7158809cf4f3c", 'hex');
			var dec = lora_packet.decrypt(packet, AppSKey, NwkSKey).toString('hex');
			var msg = {
				devaddr: device.toString('hex'),
				data: dec,
				fport: packet.getFPort(),
				counter: packet.getFCnt(),
				freq: raw.freq,
				datr: raw.datr
			};
			debug_print(JSON.stringify(msg));
		}
	}
}