【问题标题】:Xamarin.Forms - read failed, socket might closed or timeout, read ret: -1Xamarin.Forms - 读取失败,套接字可能关闭或超时,读取 ret:-1
【发布时间】:2017-09-26 18:58:22
【问题描述】:

目前我正在尝试在标签打印机 RPP320 上连接和打印文本。我正在使用 C# 和 Xamarin.Forms。

所以我有 3 种不同的方式连接到打印机,但都失败了。

foreach (var parcelUuid in parcelUuids)
{
    mBluetoothAdapter.CancelDiscovery();
    //METHOD A

    try
    {
        var method = Device.GetType().GetMethod("createRfcommSocket");
        mmSocket = (BluetoothSocket)method.Invoke(Device, new object[] { Port });
        mmSocket.Connect();
        Debug.WriteLine("Connected...");
        isConnected = true;
        DoDeviceConnected();
        break;
    }
    catch (Exception e)
    {

    }

    //METHOD B

    try
    {
        var method = Device.GetType().GetMethod("createInsecureRfcommSocket");
        mmSocket = (BluetoothSocket)method.Invoke(Device, new object[] { Port });
        mmSocket.Connect();
        Debug.WriteLine("Connected...");
        isConnected = true;
        DoDeviceConnected();
        break;
    }
    catch (Exception e)
    {

    }

}

if (!isConnected)
{
    //METHOD C

    try
    {
        IntPtr createRfcommSocket = JNIEnv.GetMethodID(Device.Class.Handle, "createRfcommSocket", "(I)Landroid/bluetooth/BluetoothSocket;");
        // JNIEnv.GetMethodID(device.Class.Handle, "createRfcommSocket", "(I)Landroid/bluetooth/BluetoothSocket;");
        IntPtr _socket = JNIEnv.CallObjectMethod(Device.Handle, createRfcommSocket, new global::Android.Runtime.JValue(Port));
        mmSocket = Java.Lang.Object.GetObject<BluetoothSocket>(_socket, JniHandleOwnership.TransferLocalRef);
        /*
        mmSocket =
            mBluetoothAdapter.GetRemoteDevice(Device.Address)
                .CreateRfcommSocketToServiceRecord(
                    UUID.FromString("00001101-0000-1000-8000-00805F9B34FB"));
        */
        mmSocket.Connect();
        DoDeviceConnected();
    }
    catch (IOException connectException)
    {

        Debug.WriteLine("IO Error: " + connectException.Message);
        // Unable to connect; close the socket and get out
        try
        {
            mmSocket.Close();
        }
        catch (IOException closeException)
        {
            Debug.WriteLine("Error: " + closeException.Message);
        }
        throw new Exception(connectException.Message);
        return;
    }
}
  • 在方法 A 中,此代码为 method 变量返回 null => var method = Device.GetType().GetMethod("createRfcommSocket");
  • 在方法 B 中,此代码为 method 变量返回 null => var method = Device.GetType().GetMethod("createInsecureRfcommSocket");
  • 在方法 C 中,此代码 => mmSocket.Connect(); 抛出异常:

{Java.IO.IOException: 读取失败,套接字可能关闭或超时, 读取 ret: -1 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] 在 :0 处 Java.Interop.JniEnvironment+InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference 实例,Java.Interop.JniMethodInfo 方法,Java.Interop.JniArgumentValue* args) [0x00069] in :0 在 Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeAbstractVoidMethod (System.String 编码成员,Java.Interop.IJavaPeerable 自我, Java.Interop.JniArgumentValue* 参数)[0x00014] 在 :0 在 Android.Bluetooth.BluetoothSocket.Connect () [0x0000a] 在 :0 在 DemoApp.Droid.Printing.ConnectThread.ProbeConnection() [0x001a4] 在 D:\DemoApp - 旧\DemoApp\DemoApp\DemoApp.Android\Printing\ConnectThread.cs:203 --- 托管 Java.IO.IOException 堆栈跟踪结束 --- java.io.IOException:读取失败,套接字可能关闭或超时,读取 ret:-1 在 android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:907) 在 android.bluetooth.BluetoothSocket.waitSocketSignal(BluetoothSocket.java:866) 在 android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:540) 在 md5270abb39e60627f0f200893b490a1ade.ButtonRenderer_ButtonClickListener.n_onClick(Native 方法)在 md5270abb39e60627f0f200893b490a1ade.ButtonRenderer_ButtonClickListener.onClick(ButtonRenderer_ButtonClickListener.java:30) 在 android.view.View.performClick(View.java:6199) 在 android.widget.TextView.performClick(TextView.java:11090) 在 android.view.View$PerformClick.run(View.java:23647) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6724) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) }

我不确定问题出在哪里,我是否应该继续使用这种方法并尝试修复它并更改我连接到打印机的方式。

我在 stackoverflow 和其他平台上发现了有关此问题的其他几个问题,但其中大多数问题是我们使用 Java 编写的解决方案,或者不适用于我的情况。

提前感谢您的帮助!

【问题讨论】:

    标签: c# .net printing bluetooth xamarin.forms


    【解决方案1】:

    我找到了另一种方法。下面是代码:

    if (this.mBluetoothAdapter.IsEnabled)
    {
        BluetoothDevice device = this.mBluetoothAdapter.GetRemoteDevice(Device.Address);
    
        var serialUUID = UUID.FromString("00001101-0000-1000-8000-00805f9b34fb");
    
        BluetoothSocket socket = device.CreateRfcommSocketToServiceRecord(serialUUID);
        socket.Connect();
    }
    

    这个对我有用。

    我不认为这是连接的最佳选择,但它是一种解决方法,同时我使用以前的代码找到了解决方案。

    【讨论】:

      【解决方案2】:

      我刚刚找到了一种让它工作的方法:D

      IntPtr createRfcommSocket = JNIEnv.GetMethodID(mmDevice.Class.Handle, "createRfcommSocket", "(I)Landroid/bluetooth/BluetoothSocket;");
      IntPtr _socket = JNIEnv.CallObjectMethod(mmDevice.Handle, createRfcommSocket, new global::Android.Runtime.JValue(1));
      socket = Java.Lang.Object.GetObject<BluetoothSocket>(_socket, JniHandleOwnership.TransferLocalRef);
      

      试一试!

      【讨论】:

      • 我刚刚对其进行了测试,但它再次失败,出现相同的异常“读取失败,套接字可能关闭或超时,读取 ret:-1”。我不确定问题是来自代码还是电话/打印机。仍然可以与其他应用程序一起使用相同的打印机和手机,因此必须是代码。仍然很奇怪,我不确定我错过了什么。
      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 2017-06-05
      相关资源
      最近更新 更多