4.1.3. シンプルプロトコルの実装
このセクションではLoRaScriptで簡単なビーコンプロトコルを実装します(リスト4-6)。
ビーコンパケットは10秒ごとに送信され、受信したLoRaパケットはリモートサーバーに転送します。
さらにネットワークから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]++; }