我正在尝试使用 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 草图,它们双向通信不会出现问题。我在这里错过/忽略了什么?
以下源代码适用于我的系统。 基本上,它将服务器和客户端的网络地址设置为相同,即
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);
}