Android蓝牙开发的一些经验

转载 2015年11月18日 00:21:36


转载请注明来自: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蓝牙开发的一些经验

Android蓝牙开发的一些经验 最近在实验室做项目,使用了Android的蓝牙开发,这里面有好多坑..所以还是希望能记下来这些东西和大家分享,不要再走我的老路了。 先说一下背景,我是开发手...
  • icyfox_bupt
  • icyfox_bupt
  • 2014年05月10日 16:18
  • 28120

一些数据库优化方面的经验

用PreparedStatement 一般来说比Statement性能高:一个sql 发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存 “inert into user values(1...
  • lixiaoming000
  • lixiaoming000
  • 2013年10月29日 15:29
  • 1181

SQL数据库优化经验

一、人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统D...
  • emailqjc
  • emailqjc
  • 2009年08月05日 11:34
  • 6057

android 传统蓝牙开发 (附示例源码)

1、获得BluetoothAdapter; 2、询问用户打开蓝牙(推荐)或直接bluetoothAdapter.enable(); 3、查询已绑定设备,发现新设备; 4.1、服务端,监听请求; 4.2...
  • Qiao_Jim
  • Qiao_Jim
  • 2017年06月10日 22:23
  • 1891

SQL数据库优化方面的经验

1、用PreparedStatement一般来说比用Statement性能高,一个sql发给服务器去执行,涉及步骤:语法检查,语义分析,编译,缓存。 2、有外键约束会影响插入和删除性能,如果程序能够保...
  • daodaipsrensheng
  • daodaipsrensheng
  • 2016年08月29日 10:42
  • 5487

符合1-2年android工作经验,开发中的难点及相关优化

1.sqlite升级步骤:     1.自己写一个类继承自SqliteOpenHelper     2.会实现SqliteOpenHelper的两个方法 onCreate与onUpgrad...
  • u010623588
  • u010623588
  • 2016年04月06日 22:22
  • 1434

Android ble低功耗蓝牙开发

在Android4.3(API等级18)平台上开始支持低功耗蓝牙中央设备角色,而且提供可供应用去发现服务、查询服务和读写特性的相关API接口。与传统蓝牙相比,低功耗蓝牙的设计对电量消耗更低,这允许An...
  • KjunChen
  • KjunChen
  • 2015年12月17日 11:46
  • 5840

Android无线蓝牙开发总结

蓝牙(Bluetooth)是一种短距离的无线通信技术标准。这个名子来源于10世纪丹麦国王Harald Blatand,英文名子是Harold Bluetooth。(一)蓝牙的四层协议      蓝牙协...
  • wenzhi20102321
  • wenzhi20102321
  • 2016年12月25日 17:06
  • 1499

安卓蓝牙开发的一些经验和教训

目前有很多人开始进行低功耗蓝牙BLE进行开发,BLE主要应用于可穿戴设备,这个可以查标准协议,就不多说了。     还有一种情况是用BLE实现类似传统蓝牙SPP功能。其实,我个人是不建议用这种方法的...
  • zhong__wenxin
  • zhong__wenxin
  • 2014年11月24日 15:09
  • 1220

Android蓝牙开发实战总结

公司最近的项目是一款带投影的智能Android手表开发,提及到穿戴设备,便携设备以及车载多媒体肯定设计到蓝牙开发。对于一般的软件开发人员,蓝牙基本不会用到,或许只用来传文件。其实蓝牙不仅仅可以做这些,...
  • axinmeng88
  • axinmeng88
  • 2018年01月14日 21:34
  • 82
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android蓝牙开发的一些经验
举报原因:
原因补充:

(最多只允许输入30个字)