1. 概要

このブログでは、neqto: のMachine Driver機能を利用した簡単な例を説明し、技術的な側面に焦点を当てて開始の支援を目的とします。

neqto: のMachine Driver機能を使用すると、ユーザーはneqto: と統合されたデバイスにリモートでファームウェアの更新できます。

 
Jetson Schematic  

Machine Driverの動作を説明するために、この簡単な例ではNvidia Jetson Nanoをneqto: Bridgeに接続されたコンポーネントデバイスとして使用します。 セットアップは次のとおりです。

  1. Nvidia Jetson Nanoは、USBケーブルを介してneqto: Bridge IOボードのUSB端子に接続されています(neqto: Bridge IOボードのUSB端子にはneqto: BridgeモジュールのUARTインタフェースがUSBシリアル変換ICを介して接続されています)。

注:(UART、RS232、RS485、SPI、とI2C)などの他の一般的なインターフェイスも使用できます

  1. Nvidia Jetson Nanoにカメラが接続され、ファームウェアファイルで設定されている頻度として1秒ごとに1つの写真を撮るようなっています。 3. この例の目的は、撮影操作の頻度を1秒ごとから2秒ごとに増やすことです。

2. MACHINE DRIVERの動作方法

ユーザーはneqto: Consoleかneqto: APIをご利用いただき、設定済みのJavaScriptスクリプト(fup.js)を使用してクラウドに新しいファームウェアファイルを簡単にアップロードできます。

ユーザーがコンソールからMachine Driverコマンドを送信すると、既存のメインスクリプト(run.js)が停止し、_fup.js_スクリプトがクラウドからダウンロードされ、実行されます。そして、_fup.js_スクリプトによって、デバイス(コンポーネント)の新しいファームウェアのダウンロード及び、書き込みが実行されます。

コード

Nvidia Jetson NanoでMachine Driverを実行するには、以下のスクリプトが必要です。

ブリッジ上のファイル

firmware.py - The new firmware
  • これは、ユーザーがデバイスにフラッシュする新しいファームウェアです。
frequency=2
fup.js - The file that handles FOTA
  • このファイルは、以下の操作を順番に実行します。
  • ファームウェアファイルのバイナリコンテンツを読み取ります
  • 内容を文字列形式に変換します
  • 変換されたデータを通信プロトコルを介して接続されたデバイスに送信します
  • 結果をクラウドに返します
// ----------------------------------------------------------------
// UART
// ----------------------------------------------------------------
nqEx.enUART(true);
var uart = new UART(2);
var BAUDRATE = 921600; //device baudrate.
uart.open(BAUDRATE, false, 0);

// Sending function - send converted data to the connected device via the UART communication protocol
var uart_sendData = function (data) {
  uart.send(data + '\n', false);
  // print(new Date().toString() + ': UART Sent | ' + data);
};

//----------------------------------------------------------------
// FOTA Object - only one file per object
//----------------------------------------------------------------
var fota = new nqFOTA('firmware.py');

// Conversion function - converts the contents to string format
var bin2string = function(ab) {
  var ret_str = '';
  uint8_a = new Uint8Array(ab);
  for (var i = 0; i < uint8_a.length; i++) {
      ret_str += (String.fromCharCode(uint8_a[i]));
  }
  return ret_str;
}

// Update function - reads and calls the conversion and sending functions
var updateReading = function (custom_func) {
  uart_sendData("--FOTA START--");
  var buff = fota.binRead(); // reads the contents of the firmware file
  while (buff != null) {
      uart_sendData(bin2string(buff));
      buff = fota.binRead();
  }
  uart_sendData("--FOTA END--");
  return 1;
}

//----------------------------------------------------------------
// Main
//----------------------------------------------------------------
var dl_data_len = fota.fileDownload(); // download the firmware file from the cloud
if (dl_data_len > 0) {
  var result = updateReading(send_string); // the result
  if (result != 1) { // send result to cloud
    fota.reportResult('UPDATE FAILED ', TARGET_VER);
  } else {  //success
    fota.reportResult('UPDATE SUCCESSFUL ', TARGET_VER);
  }
}

//----------------------------------------------------------------
// Termination
//----------------------------------------------------------------
uart.close();

JETSON NANOのファイル

firmware.py - The old firmware
  • これはアップグレードが必要な古いファームウェアです。
frequency=1
program.py - A file dependent on the firmware settings
  • これは、ファームウェアの設定に依存するサンプルファイルです。
import firmware
take_picture(firmware.frequency)
fota_daemon.py - A file that receives data from the neqto: Bridge on Machine Driver
  • コンポーネント側では、neqto: BridgeがFOTA(およびFOTA要求の設定)を開始していることを認識できるdaemonが必要です。その後、暗号化されたデートをデコードしUARTを介して受信したコンテンツを指定された場所に書き込みます。
  • さらに、ユーザーはFOTA要求がいつ終了したかを知ることができる必要があります。更新が完了すると、メインのプログラムが再開されます。
import serial
ser = serial.Serial('/dev/ttyUSB0', 921600)
fota = False
while(True):
data = ser.readline()[:-1].decode()
if data == "--FOTA START--":
  fota = True
  firmware = open("firmware.py", 'w+')
if data == "--FOTA END--":
  fota = False
  firmware.close()
if fota and data != "--FOTA START--":
  firmware.write(data)

3. 結論

この単純な例は、ひとつのクリックだけでファームウェアをリモートで更新するMachine Driverの簡単さを示しています。

neqto: をご利用いただくと、システム障害時のデバッグと修復を最小限の労力で監視および解決ができ、貴重な時間と費用を節約できます。また、技術の進歩に伴い、デバイスはセキュリティや機能を維持またはアップグレードするためにファームウェア更新する必要があります。neqto: はそのようなデバイスのファームウェア更新をMachine Driverを介して提供できます。

多くの分野がこの機能の恩恵を受けます。たとえば、自動車業界では、現代の自動車は自動・リモート制御の概念に基づいて設計されており、無線(OTA)アップデートなどの重要な機能を備えています。これにより、製造業者は車のファームウェアを更新し、セキュリティ更新プログラムと新しいソフトウェア機能をリモートで展開できます。しかしながら、既に設計済みまたはエントリーレベルの自動車の場合、これらの機能を後から導入することは容易ではなく、開発費用がかかります。neqto: がコントローラーに統合されていれば、Machine Driver機能によって無線を使用したファームウェア更新を簡単に実現できます。

今後のブログでは、具体的なユースケースの紹介や、デバイスとの統合によりneqto: がどうIoT業界の水準を高めているか詳しく説明します。