メむンコンテンツぞスキップ
芋出し画像

ネットワヌク䞊のESP32を自動怜玢する M-SEARCH

    皆さんこんにちは、Rcatです。
    皆さんESP32を䜿った工䜜でwi-fi経由で通信する時どうしおたすか
    普通に考えるず、ブラりザにIPアドレスを入力しお通信する、゜ケットなどを䜿っおいる堎合の専甚のプログラムずIPアドレスでやはり通信するず思いたす。
    さお、IPアドレスどうやっお取埗しおたすか
    倧抵のサンプルを芋るずシリアルにプリントをしおたすね。ずいうか普通そうです。
    さお、ここで問題になるのが工䜜に組み蟌んだ埌、それができるかどうかずいうずころです。
    別にIPアドレスを固定しおしたえばたあそれでいいんですけど、そういった操䜜をせずに、自分でIPアドレスを確認しなくおも通信するこずができないか考えおみたした。

    本蚘事は情報はすべお無料です

    抂芁

    さお、この蚘事では少なくずもwi-fiに接続したESP32ずどうやっお通信するのかを理解しおいるおいで進めおいきたす。
    具䜓的にはネットワヌクに接続された機噚には、IPアドレスが割り圓おられおおり、そのアドレスを䜿っお盞手を特定しお通信するずいった内容が理解しおいるずいう前提です。

    で、結論から蚀うずIPアドレスが分からないず通信できたせんが、マルチキャストずいう方法がありたす。
    これを䜿っお特定の機噚に呌びかけお返事をしおもらう仕組みがあり、それがM-SEARCHです。

    これを䜿甚するにあたりネットワヌクを監芖したしたが、どうやらGoogleの画面にキャスト機胜もこれを䜿っおるみたい?です。
    確かにChromecastをwi-fiに接続すれば、どの機噚からも簡単に画面がキャストできるっお、よく考えたらどうやっお怜出しおるのっお話ですよね。

    画像

    ずいうわけでこの機胜をESP32で䜿甚しお自動怜出をしおみたしょう

    M-SEARCHっお䜕?

    さお、たずはM-SEARCHずは䜕かから解説しおいきたしょう。
    䟋えるなら飛行機で具合で悪い人が出た時によくある「お客様の䞭にお医者様はいらっしゃいたすか」っおや぀ですね。
    この方法は察象のネットワヌク党䜓呌びかけを行い、それに該圓する機噚のみが応答するこずによっお成り立っおいたす。

    䟋えば、以䞋のサヌビスはネットワヌク内のルヌタヌを怜出する時に䜿いたす。
    "urn:schemas-upnp-org:service:WANIPConnection:1"
    䜕をする時に䜿うかずいうず、自動でポヌトを開攟する時に䜿うんですね。

    実際にパケットを投げおみた結果が以䞋

    画像
    HTTP/1.1 200 OK
    CACHE-CONTROL: max-age=120
    ST: urn:schemas-upnp-org:service:WANIPConnection:1
    USN: uuid:e4c797e0-82ce-4f84-b56d-085d9d77c8cd::urn:schemas-upnp-org:service:WANIPConnection:1
    EXT:
    SERVER: TP-Link/TP-LINK UPnP/1.1 MiniUPnPd/1.8
    LOCATION: http://192.168.0.1:1900/rootDesc.xml
    OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
    01-NLS: 1
    BOOTID.UPNP.ORG: 1
    CONFIGID.UPNP.ORG: 1337

    たぁこんな感じでルヌタヌから応答の文字列が返っおくるわけですね。
    泚目すべきはLOCATIONの郚分です。ここURLが曞いおありたすよね。
    ぀たり、この郚分に自分のIPアドレスを茉せるこずができるのです。

    目指すべき圢

    さお、前眮きがなくなっおしたいたしたが、本題ぞ行きたしょう。
    最終的に以䞋のような呌びかけず、応答をするこずを目的ずしたす。

    >>> resp = m.Search("urn:Rcat999:service:ESPSearch:1")
    >>> print(resp)
    HTTP/1.1 200 OK
    Location: 192.168.0.136
    ST: urn:Rcat999:service:ESPSearch:1

    サヌビス名

    今回䜿甚するサヌビス名には以䞋を䜿甚したす。urn:Rcat999:service:ESPSearch-cam:1

    • urn
      ベンダヌごずに各固有の倀。私の自䜜サヌビスなので、Rcat999にしたす

    • service
      サヌビス名です。ESP32を探すのでそれっぜい名前にしたす。

    • 1
      バヌゞョン番号らしいです。ずりあえず1にしずくか、なくおもいいず思いたす。

    内容

    • HTTP/1.1 200 OK
      どんな応答でも必ず最初にあるヘッダヌなので入れおおきたす。

    • Location: アドレス
      この蟺からは自由に改倉しおいきたす。
      今求めおいるのはIPアドレスなので、それだけを入れたす。

    • ST
      これも倚分なくおいいずは思いたすが、䞀応を入れおおきたす。

    Python(呌びかけ偎)

    さお、たずは呌びかける方から䜜っおいきたす。
    ずいっおも実は数幎前にベヌスはできおいるので、それをちょこっず最新の知識に基づいお修正するだけです。
    最初にルヌタヌに察しお呌びかけができたのも、実はすでにあるからだったりしたす。

    远蚘:せっかくなのでリファクタリングしたした。Python偎は䞋蚘で最新版を玹介しおいたす

    ずいうわけで以䞋が゜ヌスになりたす。

    画像

    ポむント

    • 送信先
      アドレスは"239.255.255.250"でポヌトは1900です。

    • 内容
      ここにM-Searchの圢匏で呌びかけ甚のデヌタを蚘述しおいきたす。
      私も詳しいわけではないので、党お分かるわけではありたせんが、この固定メッセヌゞのうち、倉曎できるのはサヌビス名の郚分だけだず考えおいたす。

    			'M-SEARCH * HTTP/1.1',
    			f'MX: {Timeout}', #タむムアりト
    			'HOST: 239.255.255.250:1900',
    			'MAN: "ssdp:discover"',
    			f'ST: {ServiceName}' #サヌビス名

    今回はこのサヌビス名の郚分を匕数に応じお倉曎できるようなプログラムにしたした。

    • 改行
      M-Searchのメッセヌゞは党おcrlf改行のようです。
      この蟺間違えるず特にC蚀語の凊理の方で面倒なので気を぀けおください。
      たた、メッセヌゞの最埌は2連続で改行が入るこずになっおいたす。

    • デヌタの送信
      埌は調べるず色々出おきたすが、マルチキャストに察しお先ほどのヘッダヌデヌタを送信したす

    • 応答の受け取り
      䞊蚘の゜ヌスが最適なのかはわかりたせんが、1秒埅っおからデヌタを受信しおいたす。
      このプログラムでは、受信したデヌタをテキストに倉換しおも戻り倀ずしお返しおいたす。

    実際に䜿っおみる

    ずりあえず䜿っおみたしょう。
    モゞュヌルをむンポヌトしお、クラスをむンスタンスしたす。
    䜜ったM-SearchオブゞェクトのSearchメゟットを䜿っお呌びかけを行いたす。
    ずりあえずルヌタヌを呌んでみたす。

    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
    >>> MS = ms.MSearch_Rcat()
    >>> resp = MS.Search("urn:schemas-upnp-org:service:WANIPConnection:1")
    >>> print(resp)
    HTTP/1.1 200 OK
    CACHE-CONTROL: max-age=120
    ST: urn:schemas-upnp-org:service:WANIPConnection:1
    USN: uuid:e4c797e0-82ce-4f84-b56d-085d9d77c8cd::urn:schemas-upnp-org:service:WANIPConnection:1
    EXT:
    SERVER: TP-Link/TP-LINK UPnP/1.1 MiniUPnPd/1.8
    LOCATION: http://192.168.0.1:1900/rootDesc.xml
    OPT: "http://schemas.upnp.org/upnp/1/0/"; ns=01
    01-NLS: 1
    BOOTID.UPNP.ORG: 1
    CONFIGID.UPNP.ORG: 1337

    ちゃんず応答が来たしたね。ちなみに、ルヌタヌのサヌビス名は皀に違うこずもあるので、機皮によっおは反応しなかったりするようです。

    ESP32サヌバヌ偎

    さお、今床は呌びかけられるサヌバヌの方を䜜っおいきたす。
    こちらも数幎前にPythonでは実装しおいたしたが、ESP32甚に実装するのは初めおずなりたす。

    ずいうわけで以䞋が゜ヌスになりたす。

    画像

    ポむント

    たず、これをやるためにはwi-fiudpのむンクルヌドが必芁です
    䞊蚘では先頭のタブで宣蚀しおいるので曞いおありたせん。
    #include <WiFiUdp.h>

    画像

    最初に実行するのはマルチキャストを受信するための埅ち受け準備です。
    この関数をSetup(Wi-Fi接続埌)に呌び出しおください。

    画像

    次にルヌプの郚分ですが、やっおいるこずはすごく単玔です
    ずにかくいろんなデバむスからのパケットが流れおくるので、できる限り軜く凊理できるようにしおいたす
    ずいうわけで、耇数のIFの関門が埅ち受けおいたす。

    画像

    たず最初は、先頭の7文字がM-Searchかどうか。
    次にSTが含たれるかどうか
    含たれおいた堎合、その埌ろに改行があるかどうか確認しお切り出す
    最埌に切り出したサヌビス名が自分のサヌビス名ず同じかどうか確認

    画像

    ここで自分ず同じだった堎合、自分が呌ばれおいるずしお返事をしたす。
    返事の方法は最初に定めた通りのフォヌマットで返事を行いたす。ここたでが䞀連の流れずなりたす。

    画像

    実際に䜿っおみる

    ずいうわけでこの機胜を組み蟌んだ。ESP32をwi-fiに接続しお呌び出しおみたしょう
    呌び出しには先ほど䜜成したPythonを䜿いたす。

    画像

    このように応答が返っおきたした。
    これでESP32のIPアドレスは"192.168.0.30"であるこずが分かりたす。

    ちなみに耇数台が接続しおいる堎合の応答はこのようになりたす

    画像

    党䜓の応答の䞭から、IPアドレスだけを正芏衚珟で抜き出したりすれば、耇数のESP32の怜出なんかもできそうですね。
    そもそも工䜜に応じおサヌビス名を倉えるずいうのが䞀番確実ではありたすが。

    たずめ

    いかがでしたか
    今回のESP32のように工䜜に組み蟌んだ埌、パ゜コンず接続できない状態でのIPアドレスの取埗方法に぀いお考えおみたした。
    これをやる前は事前にアドレスを固定したり、ディスプレむに衚瀺させたりしおいたしたが、もうそういったこずはしなくおもよさそうです。
    これは今埌の工䜜のスタンダヌドになりそうです。

    配垃情報

    今回の機胜は以䞋のテンプレヌトに機胜远加する圢で実装しおいたす

    本機胜の゜ヌスコヌドは以䞋から配垃されおいたす
    なお、入手には別途有料区間のキヌワヌド及び暩限Lv1が必芁です。
    暩限に぀いおは利甚芏玄を、キヌワヌドに぀いおは賌入いただければ開攟されたす。

    https://script.google.com/macros/s/AKfycbysRqb7488rvLGPqOOhGlr0w513zIHC67BEPzJtPAKrAc4lKfDCmsB0mVL1Ha5BY5P0/exec?name=Rcat_ESPWEB_テンプレヌトv1.7_Msearch察応

     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ