4.1.3. シンプルなプロトコルを実装する

このセクションではLoRaScriptのリスト4-6で記述された簡単なプロトコルを提供します。

ビーコンパケットは10秒ごとに送信され受信パケットはリモートサーバーに転送されます。

さらにネットワークからLoRaノードにデータを送信するためのダウンリンクデータも受け入れます。

このプロトコルを利用することによりTDMAプロトコルをLoRaノードに実装できます。

図4-3 TDMAの図に示すように、各LoRaノードはビーコンを待機し、ビーコンを受信した後に事前定義された遅延でパケットを送信します。

ゲートウェイは49の異なるチャネルを同時に受信できるため、各チャネルはTDMAプロトコルを提示します。

したがって、数のノードを同時に処理できます。

ただし、拡散率が異なるチャネルのデータレートは異なるため、データの送信時間を計算し各タイムスロットの期間を割り当てるよう注意する必要があります。


 図4-3 TDMAの図


リスト4-6 LoRaScriptの簡単なプロトコル 
var dgram;

//server address for forwarding uplink data
var server_port = 5555;
var server_ip = '192.168.31.200';
var udp_sock;

//command port for accepting downlink data
var cmd_port = 5556;
var cmd_sock;
var update_cmd = false;
var cmd_node_address;
var cmd_node_data;
var beacon_channel = { 
	imme:true, 
	freq:915.1, 
	rfch:0, 
	powe:14, 
	modu:"LORA",
	datr:"SF7BW125", 
	codr:"4/6", 
	ipol:false, 
	size:5,
	data:""
};

var beacon_pkt;

function onInit() {
	beacon_pkt = new Uint8Array(5);
	beacon_pkt[0] = 0x5A; //magic
	beacon_pkt[1] = 0x00; //sequence
	beacon_pkt[2] = 0x00; //cmd
	beacon_pkt[3] = 0x00; //node address
	beacon_pkt[4] = 0x00; //data

	dgram = require('dgram');
	udp_sock = dgram.createSocket('udp4');

	cmd_sock = dgram.createSocket('udp4');
	cmd_sock.on('listening', function () {
		var address = cmd_sock.address();
		debug_print('UDP Server listening on ' + address.address + ':' + address.port);
	});

	cmd_sock.on('message', function (message, remote) {
		debug_print(remote.address + ':' + remote.port +' - ' + message);
		cmd_node_address = message[0];
		cmd_node_data = message[1];
		update_cmd = true;
	});

	cmd_sock.bind(cmd_port);


	setInterval(beacon, 10000); //broadcast beacon every 10 second
}

function onLoRaRx (data) {
	var recv_pkt = JSON.parse(data);
	var recv_data = new Buffer(recv_pkt.data, 'base64');

	debug_print("Receive packet from freq:" + recv_pkt.freq + ", datarate:" + recv_pkt.datr + ", coderate:" + recv_pkt.codr);

	udp_sock.send(recv_data, 0, recv_data.length, server_port, server_ip, function(err, bytes) {
		if (err) throw err;
		debug_print('UDP message sent to ' + server_ip +':'+ server_port);
	});
}

function beacon () {
	if (update_cmd == true) {
		debug_print("Send beacon with cmd");
		beacon_pkt[3] = cmd_node_address;
		beacon_pkt[4] = cmd_node_data;
		update_cmd = false;
	} else {
		debug_print("Send beacon");
		beacon_pkt[3] = 0;
		beacon_pkt[4] = 0;
	}
	beacon_pkt[2] = 0x11; //beacon cmd
	beacon_channel.data = new Buffer(beacon_pkt).toString('base64');
	send_pkt(JSON.stringify(beacon_channel));
	beacon_pkt[1]++;
}