Envoyer et recevoir de l'OSC en python

De Centre de Ressources Numériques - Labomedia
Aller à : navigation, rechercher

Ressources

Import du module OSC

import OSC

va lire le fichier OSC.py et toutes les fonctions qu'il contient.

Il suffit de coller le fichier dans le dossier qui contient votre script.

Exemple simple

Envoi d'un message

Ce script envoie 10 messages avec la valeur de i toutes les secondes

import OSC
import time

# Init OSC
client = OSC.OSCClient()
msg = OSC.OSCMessage()
msg.setAddress("/test")

for i in range(10):
    time.sleep(1)
    msg.append(i)
    try:
        client.sendto(msg, ('127.0.0.1', 9001))
        msg.clearData()
    except:
        print 'Connection refused'

Reception d'un message avec un serveur

Cette exemple convient à un script qui boucle, dans Blender, le script qui reçoit sera relancé à chaque frame. Le module socket fait cela facilement, par exemple : dans les fichiers de Communication_entre_Pure-data_et_Blender_en_OSC.

import OSC
import threading

#------OSC Server-------------------------------------#
receive_address = '127.0.0.1', 9001

# OSC Server. there are three different types of server. 
s = OSC.ThreadingOSCServer(receive_address)

# this registers a 'default' handler (for unmatched messages)
s.addDefaultHandlers()

# define a message-handler function for the server to call.
def printing_handler(addr, tags, stuff, source):
    if addr=='/test':
        print "Test", stuff

s.addMsgHandler("/test", printing_handler)

def main():
    # Start OSCServer
    print "Starting OSCServer"
    st = threading.Thread(target=s.serve_forever)
    st.start()
main()

Pas de sortie propre de ce script, c'est un exemple, fermer le terminal pour l’arrêter.

Tester les deux ensemble

Fichier:Exemple simple OSC.zip Lancer en terminal

python exemple_receive.py

puis lancer dans un autre terminal

exemple_send.py

Un autre exemple pour recevoir avec le module socket

import socket
from OSC import decodeOSC

ip = '127.0.0.1'
port = 9001
buffer_size = 1024
do_loop = True

# Connect
my_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
    my_socket.bind((ip, port))
    my_socket.setblocking(0)
    my_socket.settimeout(0.002)
    my_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, buffer_size)
    print 'Plug : IP = ', ip,  'Port = ', port,  'Buffer Size =', buffer_size
except:
    print 'No connected'

# If connected
while do_loop:
    try:
        raw_data = my_socket.recv(buffer_size)
        data = decodeOSC(raw_data)
        print(data)
    except socket.error:
        pass

va imprimer:

Plug : IP =  127.0.0.1 Port =  9001 Buffer Size = 1024
['/test', ',i', 0]
['/test', ',i', 1]
['/test', ',i', 2]
['/test', ',i', 3]

Je trouve ça beaucoup plus clair. Il n'y a pas de sortie propre de la boucle, ce n'est pas le but de l'exercice.

Tester les deux ensemble

Comme le premier exemple ci- dessus avec Fichier:Recevoir OSC socket.zip