====== Kivy: oscpy ====== **{{tagpage>kivy|Toutes les pages Kivy}}** **[[http://translate.google.com/translate?hl=&sl=auto&tl=en&u=https%3A%2F%2Fressources.labomedia.org%2Fkivy_oscpy|English Version]]** **[[les_pages_kivy_en_details|Les pages Kivy en détails]]** **A modern implementation of OSC for python 3**\\ **C'est maintenu par les développeurs Kivy, c'est bien fait.** Ce package python fait partie du projet Kivy, mais il peut être utilisé indépendamment. ===== Ressources ===== * https://github.com/kivy/oscpy * https://pypi.org/project/oscpy/ ===== Installation ===== sudo pip3 install oscpy =====Exemple tiré de ===== * **[[https://github.com/sergeLabo/accelerometer_service_osc|accelerometer_service_osc]]** ====Extraits==== Il n'est pas possible d'avoir 2 serveurs sur le même port sur une même machine, chaque script à un serveur pour recevoir et un client pour envoyer. J'ai écrit quelque part que l'OSC ne supporte pas l'**UTF-8**. Si l'envoi et la réception se fait en python sans utiliser de bibliothèque tierce, il suffit d'encoder (en bytes) le string, ce qui est réalisé dans l'exemple ci-dessous avec "à@éèù".encode('utf-8') et de décoder avec data.decode('utf-8') ===main.py=== [[https://github.com/sergeLabo/accelerometer_service_osc/blob/main/main.py|main.py]] class Accelerometer(BoxLayout): def __init__(self, app): super().__init__() self.app = app Clock.schedule_interval(self.update_display, 1/50) ... def update_display(self, dt): root = self.app.get_running_app() self.ids.activ_sensor.text = f"Capteur actif: {root.sensor}" def on_activity(self, act): """Appelé par on_release: root.on_activity(3) dans accelerometer.kv""" r = self.app.get_running_app() r.client.send_message(b'/activity', [act]) class AccelerometerApp(App): def build(self): ... self.server = OSCThreadServer() self.server.listen( address=b'localhost', port=3003, default=True) ... self.server.bind(b'/sensor', self.on_sensor) self.client = OSCClient(b'localhost', 3001) def on_sensor(self, sens): self.sensor = sens.decode('utf-8') ===service.py=== [[https://github.com/sergeLabo/accelerometer_service_osc/blob/main/service.py|service.py]] ... from oscpy.client import OSCClient from oscpy.server import OSCThreadServer ... class AccelerometerService: ... def init_osc(self): """Le serveur peut envoyer mais impossible d'avoir 2 serveurs sur le même port. """ self.server = OSCThreadServer() self.server.listen('localhost', port=3001, default=True) # Les callbacks du serveur self.server.bind(b'/activity', self.on_activity) self.server.bind(b'/stop', self.on_stop) self.server.bind(b'/sensor_enable', self.on_sensor_enable) # Un simple client self.client = OSCClient(b'localhost', 3003) ... def on_activity(self, msg): print("activity", msg) self.activity = int(msg) ... def get_acceleration(self): if self.status: a, b, c = 0,0,0 ... if self.sensor_enabled != 0: # Set dans les arrays self.acc_x[self.num] = a self.acc_y[self.num] = b self.acc_z[self.num] = c self.acc_act[self.num] = self.activity acc_message = [a, b, c, self.activity, self.num] self.client.send_message(b'/acc', acc_message) ... def run(self): while self.loop: self.get_acceleration() sleep(0.02) if __name__ == '__main__': ACCELEROMETER = AccelerometerService() ACCELEROMETER.run() =====Bundle===== ====Envoi d'un bundle avec un Client==== from oscpy.client import OSCClient class OscClient: def __init__(self, **kwargs): self.ip = kwargs.get('ip', None) self.port = kwargs.get('port', None) self.client = OSCClient(self.ip, self.port) def send_depth(self, depth): self.client.send_message(b'/depth', [depth]) def send_bundle(self, messages): bund = [] for i, msg in enumerate(messages): tag = ('/' + str(i)).encode('utf-8') print(tag, msg) bund.append([tag, msg]) self.client.send_bundle(bund) if __name__ == "__main__": messages = [[3.2, 3, 4], [55.6, 12, 80]] cli = OscClient(**{'ip': '127.0.0.1', 'port': 8003}) cli.send_bundle(messages) b'/0' [3.2, 3, 4] b'/1' [55.6, 12, 80] ====Réception d'un bundle sur un Server==== from time import sleep from oscpy.server import OSCThreadServer dico = {} def on_tag(*args): print(args) tag = int(args[0].decode('utf-8')[1:]) print(tag) dico[tag] = args[1:] print(dico) def default_handler(*args): print("default_handler", args) server = OSCThreadServer() server.listen(b'localhost', port=8003, default=True) server.default_handler = default_handler for i in range(10): tag = ('/' + str(i)).encode('utf-8') server.bind(tag, on_tag, get_address=True) while 1: sleep(0.1) python3 osc_server_test.py (b'/0', 3.200000047683716, 3, 4) 0 {0: (3.200000047683716, 3, 4)} (b'/1', 55.599998474121094, 12, 80) 1 {0: (3.200000047683716, 3, 4), 1: (55.599998474121094, 12, 80)} {{tag>kivy osc protocole_reseau python sb}}