Archive:Python 3.2 socket Multicast
| Ce wiki a été archivé en 2018.
Le nouveau wiki se trouve à: ressources.labomedia.org Les fonctionnalités sont désactivées: vous pouvez faire une recherche sur Google site:https://wiki.labomedia.org et découvrir La Labomedia. |
De Centre de Ressources Numériques - Labomedia
Réception de Multicast dans Blender 2.6 en python 3.2
import GameLogic as gl
import socket
# OSC.py est dans un dossier OSC3, ce dossier est dans le dossier du fichier blend
from OSC3.OSC import decodeOSC
from time import sleep
def main():
ip = gl.ip_multicast
buffer_size = 1024
port = gl.port_in
connect_blender(ip, port, buffer_size)
get_OSC_data(buffer_size)
def connect_blender(ip, port, buffer_size):
# Connexion de Blender en Multicast
if not gl.connected :
gl.connected = True
ANY = "0.0.0.0"
MCAST_ADDR = "224.0.0.14"
MCAST_PORT = 18888
#create a UDP socket
gl.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
#allow multiple sockets to use the same PORT number
gl.sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#Bind to the port that we know will receive multicast data
gl.sock.bind((ANY,MCAST_PORT))
#tell the kernel that we are a multicast socket
gl.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
#Tell the kernel that we want to add ourselves to a multicast group
#The address for the multicast group is the third param
status = gl.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(MCAST_ADDR) + socket.inet_aton(ANY))
gl.sock.setblocking(0)
# This option doesn't work !
gl.sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, buffer_size)
def get_OSC_data(buffer_size):
# Si blender est connecté, récupération des messages OSC
if gl.connected :
try:
raw_data = gl.sock.recv(buffer_size)
data = decodeOSC(raw_data)
recup_messages(data)
except socket.error:
gl.socket_failed += 1
pass
L'option socket.SOL_SOCKET, socket.SO_RCVBUF, buffer_size ne fonctionne pas. Le serveur doit envoyer moins vite que ne lit Blender, sinon il y a de la latence.
Les variables attibut du GameLogic sont initialisées dans un script init.py lancé une seule fois au tout début du jeu. Voir Muti Pass For Freedom.