Android 和 OSX 之间本地网络上的 OSC 通信

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

我正在尝试使用 OSC 在台式计算机 (OSX) 和 Android 手机之间进行通信,它们都连接到同一 wifi 网络。我正在使用 oscP5 库进行处理,但我认为代码中的一切都很好 - 我认为这是地址问题或 Android 方面的权限问题。

这是我的计算机/桌面代码:

import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;
int colour = 255;

void setup()
{
  size(600, 600);

  /* start oscP5, listening for incoming messages at port 1200 */
  oscP5 = new OscP5(this,1200);
  println(this);
  
  /* the address of this device */
  myRemoteLocation = new NetAddress("127.0.0.1",1300);
}


void draw()
{
  background(0);
  
  fill(colour);
  circle(width/2, height/2, 200);
  
  int i = int(random(0, 200));
  if (i == 1) sendmessage();
}


void sendmessage()
{
  /* create the message */
  OscMessage myMessage = new OscMessage("/one");
  color c = color(random(0, 255), random(0, 255), random(0, 255));
  myMessage.add(c);
  
  /* send the message */
  println("Sending message: " + myMessage);
  oscP5.send(myMessage, myRemoteLocation); 
}


/* incoming osc message are forwarded to the oscEvent method */
void oscEvent(OscMessage theOscMessage)
{
  colour = theOscMessage.get(0).intValue();
}

运行没有问题,并在控制台中给出:

### [2024/11/7 17:12:20] PROCESS @ OscP5 stopped.
### [2024/11/7 17:12:20] PROCESS @ UdpClient.openSocket udp socket initialized.
### [2024/11/7 17:12:21] PROCESS @ UdpServer.start() new Unicast DatagramSocket created @ port 1200
### [2024/11/7 17:12:21] PROCESS @ UdpServer.run() UdpServer is running @ 1200
### [2024/11/7 17:12:21] INFO @ OscP5 is running. you (192.168.0.106) are listening @ port 1200

由于某种原因,它没有声明 ip 是 127.0.0.1,而是给出了 192.168.0.106 - 这是计算机的 ip,因此两者都指向同一设备,但 Android 的做法有所不同(见下文)。

这是在 Android 手机上运行的代码:

import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;
int colour = 255;


void setup()
{
  size(600, 600);

  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this,1300);
  println(this);
  
  /* the address of this device */
  myRemoteLocation = new NetAddress("127.0.0.1",1200);
}


void draw()
{
  background(0);
  
  fill(colour);
  circle(width/2, height/2, 200);
  
  int i = int(random(0, 200));
  if (i == 1) sendmessage();
}


void sendmessage()
{
  /* create the message */
  OscMessage myMessage = new OscMessage("/two");
  color c = color(random(0, 255), random(0, 255), random(0, 255));
  myMessage.add(c);

  /* send the message */
  println("Sending message: " + myMessage);
  oscP5.send(myMessage, myRemoteLocation); 
}


/* incoming osc message are forwarded to the oscEvent method */
void oscEvent(OscMessage theOscMessage)
{
  colour = theOscMessage.get(0).intValue();
}

清单具有互联网和wifi权限,如下

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="">
    <application android:icon="@mipmap/ic_launcher" android:label="">
        <activity android:exported="true" android:name=".MainActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

这也可以毫无问题地运行并在控制台中给出:

### [2024/11/7 17:29:23] PROCESS @ OscP5 stopped.
### [2024/11/7 17:29:23] PROCESS @ UdpClient.openSocket udp socket initialized.
### [2024/11/7 17:29:24] PROCESS @ UdpServer.start() new Unicast DatagramSocket created @ port 1300
### [2024/11/7 17:29:24] PROCESS @ UdpServer.run() UdpServer is running @ 1300
### [2024/11/7 17:29:24] INFO @ OscP5 is running. you (127.0.0.1) are listening @ port 1300

但是,请注意 127.0.0.1 IP 地址。

两个草图都运行,但彼此不通信。如果我在台式计算机上与计算机草图一起运行 Android 草图,它们双向通信不会出现问题。我在这里错过/忽略了什么?

java android udp processing osc
1个回答
0
投票

以下源代码适用于我的系统。 基本上,它将服务器和客户端的网络地址设置为相同,即

  oscP5 = new OscP5(this,1300);  
  myRemoteLocation = new NetAddress("127.0.0.1",1300);

如果您进行了大量测试,地址有时会变得“过时”,Android 端会告诉您该地址已在使用中。 在这种情况下,我会尝试将双方设置为另一个数字,但对服务器和客户端使用相同的数字。 我记得过去在使用 oscP5 时遇到了困难,并且从未完全弄清楚;很难获得可重复且一致的结果。 我记得有一种方法可以确定终端正在使用哪些端口,但我现在不记得该怎么做。 我使用的代码如下。 两个系统上的圆圈颜色都发生了变化,控制台日志显示数据从另一侧传入每个系统。

处理应用程序:

import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;
int colour = 255;

void setup() {
  size(600, 600);
  /* start oscP5, listening for incoming messages at port 1300 */
  oscP5 = new OscP5(this,1300);  
  myRemoteLocation = new NetAddress("127.0.0.1",1300);
}

void draw() {
  background(0);
  
  fill(colour);
  circle(width/2, height/2, 200);
  
  int i = int(random(0, 200));
  if (i == 1) sendmessage();
}

void sendmessage() {
  /* create the message */
  OscMessage myMessage = new OscMessage("/one");
  color c = color(random(0, 255), random(0, 255), random(0, 255));
  myMessage.add(c);
  
  /* send the message */
  println("Sending message: " + myMessage);
  oscP5.send(myMessage, myRemoteLocation); 
}

/* incoming osc message are forwarded to the oscEvent method */
void oscEvent(OscMessage theOscMessage) {
  colour = theOscMessage.get(0).intValue();
}

安卓应用程序:

import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;
int colour = 255;

void setup() {
  size(600, 600);
  /* start oscP5, listening for incoming messages at port 1300 */
  oscP5 = new OscP5(this,1300);  
  myRemoteLocation = new NetAddress("127.0.0.1",1300);
}

void draw() {
  background(0);
  
  fill(colour);
  circle(width/2, height/2, 200);
  
  int i = int(random(0, 200));
  if (i == 1) sendmessage();
}

void sendmessage() {
  /* create the message */
  OscMessage myMessage = new OscMessage("/two");
  color c = color(random(0, 255), random(0, 255), random(0, 255));
  myMessage.add(c);

  /* send the message */
  println("Sending message: " + myMessage);
  oscP5.send(myMessage, myRemoteLocation); 
}

/* incoming osc message are forwarded to the oscEvent method */
void oscEvent(OscMessage theOscMessage) {
  colour = theOscMessage.get(0).intValue();
  println("in",colour);
}
© www.soinside.com 2019 - 2024. All rights reserved.