X

An Oracle blog about Java Embedded, Japan

Devie I/OをJava SEで利用してシリアル通信 - BLEビーコンの利用

Device I/O APIを利用してJava SE上でシリアル通信を行う方法を紹介します。

Java Day 2016のキーノートのデモでは、ドローンに搭載したゲートウェイでBLEのビーコンを利用して受信した温度/湿度センサーのデータをシリアル通信で取得しました。

ここではその方法を説明します。

ハードウェア環境は、

ソフトウェア環境は、

を利用します。

まずDevice I/Oのバイナリを生成します。

Atmark Techno社から開発キットをダウンロードしてセットアップしてください。開発キットATDEの入手およびセットアップ方法はこちらを参照してください。

次にJava SE 8のJDK(32ビットLinux/x86版)をダウンロードして、セットアップしたATDE内で展開します。

最後にこちらを参考にしてDevice I/Oのソースコードを入手して、ATDE内に展開してビルドしてください。 ビルドが成功するとbuild/deviceio/lib配下に以下のファイルが生成されます。

  • ext/dio.jar
  • arm/libdio.so

これでJava SE 8でDevice I/Oを利用する環境が整いました。

実際に利用できるか試してみましょう。

まずは次のようなUARTを利用するサンプルコードUARTServer.javaをコンパイルしてUARTServer.classを作成します。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.channels.Channels;
import java.util.logging.Level;
import java.util.logging.Logger;
import javaday.db.Sensor;
import jdk.dio.DeviceConfig;
import jdk.dio.DeviceDescriptor;
import jdk.dio.DeviceManager;
import jdk.dio.uart.UART;
import jdk.dio.uart.UARTConfig;

public class UARTServer {

    private UART uart = null;

    private Thread launcher = null;
    private boolean running = false;

    public UARTServer() {

        UARTConfig config = new UARTConfig("ttyACM0",
            DeviceConfig.DEFAULT,
            115200,
            UARTConfig.DATABITS_8,
            UARTConfig.PARITY_NONE,
            UARTConfig.STOPBITS_1,
            UARTConfig.FLOWCONTROL_NONE);

        launcher = new Thread() {

            public void run() {
                try {
                    uart = (UART)DeviceManager.open(config);
                    InputStream is = Channels.newInputStream(uart);
                    StringBuffer buffer = new StringBuffer();

                    while (running) {

                        char result = (char)is.read();

                        if((result == '\n') || (result == '\r')) {
                            if(buffer != null) {
                                System.out.println(buffer.toString());
                                System.out.println("Buffer Length: " + buffer.toString().length());

                            }

                            buffer = null;
                        } else {
                            if(buffer == null)
                                buffer = new StringBuffer();
                            buffer.append(result);
                        }

                    }

                } catch (IOException ex) {
                    Logger.getLogger(UARTServer.class.getName()).log(Level.SEVERE, null, ex);
                } catch (Exception ex) {
                    Logger.getLogger(UARTServer.class.getName()).log(Level.SEVERE, null, ex);
                } finally {
                    closeUART();

                }
            }

        }

    }

    private void start() {
        running = true;
        launcher.start();
    }

    private void stop() {
        running = false;
    }

    private void closeUART() {
        try {
            if (uart != null) {
                uart.close();
            }
        } catch (Exception ex) {
            Logger.getLogger(UARTServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) {
        UARTServer server = new UARTServer();
        server.start();
    }

}

次にプロパティファイルdio.propertiesを以下の内容で用意します。

100 = deviceType: uart.UART, controllerName:ttyACM0, name:ttyACM0, baudRate:115200, dataBits:8, parity:0, stopBits:1, flowControl:0, predefined:true

uart.UART = baudRate:115200, parity:0, dataBits:8, stopBits:1, flowControl:0, predefined:true

またポリシファイルjava.policyを以下の内容で用意します。

grant codeBase "file:${{java.ext.dirs}}/*" {
        permission java.security.AllPermission;
};
grant {
        permission java.security.AllPermission;
};

これですべての準備が整いました。作成したdio.jar, libdio.so, UARTServer.class, java.policy, dio.propertiesをゲートウェイの任意のディレクトリにすべてコピーし、Cypress社のSDKに含まれるBLEデータのレシーバであるBLE-USB Bridge and Debug BoardをゲートウェイのUSBに接続し、センサーを近くに置いて、

    % sudo java -Djava.security.policy=./java.policy -cp ./dio.jar -Djava.library.path=. -Djdk.dio.registry=./dio.properties UARTServer

と実行してください。

ターミナル上に取得したセンサーのデータが表示されます。


Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.