首页 > 解决方案 > 有没有办法打印 OSC 收到的所有信息?

问题描述

我是 OSC 通信的初学者。

我过去使用UDP实现了通信,但OSC是第一次。

我已阅读Python OSC 库文档

根据该文档,OSC 将某些信息发送到某些 URL,例如“/filter”。

OSC_Client.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_Server.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_Client.py 和 UDP_Server.py。

UDP_Client.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_Server.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 通信的软件的内容,并知道正在发送什么样的数据。为此,我想知道这是否可以做到。

标签: pythonnetworkingudposc

解决方案


推荐阅读