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を使ってみようと思います。