水曜日 6 25, 2014

Java ME Embedded 8を使ったGPIOを操作するアプリケーション開発(1/2)

以前ブログにて紹介した、Java ME Embedded 8を使ったM2Mアプリケーション開発の記事をご覧いただけたでしょうか。今回はJava ME Embedded 8を使ったGPIOを操作するアプリケーションの開発手順をご紹介したいと思います。

概要

デスクトップ開発環境を利用してGPIOを操作するJava ME Embedded 8のアプリケーションを作成します。
スイッチボタン(入力)とLED(出力)はGPIOで接続していて、作成したアプリケーションを実行すると、ボタンを押すたびにLEDの状態を変更します。

ハードウェア要件

利用したハードウェアは以下になります。

  • Raspberry Pi Model B Revision 2.0 (512 MB)
  • ブレッドボード
  • ブレッドボードワイヤ
  • プッシュボタン(モーメンタリ、4ピン推奨)
  • LED(2.2V 順電圧、20mA推奨)
  • 10KΩ抵抗(プッシュボタン用)
  • 560Ω抵抗(LED用)

事前準備

開発環境の構築です。詳細は以下の記事を参考にしてください。
本記事ではRaspberry Piは利用しませんが、あわせて構築しておくことをおすすめします。

GPIOを利用するJava ME Embeddedプロジェクトの作成

NetBeansを使用してプロジェクトを作成し、Windowsエミュレータを使用して、ローカルでテストします。

NetBeansでのJava ME Embeddedプロジェクトの作成

  1. NetBeansを起動し、ファイル > 新規プロジェクトを選択します。
  2. カテゴリJava ME EmbeddedプロジェクトJava ME Embeddedアプリケーションを選択し、次 >をクリックします。
  3. 新規Java ME Embeddedアプリケーションウィンドウで以下のように変更し、終了をクリックします。
    • プロジェクト名にTestGPIOと入力
    • デバイスはEmbeddedDevice1を選択
    • MIDletの作成にcom.example.GPIOIMletと入力

GPIOPinTestクラスの追加と実装

GPIOPinTestクラスは入力ピン(プッシュボタン)での変更をし、出力端子(LED)の状態を変更する

  1. com.exampleを右クリック、新規 > Javaクラスを選択します。
  2. クラス名GPIOPinTestと入力し、終了をクリックします。
  3. PinListenerインターフェースを実装するクラスを変更します。

    public class GPIOPinTest implements PinListener {

    }


  4. クラス内にボタン(入力)とLED(出力)で利用するGPIO端子のクラスフィールドを記入します。

      // Emulator Pin values
      private static final String LED1 = "LED 1";
      private static final int LED1_ID = 1;
      private static final int Button_Port = 0;
      private static final int Button_Pin = 0;
      private GPIOPin led1;
      private GPIOPin button1;

  5. startメソッドではボタンとLEDコンポーネントを初期化します。以下のメソッドをクラス内に記入します。

      public void start() throws IOException {
        // Open the LED pin (Output)
        led1 = (GPIOPin) DeviceManager.open(LED1_ID);
        // Config file for the button - trigger on a rising edge (from low to high)
        GPIOPinConfig config1 = new GPIOPinConfig(Button_Port, Button_Pin, GPIOPinConfig.DIR_INPUT_ONLY, DeviceConfig.DEFAULT, GPIOPinConfig.TRIGGER_BOTH_EDGES, false);

        // Open the BUTTON pin (Input)
        button1 = (GPIOPin) DeviceManager.open(config1);

        // Add this class as a pin listener to the buttons
        button1.setInputListener(this);

        // Turn the LED on, then off - this tests the LED
        led1.setValue(true);
        try {
          Thread.sleep(1000);
        } catch (InterruptedException ex) {
        }
        // Start the LED's off (false)
        led1.setValue(false);
      }

  6. stopメソッドではボタンとLEDリソースをクローズします。以下のメソッドをクラス内に記入します。

      public void stop() throws IOException {
        if (led1 != null) {
          led1.setValue(false);
          led1.close();
        }
        if (button1 != null) {
          button1.close();
        }
      }

  7. valueChangedメソッドは入力ピン(ボタン)の状態が変化したときに呼び出されます。以下のメソッドをクラス内に記入します。

      @Override
      public void valueChanged(PinEvent event) {
        GPIOPin pin = (GPIOPin) event.getDevice();

        // Simple one button = one LED
        try {
          if (pin == button1) {
            System.out.println("setting led1" );
            led1.setValue(!led1.getValue()); // Toggle the value of the led

          }
        } catch (IOException ex) {
          System.out.println("IOException: " + ex);
        }
      }

  8. Ctrl + Shift + Iを押し、必要なインポート文を追加します。

GPIOIMletクラスの実装

  1. GPIOIMletクラスに次のクラスフィールドを追加します。

      private GPIOPinTest pinTest;

  2. startAppメソッドはIMletが一時停止から起動中に状態が変化したときに呼び出されます。NetBeansが生成したstartAppメソッドを以下のコードに書き換えます。

      @Override
      public void startApp() {
        pinTest = new GPIOPinTest();
        try {
          pinTest.start();
        } catch (IOException ex) {
          System.out.println("IOException: " + ex);
          notifyDestroyed();
        }
      }

  3. NetBeansが生成したpauseAppメソッドを削除します。
  4. destroyAppメソッドはIMletが実行中または一時停止から破棄された状態に変化したときに呼び出されます。NetBeansが生成したdestroyAppメソッドを以下のコードに書き換えます。

      @Override
      public void destroyApp(boolean unconditional) {
        try {
          pinTest.stop();
        } catch (IOException ex) {
          System.out.println("IOException: " + ex);
        }
      }

  5. Ctrl + Shift + Iを押し、必要なインポート文を追加します。

API権限の設定

Device Access APIへのアクセスを必要とするアプリケーションでは、JADファイル内に適切な権限を設定する必要があります。 以下の手順で権限を付与します。

  1. TestGPIOプロジェクト上で右クリックし、プロパティを選択します。
  2. [プロジェクト・プロパティ]ウィンドウで、カテゴリからアプリケーション・ディスクリプタを選択し、API権限タブの追加をクリックします。
  3. [APIの権限の追加]ウィンドウで、以下の手順で権限の追加を行います。
    1. 権限プルダウンでjdk.dio.DeviceMgmtPermissionを選択
    2. 保護されたリソース名に*:*を入力
    3. 要求されたアクションにopenを入力
    4. OKをクリック
  4. 3.同様、以下の手順で権限の追加を行います。
    1. 権限プルダウンでjdk.dio.gpio.GPIOPinPermissionを選択
    2. 保護されたリソース名に*:*を入力
    3. 要求されたアクションにopenを入力
    4. OKをクリック
  5. 3.同様、以下の手順で権限の追加を行います。
    1. 権限プルダウンでjdk.dio.gpio.GPIOPortPermissionを選択
    2. 保護されたリソース名に*:*を入力
    3. 要求されたアクションにopenを入力
    4. OKをクリック
  6. OKをクリックします。

Windowsエミュレータ上での実行とテスト

  1. TestGPIOプロジェクトを右クリックし、実行を選択します。

    エミュレータが起動し、IMletが実行状態で表示されます。
  2. GPIOピンタブをクリックし、現在のピン状態のビューを開きます。
    LED 1BUTTON 1のオープンカラムが排他的となっていることを確認してください。

  3. 外部イベントの作成アイコンをクリックします。
  4. 外部イベントの作成画面のGPIOタブをクリックします。
  5. BUTTON 1をクリックします。(ボタンのラベルは、現在の状態を示していて、低はオフの状態を示しています。)

    ボタンのラベルが[高]に変わります。

    ボタンが[高]に変化したので、LED 1の値が[高]に変わります。

  6. 再びBUTTON 1をクリックすると、LED 1の値が[低]に変わります。

次回はエミュレータ上で動作したアプリケーションをRaspberry Pi上で動作させます。

火曜日 6 10, 2014

メモリの最適化について - Java SE Embedded 8

JavaはOSから見ると、1つのプロセスとして動作しますが、内部的には大きく分けて以下のような3つのメモリ領域が存在します。

HEAP: Javaアプリがインスタンスを生成すると、この領域にメモリが確保されます。

NON-HEAP: NON-HEAP領域は、JVMが実行の最適化のために使用する領域で、Code CacheとMetaspaceという2つの領域に分かれています。

Code Cache: 実行中にJITコンパイラにより変換されたマシン語を保持するための領域
Metaspace: HEAPにロードされたクラスに関するメタ情報等を保持する領域  

JavaVM内部で使用される領域: VMが実行時に内部的に使用する領域です。


メモリの構成と測定方法について

次に、メモリが実際にどのぐらい使われているかを計測する方法についてです。以下はそれぞれの領域と、メモリの状況を見る方法について表した図となります。



HEAPはJava Mission Controlを使って画面から確認することもできますし (下図参照)、 あるいはJava SE標準で提供されている下記のAPIをアプリから呼び出すことで実際の使用量を取得することが可能となっています。 Mission Controlを使うか、APIをご使用になるかは状況次第で使い分けていただければと思います。さてAPIですが、以下のようになります。

HEAPの最大値を取得できます。 VMの起動オプション"-Xmx"で指定した値の近似値となります。
java.lang.Runtime.maxMemory();

利用可能なHEAPの総量を示します。 基本的にはVMの起動オプション"-Xms"で 指定した値の近似値となり、 "-Xms"がない場合は、"-Xmx"の近似値となります。
java.lang.Runtime.totalMemory();

測定時点での使用可能なHEAPサイズの概算値を返します。
java.lang.Runtime.freeMemory();

またNON-HEAPの状況を見る場合ですが、 APIによる計測方法はなく、 Java Mission Controlを利用して行います。 以下は参考となりますが、Java Mission Controlの該当する画面をキャプチャしたものとなります。 タイプが"NON_HEAP"となっている箇所がNON-HEAPとなります。

最後に、 HEAPでもなくNON-HEAPでもない領域についてですが、 Java VM内部で使用する領域ということもあり、この部分だけを解析するツールは存在しません。 強いてやるとするならば、プロセス全体が使っているメモリの量を計測し、 そこからHEAP/NON-HEAPのサイズを差し引く。というやり方になるかと思います。 OSにより様々かとおもいますが、 Linuxを例にとると、procfsでJavaプロセスが使用中の全物理メモリのサイズ (VmHWM or VmRSS) を計測し、 そこからHEAP/NON-HEAPを引くことで概算値を取得することができるかと思います。


使用メモリを調節するためのオプション

さて、実際にJVMのメモリの使用量を調節するにあたり、 まずは大前提として実行環境に最適なJVMが選択されていることを確認してください。 最適なJVMというのは、

  1. 組み込みデバイス向けには、 Embedded版のJVMが使われていること。 特にEmbedded向けのOracle JVMは組み込み用CPUに内部の処理が最適化されていたり、無駄なクラスをロードしないよう配慮されています。 なので、同じCPUアーキテクチャでも組み込みとそれ以外の環境によって適切な選択を行ってください。
  2. Minimal/Client/Server版のJVMが適切に使い分けられていること。 これらはJVMの起動オプションによって選択可能です。(参考URL: http://docs.oracle.com/javase/8/embedded/develop-apps-platforms/embedded-jvms.htm#CHDCHECF
  3. 必要最小限のCompactプロファイルが選択されていること。(参考URL: http://docs.oracle.com/javase/8/embedded/develop-apps-platforms/compact-profiles.htm#CHDGIIGE

またJVMの起動オプションの内、 メモリに影響を与えるものを以下に示します。

  • -Xms: ヒープサイズの初期値。 初期値を指定すると、 メモリ確保をコミットしようとする傾向から、使用している物理メモリの値が若干高くなる可能性があります。
  • -Xmx: ヒープサイズの最大値。
  • -XX:ReservedCodeCacheSize: Code Cacheのサイズ指定。 注) JITオプションを使わない場合でもCode Cacheの領域が使用されるため、0にはできません。
  • -Xint: JITオプションを無効とし、 インタプリタで動作します。 JIT使用時に比べメモリの使用量が減りそうですが、 意外とメモリサイズは変わりません。
  • -Xss: スレッド毎のスタックサイズを指定します。 スタックサイズの総数はスレッド数にも依存するため、 スレッド数が大きい場合はメモリの低減効果が大きくなります。
  • -XX:CompileThreshold: JITコンパイラは同じコードが指定回数以上呼び出されると動作し始めますが、 その時の呼び出し回数のしきい値を設定します。 指定した値が大きくなれば、 コンパイルされる可能性が下がるため、 Code Cacheの使用量が減るため、NON-HEAP領域のサイズが減る可能性があります。

上記のオプションは、 アプリを動作させるための要件にも依るため、 一概にどれを使えば良いかを言うのは難しいのですが、 パフォーマンスとメモリのバランスを取りながら、 少しずつパラメータの調整を行ってください。


火曜日 6 03, 2014

jdepsでCompactプロファイルの依存関係を調べる

Java SE Embedded 8からCompactプロファイルが導入され、 デバイスのROMサイズに応じたプラットフォームの選択が可能となりました。 Compactプロファイルは、compact1, compact2, compact3の3つがあります。 またさらに全てのSEのAPIを含んだFull JREも利用可能となっており、 エンベデッド向けのJava SEとしては、全部で4つの選択肢があることになります。

そこで、自分のアプリケーションがどのプロファイルであれば動作可能なのかを知る方法として、jdepsというツールを使って調べる方法を紹介いたします。なお、jdepsはJDK 8から新規追加されたツールで、JDKの中に同梱されており($JAVA_HOME/bin/jdeps)、いつでも無償にて利用することが可能です。

以下にサンプルとして、jdepsでCompactプロファイルを確認する方法を示します。

---------------------------------------------------------------------------------------------------------------------

 > jdeps -P helloworld.jar           # パッケージ単位で依存関係を調べる場合

helloworld.jar -> /opt/jdk1.8.0_05/jre/lib/rt.jar (compact1)
   com.example (helloworld.jar)
      -> java.io                                            compact1
      -> java.lang                                        compact1
      -> java.util.logging                              compact1

---------------------------------------------------------------------------------------------------------------------

>jdeps -P -v helloworld.jar           # クラス単位で依存関係を調べる場合

com.example.HelloWorld                           -> java.io.PrintStream                             compact1
com.example.HelloWorld                           -> java.lang.Class                                   compact1
com.example.HelloWorld                           -> java.lang.InterruptedException           compact1
com.example.HelloWorld                           -> java.lang.Object                                  compact1
com.example.HelloWorld                           -> java.lang.OutOfMemoryError             compact1
com.example.HelloWorld                           -> java.lang.Runtime                               compact1
com.example.HelloWorld                           -> java.lang.String                                   compact1
com.example.HelloWorld                           -> java.lang.StringBuilder                        compact1
com.example.HelloWorld                           -> java.lang.System                                compact1
com.example.HelloWorld                           -> java.lang.Thread                                 compact1
com.example.HelloWorld                           -> java.lang.Throwable                            compact1
com.example.HelloWorld                           -> java.util.logging.Level                          compact1
com.example.HelloWorld                           -> java.util.logging.Logger                       compact1
---------------------------------------------------------------------------------------------------------------------

また、出力結果をファイルに出力する場合は、"-dotoutput"オプションに出力ディレクトリを指定することで、ファイルへの書き出しが可能となっています。 ちなみに出力ファイルのフォーマットはDOT言語の形式となっています。

参考URL:

1. jdeps

http://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html

2. Compactプロファイルについて

http://www.oracle.com/technetwork/java/embedded/resources/tech/compact-profiles-overview-2157132.html?ssSourceSiteId=otnjp

3. CompactプロファイルのFootprint

http://www.oracle.com/technetwork/java/embedded/resources/se-embeddocs/index.html#sysreqs

Java Mission Control for SE Embedded 8

今まで主にサーバ環境でのJavaの診断・監視目的で使われてきた、Java Mission Controlですが、Java SE 8 Embeddedからエンベデッド環境のJavaでも利用できるようになりました。Java Mission Controlを使うことにより、JVMやJavaアプリについての、 CPUやメモリの使用状況、 スレッドの状態、 詳細ログの取得等が、 グラフィカルなUIから簡単に行えるようになります。 エンベデッド環境でも使える機能自体は同じなのですが、若干注意する点があり、それを踏まえつつ以下に紹介させていただきます。(Java Mission Controlの一般的なことについては、ページ最下部のリンクを参照してください)

1. Java Mission Controlが利用可能な、 Javaエンベデッドプラットフォーム

 JMXコンソール(MBeanサーバー)

  → Java SE Embedded 8のCompact 3とFull JREでサポート(ただしMinimal版VMは未サポート)

 フライト・レコーダ

  → Java SE Embedded 8のFull JREのみサポート(ただしMinimal版VMは未サポート)

 ※ ちなみに現状、Java ME 8では利用することができません。

2. 監視対象となるJVMの起動方法

    2.1. JMXコンソール(MBeansサーバ)を使う場合

 >java -Dcom.sun.management.jmxremote=true
              -Dcom.sun.management.jmxremote.port=7091                # ポート番号の設定
              -Dcom.sun.management.jmxremote.authenticate=false   # 認証設定
              -Dcom.sun.management.jmxremote.ssl=false                  # SSL有無
              -jar appliation.jar

※ 監視対象デバイスにつながらない場合は、以下のJVM起動オプションを追加してみてください。

"-Djava.rmi.server.hostname=192.168.0.20"                     # 監視対象デバイスのIPアドレス/ホスト名

もしくはこちらのリンク(http://docs.oracle.com/javase/7/docs/technotes/guides/management/faq.html)の5に書かれている内容について調べて見てください。

    2.2. フライト・レコーダを使う場合

  JVMの起動オプションに以下を追加してください。

  "-XX:+UnlockCommercialFeatures -XX:+FlightRecorder"

3. Java Mission Controlの起動方法。 JDKに同梱されているjmcコマンドを起動します。

 >$JAVA_HOME/bin/jmc

4. Java Mission ControlからJVMへの接続方法

 Java Mission Controlの「ファイル」→「接続」→「新規接続の作成」を開き、以下を設定してください。

- 監視対象となるデバイスのIPアドレス・ポート番号を設定します。ポート番号はJVMの起動オプションで指定したものを使います。

- 必要に応じて認証情報(ユーザ名・パスワード)を指定してください。

- 接続名は任意のものでOKです。

設定が終わったら接続のテストを行い、問題がなければ設定画面を閉じてください。接続が完了していれば、自動的に監視対象となるJavaプロセスがJava Mission Controlに表示されます。



参考URL)

http://www.oracle.com/technetwork/jp/java/javaseproducts/mission-control/index.html

http://www.oracle.com/technetwork/jp/java/javaseproducts-old/mission-control/java-mission-control-wp-2008279-ja.pdf

http://www.oracle.com/technetwork/java/embedded/resources/tech/java-flight-rec-on-java-se-emb-8-2158734.html

木曜日 12 26, 2013

Java ME Embedded 8を使ったM2Mアプリケーション開発 (3/3)

Java ME Embedded 8を使ったM2Mアプリケーション開発(2/3)の続きです。今回はRaspberry PiとNetBeansを使って、リモートデバッグを行う方法をご紹介します。NetBeansでステップ実行しながら、Raspberry Pi上で動くJavaアプリの様子をみることが可能となります。 ホストPCにはNetBeans 8.0, Java ME SDK 8, Java ME SDK 8 Plugins for NetBeans 8がインストールされており、Raspberry PiにはJava ME Embedded 8がインストールされていることが前提となります。 詳細は(1/3)(2/3)を参照してください。

1. Raspberry Piにログインして、Java ME Embedded 8のbinディレクトリ以下の、usertest.shを起動します。

>sudo ./usertest.sh

2. Java ME SDK 8のデバイスマネージャにRaspberry Piを登録します。

デバイスマネージャの起動は、Java ME SDK 8がインストールされたWindows PCにておこないます。 ”SDKのインストールフォルダ”\bin\device-manager.exeをダブルクリックすると下記の画面が表示されます。

 Windowsのタスクバーからもデバイスマネージャを開くことも可能です。

デバイスマネージャの追加ボタンからRaspberry PiのIPアドレスを登録すれば終わりです。

3. NetBeansでリモートデバッグを行うための設定を行います。

1. Java ME Embedded 8を使ったM2Mアプリケーション開発 (1/3)で作成したサンプルアプリ(ネットワークのデモ (MEEP))のプロジェクトを右クリックし、プロパティ画面を開きます。

2. カテゴリプラットフォームを選択し、以下のように設定を行ってください。

    Java MEプラットフォーム: Oracle Java (TM) Platform Micro edition SDK 8.0

    デバイス: EmbeddedExternalDevice1 


3. ソースコードの任意の場所にブレークポイントを設定し、プロジェクトのデバッグを行います。デバッグ実行はCtrl + F5もしくは、デバッグメニューより開始することができます。デバッグ実行を開始すると、Raspberry Piにアプリが自動的にインストールされ、通常のデスクトップでのデバッグと同じ感覚で開発を行うことが可能になります。

 こちら→http://docs.oracle.com/javame/8.0/get-started-rpi/debugging.htm#BABCIJHAにも詳細を記載していますので、ご参照ください。

Java ME Embedded 8を使ったM2Mアプリケーション開発 (2/3)

Java ME Embedded 8を使ったM2Mアプリケーション開発 (1/3)で作成したサンプルアプリを、Raspberry Pi(Model B)上で動かす手順をご紹介したいと思います。

Raspberry Piのセットアップ

手順はこちらを参照 → Raspberry Pi で JavaFX - かんたん3ステップ

PuTTY(ターミナルエミュレータ)のダウンロード

PuTTYはコマンドラインを使ってアプリのインストール等(詳細は後述)をホストPCから行う場合に使います。またscpやsftpでRaspberry Piにファイルを転送する場合にも使うことが可能です。

ダウンロードはこちら → http://www.putty.org/

Java ME Embedded 8のダウンロード

ダウンロードリンクhttp://www.oracle.com/technetwork/java/embedded/downloads/javame/index.htmlから、oracle-jmee-8-0-rr-raspberrypi-linux-bin.zipというファイルがダウンロードされますが、解凍すると以下のディレクトが含まれています。

  •  /appdb - Javaプラットフォームが内部で使用するためのディレクトリです。
  •  /bin - Javaの実行ファイルや設定ファイル等が格納されています。
  •  /legal - Legal関連の文書が格納されています。
  •  /lib - Raspberry Pi上でアプリ(IMlets)をコンパイルする時に使用されます。
  • /util - ホストPC(Windows)のコンソールからリモートデバッグを行う際に使用します。

Raspberry PiへJava ME Embedded 8を転送

上記でダウンロードしたファイル(oracle-jmee-8-0-rr-raspberrypi-linux-bin.zip)をRaspberry Piに転送します。転送はsftpもしくはscpで行います。Windowsの場合PuTTYを使って送信することも可能です。ターミナルでRaspberry Piにログインし、転送したファイルをお好みの場所へ展開後、appdbとbinディレクトリのアクセス権を変更します。

>chmod -R 755 appdb bin

HTTP Proxyの設定(オプション)

もしアプリがRaspberry PiからHTTP接続を行い、proxyサーバを必要とする場合、bin/jwc_properties.iniファイルにproxyサーバの情報を登録します。

com.sun.midp.io.http.proxy.host = proxy.mycompany.com
com.sun.midp.io.http.proxy.port = 80

Raspberry Piへサンプルアプリを転送

Java ME Embedded 8を使ったM2Mアプリケーション開発(1/3)で開発したサンプルアプリ(NetworkDemo.jar)をPuTTY等を使って、Raspberry Piへ転送します。NetworkDemo.jarはNetBeansのプロジェクトフォルダの下のdistフォルダ以下に保存されています。ここでは、転送したJarファイルをJava ME Embedded 8のbinディレクトリの下にコピーします。

アプリの起動 

コマンドラインを使った起動 

ターミナルエミュレータからRaspberry Piに入り、Java ME Embedded 8のbinディレクトリまで移動します。binディレクトリには下記のシェルが含まれています。コマンドのサンプルもその下に書いておきます。


listMidlets.sh [SUITE_ID or NAME]     --- インストール済みのアプリとステータス等を表示します。
installMidlet.sh <URL> [<URL label>] --- アプリをインストールします。JARファイルを引数に指定します。
removeMidlet.sh <SUITE_ID>             --- インストール済みのアプリをアンインストールします。
sudo runSuite.sh <SUITE_ID or NAME> [IMLET_ID or classname] --- 指定されたアプリを起動します。アプリの起動後は標準出力へLogが出力されます。


インストール

pi@raspberrypi ~/pi/bin $ sudo ./installMidlet.sh NetworkDemo.jar

Java is starting. Press Ctrl+C to exit

The suite was successfully installed, ID: 2

インストールが成功すると、上記の”The suite was successfully installed”が表示され、IDが自動的に割り当てられます。IDはコンソールに表示されるメッセージにて確認することが出来ます。

注)インストール時に、下記のメッセージが 表示されることがあります。これはホストPC上にインストールされたデバイスマネージャ(Java ME SDK 8の一部です)に、デバイスが登録されていない場合に表示されるメッセージです。 動作上問題はありませんが、デバイスマネージャにRaspberry Piを登録することにより、メッセージは表示されなくなります。

[ERROR][AMS] iso=1:SEnding the notification: com.oracle.midp.proxy.InstallCommand@7114ea81. FAILED,proxy is disconnected

起動

pi@raspberrypi ~/pi/bin $sudo ./runStuite.sh 2

引数には、アプリの名称もしくは、インストール時に割り当てられたIDを指定します。また起動後のアプリのログ等は標準出力へ表示されます。アプリを終了する場合はCtrl + Cで行ってください。

アンインストール

pi@raspberrypi ~/pi/bin $ ./removeMidlet.sh 2

引数には、インストール時に割り当てられたIDを指定します。 

インストール済みアプリの確認

pi@raspberrypi ~/pi/bin $ ./listMidlets.sh

Java is starting. Press Ctrl-C to exit

Suite: 2

    Name: NetworkDemo

    Version: 1.0

    Vendor: Oracle

    MIDlets:

        Socket Demo: socket.SocketMidlet


今回は、 いち早くRaspberry Pi上にてアプリを動作させる方法について記載を行いました。元文書 → http://docs.oracle.com/javame/8.0/get-started-rpi/debugging.htm#BABCIJHAを見ていただくと、WindowsのホストPCからコマンドラインでアプリを起動させる方法も紹介しております(Starting the Developer Agent Program on the Desktopの章)。 必要に応じて、上記リンクをご参照いただければと思います。


Java ME Embedded 8を使ったM2Mアプリケーション開発 (1/3)

Java ME Embedded 8を使ったM2Mアプリケーションの開発手順をご紹介したいと思います。今回は、NetBeans 8.0を使い、エミュレータ上で簡単なサンプルアプリを動作するところまで行いたいと思います。

また、Java ME Embedded 8は、センサーデバイスや通信モジュール等の小型デバイスをターゲットとしたJavaの実行環境で、従来のもの(Java ME Embedded 3.x)と比較すると以下の特徴を備えており、開発効率がさらに上がっています。

  • 言語仕様がJava SE Embedded 8と同期しており、APIもSE 8のサブセット版を実装していることから、SEとのソースコードの共有化が可能
  • New IO, コレクションフレームワーク等、SEで利用されている便利なAPIを追加
  • モバイル通信系のAPIの拡張。また従来通りGPIO, I2C等の低レベルH/WアクセスAPIも実装


開発用PCへのJava SEのインストール

開発用PCはWindows 7を想定しています。また開発用PCにはJava SE 7もしくは8の最新版をインストールしてください。

Java ME SDK 8のインストール

下記のリンクからJava ME SDK 8をダウンロードします。ダウンロードした.exeファイルをダブルクリックし、インストールを行います。インストール先は任意の場所を選んでください。

http://www.oracle.com/technetwork/java/javame/javamobile/download/sdk/index.html

NetBeans 8.0のインストール

こちら → https://netbeans.org/downloads/から、 ”JavaSE/EE/すべて”のいずれかをダウンロードしてください。

またインストール手順はこちらです。 → https://netbeans.org/community/releases/80/install_ja.html

Java ME SDK 8 Plugins for NetBeans 8のインストール

1. NetBeans向けのPluginを下記のリンクからダウンロードし、任意の場所で解凍します。

http://www.oracle.com/technetwork/java/javame/javamobile/download/sdk/index.html

2. NetBeansを起動し、ツール -> プラグインメニューを開きます。

3. 古いバージョンのPluginがインストールされている場合はアンインストールを行います。 新規インストールの場合はスキップしてください。 以下はアンインストール手順となります。 

  • インストール済タブの詳細の表示にチェックを入れ、インストール済みPluginの一覧を表示します。
  • Java ME SDK ToolsJava ME SDK Demosがあれば、チェックを入れ、アンインストールボタンをクリックします。アンインストール後はNetBeansを再起動してください。

4. NetBeans再起動後、ツール -> プラグインメニューを開き、ダウンロード済タブを開きます。

5.  プラグインの追加ボタンを選択し、1でダウンロードしたPluginを解凍したフォルダを参照します。.nbmファイルをすべて選択し、開くボタンを押します。

6. ダウンロード済タブを開くと、 ダウンロードしたPlugin一覧が表示されるので、 それらをすべて選択した後、インストールボタンを押します。

7. Pluginのインストールが開始されます。 ライセンス契約条件に同意し、インストールを完了させてください。インストール完了後は、NetBeansを再起動します。

8. 再びツール -> プラグインメニューを開き、インストール済タブを開きます。Java MEがインストールされており、アクティブとなっていればインストールが正常にできています。

Java ME Embedded 8の開発用プラットフォームのインストール

1. NetBeansを起動し、ツール -> Javaプラットフォームを選択します。

2. プラットフォームの追加ボタンを押下します。

3. Javaプラットフォームの追加画面が開くので、Java ME CLDCプラットフォーム・エミュレータを選び、次>ボタンを押下します。

4. プラットフォームを検索するディレクトリを選択してください画面にて、上記手順の”Java ME SDK 8のインストール"で行った、SDKのインストールディレクトリを選択します。

5. ME SDK 8のプラットフォームが正常に選択されたことを確認し次 >ボタンをクリックし、プラットフォームが問題なく検出できれば、終了ボタンを押して追加を終了します。

サンプルアプリの起動

上記に引き続いて、 新規プロジェクトを作成しサンプルアプリを作ります。

1.  ファイル -> 新規プロジェクトを選ぶと、新規プロジェクトの作成ダイアログが表示されます。カテゴリからサンプル -> Java ME SDK 8.0を選択し、ネットワークのデモ (MEEP)を選んだ後、次>ボタンを押してください。

2. プロジェクト名とプロジェクトの場所を任意に設定し、終了ボタンを押してください。

3. プロジェクトが新規に作成されるので、プロジェクトを選択し、右クリックメニューから、消去してビルドを行った後、同じく右クリックメニューから、プロジェクトを実行してください。

4.  アプリが正常起動すると、エミュレータが自動起動し、アプリが起動できていることが確認できます。


5. NetBeansの出力画面では、アプリが標準出力へ出力した以下のメッセージが表示されます。

Waiting for connection on port 5000

上記のように、Java ME Embeddedのアプリケーションはデバイスが無くても、エミュレータにより簡単に開発ができることがご理解いただけたかと思います。さらに詳しい情報は以下をご参照下さい。

http://docs.oracle.com/javame/8.0/javame-dev-tool.htm

Java ME Embedded 3.4 for Qualcom IOE


9月末に行われたJavaOne 2013でJava ME 8 Early Access版が公開されました。
Java ME 8の正式版のリリースは来年初旬に予定されておりますが、我々は引き続きJava ME Embedded 3.xシリーズのアップデートも行います。

今回はJava ME Embeddedの最新バージョン、Java ME Embedded 3.4のご紹介です。

Java ME Embedded 3.4はバージョン3.3をベースにしておりますが、Qualcomm IOE("Internet Of Everything";) developer platformをサポートしております。

Qualcomm IOE developer platform:
・QSC6270T processor with 64 MB DDR RAM and 128 MB NAND Flash
・Tri-band UMTS/HSDPA + quad-band GSM, SIM slot
・2.4 GHz WiFi a/b/g/n
・GPS
・Supported I/O: SPI, I2C, GPIO, ADC, UART, SD card, on-board accelerometer, light + temp sensor

さらにQualcomm IOE platformとPCをUSBでつないで開発、デバッグできるようJava ME SDKのアップデートも行いました。


このリリースにより、Java ME EmbeddedはQualcommのエコシステムを支えることができるようになり、また組み込みJavaの未来へ大きく前進する機会となるでしょう。


Java ME Embedded 3.4とJava ME SDK 3.4は開発・評価用に無料でOTNからダウンロードすることができます。

水曜日 10 16, 2013

DIY(Do-It-Yourself)タブレットのDukePad

9月にサンフランシスコで行われたJavaOne2013では一際大きな話題を呼びました DukePad についてご紹介します。

DukePad-Front-Home-Screen-W

Raspberry PiとJava SE Embedded 8をベースとした自作可能なタブレットで、作り方なんかはこちらから見ることができます。ひととおり揃えたとしても $370 で作ることができるそうです。

現状はデモ品質だと書いてありますが、OSGiベースのJavaFXデスクトップ環境で、アイコンをクリックすればJavaFXで作られたアプリが起動することができ、これからが本当に楽しみですね。

参考URL:https://wiki.openjdk.java.net/display/OpenJFX/DukePad

金曜日 9 20, 2013

ハードフロートABI対応版 Java SE Embedded 7

組み込み向けのJava SEの最新版 Java SE Embedded 7 update 40が発表されました。

http://www.oracle.com/technetwork/java/javase/emb7u40-relnotes-2004166.html

今までのARM/Linux向けのJava実行環境バイナリでは、浮動小数点ABI がソフト(arm-sflt, arm-vfp-sflt)のみに対応していましたが、本アップデートにより、ハード(arm-vfp-hflt)にも対応しています。

水曜日 7 03, 2013

リコーMFPにJava SEを搭載

オラクルの顧客事例サイトに、株式会社リコー様のデジタル複合機(MFP)へのJava SE搭載事例が掲載されました(PDF版はこちら)。2003年からJava MEを採用頂いていましたが、2011年よりJava SEを搭載しています。この事例サイトでは、Java採用に至る背景や、Java MEからSEへの移行の経緯などが紹介されています。

株式会社リコー様
リコー、MFPを中核とした「オフィスの生産性向上」と「ワークスタイル変革」の提供を目指し、プリントエンジンを制御するコントローラにJava SE を搭載
株式会社リコーは、事業の中核となる画像&ソリューション事業において、MFPのプリントエンジンを制御するためのコントローラに、Java Platform, Standard Edition(Java SE)を搭載。顧客の課題解決やニーズに合わせた画像機器およびソリューションを提供することで、オフィスの生産性向上やワークスタイルの変革に貢献することを目指している。

水曜日 6 12, 2013

楽天が東光電気製ゲートウェイでデマンドレスポンス推進

2013年5月27日に、楽天株式会社様が、Java SE Embeddedを搭載した東光電気製ゲートウェイSTiNC IIを活用し、OpenADR準拠のデマンドレスポンスを推進すると発表しています。管理・制御ソフトウェアには、米国Wireless Glue Networks社のOpenADR対応Javaアプリケーションが使用されます。プレスリリースについては以下をご覧下さい。

プレスリリース「楽天、グローバルエンジニアリングと協業し、九州電力管内でOpenADR標準対応のデマンドレスポンスを推進—東光電気、米WGN社による新たなシステムを採用

東光電気様のSTiNC IIは、Java SE Embeddedを採用したARM Coretex-A8搭載Linuxゲートウェイ装置で、1-Wire (MicroLAN)やRS-485などの本体端子で直接センサー類に接続し、標準搭載のJavaアプリケーションでエネルギー管理が行なえます。

火曜日 6 04, 2013

オムロンのPLCにJava SEを採用

オラクルマガジンVol.16 2013年5月号の国内最新導入事例に、オムロン株式会社様の事例が掲載されました。産業用制御機器であるPLC (Programmable Logic Controller)にJava SEが採用されています。

オムロン株式会社様
最新FAコントローラの開発プラットフォームにJavaを採用
シンプル・確実・高速にデータベースと接続
オムロン株式会社(以下、オムロン)の事業の1つ、制御機器、およびファクトリーオートメーション(FA)システム事業を運営するインダストリアルオートメーションビジネスカンパニーは、FA用コントローラからセンサー、スイッチ、リレー、セーフティ機器まで、10万仕様を超える製品を提供。制御機器の分野において約40%という国内トップシェアを誇っている。さらなる競争優位性向上を目指して同カンパニーは、Sysmacマシンオートメーションコントローラ「NJシリーズ」のデータベース接続プラットフォームとして「Java Platform, Standard Edition(Java SE)」を採用した。

金曜日 5 31, 2013

Java Day Tokyo 2013

[2013年5月31日更新] 2013年5月14日(火)秋葉原UDXにてJava Day Tokyo 2013が開催されました。Java Embeddedのセッションもいくつかあり、展示コーナーではJava搭載のデバイスやデモを紹介しました。

OTNのページに当日のセッション資料と動画(一部を除く)が公開されています。Java Embeddedに関連するセッションを紹介します。

[L-1] 基調講演
Java Embeddedの開発責任者Nandini Ramaniらが、Java Embeddedを含む最新情報を紹介しました。

[B-2] Internet of ThingsにおけるJava: Small, Smart, Connected (Java ME Embedded)
Java MagazineのEmbedded特集号(第9号)のメイン特集で熱く語っているTerrence Barr (シニアテクノロジスト&製品マネージャー)が、Internet of Things (モノのインターネット)時代にJavaがいかに重要か、M2Mを支えるD2Dビジョンの紹介と、スマートデバイスに最適なJava ME Embedded (CLDCベースの新製品)について、Angela Caicedo(テクノロジスト エバンジェリスト)と共にデモを交えながら紹介しました。

[B-1] Raspberry Pi NightHacking (Java SE / JavaFXを楽しもう)
JavaFXで有名なStephen Chin(Javaテクノロジー アンバサダー)が、NetBeansとSceneBuilderを使ってJavaFXアプリケーションを作成し、安価なARMデバイスRaspberry Piで実行するデモを行ないました。後半にはAngela Caicedo(テクノロジスト エバンジェリスト)がLCDやセンサーを接続したRaspberry Piで奥行きのある3Dデモを紹介しました。

[C-3] Device to Data Centerを実現するJava Embedded Suite
D2Dの中でデバイスとデータセンターの中継の役割を果たすゲートウェイに最適な、Java SE、Java DB、GlassFish (Embedded版)を統合した新製品Java Embedded Suite、およびそのオプション製品である、リアルタイムにイベント処理を行なうOracle Event Processing (OEP) Embedded版(3月末にダウンロード公開開始)について紹介しました。このセッションの動画はありませんが、WebLogic Channelのレポート記事をご覧下さい。

[A-4] タブレット用のJavaFXアプリケーション開発
Jim Weaverが、MicrosoftのタブレットデバイスSurface Proを使い、JavaFXのマルチタッチ機能を使ったプログラミングについて紹介しました。


Java Embeddedデモ展示コーナー

水曜日 4 17, 2013

Java Magazine日本版第9号(組み込みJava特集号)

Java Magazine日本版第9号が公開されています。この号は組み込みJavaの特集号なので、組み込みJavaに関する記事がたくさん掲載されています。

第9号の記事タイトルは次の通りです。

  • 組込みコンピューティングの時代
  • 組込み型アプリケーションでJavaを使う10の理由
  • Javaと25ドル・ボードの融合
  • マネーの未来
  • Webサービスのセキュリティ入門
  • invokedynamicの神秘を解く
  • Java 8のJavaコンパイラ・プラグイン
  • セキュアなJava EE認証
  • WebアプリケーションおよびJavaクライアント・アプリケーションとソーシャル・メディアとの統合
  • IMS Services API—JSR 281入門
  • モバイルへの転換
  • Akkaフレームワークを使用したアクターベースのシステムの構築
  • 組込みに関する問題に挑戦
目次から各記事を読むこともできますし、全章をまとめてダウンロードすることもできます。
About

日本オラクルのエンベデッドJavaチームから、最新情報をお送りしていきます。

Search

Archives
« 3月 2015
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    
       
Today