用Android 开发一个应用,其中想使用蓝牙来做数据交换。
先查了一下资料,感觉还算简单,于是就开始了一整天的痛苦历程。
基本上用discover之类的能够很快的发现对方的蓝牙设备,但是在
建立socket的时候,就出了一堆问题。刚开始,服务端用
adapter.listenUsingRfcommWithServiceRecord
加上某个UUID来监听,同时获得serverSocket,客户端用
serverDevice.createRfcommSocketToServiceRecord
来获取socket,然后就在 socket.connect的时候,出了很多
奇怪的错误。
最开始是 Service discovery failed ,
然后是 connection refused,
然后是 File descriptor in bad state
总之搜索了一下,确实千奇百怪的错误都有。后来看到有人用
Method m = serverDevice.getClass().getMethod( "createRfcommSocket", new Class[]{int.class});
BluetoothSocket socket = (BluetoothSocket) m.invoke( serverDevice, Integer.valueOf( 1));
据说能解决,尝试了一下,也是有时成功有时失败,极不稳定。
再后来,仔细考虑了一下,其实 createRfcommSocket 这个方法,指定连接的是 1号端口,
而服务端则还是用UUID来启动服务,至于其绑定了哪个端口,其实是不可知的。
最开始客户端用 createRfcommSocketToServiceRecord 这个方法,其实是利用UUID去找到
相应的服务,只不过不知道是不是我的UUID的问题,导致它找不到,所以报 service discovery failed这个错。
而直接用反射的方法去访问 1号端口,如果凑巧服务端也是在1号端口监听,那就没问题。如果不是,
并且没有服务在监听,就会报connection refused这个错。如果有别的服务在监听,然后又不理解
我的这个协议,就会报 File descriptor in bad state 这个错。
想明白了,解决起来也就容易。办法是在启动服务的时候,也用反射
Method listenMethod = btClass.getMethod("listenUsingRfcommOn", new Class[]{int.class});
BluetoothServerSocket returnValue = ( BluetoothServerSocket) listenMethod.invoke(btAdapter, new Object[]{ 29});
我在服务器和客户端都用29端口,然后就稳定下来了。
花了一整天的时间,真是无语。
分享到:
相关推荐
android蓝牙封装代码
在Android系统中,蓝牙通信是实现设备间无线数据交换的重要技术。特别是在穿戴设备领域,如智能手表、健康监测器等,蓝牙通信使得这些设备能够与手机或其他设备进行数据同步和交互。本文将深入探讨Android系统如何...
在Android平台上进行蓝牙开发,尤其是实现蓝牙连接到打印机的功能,是一项技术性较强的任务。下面将详细阐述这个过程中涉及的关键知识点。 首先,理解Android蓝牙API是基础。Android提供了BluetoothAdapter类,它是...
在Android平台上,蓝牙低功耗(Bluetooth Low Energy,简称BLE或Bluetooth LE)技术被广泛用于设备间的通信,尤其是在物联网(IoT)应用中。"Android蓝牙连接设备demo"是一个示例项目,它演示了如何使用Android SDK...
Android 蓝牙开发步骤详解 Android 蓝牙开发步骤是一个复杂的过程,它涉及到硬件、Linux 内核、库、框架和应用程序等多个方面。在本文中,我们将详细介绍 Android 蓝牙开发的步骤,从硬件到应用程序的所有方面。 ...
Android 蓝牙map协议连接流程图(上层),将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发走向,代码流程更加形象生动,能够很快的熟悉Android 蓝牙源码,利于后面问题处理和BUG解决
在Android平台上,蓝牙Serial Port Profile (SPP) 是一种用于设备间进行串行数据通信的协议,常用于连接蓝牙模块或其他支持SPP的设备,如打印机、传感器等。本示例是一个Android蓝牙SPP传输的Demo,它展示了如何在...
在Android平台上,蓝牙通信是一种常见的无线技术,用于设备间的短距离数据交换。"android蓝牙聊天源代码"项目提供了一个很好的实例,帮助开发者了解如何在Android应用程序中实现蓝牙聊天功能。以下将详细介绍这个...
在Android平台上进行蓝牙开发是一项常见的任务,特别是在构建物联网(IoT)应用或设备通信时。本文将深入探讨如何使用Android SDK中的Bluetooth API来创建一个蓝牙客户端。首先,我们需要理解蓝牙技术的基本概念,然后...
在Android平台上,实现蓝牙打印功能是一项实用的技术,尤其对于那些需要在移动设备上输出文本或图像的应用来说。本文将深入探讨如何在Android应用中集成蓝牙打印功能,支持图片和文字打印,以及如何自定义页面大小和...
【C#与Android之间的蓝牙通信】是移动设备间交互的重要技术之一,特别是在物联网(IoT)和嵌入式系统中广泛应用。本示例是通过C#编写的应用程序与Android设备进行蓝牙连接,实现数据传输,如图片、语音和文字等。这种...
在Android平台上,蓝牙HID(Human Interface Device)协议的开发是一项关键的技术,它允许设备如鼠标、键盘或扫描枪等通过蓝牙与手机进行交互。本文将深入探讨Android蓝牙HID协议开发的相关知识点,并提供实现手机...
在Android平台上,蓝牙通信是一种常见的无线数据传输方式,尤其适用于短距离、低功耗的应用场景。UUID(Universally Unique Identifier)在蓝牙通信中扮演着关键角色,它是一种全球唯一的标识符,用于区分不同的蓝牙...
在Android平台上,蓝牙通信是一种常见的数据传输方式,尤其适用于设备之间的短距离通信。"android蓝牙间传输demo"是一个示例项目,它展示了如何在Android设备之间通过蓝牙进行数据交换。这个项目的重点在于理解和...
在Android平台上,蓝牙技术是设备间无线通信的重要组成部分,尤其在移动应用开发中扮演着不可或缺的角色。本项目"Android蓝牙,配对,搜索,连接,通信,断开的Demo"是一个使用Kotlin编写的Android应用示例,它涵盖...
在Android平台上进行蓝牙通信是一项常见的任务,特别是在物联网(IoT)应用中,设备间的无线通信至关重要。本示例将详细讲解如何在Android上构建一个蓝牙通信系统,包括客户端和服务端的实现。 首先,理解蓝牙通信的...
在Android平台上,实现“蓝牙耳机录音”涉及到一系列的系统服务、API接口以及音频处理技术。以下将详细解析这个过程,并提供关键知识点。 首先,我们来理解“Sco”(Short Range Communication)模式。Sco是蓝牙...
Android 蓝牙 A2DP播放AVDTP连接,音乐从audio到A2dp蓝牙侧,流程图。非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙...
在Android平台上,实现蓝牙连接打印机是一项常见的高级应用技术。这个源码包提供了具体的实现示例,可以帮助开发者深入了解如何在Android设备上与蓝牙打印机进行通信。本文将深入解析这个项目中的关键知识点,帮助...
在Android平台上,蓝牙技术是设备间通信的重要方式,特别是在物联网(IoT)设备和移动设备交互的场景中。本文将详细解析如何实现Android蓝牙扫描,包括注册蓝牙扫描广播、使用LeScanCallback回调以及ScanCallback回调...