HomeServerの環境設定画面をつくるには。IoT+WEBのためのホームサーバ計画の実装編23。
環境設定は、まぁ必要かもしれない
『つないだだけでつかえる』
と、銘打っていても、最後の最後にどうしようもないとき、
設定がPC画面でできるとうれしいわけですよ。
さぁどうします。
そうですね。簡単なのはWebサーバを立てちゃうことだとは思うのです。
そして、ありがちな命題、
ホームサーバのIPがDHCPだとわからんやん^^;
というもの。
もちろん、IPのスキャンしたりすればできるわけですが、
めんどいわけなので。
でも、そう、いままでさんざんやったじゃないですか。
UDPの無駄遣いをすればよいのです。
今までは、IoTクライアントがUDPでブロードキャストを投げてましたが、
HomeServerにも投げさせましょう。
そんで、PCでPythonのプログラムでUDPを受け取り、IPを特定し、ブラウザを開くようにしちゃえばそれでOKですね。
仕組みは。
仕組みは簡単です。
HomeServerはいくつかのスレッドが動いているので、
これにあらたにUDPでブロードキャストを投げ続けるスレッドを追加するだけですね。
もちろん、自分のIPを知らせることだけが目的なので、
なんの連携も必要ないことを考えれば、
スレッドじゃなくてプロセスでも良いです。ハイ。
【HomeServerでUDPでなげつづける】というプロセスを追加。
うぅーーん。そうですね。1分に1回とか。30秒に1回とか。そんな感じですかね。
そしたら今度はPC側ですね。
UDPのブロードキャストでコマンドを受信したら、
そのIPをブラウザで開くっていうPythonを実行させればよいのです。
ブラウザを開くとこはこんな感じで、別に、chrome.exeとかを指定する必要はありません。
import subprocess
#urlが設定されてるとして、、
subprocess.Popen(['start', url], shell=True)
完成形
UDPで投げ続ける方。
最初は5秒おきに20回投げ、その後は30秒に1回投げ続けます。
#-------------------------------------------------------
import const
import sys
import time
import multiprocessing
#--------------------------------------
from hiraSockUDPC import hiraSockUDPC # UDP client
#--------------------------------------
import hiraSetting # only port number
#--------------------------------------
def thrower():
for w in range(20):
C = hiraSockUDPC(const.HIRA_USE_BROAD_ADDR,const.HIRA_USE_UDP_THROW_PORT)
C.exec("FINRED_ENVIRONMENT")
print("upto FINRED_ENVIRONMENT")
time.sleep(5)
while True:
C = hiraSockUDPC(const.HIRA_USE_BROAD_ADDR,const.HIRA_USE_UDP_THROW_PORT)
C.exec("FINRED_ENVIRONMENT")
print("..upto FINRED_ENVIRONMENT")
time.sleep(30)
#----------------------------------
if __name__ == '__main__':
p = multiprocessing.Process(target = thrower)
p.start()
受け取ってブラウザ開く方
受け取ったら、ブラウザを自動で立ち上げて、Pythonのプロセス自体は終了させます
#-------------------------------------------------------
import const
import os
import sys
import multiprocessing
import subprocess
#--------------------------------------
from hiraSockUDP import hiraSockUDP # UDP server
#--------------------------------------
import hiraSetting # only port number
#--------------------------------------
def udpRecv(adr,dat):
print(adr)
print(dat)
if dat == b'FINRED_ENVIRONMENT':
print("合致")
url = "http://" + adr + ":" + str(const.HIRA_USE_HOME_HTTP_PORT) + "/"
subprocess.Popen(['start', url], shell=True)
sys.exit()
def udpRecvExec():
U = hiraSockUDP(const.HIRA_USE_BROAD_ADDR,const.HIRA_USE_UDP_THROW_PORT)
U.setFunc(udpRecv)
U.exec()
#----------------------------------
if __name__ == '__main__':
P = multiprocessing.Process(target = udpRecvExec)
P.start()
まぁhiraSockUDPとかhiraSockUDPCとかは、たぶん過去ブログ参照^^;