« WindowsでのボリュームのUUID取得方法 | トップページ | Raspberry Piからの語りかけ、リクエストボディの違い »

2020年9月27日 (日)

restlet serverを立ち上げる

今から6年程前に結構一生懸命になってデモ用のRestletサーバーを構成したことがある。その頃のことを思い出して、久々にRestletサーバーを試してみた。目的はRaspberry Piの話し相手の作成。

環境は以下のとおり:
Centos 7.8
Java 1.8.0
Restlet 2.4.3

Step-1
Javaのインストール
# yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

Step-2
Restletのインストール
以下からzipをダウンロードする。
https://restlet.talend.com/downloads/current/
展開先は$HOME/workにした。

Step-3
環境変数の設定
Homeの.bash_profileに以下を設定する
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$HOME/work/restlet-jse-2.4.3/lib/org.restlet.jar:$home/work
なお、Class編集を含むコーディング環境は$home/workとしている。
備忘録として、、、上記環境変数の即時有効化には以下のコマンドを実行。
source ./.bash_profile

Step-4
コードの作成
作ったJAVAコードは以下の3つ:
ServerMain.java:Port8010でServerを立ち上げ、Dispatcherを呼ぶ
ServerDispatcher.java:コマンドに従ってFunctionを呼ぶ(この時点ではDataInpuのみを呼び出している)
DataInput.java:Dispatcherに呼び出されるFunction(中身はこの時点では空)

以下がソースコード。昔のコードを引っ張りだして今時点で不要な部分はざっくりとそぎ落としてあるけれどもimportはそのままなので、余分なライブラリがImportされているかも(だろう)。

ServerMain.java

import org.restlet.Component;
import org.restlet.data.Protocol;
import org.restlet.resource.ServerResource;

public class ServerMain extends ServerResource{
public static void main(String[] argsthrows Exception {
    // Create a new Component.
    Component component = new Component();

    // Add a new HTTP server listening on port 8010.
    component.getServers().add(Protocol.HTTP8010);

    // Attach the sample application.
    component.getDefaultHost().attach("/command",
            new ServerDispatcher());

    // Start the component.
    component.start();
   }

ServerDispatcher.java

import org.restlet.Application;
import org.restlet.Restlet;
import org.restlet.routing.Router;

public class ServerDispatcher extends Application {

    /**
     * Creates a root Restlet that will receive all incoming calls.
     */
    @Override
    public synchronized Restlet createInboundRoot() {
        // Create a router Restlet that routes each call to a new instance
        Router router = new Router(getContext());

        // Defines only one route
        router.attach("/datain/{keyword}"DataInput.class);
  
        return router;
    }
}

DataIn.java

import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
import org.restlet.Restlet;
import org.restlet.Client;
import org.restlet.Context;
import org.restlet.Request;
import org.restlet.Response;
import org.restlet.data.MediaType;

 /**
 * Resource which has only one representation.
 * 
 */
public class DataInput extends ServerResource {

    public static int count;
            
    @Get
    public String represent() {

        String str = getReference().getPath();
        System.out.println( str );
        int index = str.indexOf("/datain/");
        index += "/datain/".length();
        String indata =  str.substring(index);
        System.out.println("input :" + indata );

    return "return from datain";

    }
}

 

それぞれのJavaコードをコンパイルしてClassファイル化しておく。
以下、ServerMainの実行。クライアントからのコマンドの実行結果(19:58:07)が出力されている。インプットデータはtestと表示している。

# java ServerMain
Starting the internal [HTTP/1.1] server on port 8010
Starting ServerDispatcher application
/command/datain/test
input :test
2020-09-27 19:58:07 192.168.1.8 - - 8010 GET /command/datain/test - 200 18 0 56 http://192.168.1.62:8010 curl/7.55.1 -

上記出力をさせた、実際にクライアントから実行したコマンドは以下。testをパラメータとして渡している。

>curl http://192.168.1.62:8010/command/datain/test
return from datain
>

これで基本形が出来たことになる(と言うか昔のコードを復活したことになる)。

次のステップはRaspberry Piからコマンド(多分温度計の値)を送ってみたいと思う。
で、今日はここまで。

 

« WindowsでのボリュームのUUID取得方法 | トップページ | Raspberry Piからの語りかけ、リクエストボディの違い »

ソフトウエア導入」カテゴリの記事

ラズパイ日記」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« WindowsでのボリュームのUUID取得方法 | トップページ | Raspberry Piからの語りかけ、リクエストボディの違い »