Java Socket Server〜ラズパイで動くサーバーを作る4: javaサーバー2〜

今回はJavaサーバーの設計に着手します。
MicrobitとラズパイのBluetooth接続ができることは確認したので、その次にMicrobitのBluetoothボタンサービスから送信されるデータを受け取ることを考えます。

Bluetoothサービス調査

ラズパイとMicrobitを接続した時には、blutoothctlコマンドで接続しました。なので、JavaからBluetoothに接続したいと思いますので、そこらへんの調査をします。
Googleで「java bluetooth api」などと検索するとオラクルのページを見つけることができました。
やっぱり英語なので、翻訳機能で日本語にして読みます。が大雑把な概要(イメージ)歯科理解できず。。。
仕方ないので他に探します。

ちょっとアプローチを変えて

調べてみると接続して、通信するにはSDPというプロトコルを使用する様です。
上記のリンクをまとめると、ラズパイでSDPサーバーを起動してMIcrobitからの通信を受信するためのアプリケーションを起動、待機させておくということをやった様です。

プロトコルとは

余談ですが、プロトコルという言葉について記載しておきます。プロトコルは送信側と受信側「この様にデータを投げるし、受け取るよ?」というルールを決めたものなので作ればいくらでも存在するものです。有名なものしか耳に入ってこないので、それしかないというわけではありませんということを記載しておきたかった次第です。
具体的には「http」とか「ftp」などのURLの頭につくもののことです。

SDPプロトコル

参考URL:
シリアル通信のQA

結局のところはMicrobitからシリアル通信を行います、具体的には以下の様なケースが考えられます。

  1. ボタンを押下した時に文字をシリアル通信
  2. 温度をシリアル通信
  3. そのほかのセンサーなどをシリアル通信

こんな感じでデータをラズパイに送信します。

これらを実現するためにはとりあえず、ラズパイでMicrobitからの通信を受信するためのサーバーが必要です。
上の参考URLではSDPサーバーを立ち上げて動かしている様でした。

JavaサーバーSDP

もしかしたらSDPを使用しなくても良いのかもしれません。
現状、持っている情報から行くとSDPでMicrobitからデータが送信されてくるという認識なのでSDPを使用しようとしています。がここも調査が必要です。
今回はJavaでBluetooth通信をしたいのでここについて詳しく調べます。
Java Bluetooth APIを使用するのも手段の1つです。というかこれを使用します。

JSR 82

これがJavaでBluetoothを使用するときの仕様(JSR 82)になる様です。
とりあえずは、必要なライブラリをインストール(ダウンロード)します。つまりPOMファイルの出番です。
POMファイルはXMLに必要な情報を記述して「ビルド!」ってやるとMavenリポジトリから対象のライブラリをダウンロードしてくれる優れものです。
ここのリンクにある内容をPOMファイルに追記します。
このページに追記する内容がそのまま書いてあります。

ここの<!-- http://XXXXXXX -->とある部分はリポジトリのURLになります。なので手順は以下の様になります。

  1. 青色で囲っている部分をコピー
  2. POMファイルを開き<dependncies>で囲まれている部分にペースト

最終的に以下の様になりました。

  <repositories>
    <repository>
      <name>jsr82</name>
     <id>microemu-extensions</id> <url>https://mvnrepository.com/artifact/org.microemu/microemu-jsr-82</url>
    </repository>
  </repositories>
 ・
   ・
   ・

nameは適当につけました。。。。
これを作成したら、Eclipseのプロジェクトを右クリック→Maven→Maven installをクリックすると下の様にインストールされました。

次回は、このライブラリを使用してみます。

でわでわ。。。



Java Socket Server〜ラズパイで動くサーバーを作る3: javaサーバー〜

今回は、Javaで作るAPサーバーを作り始めます。
ちなみに、APサーバーというのは画面を表示しないサーバーのことだと思ってくれればOKです。

現状

前回までにやった事は以下になります。

ここまでで、ラズパイに作成したソースをGit hubにアップしておけばあとはラズパイで起動できるようになりました。

目的の確認

今度は、核になるサーバーを作ります。確認のため全体の処理フローを以下に示します。

雑な絵ですが、つまるところは

  1. マイクロビットから何かしらのメッセージをラズパイに送る
  2. ラズパイで受けたメッセージからMidiメッセージを生成
  3. 生成したメッセージをラズパイに接続したMidi音源に送信

この様な形で、マイクロビットをコントローラーにした、Midiプレーヤーを作ろうと考えてます。イメージは下の様な感じです。

![](http://zenryokuservice.com/wp/wp-content/uploads/2019/10/スクリーンショット-2019-10-08-20.19.29-300x200.png)

Javaサーバー

今回作成するものは、上記の「2」にある様に、ラズパイで起動して、メッセージの受信と送信を行うものにします。

リクエストとレスポンス

余談ではありますが、今回作成するものは受信と送信を行うのですが、この仕組みは身近にあるものなので記載しておきます。

ホームページ開くのと同じ

余りに身近になったこのテクノロジーは、TCP/IPなどと呼ばれるネットワーク技術をベースにしています。送受信するメッセージがhttpメッセージです。

httpリクエストの例

httpの詳細には触れませんが、大雑把に、リクエストとレスポンスがありサーバーへ送信するメッセージをリクエスト、サーバーが返すメッセージをレスポンスと呼びます。

スマホで検索したページを開く時
  1. スマホを開いてブラウザアプリを起動します
  2. http://www.google.co.jpにアクセスします。
  3. この時にスマホから上のURLへGETリクエストを送信
  4. レスポンスとして、スマホで見ているHTML(であろう)ファイルをダウンロード
  5. ブラウザで表示

というような手順を踏みます。

これと同じ様にJavaサーバーも動く
  1. マイクロビットからBluetooth経由でhttpでないがメッセージ(データ)を送信
  2. ラズパイのJavaサーバーがそのデータを受け取る
  3. 何かしらの処理をしてMidi音源にUSB経由でMidiメッセージを送信
  4. Midi音源が鳴る

こんな風に動かそうと思いこの計画を立てました。

JavaServerの仕様

全体の流れとしては上記の通りです。これを実現するために、どーしたら良いか?考えます。

前提

  1. マイクロビットは、シリアルデータ通信を行う事が出来る事を確認済み

今後は、以下の事を確かめていきます

  1. ラズパイでマイクロビットとBluetooth通信を行う為のペアリングが出来る事を確認
  2. ラズパイからUSBでMidi音源にMidiメッセージを送信出来る事を確認

この部分は、後々に確かめようと思います。

理由

  1. 早くJavaサーバーを作り、ラズパイで動かしたいから
  2. もし前提が通らなくても、他の事に使えるので、作り損はない

こんな感じです。

プログラム設計

お待ちかね、プログラム設計です。今回はJavaのSocketを使用したサーバーを作ります。ソケットは昔からある低レベAPIで、送信データの内容全てをコントロール出来ます。逆に言うと全部自分で作る…という事です。

[ソケットの扱い](https://docs.oracle.com/javase/jp/8/docs/api/java/net/Socket.html)に関しては次回以降やります。

でわでわ…

## 関連ページ
1. [Javaで通信処理を行う](https://zenryokuservice.com/wp/2019/07/20/java-socket-%e3%80%9c%e6%a5%b5%e5%b0%8f%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%a7%e9%80%9a%e4%bf%a1%e3%81%ae%e5%9f%ba%e6%9c%ac%e3%82%92%e5%ad%a6%e3%81%b6%e3%80%9c/)
2. [極小サーバーを作る](https://zenryokuservice.com/wp/2018/09/14/java-network-socket%e3%80%9c%e6%a5%b5%e5%b0%8f%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%80%9c/)




Java Socket Server 〜ラズパイで動かすサーバーを作る2: mavenでjarファイル出力〜

Mavenビルドをかけると下の様なエラーが出ました。

解決方法に関して、結局のところはマニフェストファイルを作成してビルドし直すというところです。

できた方法

  1. pom.xmlファイルにプラグインを追加する
    「maven-dependency-plugin」
    「maven-assembly-plugin」
  2. ビルドする。ゴールはとりあえずで、「install」を設定して起動した。
  3. 出力したXXXX-jar-with-dependenciesを実行する

こんな感じでできました。
ちなみに、実行するコマンドは下のものです。
java 対象のjarファイル.jar ./対象のファイルまでのパス/出力した.jar という形でコマンドを叩きます。
自分の叩いたものはこちらです。
java -jar ./target/socket.server-0.0.1-SNAPSHOT-jar-with-dependencies.jar

下のものは調べたけどうまくいかなかったので、一応の形で記載しています。でも、初めからjar-with-dependenciesのついているjarファイルを実行していれば問題なかったかも?

マフェストファイルを出力する方法

作成したプロジェクトをMaven化するなどしてMavenプロジェクトを作成します。

そして、プロジェクトを右クリックしてエクスポート(Export)をクリックします。そうすると下の様なダイヤログが見れます。

ここで、Java/Jar Fileを選択します。
そして出力するプロジェクトを選択します。

下のものはそのまま次へ

次のところで、出力するマニフェストファイル名を指定します。

そして、出力した結果が以下になります。

packageコマンドを実行する場合

色々と調べてみましたが、「コマンドを実行したほうが早い」ということになり、以下のコマンドを実行します。
ターミナル(コマンドプロンプト)を開き、プロジェクトのディレクトリまで移動します。
そして、「mvn package」と入力します。

でわでわ。。。



Java Socket Server 〜ラズパイで動かすサーバーを作る1〜

今回からは、ラズパイで動かすサーバーを作ろうと思います。
作成するサーバーはMicrobit→ラズパイ→Midi音源で使用できる様に作成します。目的は「フリーハンドで音源を鳴らす仕組み」を作ることです。
早い話が、「マイクロビットから音源を鳴らしたい」ということです。

サーバーの用途

JavaのSocket Serverはマイクロビットからメッセージを受けてラズパイでMIDIメッセージを作成し、音源に送信するという形で使用します。

仕様について

  1. Javaサーバーでメッセージを受ける
  2. 受けたメッセージにより複数パターンのMIDIメッセージを作る
  3. 作成したMIDIメッセージをMIDI音源へ送信する

接続方法

マイクロビット ー ラズパイ
これは、Bluetoothで接続してメッセージを送受信する想定です。
ラズパイ ー MIDI音源
これはラズパイとMIDI音源をMIDIインターフェースで接続してメッセージの送信を行う想定です。

どうやって実現するか?

マイクロビットからメッセージを送信するのは問題なくいけそうです。このリンクを見て、シリアルデータの送信ができる様なのです、というか前に試しました
なので、マイクロビット〜という部分は後回しにします。

まずは、Java Serverを作る

ここに至ります。Java Serverがこの仕組み(システム)の中核になるのでここから作成して行きます。
<起動する環境>
ラズパイ状で起動するので、コンパイル(ビルド)はラズパイ上でやる必要があります。なので以下の様な処理手順を踏みます。

  1. ラズパイでGithubにアップロードしたJavaファイルをダウンロード(PULL)してビルドする仕組みを作ってしまいます。
  2. Mavenを使用します。これのプラグインでJARファイルを出力する様に設定します。
  3. PC上で作成したJavaServerをGitにアップロード(PUSH)します。
  4. ラズパイを起動した時に、Githubからプルしてビルドをする様に起動スクリプトを作成します。
  5. そして、Java Serverを起動してマイクロビットからのメッセージを待機

Java Socket Server

サーバーと聞いて皆さんは何を想像するでしょうか?
サーバーはパソコンのことではなくアプリケーションのことです。入力を待機しているアプリケーションのことをサーバーと呼びます。
というわけで、マイクロビットからのメッセージを待機するサーバーを作るということで入力がマイクロビットから送られてくるもの(データ)なのでシリアルデータ(バイト配列)になります。マイクロビットのブロックコードではラジオカテゴリの中にあります。
そして、MIDIデータを作成し送信するというのがこのサーバーの役目になります。

まとめる

  1. ラズパイ上でJavaServerが起動する
  2. マイクロビットからシリアルデータが送信される
  3. シリアルデータを読み取り、MIDIメッセージを作成
  4. ラズパイに接続したMIDI音源にMIDIを送信する

こんな感じで動くものを作成するためにJavaで極小サーバーを作成します。低レベルAPIのSocketを使用するので処理内容などは自由自在に作ることができます。
逆に高レベルAPIの場合は中身はいじれないけど、決まった形の処理は簡単に作ることができます。

高レベルAPIと低レベルAPI

高レベルは人間に近く、低レベルは機械に近いという意味です。人間に近いということは、細かい処理などがひとまとまりになっています。
例えば、「DBサーバーにアクセスする」というのを1行実現することができる。この様なAPIは高レベルです。
逆に、「DBサーバーにアクセスするためにDBコネクションを取得するためのネットワークを検索する」という処理を行うAPIは低レベルなAPIです。
あくまで「Application Programing Interface」なのでjavaでいうなら「そのクラスは高レベルか?、低レベルか?」という違いでしかありません。話をするのに伝えやすいのでこのことを記載しました。

とりあえずSocket Serverを作る

今回は、少し長くなってしまったので次回作成します。
イントロダクション的なことを記載しました。

でわでわ。。。



Microbit 工作〜ソフトシンセを鳴らす1〜

Microbitを使用して、iPadなどのiOS系のデバイスからMIDIデータ送信による、音楽再生ツールを作成しようと考えています。

Micribit工作

マイクロビットでどのようにやるかというと・・・
シンプルに、MIDIデータを送信しループしてデータを送信し続けるというものです。これが作れたら、iPadを使って簡単な伴奏をiPadにやらせて、自分はアドリブの練習をしようと考えています。

設計

仕様としては、Aボタン押下により伴奏を行う時のキー(ハ長調とかイ長調など)を選択します。#(シャープ)とかb(フラット)は面倒なので、キーは以下のものにしようと考えています。

C(ハ長調), D(ニ長調), E, F, G, A, B

以上の7つを考えています。

ちょっと妄想

月曜日〜日曜までと考えてCから始まりBで一週間を終わるようなイメージ、毎日キーを変えて同じ練習してもいいし、例えば、Cメジャー(ハ長調)キーの伴奏に合わせて、Am(イ短調)のスケールを合わせても良いし。。。うーん楽しそうだ!

楽しむために

ちょいと頑張ってみようか?ってかMicrobitはブロックコードでいろんなことができるので、実装はそんなに大変でないと思います。間違いなく前回作成したDBからカテゴリ情報を取得してくるよりは楽です。。。なぜかというとJSとPHPは癖が強く、「〜の場合は〜のやり方」でないと動かない時が結構あり。。。じゃPHPとか使うなよ!と怒られそうですが、他に手がなく。。。
PHPとかJSは、なんだかんだ言って付き合っている悪友のような。。。そんな感じです(笑)
ちなみに今、記載しているブログもPHPを使用しているWordPressを使用しています。

Microbitを始める

参考にするページはこちらです。下のようなページです。

学校などでプログラミング教育を行なっているようです。以前アメリカのどこだか忘れたけど、音楽に合わせて踊るなど(教育チャンネルでやっているようなもの)でプログラムの動きと体の動きを同じようにして「〜したらどうなる?」みたいなことをしているのを日本とアメリカでテレビ電話しながら互いのやっていることを動画にて共有することをやっている所のに参加したことがあります。
まさにグローバル!はっきり言って何を言っているのかわからなかった(笑)
英語の勉強も大切ですね。。。

当たり前な話ですが、Microbitは購入する必要があります。これは値段的には¥2,500くらいです。

なので、手軽に購入ができます。これを使用して世界的に「プログラミング教育」を行なっていますが、自分の思うところはScratchでも良いと思います。実際にプログラムを作って、動かす時にPC上で動かすのではなくIot的に使用するというのなら間違いなくMicrobitだと思います。
「とりあえずやってみるかな?」というのならScratchで十分だと思います。

Microbit買いました。

自分は、買ってしまった方なのですが、買ってよかったと思っています。
実際のところ、Scratchだとできることに限界があり、画面上(ブラウザ上)で何かをするというものです。
WebBluetoothを使用してPCからBluetooth接続というもの悪くないと思います。
しかし、手を動かして「Microbitを手に持って振ってみる」とかそういう物理的な動きでアプリケーションを動かそうとするのならMicribitでないとできません。というか面倒なことになります。

Microbitの良いところ

下の動画のように、電気が繋がらなくなってもの手回し発電機で動かすことができます。

そして、C++での実装も可能です。これにはMakeCodeというウェブサイトから実行することができます。
ここでは、C++コードを使用できます。
ブロックから一気に飛びすぎでは?と思ってしまいますが、マイコンボードであるMicrobitでは当然な話です。

通常のPCのようにメモリが多いわけでないので最小限のプログラムで作成する必要があります。
いづれにしろ、アイディアが鍵を握りますので、趣味としてもとても魅力的だと思います。

でわでわ。。。

関連ページ

  1. microbitからwebserverまでの旅
  2. Microbitで遊ぶ〜シリアル通信をする〜
  3. Microbitで遊ぶ〜ボタンを押す〜
  4. Microbitで遊んでみる
  5. MicrobitでHttpリクエストを飛ばすためのメモ