转载请注明来自: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);}

更多相关文章

  1. 腾讯微博java(android) sdk 数据更新相关api详细介绍
  2. 安卓数据库sqlite增删查改—模拟用户登录与管理(2020-6-19)
  3. Android(安卓)ContentProvider的线程安全(一)
  4. android SQLite实现本地登录注册功能,SQLite简单应用(android stu
  5. Android数据库的操作之存储和获取
  6. 收藏老罗的----------Android应用程序组件Content Provider简要
  7. mac os x中android无法连接手机的解决方案
  8. android Logger 一二三
  9. 在iPhone 和 Android设备上,HTML5的关于键盘的输入类型

随机推荐

  1. Android(安卓)AOP(三):在Android中Javassi
  2. 移动端判断是android手机还是ios手机
  3. Android ArrayAdapter的使用
  4. Android:EventBus-3 基本使用
  5. 【Android】Fragment将废弃onActivityCre
  6. Gradle使用手册
  7. linux 下编译 vlc
  8. FregClient进程,创建一个BpFregService类
  9. 【转】android让普通app不被其他程序kill
  10. Android 阻断adb install