Windowsをホームサーバーにします。
ラズパイ側でコマンドを作って送信、Windows側でブラウザーを開いてもらいます。
「~のページを開いて」という発話を認識してURLを生成。メッセージとしてURLを受け取ったらページを表示ということを想定。
音声認識でコマンドを作る場合JuliusとGoogle Assistantの連携
今回はコマンドを作成した後工程です。
IFTTTを使ってもできると思いますが、クラウドサービスを使わない場合はこういうやりかたもあるってことで。
また、ラズパイにWebサーバーを立てる場合はこちらを参照
Windows側
pyinstallerを使ってホームサーバーを立てます。
上記ページではGUIでメッセージを表示していましたが今回は必要ないのでただの待ち受けサーバーにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#!/usr/bin/env python3 # -*- coding: utf8 -*- import socket import threading import webbrowser # import json PORT = 51000 MAX_MESSAGE = 2048 NUM_THREAD = 4 def com_receive(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ip_info = socket.gethostbyname_ex(socket.gethostname()) ip_list = ip_info[2] print(ip_list) for x in ip_list: ip = x octet_list = ip.split(".") if(int(octet_list[2]) == 0): ip_address = ip break print("HOST:" + ip_address) sock.bind ((ip_address, PORT)) sock.listen (NUM_THREAD) #print ('receiver ready, NUM_THREAD = ' + str(NUM_THREAD)) while True: try: conn,addr = sock.accept() reception = conn.recv(MAX_MESSAGE).decode('utf-8') conn.close() obj = json.loads(reception) http_txt = obj['http'] if(http_txt != ""): url = http_txt #既定のブラウザーを使う場合 webbrowser.open(url) #-------------------------------------- #ブラウザーを選ぶ場合 #64bitChrome #browserdir = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s" #32bitChrome #browserdir = "C:/Program Files/Google\Chrome/Application/chrome.exe %s" #Opera #browserdir = "C:/Program Files/Opera/launcher.exe %s" #Firefox #browserdir = "C:/Program Files/Mozilla Firefox/firefox.exe %s" #IE #browserdir = "C:/Program Files/Internet Explorer/iexplore.exe %s" #webbrowser.get(browserdir).open(url) except: print('Error') sock.close() def com_start(): th=threading.Thread(target=com_receive) th.start() if __name__ == "__main__": com_start() |
ラズパイ側
HOSTアドレスのXXは書き換えてください。
ラズパイ側で立てたWebサーバーにアクセスする場合は、DDNSを利用していない場合はラズパイのIPアドレスが要りますが、その際はコマンドを送る時に自分のアドレスを調べて、JSONに記述して送ります。ただし、ラズパイのようにWi-Fi環境のものはsocket.gethostbyname_exでは取得できません。ipgetとかを使いましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/usr/bin/env python3 # -*- coding: utf8 -*- import socket HOST = '192.168.0.<span style="color: #ff0000;">XX</span>' PORT = 51000 def com_send(mess): while True: try: # 通信の確立 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) # メッセージ送信 sock.send(mess.encode('utf-8')) # 通信の終了 sock.close() break except: print ('Error: ' + mess) break if __name__ == "__main__": http_txt = "http://www.gamba-osaka.net" json_txt = '{"http":"' + http_txt +'"}' com_send(json_txt) |
Appendix1
Wi-Fi環境で自IPアドレスの取得
$pip3 install ipget
1 2 3 4 5 6 7 |
import ipget a = ipget.ipget() b = a.ipaddr("wlan0") c = b.split("/") d = c[0] print(d) |
Appendix2
Wi-Fi環境で自IPアドレスの取得
1 |
$pip3 install netifaces |
1 2 3 |
import netifaces a = netifaces.ifaddresses('wlan0')[netifaces.AF_INET][0]['addr'] print(a) |
Appendix3
LAN内の有効なIPアドレスを列挙してみる
$echo
192.168.0.{1..254} |
xargs
-P256 -n1
ping
-s1 -c1 -W1 |
grep
ttl
Windowsをホームサーバーにする
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(1)
WindowsでWebブラウジング
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(2)
Windowsに接続しているサーマルプリンターでメッセージを印刷(プリントサーバー)
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(3)
Windowsに保存した音源やビデオ再生、ストリーミング(メディアサーバー)
ラズパイからコマンドを送ってWindowsにいろいろやってもらう(4)
Windowsに接続した学習リモコンで家電制御(リモコンサーバー)
それぞれのWindowsなどの端末にメッセージを同時配信
Leave a Reply