实现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端连接请求的方法:

if (connected)
                {
                    return;
                }
                try
                {
                    mBThServer = myBluetoothAdapter
                            .listenUsingRfcommWithServiceRecord(NAME_SECURE,
                                    MY_UUID_SECURE);
                } catch (IOException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                try
                {
                    mBTHSocket = mBThServer.accept();
                } catch (IOException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try
                {
                    mBufferedReader = new BufferedReader(new InputStreamReader(
                            mBTHSocket.getInputStream()));
                } catch (IOException e1)
                {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }// 取得输入、输出流
                try
                {
                    mPrintStream = new PrintStream(
                            mBTHSocket.getOutputStream(), true);
                    connected = true;
                } catch (IOException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

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

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设备,但这样貌似是不行的。因为这个库本身提供的方法不够底层...总之还想再研究下。

        有任何问题欢迎讨论

时间: 2024-10-31 08:49:39

实现Android和PC之间的蓝牙通信的相关文章

android和js之间的bridge通信原理是什么

问题描述 android和js之间的bridge通信原理是什么 android webview和js之间的bridge通信原理是什么,最近只是简单的用到github上的一个库,请大神帮忙解答下. 解决方案 不是webview 吗 解决方案二: 没怎么研究过这个问题,

android apk 和全站仪通过蓝牙通信

问题描述 android apk 和全站仪通过蓝牙通信 android apk 和全站仪通过蓝牙通信测试,这个具体是一个什么样的实现思路 解决方案 Ble4.0?通信测试测试啥?如果用蓝牙实现通信功能的话,需要硬件和软件配合,类似于穿戴那种,至于如何实现,硬件:单片机(arm)+ble,软件:apk+支持ble的手机.

android-关于Android蓝牙通信的问题

问题描述 关于Android蓝牙通信的问题 想实现Android 和PC之间的蓝牙通信,在网上查找后发现有手机端和PC端两个代码要写,但是我不知道PC端的代码是写在手机端的那个APP里,还是单独再创建一个APP写作新的APP里面 解决方案 最近同学要做一个手机与蓝牙模块的通信的毕业设计,让我帮忙写一个手机端的应用,匆匆的找了些资料,总算是能勉强实现通信,总结一些关键的步骤:首先,android蓝牙通信步骤:1:打开蓝牙2:搜索蓝牙设备3:选择设备进行配对(连接前必须先配对)4:对配对好的设备建立

蓝牙开发之从手机走向PC【4】——手机与PC之间的通信

前面几篇文章写的都是手机和手机之间怎样通过蓝牙互连通信,这篇文章开始讲一下怎么利用蓝牙技术实现手机和PC之间的通信连接,完成这一步后我们可以进一步在此通信基础上开发类似于控制电脑的手机遥控器. 其实笔者后来感觉这篇文章其实也没多少要写的了,原因是从手机转移到PC的难度不在于编码,而在于J2SE本身未提供对JSR-82规范的实现.所以,问题的关键是怎么在J2SE平台上能支持蓝牙应用的开发.在此,后来笔者在网上找到了一个开源组件Bluecove.jar包,该Jar包实现了JSR- 82规范,将其作为

PC电脑和Android模拟器访问及模拟器之间tcp/udp通信

Android系统默认只能通过IP(10.0.2.2)单向访问PC电脑,而PC电脑不能通过IP来直接访问Android模拟器系统.要想实现PC电脑和Android模拟器系统以及Android模拟器之间相互通信必须借助端口重定向(redir)来实现. 先说说端口重定向所需要的telnet客户端安装: windows: 安装telnet客户端.如果没有安装,可以在windows程序管理中的打开或关闭系统功能下找到telnet客户端菜单项来启用telnet客户端功能. linux: 自行安装telne

《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.7节蓝牙通信

2.7 蓝牙通信 Android 3D游戏开发技术宝典--OpenGL ES 2.0 随着硬件设备价格的不断降低,大部分智能手机上都已配备了蓝牙网络模块,Android设备也是如此.如果能为一些小型的休闲娱乐游戏增加蓝牙联网对战的功能,将会大大增加游戏的可玩性.本节将向读者详细介绍如何在Android平台下开发具有蓝牙互联功能的应用程序. 2.7.1 蓝牙通信的基本知识 蓝牙是一种支持设备短距离通信(一般是10m以内)的无线技术,其数据传输时不仅不需要连线,而且传输速率也比传统手持设备的红外模式

Android实现Activity之间通信的方法_Android

本文实例讲述了Android实现Activity之间通信的方法.分享给大家供大家参考.具体如下: 在一个Activity中可以使用系统提供的startActivity(Intent intent)方法打开新的Activity,在打开新的Activity前,你可以决定是否为新的Activity传递参数. 第一种:打开新的Activity,不传递参数 public class MainActivity extends Activity { @Override public void onCreate

Android蓝牙通信概述

通常情况下,我们对蓝牙的操作主要有:开启和关闭蓝牙.搜索周边设备.能被周边设备所发现.获取配对设备.蓝牙设备间的数据传输. 1.打开蓝牙(当然首先要确保你的手机是有蓝牙设备的) 蓝牙设备主要分为两部分,一部分为本地设备,另一部分为远程设备. BluetoothAdapter--本地设备,对蓝牙操作首先就需要有一个BluetoothAdapter实例.常用的几个方法如下: cancelDiscovery()--取消本地蓝牙设备的搜索操作,如果本地设备正在进行搜索,那么调用该方法后将停止搜索操作.

通讯-如何实现单片机与PC之间的通信

问题描述 如何实现单片机与PC之间的通信 想用opencv编写识别程序,与atmega128通讯,来控制机械臂抓取物体 用一根USB串口转接线连接单片机和笔记本电脑 怎么实现通讯(单独编程?还是可以安装什么软件?) 求大神们帮帮忙~万分感谢 解决方案 单片机与PC 直接最常用的就是串口通讯了 解决方案二: 串口通信,有 SerialPort 解决方案三: 这个要和硬件的设计方协调,用什么协议,什么接口. 解决方案四: 各种语言基本都有串口组件,有代源码的,你可以研究一下,就明白,其实都是wind