うごくものづくりのために

技術的な備忘録がメインです。

Pythonでマルチキャストのデータを読む

RoboCupSSLでは、チーム間共有のビジョンサーバがフィールド上のカメラ情報を統合し、各ロボットの座標などのデータを取得してくれます。 そのデータは、UDPマルチキャストによって送信されてきます。 その情報を使って、各チームのAIはいろいろと戦略を練って、ロボットへ指示を与えるわけです。

自分が、マルチキャストってなんぞい?っていう状態から、なんとかPythonを用いてサーバ(正確にはシミュレータ)からのデータを受信できるようになったのでメモしておきます。

マルチキャストって何

ネットワークのおべんきょしませんか? テクニカルエンジニア(ネットワーク)、Cisco CCNA/CCNP対策に!

上のページを参考にしました。

ネットワーク上の複数の端末に、同じ情報を同時に送信するための仕組みです。 同様に、全体に同時送信するための仕組みで、ブロードキャストというのもあるのですが、 マルチキャストはブロードキャストより通信のオーバーヘッドが少ないです。

で、マルチキャストでデータを送信するためには、データを送信する対象となるグループを作る必要があります。 逆に、マルチキャストで送信されるデータを受信するためには、そのグループに参加する必要があります。

あんまり詳しくはわかっていないので、解説はこのへんで適当に終わらせておきます。 詳細な情報はぐぐってみてください…

Pythonマルチキャストのデータを受信する

このページを参考にしてソースを書きました。(というかほぼコピペ)

pythonでマルチキャストを受信する - karasuyamatenguの日記

今回は、前回インストールしたgrSim を使って、grSimが吐いてくれるマルチキャストのデータをPythonで拾おうと思います。

#!/usr/bin/env python
import socket

#LANアダプタに割り当てられているIPアドレス
multicast_if_addr='192.168.0.10'

#マルチキャストアドレスとポート(grSim参照)
multicast_group='224.5.23.2'
multicast_port=10020

my_addr='0.0.0.0' #これは変えない
server_address=(my_addr, multicast_port)

sock=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)

mreq=socket.inet_aton(multicast_group)+socket.inet_aton(multicast_if_addr)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while True:

    data, address=sock.recvfrom(1024) #本当は受信したデータを表示させたいけど、バイナリなので表示できない
    print 'Received'

一応"Received"が端末に表示されまくったので、受信できているでしょう。 バイナリデータからちゃんとしたデータに直すために、次はPythonでGoogleProtocolBuffersを使ってみようと思います。