USB 串行驱动程序 Java 插件在 Unity Android 构建中不工作
USB Serial Driver Java Plugin not working in Unity Android build
我正在尝试使用 Unity 编辑器制作一个 Android 应用程序,以便从 USB 设备读取数据。我正在使用 Unity 2019.4.12f1,我正在构建的 android 设备是小米盒子 S,运行 Android 9.
到目前为止我所做的是使用 Android Studio 编译一些 java 代码以访问小米的 USB 端口。
我正在使用此存储库:https://github.com/mik3y/usb-serial-for-android 作为我要构建的库的基本功能。
这是我在 Java 库中编写的代码:
public class Plugin extends Activity {
private static UsbSerialPort port;
private static final int READ_WAIT_MILLIS = 2000;
public static String Initialize(Context unityContext) throws IOException {
UsbManager manager = (UsbManager) unityContext.getSystemService(Context.USB_SERVICE);
ProbeTable customTable = new ProbeTable();
customTable.addProduct(0x067b, 0x2303, CdcAcmSerialDriver.class);
UsbSerialProber prober = new UsbSerialProber(customTable);
List<UsbSerialDriver> availableDrivers = prober.findAllDrivers(manager);
if (availableDrivers.isEmpty()) {
return "Drivers list is empty";
}
// Open a connection to the first available driver.
UsbSerialDriver driver = availableDrivers.get(0);
UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
if (connection == null) {
return "Connection is null";
}
port = driver.getPorts().get(0); // Most devices have just one port (port 0)
port.open(connection);
port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
return "Connection Successful";
}
public static String ReadPort() throws IOException {
if(port == null || !port.isOpen())
return "Null";
byte[] buffer = new byte[8192];
int len = port.read(buffer, READ_WAIT_MILLIS);
return buffer.toString();
}
public static void CloseSerialPort() throws IOException {
if(port != null && port.isOpen())
port.close();
}
这是我在 Unity 端使用的 C# 代码:
void Start()
{
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");
AndroidJavaClass pluginClass = new AndroidJavaClass("com.hoho.android.usbserial.Plugin");
string response = pluginClass.CallStatic<string>("Initialize", context);
Debug.Log(response);
if (response.Contains("Successful"))
{
string read = pluginClass.CallStatic<string>("ReadPort");
Debug.Log(read);
}
else
{
Debug.Log("Init failed");
}
}
您可以看到我已经为我的设备创建了一个自定义“探测器”,其中包含它的供应商和产品 ID,因此理论上 Java 一方应该知道要寻找什么。不幸的是,代码执行后集合“availableDrivers”为空。
在 C# 方面,我正在为 Java 发送我的 unity activity 以获取它的上下文。我看到 USB 管理器需要该上下文才能实例化。我确实检查过,变量“unityContext”在从 C# 传递到 Java 库后不为空。现在我正在调查我发送给 Java 的上下文是否不正确,导致 USB 管理器无法访问 USB 设备。
我从 Java 代码中获取到 Unity 的 return 字符串是:“Drivers list is empty”,因此得出 USB 驱动程序列表为空的结论。
在正确方向上的任何帮助或任何类型的引导都会有所帮助。
PS。我检查过的东西:
- 我知道 USB 设备能够与 Android 设备通信,因为我使用应用程序检查过,一切正常。 (https://play.google.com/store/apps/details?id=de.kai_morich.serial_usb_terminal&hl=en)
我在这里回答我自己的问题。也许其他人会偶然发现这一点。
有几个问题我没有意识到:
- 如果设置为USB调试模式,小米USB接口将不会继续与传感器通信;
- 同样,即使关闭了小米USB调试模式,也无法正常工作。为了让它工作,我必须重新启动设备。
结论是,如果您使用的是小米盒子 S,请确保硬件连接正常,然后再开始更改代码。
要完成所有这些工作:
- 确保您了解 Java <-> C# 通信的工作原理;
- 您需要稍微熟悉 Android Studio 库构建;
- 按照我发布的回购协议中的说明进行操作。
此时你应该可以开始了。如果您需要任何进一步的帮助,请告诉我。
我正在尝试使用 Unity 编辑器制作一个 Android 应用程序,以便从 USB 设备读取数据。我正在使用 Unity 2019.4.12f1,我正在构建的 android 设备是小米盒子 S,运行 Android 9.
到目前为止我所做的是使用 Android Studio 编译一些 java 代码以访问小米的 USB 端口。
我正在使用此存储库:https://github.com/mik3y/usb-serial-for-android 作为我要构建的库的基本功能。
这是我在 Java 库中编写的代码:
public class Plugin extends Activity {
private static UsbSerialPort port;
private static final int READ_WAIT_MILLIS = 2000;
public static String Initialize(Context unityContext) throws IOException {
UsbManager manager = (UsbManager) unityContext.getSystemService(Context.USB_SERVICE);
ProbeTable customTable = new ProbeTable();
customTable.addProduct(0x067b, 0x2303, CdcAcmSerialDriver.class);
UsbSerialProber prober = new UsbSerialProber(customTable);
List<UsbSerialDriver> availableDrivers = prober.findAllDrivers(manager);
if (availableDrivers.isEmpty()) {
return "Drivers list is empty";
}
// Open a connection to the first available driver.
UsbSerialDriver driver = availableDrivers.get(0);
UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
if (connection == null) {
return "Connection is null";
}
port = driver.getPorts().get(0); // Most devices have just one port (port 0)
port.open(connection);
port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
return "Connection Successful";
}
public static String ReadPort() throws IOException {
if(port == null || !port.isOpen())
return "Null";
byte[] buffer = new byte[8192];
int len = port.read(buffer, READ_WAIT_MILLIS);
return buffer.toString();
}
public static void CloseSerialPort() throws IOException {
if(port != null && port.isOpen())
port.close();
}
这是我在 Unity 端使用的 C# 代码:
void Start()
{
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");
AndroidJavaClass pluginClass = new AndroidJavaClass("com.hoho.android.usbserial.Plugin");
string response = pluginClass.CallStatic<string>("Initialize", context);
Debug.Log(response);
if (response.Contains("Successful"))
{
string read = pluginClass.CallStatic<string>("ReadPort");
Debug.Log(read);
}
else
{
Debug.Log("Init failed");
}
}
您可以看到我已经为我的设备创建了一个自定义“探测器”,其中包含它的供应商和产品 ID,因此理论上 Java 一方应该知道要寻找什么。不幸的是,代码执行后集合“availableDrivers”为空。
在 C# 方面,我正在为 Java 发送我的 unity activity 以获取它的上下文。我看到 USB 管理器需要该上下文才能实例化。我确实检查过,变量“unityContext”在从 C# 传递到 Java 库后不为空。现在我正在调查我发送给 Java 的上下文是否不正确,导致 USB 管理器无法访问 USB 设备。
我从 Java 代码中获取到 Unity 的 return 字符串是:“Drivers list is empty”,因此得出 USB 驱动程序列表为空的结论。
在正确方向上的任何帮助或任何类型的引导都会有所帮助。
PS。我检查过的东西:
- 我知道 USB 设备能够与 Android 设备通信,因为我使用应用程序检查过,一切正常。 (https://play.google.com/store/apps/details?id=de.kai_morich.serial_usb_terminal&hl=en)
我在这里回答我自己的问题。也许其他人会偶然发现这一点。 有几个问题我没有意识到:
- 如果设置为USB调试模式,小米USB接口将不会继续与传感器通信;
- 同样,即使关闭了小米USB调试模式,也无法正常工作。为了让它工作,我必须重新启动设备。
结论是,如果您使用的是小米盒子 S,请确保硬件连接正常,然后再开始更改代码。
要完成所有这些工作:
- 确保您了解 Java <-> C# 通信的工作原理;
- 您需要稍微熟悉 Android Studio 库构建;
- 按照我发布的回购协议中的说明进行操作。
此时你应该可以开始了。如果您需要任何进一步的帮助,请告诉我。