別にラズパイからでなくてもいいのですが…….(成り行きで)。
こんな感じ。対応するサーバにのみキャストされるのがブロードキャストとの違い。
1対nで文字列のメッセージをPython to Pythonで配信してみます。
Pythonでプロセス間通信ではTCPを使っていましたが、今回はUDPを使います。
配信側
【client.py】
ラズパイなどのWi-Fi環境の場合
$pip3 install netifaces
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 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from __future__ import print_function import socket from contextlib import closing import netifaces PORT = 55000 def main(): # 送信側のIPアドレス #ラズパイなどのWi-Fi環境の場合 local_address = netifaces.ifaddresses('wlan0')[netifaces.AF_INET][0]['addr'] #PCなどのイーサーネット環境の場合 ''' 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): local_address = ip break ''' multicast_group = '239.255.0.1' # マルチキャストアドレス with closing(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) as sock: sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_address)) message = 'Hello Everybody!!'.encode('utf-8') #messageはバイト列で送信されます sock.sendto(message, (multicast_group, PORT)) sock.close() return if __name__ == '__main__': main() |
受信側
【server.py】
ラズパイなどのWi-Fi環境の場合
$pip3 install netifaces
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 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from __future__ import print_function import socket from contextlib import closing import netifaces PORT = 55000 MAX_BUFFER = 4096 def main(): # 受信側のIPアドレス #ラズパイなどのWi-Fi環境の場合 #local_address = netifaces.ifaddresses('wlan0')[netifaces.AF_INET][0]['addr'] #PCなどのイーサーネット環境の場合 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): local_address = ip break multicast_group = '239.255.0.1' # マルチキャストアドレス with closing(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) as sock: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('', PORT)) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(multicast_group) + socket.inet_aton(local_address)) while True: temp = sock.recv(MAX_BUFFER) txt = str(temp) print(txt) sock.close() return if __name__ == '__main__': main() |
マルチキャスト・ストリーミングする場合はこのページ(動画・音源) や このページ(マイク)参照
ブロードキャスト・ストリーミングする場合はこのページ(カメラ)参照
Flashベースのストリーミングではこんなのもありました。
Leave a Reply