python 是否有办法打印OSC收到的所有信息?

r6hnlfcb  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(143)

我是OSC通信的初学者。
我以前用UDP实现过通信,但OSC是第一次。
我已经看过了。
OSC根据该文档将某些信息发送到某些URL,如“/filter”。

OSC_客户端.py

import argparse
import random
import time

from pythonosc import udp_client

if __name__ == "__main__":
  parser = argparse.ArgumentParser()
  parser.add_argument("--ip", default="127.0.0.1",
      help="The ip of the OSC server")
  parser.add_argument("--port", type=int, default=5005,
      help="The port the OSC server is listening on")
  args = parser.parse_args()

  client = udp_client.SimpleUDPClient(args.ip, args.port)

  for x in range(10):
    client.send_message("/filter", random.random())
    time.sleep(1)

接收端的代码还通过指定特定的URL(如“/filter”)来接收信息。
OSC_服务器.py

import argparse
import math

from pythonosc import dispatcher
from pythonosc import osc_server

def print_volume_handler(unused_addr, args, volume):
  print("[{0}] ~ {1}".format(args[0], volume))

def print_compute_handler(unused_addr, args, volume):
  try:
    print("[{0}] ~ {1}".format(args[0], args[1](volume)))
  except ValueError: pass

if __name__ == "__main__":
  parser = argparse.ArgumentParser()
  parser.add_argument("--ip",
      default="127.0.0.1", help="The ip to listen on")
  parser.add_argument("--port",
      type=int, default=5005, help="The port to listen on")
  args = parser.parse_args()

  dispatcher = dispatcher.Dispatcher()
  dispatcher.map("/filter", print)
  dispatcher.map("/volume", print_volume_handler, "Volume")
  dispatcher.map("/logvolume", print_compute_handler, "Log volume", math.log)

  server = osc_server.ThreadingOSCUDPServer(
      (args.ip, args.port), dispatcher)
  print("Serving on {}".format(server.server_address))
  server.serve_forever()

但是,普通UDP的代码为:可以在不指定URL等的情况下发送字符串,并且通过指定端口来接收所有字符串信息。
如下面的UDP客户端.py和UDP服务器.py。

UDP客户端.py

from socket import socket, AF_INET, SOCK_DGRAM

HOST = ''
PORT = 5000
ADDRESS = "127.0.0.1" 

s = socket(AF_INET, SOCK_DGRAM)

while True:
    msg = "testSend"
    s.sendto(msg.encode(), (ADDRESS, PORT))

s.close()

UDP服务器.py

from socket import socket, AF_INET, SOCK_DGRAM

HOST = ''   
PORT = 5000

s = socket(AF_INET, SOCK_DGRAM)
s.bind((HOST, PORT))

while True:
    msg, address = s.recvfrom(8192)
    print(f"message: {msg}\nfrom: {address}")

s.close()

我想知道是否有一种方法可以通过只指定端口号来获取OSC中所有接收到的数据。
我想分析与OSC通信的软件内容,了解发送的是什么数据,为此,我想知道是否可以做到。

jdgnovmf

jdgnovmf1#

知道这是一个老问题,但我偶然发现它寻找帮助。如果我理解你想做什么正确的,你只是想看到所有的OSC消息,而不是必须指定一个路径。
如果是这样的话,好消息是这很容易。
在您的OSC_Server.py示例中,更改以下内容:

dispatcher.map("/filter", print)

对此:

dispatcher.map("/*", print)

这将使用内置的“print()”函数来打印出所有通过OSC在你指定的端口上传入的消息。有点惊讶的是文档没有显示这一点,并在示例中解释得更好一点。
我希望这能帮到一些人

相关问题