Bluetooth受信サーバーを作る〜 MicrobitからのBluetooth通信: JavaME(SDK)インストール〜

ラズパイ(RPi)でMicrobitからのBluetooth経由でのデータ(ボタン押下、メッセージなど)を受信するために、以下の準備をします。

Javaサーバーを立ててモニョモニョやろうと考えているのですが。。。具体的には、MIDIメッセージをMIDI音源に送信して音を鳴らす。ということ考えています。

イメージとしてはこんな感じです。

Bluetooth通信

MIcrobitからのBluetooth通信を行うのには、リンク先のサイトを参考にしてみるとBluetoothサービスを使用してやるようです。

そして、問題のJavaサーバー側を実装しようと思い色々と調べていたら。。。

Mavenを使おう(失敗)

上のような考えに至りました。理由は以下の通りです。

使用できるAPIをMaven(Gladleなど)でインストールして実行したほうが早い

そして、以下のライブラリをダウンロード(POM使用)します。
詳細に関してはこちらのリンクを参照してください。POMファイルにコピペできます。

  1. blueCove
  2. javax.microedition: midpの方はビルドエラー

調べてみると、2の方はJavaMEのライブラリのようでした。
つまりは、JavaMEで開発しましょうという事になりました(笑)

JavaME

調べてみると、開発するOSに依存するようです。(まぁそうなるよなぁ。。。)なので開発するのにはライブラリなどまとまったものをインストールするほうが楽だろうという判断に至りました。

調べた結果

色々調べて見たらMacOSでやる場合は、自分の描いているようにPCで開発、テスト、実機へデプロイと言うのができないようです。。。。
J2ME開発をやるならばWindowsで。。。と言うとこ炉に至りました。

以下は調べて見た結果です。

NetBeensで環境構築はWindowsのみ

以下は失敗した記事です。結局はNetBeensを使用してやるのが良いとなりました。

なので、以下の環境で開発する方向でやる事にします。

  1. Exlipseのプラグインを使用する
  2. PC(Mac)上で作成したものをラズパイにインストールする、もしくはソースをラズパイでPULLしてコンパイル、実行ファイル作成

上のような方法で開発する方向で行こうと思います。
なので、以下の手順で行います。

  1. ここのページからEclipseプラグイン(JavaME SDK)をダウンロード
  2. Eclipseにプラグインを追加する

Macの場合はEclipseでやらないほうが良い

サポートされているのがv3.0までのようで。。。
そんなわけで以前使っていたIntelliJ IDEAを使用してやろうと思います。
しかし、調査が先になります。
とりあえずMac版をダウンロードします。

そして、オープンソースな方を選びます。

そして、APPストア以外のインストールなので、ファインダーから開き、右クリック(controlボタンを押しながら)して開きます。
最終的にはこんな感じでJ2MEのプラグインをインストールしました。



以下失敗したものです

理解するまでに時間がかかりましたが。。。
どうやら上のプラグイン(SDK)をインストールする事で、Mavenのエラーを解消できたみたいです。なので下のような実装をしてもビルドエラーが出なくなりました。

import java.io.IOException;

import javax.bluetooth.L2CAPConnection;
import javax.bluetooth.L2CAPConnectionNotifier;
import javax.microedition.io.Connector;

/**
 * BluetoothAPIを使用して実装する。
 * @author takunoji
 * 
 * 2019/10/06
 */
public class Main {
    public static void main(String[] args) {
        try {
            L2CAPConnectionNotifier server = (L2CAPConnectionNotifier)
            Connector.open("btl2cap://localhost:3B9FA89520078C303355AAA694238F08;name=L2CAP Server1");
            L2CAPConnection cliCon = (L2CAPConnection)server.acceptAndOpen();
        } catch (IOException e) {
            /* Handle the failure to setup a connection. */
        }
    }
}

参考にしたものはJSR82のソースの入ったZIPファイルをダウンロードした時に付いていたPDFにあるソースです。
そして、プラグイン(SDK)をインストールした時に名前が一致しなかったので、インストールしたものを下に記載しておきます。

まとめ

今までやったことを整理して、まとめます。
正しい作業フローは以下のようになります。

  1. プラグイン(SDK)をEclipseにインストールする
  2. MavenでBluetoothAPI(BlueCove, javax.microeditionなど)をインストールする(POMファイル使用)

作成したPOMファイルは以下のようなものができました。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>zenryokuservice</groupId>
  <artifactId>socket.server</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
      <java.version>1.8</java.version>
      <maven.compiler.target>${java.version}</maven.compiler.target>
      <maven.compiler.source>${java.version}</maven.compiler.source>
  </properties>  

  <repositories>
    <repository>
      <id>microedition</id>
      <name>microedition</name>
      <url> https://mvnrepository.com/artifact/javax.microedition/midp</url>
    </repository>
    <repository>
      <id>microemu-extensions</id>
      <name>jsr82</name>
      <url>https://mvnrepository.com/artifact/org.microemu/microemu-jsr-82</url>
    </repository>
    <repository>
      <id>bluecove</id>
      <name>bluecove</name>
      <url>https://mvnrepository.com/artifact/net.sf.bluecove/bluecove</url>
    </repository>
  </repositories>

  <dependencies>
    <dependency>
        <groupId>org.microemu</groupId>
        <artifactId>microemu-jsr-82</artifactId>
        <version>2.0.4</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>net.sf.bluecove</groupId>
      <artifactId>bluecove</artifactId>
      <version>2.1.0</version>
    </dependency>
  </dependencies>
  <build>
   <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <mainClass>zenryokuservice.socket.server.SocketServerBasic</mainClass>
            <classpathPrefix>dependency-jars/</classpathPrefix>
          </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
      </configuration>
      <executions>
        <execution>
          <id>make-assembly</id> <!-- this is used for inheritance merges -->
          <phase>package</phase> <!-- bind to the packaging phase -->
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.5.1</version>
      <executions>
        <execution>
          <id>copy-dependencies</id>
          <phase>package</phase>
          <goals>
          <goal>copy-dependencies</goal>
          </goals>
          <configuration>
           <outputDirectory>
             ${project.build.directory}/dependency-jars/
           </outputDirectory>
          </configuration>
         </execution>
       </executions>
     </plugin>
   </plugins>
  </build>
</project>