ラズパイからコマンドを送ってWindowsにいろいろやってもらう(1)


Windowsをホームサーバーにします。

ラズパイ側でコマンドを作って送信、Windows側でブラウザーを開いてもらいます。

「~のページを開いて」という発話を認識してURLを生成。メッセージとしてURLを受け取ったらページを表示ということを想定。

音声認識でコマンドを作る場合JuliusとGoogle Assistantの連携

今回はコマンドを作成した後工程です。

 

IFTTTを使ってもできると思いますが、クラウドサービスを使わない場合はこういうやりかたもあるってことで。

また、ラズパイにWebサーバーを立てる場合はこちらを参照

 


Windows側

pyinstallerを使ってホームサーバーを立てます。

上記ページではGUIでメッセージを表示していましたが今回は必要ないのでただの待ち受けサーバーにしています。

 

#!/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とかを使いましょう。

#!/usr/bin/env python3
# -*- coding: utf8 -*-

import socket

HOST = '192.168.0.XX'
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

 

import ipget
a = ipget.ipget()
b = a.ipaddr(“wlan0”)
c = b.split(“/”)
d = c[0]

print(d)


Appendix2

Wi-Fi環境で自IPアドレスの取得

$pip3 install netifaces

 

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に接続した学習リモコンで家電制御(リモコンサーバー)

ラズパイ3でLAN内にマルチキャスト

それぞれのWindowsなどの端末にメッセージを同時配信

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*