「Android」端末で「ビーコン」を受信

小さいエリアでの通信や端末同士の位置情報を利用したサービスに興味がある。
Androidの開発環境を用意したのでAndroid端末のBLEを利用した「ビーコン」について調べた。

BLEを利用した「ビーコン」は、Bluetooth機器のペアリング時使用していた、アドバタイジングパケットを利用した発信機なイメージ。
その信号をひろって「ビーコン」のIDや信号の強さなどの情報から位置情報サービスに利用するのだろうと思っている。

BLEを利用した「ビーコン」には、Appleの「iBeacon」とGoogleの「Eddystone」があるらしい。
今回は情報が多そうな「iBeacon」を対象とする。

1.テスト用のアプリのインストール

自分で書いたコードが正しく「iBeacon」の受発信を行えているかをテストするためアプリとして以下のものを使用させてもらった。

2.ビーコンライブラリの登録

サンプルコードが豊富なビーコンライブラリの「AltBeacon」を使用する。
ライブラリの登録は「プロジェクトの構造」画面で行う。

「Android Studio」を起動し、プロジェクト、「プロジェクトの構造」>「app」>「依存関係」タブの「+」ボタンを押下するとプロジェクトへライブラリの登録する画面が表示される。
「altbeacon」と入力して検索ボタンを押下すると「org.altbeacon:android-beacon-library」がヒットするので選択し登録する。

「プロジェクトの構造」
ライブラリの登録

build.gradleファイルのdependenciesに次の行が追加されていることを確認。

3.BLE関連のPermissionの追加

BLEデバイスにアクセスできるように「app/src/main/AndroidManifest.xml」に次のような設定を追記。

4.「Android」端末側の設定

Bluetoothにアプリケーションがアクセスできるようにするため「Android」端末側の設定が要るようだ。まず、Bluetoothを有効にする。

一度アプリケーションをデプロイした後に、
「設定」>「端末管理」>「アプリケーション」>[デプロイしたアプリケーション]をタップする。「アプリ情報」の「許可」をタップすると「位置情報」の許可設定ができるようになっているので有効にする。(※)

※この許可をしていないと下のようなメッセージが出力されBluetoothにアクセスできない。

5.ビーコン受信のJavaコード

6.実行

上記のコード実行しiOS版の「Beacon入門」から「ビーコンの発信」を行うと以下のようなログが出力された。
動作しているようだ。

次は発信(送信)を試そう。

「Android」端末で「Hello World」2

androidアプリを作りたい。
まずはお約束の「Hello World」を出力するまでのメモのその2。
実機の実行とデバッグについて触れる。

5.実機「Android」端末(Fujitsu Arrows M03)で実行する

まず、IDEを使ったデプロイ・デバッグができるように「Android」端末を開発者モードに切り替える。

「Android」端末の「アプリ一覧」画面から、「設定」>「端末管理」>「端末情報」と選び、「ビルド番号」を数回タップ。「これでデベロッパーになりました!」とメッセージが出力されたら「端末管理」に「開発者向けオプション」が表示されるようになる。

「アプリ一覧」画面
「設定」画面
「端末情報」画面
※「開発者向けオプション」は当初表示されない
「端末情報」画面
ビルド番号を数回タップ後に表示されるメッセージ

「開発者向けオプション」画面で「OFF」から「ON」に切り替え、「USBデバッグ」にチェックを入れる。

「開発者向けオプション」画面

PCとAndroid端末をUSBでつなげるとUSBデバッグの許可を求めてくるので「OK」を押下する。

IDE(Android Studio)に戻り、再び「ツールバー」から「実行」ボタンを押すと「デプロイ対象の選択」画面に実機(FUJITSU ArrowsM03)が選択可能になった。

「デプロイ対象の選択」画面
「FUJITSU ArrowsM03」で実行
6.デバッグモードで起動しブレーク(停止)させる

ブレークポイントの置き方は他のIDEなどと同じ。ソースコードエディタの行番号の右隣をクリックすれば赤丸が表示され、その行でブレークできるようになる。

デバッグモードでデプロイ・起動するボタンはツールバーの「デバッグ」ボタン。

「デバッグ」ボタン
デバッグブレーク

起動中のプロセスにアタッチしてデバッグしたい場合は、「Andoroidプロセスへデバッガー接続」ボタンを押下する。
「プロセスの選択」画面でアタッチするプロセスを選択する。

「Andoroid
プロセスへデバッガー接続」
ボタン
「プロセスの選択」画面

これで開発する準備ができた。

「Android」端末で「Hello World」1

Androidアプリを作りたい。
まずはお約束の「Hello World」を出力するまでのメモのその1。
エミュレータで「Hello World」を出力するまで起動するまで。

事前準備として次のものを用意した。
  • 開発機:Windows 10
  • スマホ:Android 6.0.1 (Fujitsu Arrows M03)
1.「Android Studio」をセットアップ

AndoridのIDEを「Android Studio」をセットアップする。
developer.android.comからインストーラ(.exe形式)のファイルをダウンロードし、インストールを実行した。
「Android Studio」にはOpenJDKが同梱されているのでOracleJDKを別にインストール必要はないようだ。
「次へ」を連打してインストール終了。

developer.android.com
android studioのダウンロードページ
2.「Andorid Studioプロジェクト」を作成する

インストール直後に起動される「Android Studioへようこそ」画面で「新規Android Studioプロジェクトの開始」を選択。

「Android Studioへようこそ」画面

「Android プロジェクトの作成」画面で、適当な「アプリケーション名」「会社ドメイン」「プロジェクトのロケーション」を設定する。

  • アプリケーション名は、アプリケーションパッケージ名として使われるようだ。
  • 会社ドメインは、ルートパッケージ名として使われるようだ。
  • プロジェクトのロケーションは、ソースを配置する任意のディレクトリをセットする。
「Android プロジェクトの作成」画面

「ターゲット Android デバイス」画面で、「スマホおよびタブレット」にチェック、「API23: Android 6.0(Marshmallow)」を選択する。

「ターゲット Android デバイス」画面

「次へ」を押下するとプロジェクトが作成された。

プロジェクト作成後の画面
3.プロジェクト作成後の画面でエラーが出力された。

プロジェクトの作成後、Gradleが実行されるようだが、イベントログに下記のエラーが出力された。

このプロジェクトが使用するJDKのパスの設定が正しくないようだ。メニューの「プロジェクト」>「SDKローケーション」>「JDKロケーション」で「埋め込みJDKを使用する」にチェックを入れると同期(ビルド)が正常に行われた。

「プロジェクトの構造」画面

4.エミュレータ(AVD:Android Virtual Device)で実行する

作成された直後のプロジェクト(未だコードを加えていない)をとりあえず実行するために「Android Studio」に付属するエミュレーターを使用する。

エミュレータを管理するツール「AVDマネージャー」は、ツールバーの「AVDマネージャー」ボタンをクリックすると起動する。

ツールバー
「AVDマネージャー」ボタン

「仮想デバイス」画面で「仮想デバイスの作成」ボタンを押下。

「仮想デバイス」画面

「ハードウェアの選択」画面では、一昔前のデバイスをということで「Nexus 6」を選択した。

「ハードウェアの選択」画面

「システム・イメージ」画面では、プロジェクト作成で指定したAPIレベルと同じ「Marshmallow(APIレベル:23,Android 6.0)」を選択した。

「システム・イメージ」画面

「Android仮想デバイス(AVD)」画面では、デフォルトの設定をそのまま使用する。「完了」を押下すると設定したデバイスのエミュレータが登録され使用できるようになる。

「Android仮想デバイス(AVD)」画面

「ツールバー」の「実行」ボタンを押下するとアプリケーションのデプロイ先を選択できる「デプロイ対象の選択」画面が起動する。
作成した仮想デバイスを選択するとアプリケーションがデプロイされ起動した。

「実行」ボタン
「デプロイ対象の選択」画面

仮想デバイスで次のようにアプリケーション起動した。

仮想デバイス

うん?なにもコード書いていないのに「Hello World」と表示されている?(笑)もう少し手を加えよう。

「その2」続きます。

SpringBootでNeo4jを組み込む

アプリケーションにDBを組み込めると、テスト時やアプリケーションの構成を単純にしたいときにうれしいです。

SpringBootアプリケーションでSQLなDBを使用する場合、DBにH2を選べば特に設定しなくても組み込みで使用できます。便利ですね。同様にNeo4jを組み込みで使用ようとした時に少々手間取ったので、その方法をメモとしてここに残します。

■ 基本的なコード

プロジェクトのひな型は「SPRING INITIALIZR」で簡単に作成できます。また、「SpringData Neo4j」の「クイックスタートページ」に分かりやすいサンプルコードがあります。ただし、Neo4jサーバに接続するコードになっています。次のコードの「uri」の部分です。

■ 組み込みで使用する場合の「uri」について

「SpringData Neo4j」の「リファレンスマニュアルの組み込みドライバ設定方法」をみると、この「uri」の部分を下記のように「file」にすると良いようです。

※1 Windows環境の場合、URI(Path)の表記が「file:///ドライブ名:/」という形になります。「file://c:/tmp」というような、「/」が一つ足りない記述をすると下記のような例外が発生します。 気をつけてください。(→自分)

※2 「uri」を省略するとJVMのシャットダウン時に削除される一時ファイルを利用した使い捨てデータストアとして使用できます。

■ 依存ライブラリの追加

「SPRING INITIALIZR」で生成したプロジェクトは、組み込みで使用する想定をしていません。依存ライブラリが足りずに下記のような例外が発生します。

次のような依存を一行だけ追記するとNeo4j本体とドライバーライブラリが組み込まれます。(gradleの場合)

※SpringBoot、Neo4j本体、ドライバなどのバージョンの組み合わせは、「バージョンテーブル」を参照してください。正しい組み合わせでない場合、動作しないことがありました。

■ まとめ

SpringBootアプリケーションで組み込みでNeo4jを使いたい場合、次の設定をします。

  1. Configurationの「uri」に「file://」を設定。もしくは、uriを設定しない。
  2. 依存ライブラリにNeo4j本体と組み込みドライバーライブラリを追加する。

以上です。

「Spring Boot」で「Hello world」

みんな大好きSpringBootを使って「Hello world」。

■1.開発ツールのダウンロード

下記のページからSpring謹製のIDE「Spring Tool Suite」(以下STS)をダウンロードしました。

https://spring.io/tools/sts/all

落としたファイルは、7zipなどのイケている解凍ツールで解凍してください。
パスが深いファイルは、うまく解凍できないツールがあるようなのです。

■2.開発ツールの起動

解凍先の「sts-bundle/sts-x.x.xRELEASE/STS.exe」を実行して、開発ツールを起動します。
sts-dir

こんなツールが起動します。はい、Eclipseです。
sts

■3.「Gradle」プラグインを追加インストール。

みなさん(誰?w)がmavenから移行しているのにならって、私も「Gradle」をインストールしてみました。(Gradle。良い解説書を探してます。)

ゾウさんが好きです。Buildshipを使うことにします。
メニューを以下のように選択してインストールしました。
「Help」->「Eclipse Marketplace」->Findに「Gradle」を入力し検索->「Buildship Integration 1.0」
インストール後、STSを再起動するとプラグインが有効化されます。
sts-marketplace0sts-marketplace1

■4.「SpringBoot」プロジェクト生成ウィザード

STSには超簡単に「SpringBoot」のプロジェクトを作成するツールが用意されています。超便利です。あちょー。

①次のメニューから起動します。

「File」->「New」->「Spring Starter Project」
sts-new-project-0

②STEP1 プロジェクトの基本構成

「Type:」が「maven」になっていたら、「Gradle(Buidship)」に変更してください。他はそのままで大丈夫だと思います。「Next」を押下します。(各項目の意味はいつか探求しますん)
sts-new-project-1

②STEP2 使用するモジュールの選択

ブラウザで「Hello world!」したいので、Web->Vaadinを選択します。

Vaadinは「Java-based Web Framework」(だそう)です。
「javaさえ知っていれば、Html5とかJSを知らなくてもでリッチUIブラウザアプリが作れますよー」という素晴らしいフレームワーク(らしいっす)。Wicketとかと同じ路線ですかね…(いや、むしろWeb版Swing?)
SPA(JS)+REST勢が優位なわが社においてなぜ今・・・。(ФωФ)フフフ・・・。
sts-new-project-2

③STEP3 完了

最後のステップは、何もせずそのまま「Finish」を押下します。
sts-new-project-3

■5.「Hello world!」コードを記述

生成されたプロジェクトを開き、「src/main/java」の「com.example」パッケージに下記のクラスを追加しました。むぅ。Javaですねー。

■6.実行

上記のクラスができたら、実行してみます。
「com.example.DemoApplication.java」を選択し、
コンテキストメニュー(右クリックメニュー)の「Run As」->「Spring Boot App」を選択すると実行できました。(埋め込みTomcatが起動します)
sts-hello-run

■7.ブラウザでアクセス

ブラウザで次のURLにアクセスしてください。
「http://localhost:8080/index.html」
ボタンを押下すると「Hello Workd!」と表示されれば成功です。
sts-run-b

■8.まとめ

「STS+SpringBoot」を使ってコードをほとんど書かず「Hello world!」できましたー。