实现Android和PC之间的蓝牙通信

随笔- 35  文章- 0  评论- 200 

实现Android和PC之间的蓝牙通信

       这两天想实现PC和安卓手机的通信,限于水平,知道的方法大概有两种:基于数据包的socket和蓝牙。虽然看起来简单,但调也调了两天多。自己测试了下socket,在室内WIFI环境下时延大概是0.1s。而在3G网络下时延居然达3s之多,而且只要不发数据,端口貌似就会断掉,总之,很不爽。于是,便考虑了蓝牙的方法。

  实现手机和PC的蓝牙通信,一种是最常用的蓝牙虚拟串口,这种方法可以通过配置非常简单地实现,很多外置蓝牙GPS都用这种做法。但大名鼎鼎的安卓却不支持,因此对大部分外置GPS都不提供支持(可能安卓手机大部分包含内置GPS,觉得外置的太鸡肋了)。因此必须采用第二种,蓝牙socket。

      在电脑上,实在不想去在C++下开发,于是便寻找.NET组件,但实际上微软的NET库中不支持蓝牙,因此必须采用第三方的控件,名字叫inthehand.

      这篇文章中详细的介绍了inthehan

d组件,http://www.cnblogs.com/procoder/archive/2009/09/22/1571580.html。由于它讨论了实现文件传输的思路,我们在这篇文章中就只讨论简单的字符传输。

       它的官方网站是inthehand.net,其中多数的类库和方法都能找到。

 下面是手机端的初始化代码。其中的具体含义可参照http://android.tgbus.com/Android/tutorial/201103/346657.shtml

复制代码
    private PrintStream mPrintStream = null;
    private BufferedReader mBufferedReader = null;

    BluetoothAdapter myBluetoothAdapter = null;
    BluetoothServerSocket mBThServer = null;
    BluetoothSocket mBTHSocket = null;



    myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        myBluetoothAdapter.enable();//open bth

        Intent discoverableIntent = new Intent(
                BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//使得蓝牙处于可发现模式,持续时间150s
        discoverableIntent.putExtra(
                BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 150);
复制代码

 下面是PC上的初始化核心代码:PC是作为客户端出现的。它需要通过搜索获取手机的蓝牙MAC地址,实现通信。GUID又名UUID,是标记硬件地址的一种方法。

复制代码

   /// <summary>
        /// 打开端口
        /// </summary>
        /// <param name="Name">端口名称</param>
        /// <returns>成功否</returns>
        public bool OpenPort(string Name)
        {

            InTheHand.Net.Bluetooth.BluetoothRadio.PrimaryRadio.Mode = InTheHand.Net.Bluetooth.RadioMode.Connectable;
            InTheHand.Net.Sockets.BluetoothClient cli = new InTheHand.Net.Sockets.BluetoothClient();
            InTheHand.Net.Sockets.BluetoothDeviceInfo[] devices = cli.DiscoverDevices();
            foreach (InTheHand.Net.Sockets.BluetoothDeviceInfo device in devices)//设备搜寻
            {
                device.Update();
                device.Refresh();
                MessageBox.Show("设备已找到");
                break;
            }

 


            BluetoothDeviceInfo bd = new BluetoothDeviceInfo(devices[0].DeviceAddress);
            bluetoothClient = new BluetoothClient();


            Guid mGUID = Guid.Parse("fa87c0d0-afac-11de-8a39-0800200c9a66");
            bluetoothClient.Connect(devices[0].DeviceAddress, mGUID);//客户端对地址实现连接,这是一个阻塞线程,需要服务器端的回应

            ReceiveThread = new Thread(ReceiveMethod);
            ReceiveThread.Start();

 

            return true;
        }

复制代码

        下面是手机接受PC端连接请求的方法:

View Code
 1     if (connected)
 2                 {
 3                     return;
 4                 }
 5                 try
 6                 {
 7                     mBThServer = myBluetoothAdapter
 8                             .listenUsingRfcommWithServiceRecord(NAME_SECURE,
 9                                     MY_UUID_SECURE);
10                 } catch (IOException e)
11                 {
12                     // TODO Auto-generated catch block
13                     e.printStackTrace();
14                 }
15 
16                 try
17                 {
18                     mBTHSocket = mBThServer.accept();
19                 } catch (IOException e)
20                 {
21                     // TODO Auto-generated catch block
22                     e.printStackTrace();
23                 }
24                 try
25                 {
26                     mBufferedReader = new BufferedReader(new InputStreamReader(
27                             mBTHSocket.getInputStream()));
28                 } catch (IOException e1)
29                 {
30                     // TODO Auto-generated catch block
31                     e1.printStackTrace();
32                 }// 取得输入、输出流
33                 try
34                 {
35                     mPrintStream = new PrintStream(
36                             mBTHSocket.getOutputStream(), true);
37                     connected = true;
38                 } catch (IOException e)
39                 {
40                     // TODO Auto-generated catch block
41                     e.printStackTrace();
42                 }

   要通过手机发送数据,执行以下代码即可:

复制代码
        mPrintStream.write(buff);
                } catch (IOException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }// 发送给服务器
                mPrintStream.flush();
复制代码

    PC端的接受代码:

复制代码
  while (isConnecting)
            {

                try
                {
                    Stream peerStream = bluetoothClient.GetStream();
                    peerStream.Read(buffer, 0, PACKETLENGTH);
                  //dataprocess();
                }


                catch (Exception ex)
                {
                    isConnecting = false;
                    MessageBox.Show(ex.ToString());

                }
复制代码

  这里要注意以下几个小问题,但也就是这几个问题,耽误了我很久时间:

      inthehand.net.personal是PC端上一定要用得到的库,但注意这个库函数的版本,我一开始用了的dll是600K左右的,编译没问题,运行就会报错,提示找不到dll。但后来左思右想,才发现还有另外的一个同名dll,150K左右,换过来以后一切OK,太坑爹了!

        手机设备的蓝牙硬件权限要打开,否则就没法运行。

        还有我特想将手机做个蓝牙HID设备,但这样貌似是不行的。因为这个库本身提供的方法不够底层...总之还想再研究下。

        有任何问题欢迎讨论

        

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要实现Android手机与PC之间蓝牙数据传输,可以按照以下步骤进行操作: 1. 在Android手机上,首先需要开启蓝牙功能。这可以通过在应用程序中请求蓝牙权限并使用蓝牙适配器(BluetoothAdapter)来实现。 2. 在PC端,确保蓝牙适配器已连接并且可用。如果PC上没有内置蓝牙适配器,您可以使用USB蓝牙适配器。 3. 在Android手机上,编写一个蓝牙客户端应用程序。你可以使用Android的BluetoothSocket类来实现PC之间通信。使用该类,您可以连接到PC设备的蓝牙服务器,并通过输入输出流来发送和接收数据。 4. 在PC上,您需要编写一个蓝牙服务器应用程序。使用带有SPP(串行端口配置文件)的蓝牙适配器,您可以将PC设备设置为接受来自Android客户端的蓝牙连接。在PC服务器应用程序中,使用输入和输出流来处理与Android手机之间的数据交换。 5. 建立蓝牙连接后,Android客户端可以通过输出流将任何要发送给PC的数据写入,并通过输入流从PC接收数据。 6. 在整个过程中,确保在AndroidPC之间蓝牙通信中使用相同的UUID(通用唯一标识符),以便两者能够匹配并建立连接。 请注意,以上步骤仅提供了一个基本的框架,具体的实现可能因您的需求而有所不同。您可能需要根据实际情况进行适当的修改和调整。同时,请确保在开发过程中执行错误处理和异常处理,以提高应用程序的稳定性和可靠性。 ### 回答2: 要实现Android蓝牙客户端和PC之间的数据传输,可以采用以下步骤: 1. 在Android设备上,首先确保蓝牙功能已经打开。可以通过编程方式检查蓝牙是否可用,并请求用户打开蓝牙。 2. 使用Android蓝牙API建立蓝牙连接。可以使用BluetoothAdapter类来获取本地蓝牙适配器,然后使用该适配器启动设备发现。 3. 在PC上,也需要确保蓝牙适配器已经连接到PC上,并且蓝牙功能已经启用。 4. 在PC上,使用蓝牙软件来搜索附近的蓝牙设备。找到Android设备后,可以进行配对和连接。 5. 在Android设备上,使用BluetoothSocket类来建立与PC之间的数据通道。可以使用createRfcommSocketToServiceRecord方法来创建一个RFCOMM(串口)通信的socket,并将其连接到PC蓝牙设备。 6. 在PC上,接受来自Android设备的连接请求,并建立连接后,可以使用已匹配的蓝牙设备和RFCOMM服务在PC上创建一个监听器。 7. 一旦连接建立,就可以在Android设备和PC之间传输数据。可以使用输入流和输出流来读取和写入数据。 8. 在结束数据传输后,记得关闭连接并释放资源,以便其他设备可以重新连接。 总结来说,要实现Android蓝牙客户端和PC之间的数据传输,需要打开蓝牙功能、建立蓝牙连接、创建数据通道并传输数据。请注意,具体的实现方式可能会因为不同的蓝牙设备和操作系统版本而有所差异。因此,建议查阅相关的Android蓝牙编程文档和PC蓝牙操作指南以获得更详细的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值