转载请注明来自:http://blog.csdn.net/icyfox_bupt/article/details/25487125

最近在实验室做项目,使用了Android的蓝牙开发,这里面有好多坑..所以还是希望能记下来这些东西和大家分享,不要再走我的老路了。


先说一下背景,我是开发手机与带蓝牙的智能设备(蓝牙血压计、血糖仪、手环等)设备对接的APP。也就是说,在设备端没有什么可以操作的,手机负责发起数据传输。

  1. 蓝牙连接,不需要配对

由于被曾经使用蓝牙的思路所误导,一直以为使用蓝牙是必须一个配对的过程的。实际上不是这样。搜索到设备以后,直接去connect设备而不去配对,目前在我这里是没问题的,搜索到设备以后,可以直接用一下代码进行连接:

    final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";     UUID uuid = UUID.fromString(SPP_UUID);     BluetoothSocket socket;      socket = device.createInsecureRfcommSocketToServiceRecord(uuid);adapter.cancelDiscovery();  socket.connect(); 这里的UUID是比较好用的一个,设备都可以识别。
  1. startDiscovey有可能启动失败

    一般程序中会有两步:开启蓝牙开始寻找设备。之前我写的代码是用户按下按钮就直接顺序执行这两步,导致的结果就是经常性搜索失败。仔细看了一下API,发现adapter.startDiscovery()函数是有一个boolean返回值的,也就是说如果启动失败就返回false。这就解释了为什么会启动失败了:顺序执行了开启蓝牙-寻找设备的步骤,但是由于蓝牙还没有完全打开,就开始寻找设备,导致寻找失败。于是最后我把代码改成了这样,问题解决:

    adapter = BluetoothAdapter.getDefaultAdapter();
    if (adapter == null)
    {     // 设备不支持蓝牙
    }
    // 打开蓝牙
    if (!adapter.isEnabled())
    {     adapter.enable();adapter.cancelDiscovery();
    }    // 寻找蓝牙设备,android会将查找到的设备以广播形式发出去
    while (!adapter.startDiscovery()){Log.e("BlueTooth", "尝试失败");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}
    }
    
  2. 接收数据转换

    使用socket.getInputStream接收到的数据是字节流,这样的数据是没法分析的。又由于一般来说厂家给的协议都是类似于"FA 22 89 D0"这样的十六进制数据,所以很多情况需要一个byte转十六进制String的函数:

    public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for ( int j = 0; j < bytes.length; j++ ) {int v = bytes[j] & 0xFF;hexChars[j * 2] = hexArray[v >>> 4];hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);}

Android蓝牙开发的一些经验相关推荐

  1. Android蓝牙开发系列文章-蓝牙设备类型知多少?

    在写<Android蓝牙开发系列文章-蓝牙音箱连接>时,计划细化出一篇讲解蓝牙设备类型的文章,现在它来了~ 阅读其他内容,可以点击<Android蓝牙开发系列文章-策划篇>,或 ...

  2. Android - 蓝牙开发

    文章目录 科普 SIG 类型 制式 选择 逻辑链路控制适配协议 (L2CAP) L2CAP的功能 蓝牙框架和 RFCOMM 协议 蓝牙安全 白名单机制 编程 蓝牙权限 Classic Bluetoot ...

  3. Android 蓝牙开发,申请打开蓝牙

    申请打开蓝牙 <!-- 蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" ...

  4. android蓝牙聊天设备,Android蓝牙开发——实现蓝牙聊天

    最近课上刚好需要做一个课程设计关于蓝牙的就挑选了个蓝牙聊天室,其实关键还是在于对蓝牙API的了解 一.蓝牙API 与蓝牙开发主要的相关类是以下四个 BluetoothAdapter 字面上则理解为蓝牙 ...

  5. Android蓝牙开发(一)之打开蓝牙和设备搜索

    Android蓝牙开发系列目录: https://blog.csdn.net/huangliniqng/article/details/82185635 一.判断是否系统是否支持蓝牙 在使用蓝牙之前, ...

  6. Android蓝牙开发系列文章-蓝牙mesh(一)

    在<Android蓝牙开发系列文章-策划篇>中我们对蓝牙专题的内容进行整体规划,现在让我们一点点揭开他的面纱~ 本文是关于蓝牙mesh的首篇文章,由好友CSDN博主yk150915提供,在 ...

  7. Android蓝牙开发 — 经典蓝牙BLE蓝牙

    一,前期基础知识储备 1)蓝牙是一种支持设备之间短距离通信的无线电技术(其他还包括红外,WIFI): 支持移动电话.笔记本电脑.无线耳机等设备之间进行信息的交换: Android支持的蓝牙协议栈:Bl ...

  8. Android 蓝牙开发(扫描设备、绑定、解绑)Kotlin版

    Kotlin版 蓝牙开发 (扫描设备.绑定.解绑) 前言 运行效果图 正文 ① 配置项目 ② 布局和样式 ③ 编码 1. 通知栏样式修改 2. 蓝牙设备列表适配器编写 3. 权限请求 4. 初始化蓝牙 ...

  9. Android 蓝牙开发(扫描设备、绑定、解绑)

    Android 蓝牙开发(扫描设备.绑定.解绑) 前言 效果图 一.配置项目 二.布局和样式 三.编码 四.源码 前言 公司最近给我丢了一个蓝牙开发的项目,不了解怎么办呢,那当然是从最基础的开始了,所 ...

最新文章

  1. 复制windows对话框内容的方法
  2. C++ 字符串中小写字母转换成大写字母
  3. 1.10a – 如何设计你的第一个程序
  4. vue 在进入某一个页面的时候,created方法不执行,----亲测,通俗易懂
  5. Gradle初探(一):创建一个Gradle项目
  6. C++ STL 三大组件(容器|算法|迭代器) 初步使用01
  7. 如何在React Native和Firebase中设置Google登录
  8. devops 数据库_DevOps世界中与数据库管理员合作的6种方法
  9. centos7 访问php页面显示源码_运维干货分享:centos7下源码编译安装php-7.1.5(脚本)...
  10. python实现将子文件夹下的图片复制到新的文件夹并重命名
  11. 《玩转D语言系列》三、轻松大跃进,把它当C语言先用起来
  12. Linux kernel kfifo分析【转】
  13. java二次开发考勤机_浩顺AC671指纹考勤机二次开发(demo)
  14. 啊哈C语言 第1章 编程改变思维(第0讲)
  15. LNK2005 protected: virtual int __thiscall CDataView::OnInitDialog(void) (?OnInitDialog@CDataVie
  16. Qt QTreeView 详解
  17. EasyExcel 实现单元格数据下拉选
  18. React Native UI渲染流程分析(Android)
  19. 教你如何关闭“你要打开此文件吗”的安全警告弹窗?
  20. 如何自定义Android推送提示音,让你的应用与众不同

热门文章

  1. xoy面上两直线交点算法
  2. 如何让CSDN博客的代码高亮显示
  3. 个人阅读作业-阅读和调研
  4. 计算机硬件保留内存,为硬件保留的内存:8G
  5. 怎样做研究(六) 刘挺
  6. 与君共勉_一个女孩的创业史
  7. 2015年中国“互联网+”体育研究
  8. 在12C中通过新增的一个ASM-scrubbing功能
  9. 医用红外额温枪测温仪方案
  10. Objective-c语言_数组练习题2: