实现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,其中多数的类库和方法都能找到。


复制代码

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,是标记硬件地址的一种方法。

复制代码

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

       有任何问题欢迎讨论

       

     


作者:热情的沙漠
出处:http://www.cnblogs.com/buptzym/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


本文转自FerventDesert博客园博客,原文链接:X http://www.cnblogs.com/buptzym/archive/2011/09/07/2169858.html,如需转载请自行联系原作者

目录
相关文章
|
24天前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
92 4
|
7月前
|
Android开发
Android JNI与CAN通信遇到的问题总结
Android JNI与CAN通信遇到的问题总结
273 1
|
7月前
|
JavaScript Java Android开发
uniapp通过蓝牙传输数据 (安卓)
uniapp通过蓝牙传输数据 (安卓)
336 1
|
7月前
|
XML 物联网 API
Android Ble蓝牙App(五)数据操作
Android Ble蓝牙App(五)数据操作
724 0
|
3月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
386 4
|
4月前
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
208 1
|
5月前
|
Java Android开发 Spring
Android Spingboot 实现SSE通信案例
【7月更文挑战第14天】以下是使用Android和Spring Boot实现SSE(Server-Sent Events)通信的案例摘要: 在`MainActivity`中: - 初始化界面元素并设置按钮点击事件。 - `startSseRequest`方法创建`WebClient`对象,设置请求头,发送请求,并处理响应和错误。 请确保将`your-server-url`替换为实际的服务器地址。
131 14
|
4月前
|
Android开发
Android项目架构设计问题之C与B通信如何解决
Android项目架构设计问题之C与B通信如何解决
22 0
|
4月前
|
移动开发 前端开发 weex
Android项目架构设计问题之模块化后调用式通信如何解决
Android项目架构设计问题之模块化后调用式通信如何解决
21 0
|
5月前
|
Dart Android开发 Windows
Flutter和Native 通信 android端
Flutter和Native 通信 android端