使用 JavaOsc 从 Behringer X32 获取仪表读数

问题描述 投票:0回答:1

我正在尝试使用 JavaOsc,但在建立连接时遇到困难。我的测试代码如下,但无论我输入什么IP地址端口,它似乎都已连接(这是不正确的)并且我没有收到任何响应。所以我做错了,但发现很难找到文档。

    final static private int port = 10023;
    final static private String ipAddess = "192.168.1.78";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(true) {
            OSCPortOut sender = null;
            OSCPortIn receiver = null;
            try {
                //receiver = new OSCPortIn(10023);
                OSCMessageListener msgListener = new OSCMessageListener() {
                    @Override
                    public void acceptMessage(OSCMessageEvent oscMessageEvent) {
                        System.out.println("Message received A! " + oscMessageEvent.toString());
                    }
                };

                OSCPacketListener listener = new OSCPacketListener() {
                    @Override
                    public void handlePacket(OSCPacketEvent oscPacketEvent) {
                        System.out.println("Package received A! " + oscPacketEvent.toString());
                    }

                    @Override
                    public void handleBadData(OSCBadDataEvent oscBadDataEvent) {
                        System.out.println("Package BAD received B!");
                    }

                    public void acceptMessage(java.util.Date time, OSCMessage message) {
                        System.out.println("Message received!");
                    }
                };

                MessageSelector selector = new MessageSelector() {
                    @Override
                    public boolean isInfoRequired() {
                        System.out.println("Info required call");
                        return false;
                    }

                    @Override
                    public boolean matches(OSCMessageEvent oscMessageEvent) {
                        System.out.println("Message match?? " + oscMessageEvent.toString());
                        return false;
                    }
                };
                
                receiver = new OSCPortInBuilder().addPacketListener(listener).addMessageListener(selector, msgListener).setLocalPort(port).setRemotePort(port).build();
                receiver.connect();
                receiver.startListening();

                sender = new OSCPortOut(InetAddress.getByName(ipAddess), port);
                sender.connect();
                System.out.println("Remote address: " + sender.getRemoteAddress() + " local: " + sender.getLocalAddress());
                List<String> vars = new ArrayList<String>();
                vars.add("/info");
                OSCMessage msg = new OSCMessage("/msgAddress", vars);

                System.out.println("Is connected: " + sender.isConnected());
                sender.send(msg);     
                System.out.println("Msg info: " + msg.getInfo() + " - " + msg.getAddress());

                System.out.println("Deamon: " + receiver.isDaemonListener() + " is listening " + receiver.isListening() + " is connected " + receiver.isConnected());

                System.out.println("Please type 'q' to stop.");
                if(scanner.nextLine().equalsIgnoreCase("q")) break;

            } catch (Exception e) {
                System.out.println("Error: " + e.getMessage());
                e.printStackTrace(System.out);
            } finally {
                try {
                    if (sender != null) sender.close();
                    if (receiver != null) receiver.close();
                } catch (IOException e){
                    System.out.println("Problem closing: " + e.getMessage());
                }
            }
        }
        System.out.println("Finished.");

回复是:

Info required
Remote address: /192.168.1.78:10023 local: /0.0.0.0:0
Is connected: true
Msg info: null - /msgAddress
Deamon: true is listening true is connected true
Please type 'q' to stop.

我还尝试联系本地接收器(使用 127.0.0.1),但也没有成功。 任何建议将不胜感激!

java osc javaosc
1个回答
0
投票

我在 Windows PC 上使用 JavaOSC 连接到 Behringer X32,并且能够建立双向通信。 我没有在其他操作系统上进行过测试,因此您的情况可能会有所不同。

X32 在用于发送到 X32 的同一端口上响应客户端。 这给 JavaOSC 带来了一个问题,因为默认情况下它会动态分配一个端口用于发送和接收(不同的端口)。

技巧是告诉 JavaOSC 使用客户端上的相同端口进行发送和接收。 为此,您需要使用 OSCPortInBuilder 和 OSCPortOutBuilder 类,并为两者配置相同的套接字作为本地套接字。

以下内容对我有用(为简洁起见,删除了 try-catch 块):

// X32 listens on this port
int x32Port = 10023;

// Port for sending AND receiving packets on the client
// This needs to be manually assigned
int clientPort = myClientPort; 

InetSocketAddress clientSocket = new InetSocketAddress(clientPort);
InetSocketAddress x32Socket = new InetSocketAddress(x32IP, x32Port);

// build the receiver socket and connect
var recvBuilder = new OSCPortInBuilder();

recvBuilder.setRemoteSocketAddress(x32Socket);
recvBuilder.setLocalSocketAddress(clientSocket);
recvBuilder.setNetworkProtocol(NetworkProtocol.UDP);

OSCPortIn receiver = recvBuilder.build();
receiver.connect();


// build the sender socket -- note that the local socket address
// is that same as the receiver's
var sendBuilder = new OSCPortOutBuilder();

sendBuilder.setLocalSocketAddress(clientSocket);
sendBuilder.setRemoteSocketAddress(x32Socket);
sendBuilder.setNetworkProtocol(NetworkProtocol.UDP);

OSCPortOut sender = sendBuilder.build();
sender.connect();

正如评论所建议的,像 Wireshark 这样的工具可以帮助您调试网络问题。

© www.soinside.com 2019 - 2024. All rights reserved.