【问题标题】:Xamarin Android Bluetooth Socket Connection failsXamarin Android 蓝牙套接字连接失败
【发布时间】:2016-10-28 13:37:19
【问题描述】:

我正在尝试创建一个示例 Xamarin Android 应用程序以通过蓝牙连接设备。

当我尝试连接蓝牙插座时出现以下错误

  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Users/builder/data/lanes/3819/96c7ba6c/source/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
  at Java.Interop.JniEnvironment+InstanceMethods.CallVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00084] in /Users/builder/data/lanes/3819/96c7ba6c/source/Java.Interop/src/Java.Interop/Java.Interop/JniEnvironment.g.cs:11643 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeAbstractVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00017] in /Users/builder/data/lanes/3819/96c7ba6c/source/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:15 
  at Android.Bluetooth.BluetoothSocket.Connect () [0x00000] in /Users/builder/data/lanes/3819/96c7ba6c/source/monodroid/src/Mono.Android/platforms/android-24/src/generated/Android.Bluetooth.BluetoothSocket.cs:141 
  at Bluetooth.Droid.Activities.Bluetooth.BluetoothActivity.PairedDevicesListView_ItemClick (System.Object sender, Android.Widget.AdapterView+ItemClickEventArgs e) [0x00094] in C:\Git\Bluetooth\Bluetooth\Bluetooth.Droid\Activities\Bluetooth\BluetoothActivity.cs:92 
  --- End of managed Java.IO.IOException stack trace ---
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
    at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:517)
    at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:528)
    at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:320)
    at mono.android.widget.AdapterView_OnItemClickListenerImplementor.n_onItemClick(Native Method)
    at mono.android.widget.AdapterView_OnItemClickListenerImplementor.onItemClick(AdapterView_OnItemClickListenerImplementor.java:30)
    at android.widget.AdapterView.performItemClick(AdapterView.java:305)
    at android.widget.AbsListView.performItemClick(AbsListView.java:1146)
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3053)
    at android.widget.AbsListView$3.run(AbsListView.java:3860)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5343)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

您可以在https://github.com/sstechGitHost/Bluetooth.git找到我的示例

谢谢, 纳希德

【问题讨论】:

    标签: android sockets xamarin bluetooth connection


    【解决方案1】:

    您正在与另一台设备不支持的 UUID 配对的问题。这是解决此问题的示例代码。请记住,此解决方案可能需要一些稳健性,这只是概念证明。人们说 FetchUuidsWithSdp 不是很稳定,所以你可能想注册广播动作来获取 UUID 或类似的东西。现在是代码。 而不是

    BluetoothSocket btSocket = btDevice.CreateRfcommSocketToServiceRecord(UUID.FromString("00001101-0000-1000-8000-00805F9B34FB"));
    

    我用过

    ParcelUuid[] uuids = null;
                    if (btDevice.FetchUuidsWithSdp())
                    {
                        uuids = btDevice.GetUuids();
                    }
                    if ((uuids != null) && (uuids.Length > 0))
                    {
                        foreach (var uuid in uuids)
                        {
                            try
                            {
                                btSocket = btDevice.CreateRfcommSocketToServiceRecord(uuid.Uuid);
                                btSocket.Connect();
                                break;
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("ex: " + ex.Message);
                            }
                        }
                    }
    

    并且能够使用 UUID 连接到另一台设备

    0000111f-0000-1000-8000-00805f9b34fb    
    00001132-0000-1000-8000-00805f9b34fb    
    00000000-deca-fade-deca-deafdecacafe
    

    但不是“ 串行”你正在使用。

    【讨论】:

    • 另外,您的可移植类库使用命名空间蓝牙,这会在智能上造成一些混乱。您可能想要重命名它。
    • 我试过你的改变,它有效。但是我不确定为什么 FetchUUIDSWithSdp() 返回这么多 uuid。我一接通就退出循环。我还在 github 中推送了一个具有非混淆命名空间的新项目。可以下载github.com/sstechGitHost/BluetoothDemo.git 至此我已经实现了扫描、配对和socket连接。我现在期待设备之间的数据交换。如果有任何指针,请随时更新源代码。非常感谢。
    • 如果可行,请接受答案。如果您将来有更多问题,您可以发布新问题
    • @YuriS 运行您的代码时出现以下错误。我的有什么问题吗? java.io.IOException: 读取失败,套接字可能关闭或超时,读取 ret
    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2014-03-28
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多