PythonでM-Searchサーバー&クライアント

皆さんこんにちはRcatです。
今回はESP32の記事で紹介したMSearchのPython側の解説です。
ESP32の時は検索にしか使用しませんでしたが、今回はPython側がサーバーになることも考えています。
それでは早速内容へ


M-Searchって何

以下の記事でも紹介していますが、簡単に言えばネットワーク上の機器を検索するためのものです。
例えばワンクリックでポート開放をできるソフトとかありますが、どうやってルーターに話しかけてると思いますか?
この時に使っているのがMサーチです。
つまり、自分が何かのサーバーを立ち上げたとして、それにアクセスするために、クライアントはIPアドレスを指定しなければなりませんが、Mサーチを使えばワンクリックで接続することができるようになるわけです。

使い方(サーバー)

まずはサーバーとしての使い方を説明していきます。
サーバー開設の流れは以下のようになっています。まずはこちらのコードをご確認ください。
なお、サーバーはLinuxのコードです。Pythonなので大差ないですが。

$ python3
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import M_search as ms
>>> m = ms.MSearch_Rcat()
>>> m.Server_addService("urn:rcat999:service:rcat-msearch:1")
>>> m.Server_addService("urn:rcat999:service:neko:1","192.168.0.100:25565")
>>> m.Server()
M-SEARCHサーバー起動
サービス一覧
urn:rcat999:service:rcat-msearch:1 / 192.168.0.4
urn:rcat999:service:neko:1 / 192.168.0.100:25565
応答します
  • import M_search
    Rcat自作のモジュールをインポートします
    自作のモジュールなのでカレントディレクトリに配置して、ファイル名から拡張子を抜いた状態でインポートします。

  • ms.MSearch_Rcat()
    モジュールの中のクラスをインスタンスします。
    このクラスがサーバーにもクライアントにもなります。

  • m.Server_addService("サービス名","ロケーション")
    サーバーのセットアップを行います。
    ここからがサーバーの場合の手順になります。
    この登録は複数行うことができます。複数を行える理由としては、同じサーバー内でいくつもの自作サービスを共存させることを考えた場合、そのMサーチサーバーは1つにまとめるべきだからです。
    具体的には以下のことを行います。

    • サービス名の登録
      どのサービス名で検索されたら応答するかを設定します。
      サービス名は自由ですが、フォーマットには則っておいた方がいいかもしれません。フォーマットは次の通りです。
      urn:"ベンダーID":service:"サービス名":"バージョン"

    • ロケーションの登録
      サービスが検索された際に応答する文字列です。
      今回は機器のIPアドレスを返すことが目的なので、IPアドレスを登録できます。また、省略した場合はサーバーを実行している端末のIPアドレスが自動的に代入されます。

  • m.Server()
    サーバーを起動します。
    これを実行すると受信待機に入りプロントが戻ってこなくなります。

使い方(クライアント)

次にクライアントの使い方です。こちらはいたってシンプルです

>py
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import M_search as ms
>>> m = ms.MSearch_Rcat()
>>> m.Search("urn:rcat999:service:rcat-msearch:1")
'HTTP/1.1 200 OK\n\nLocation: 192.168.0.4\n\nST: urn:rcat999:service:rcat-msearch:1\n\n'
>>> m.Search("urn:rcat999:service:neko:1")
'HTTP/1.1 200 OK\n\nLocation: 192.168.0.100:25565\n\nST: urn:rcat999:service:neko:1\n\n'
  • import M_search as ms / m = ms.MSearch_Rcat()
    こちらをサーバーの時と一緒です。
    初回のインポートとクラスのインスタンスを行っています。

  • m.Search("サービス名")
    クライアントの場合は検索を行えます。
    サーバーで設定した通りのサービス名を入力して実行すると、ネットワークに対してMサーチを投げます。
    サーバーが正常に移動していれば応答は返ってきます。

  • HTTP/1.1 200 OK\n\nLocation: 192.168.0.4\n\nST: urn:rcat999:service:rcat-msearch:1\n\n'
    サーバーからの応答です。Rcat自作のサーバーはこの形の応答を返します。この中からLocationの後ろの部分がIPアドレスやボード番号になるのでここを切り出してください。

使い道

上の記事でも紹介していますが、ネットワーク上の機器を自動検索する機能を搭載することができます。
他にも自宅のバックアップサーバーシステムなどを作って、ワンクリックに接続できるなんていうのもできそうですね(現在進行形)。

動作確認状況

  • Windows10

    • Python 3.8.1

    • サーバー / クライアント

  • Linux(Ubuntu)

    • Python 3.10.12

    • サーバー

配布情報

配布準備中
催促はDiscordまで


情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。