如何使用dot42连接蓝牙SPP?

时间:2013-09-12 19:26:05

标签: android bluetooth dot42

在阅读了dot42注释并拖拽Java示例后,我设法建立了蓝牙连接但无法打开连接。我无法确定问题。我一步一步地跟着文档。

我的目标设备是在2.3 Gingerbread上运行的HTC Explorer。这是我的代码。

//Target 2.3 (Gingerbread)
[assembly: Application("dot42Application1")]

[assembly: UsesPermission(Android.Manifest.Permission.BLUETOOTH)]
[assembly: UsesPermission(Android.Manifest.Permission.BLUETOOTH_ADMIN)]

namespace dot42Application1
{
    [Activity]
    public class MainActivity : Activity
    {

        private TextView txStatus;

        protected override void OnCreate(Bundle savedInstance)
        {
            base.OnCreate(savedInstance);
            SetContentView(R.Layouts.MainLayout);

            // Find UI controls
            txStatus = FindViewById<TextView>(R.Ids.txStatus);

            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 

            var bt = BluetoothAdapter.GetDefaultAdapter();

            if (bt != null) //If device has not Bluetooth this will be null
            {
                if (bt.IsEnabled()) //Is Bluetooth device enabled?
                {
                    var BT_My_Addr = bt.Address; //Get the devices MAC
                    var BT_Bonded = bt.GetBondedDevices().ToList(); //Get a list of bonded devices- I bonded to a BT2TTL Board earlier.

                    txStatus.Text = BT_My_Addr + System.Environment.NewLine; //Shows my MAC on screen.

                    string BT_Remote_Address = string.Empty;
                    foreach (var BTDevice in BT_Bonded) //Just searchging for string in bonded list
                    {
                        if (BTDevice.Name.Contains("linvor"))  
                        {
                            BT_Remote_Address = BTDevice.Address;
                        }
                    }

                    //Gets remote device
                    var BT_Remote_Device = bt.GetRemoteDevice(BT_Remote_Address);

                    //Create a RFCOMM Socket to remote device using popular UUID ofr BT Serial boards
                    var BTsocket = BT_Remote_Device.CreateInsecureRfcommSocketToServiceRecord(Java.Util.UUID.FromString("00001101-0000-1000-8000-00805F9B34FB"));

                    //Call anyway to make sure there is no discvoerry in the backgorund. It slows stuff down.
                    bt.CancelDiscovery(); 

                    //Exception here? Dont know why :(
                    BTsocket.Connect();

                    //Suppsoed to dump 0 to 99999 to my listening serial device but I never get this far.
                    var BT_Out = BTsocket.GetOutputStream();
                    for (int i = 0; i < 99999; i++)
                    {
                        BT_Out.Write(Encoding.ASCII.GetBytes(i.ToString()));

                    }


                }
                else
                {
                    txStatus.Text = "Bluetooth is disabled :(";
                }

            }
        }
    }

这就是它在创建套接字后显示的内容

enter image description here

和错误......

enter image description here

我做错了什么? :(

1 个答案:

答案 0 :(得分:1)

我似乎通过分析互联网上的各种代码片段解决了这个问题。我认为问题是试图用OnCreate方法做所有事情。我遵循的步骤如下:

  • 在主视图(MainActivity.xml)上创建了一个按钮,并附加了一个onClick方法。

enter image description here

  • 移动了OnCreate方法的所有代码。 (我认为这允许应用程序完全初始化。)使用两种方法为按钮创建了一个事件处理程序。

enter image description here

  • 这两种方法与我在原始问题中发布的代码相同。只需将它们分开并在用户单击按钮时调用。
    • findBT()获取默认适配器。检查蓝牙是否已启用,如果没有意图过滤器。或者如果是,它将遍历绑定列表并匹配设备名称并将BluetoohDevice存储在变量中。 这是另一件与我的代码不同的东西。我不使用GetRemoteDevice我只是将BondedList中的设备分配给我的全局变量。

enter image description here

enter image description here

  • openBT()创建了RFCOMM套接字(这不适用于不安全 - 它引发了异常,但使用了安全方法!)

enter image description here

您必须使用Androids蓝牙控制面板与远程设备配对。此代码不会扫描或连接到未配对的设备。它只会抛出空例外。

我还离开了目标SDK 2.3.x,但我使用的是4.x API。

-Disclosure。我不是一个经验丰富的Android开发人员,只是在Android环境中了解Java应用程序的生命周期。我希望这可以帮助其他C#开发人员尝试这样做。