安卓 蓝牙BLE开发(持续更新)

蓝牙BLE开发其实是要通过三方(加上后台就是四方了) , 手机端 嵌入式工程师, 蓝牙模块厂商  ,还有后台。

在开发之前 首先你要跟蓝牙模块厂商确定 UUID 是否如文档中描述的一样,  以及蓝牙模块是双模还是单模,

要跟你的 嵌入式工程师沟通好 发送字节数组的 结构 以及返回 字节数组的结构  我们的是 一条命令 有10个字节,


如果你的嵌入式工程师不够专业,你需要知道 发送一条10个字节的命令 返回的字节命令是有限制的,不论 嵌入式工程师发送出去的数据有多快

他都是要走蓝牙模块的,而这个蓝牙模块根据BCM90以及BCM99都是有限制的, 意思也就是说,当你想要发送一条 10字节的命令 而让嵌入式工程师

给你返回24条每条为10个字节的命令 那是不可能的,因为返回的数据总字节有240个 而BCM90蓝牙模块拿到包装嵌入式工程师返回给你的 数据

是有字节限制的,BCM90蓝牙模块一次只能返回最多20个字节,就说BCM99模块安卓方面没有字节限制,以后会测试下。


2016/5/18

蓝牙BLE的 BluetoothGatt  主要是调度 与蓝牙仪器各种状态的 具体操作在其必须要实现的方法中

在实际 开发中 BluetoothGattService更加重要 因为有时候你发明明跟 蓝牙仪器建立了连接 但是就是发送不了消息

BluetoothGattService= BluetoothGatt.getService(SERVIE_UUID);

有时候 BluetoothGattService 无论如何都是空 那是因为 蓝牙模块传感器不亮了 重启仪器吧


筛选UUID篇

有时候会有这样的需求,就是会让你只搜索自己公司的蓝牙设备 ,这个时候就要用到

final UUID SERVIE_UUID = UUID
        .fromString("000018f0-0000-1000-8000-00805f9b34fb");
UUID[] uuids = {SERVIE_UUID};

adapter.startLeScan(uuids,mLeScanCallback);

试过的同学都知道 这个方法 是不可能实现的 官方API上是这样说 filter yourself  没错 就是让 你自己过滤

于是我开始上 STACKOVERFLOW上找老外是怎么实现这个需求的 但是发现他们的意思就是 UUID 需要传递16BIT的 就可以了

(话说谁知道怎么商城 16BIT的 UUID可以交流下) 所以我已经放弃提前筛选了

我选择在回调的时候 进行筛选 虽然很简单 但是浪费了好久。。。。在网上根本就找不到 相关正确答案,具体代码如下

if (Build.VERSION.SDK_INT < 18) {
    showToast("手机版本不支持蓝牙BLE");
    JiaQuanLianjie.this.finish();
} else {
    mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
            System.out.println("查看解析的字节数组" + toHexString1(scanRecord));
            if (!devices.contains(device)) {
                if (toHexString1(scanRecord).contains("18f0")) {
                    devices.add(device);
                }

            }
        }
    };

这是我加了一个判断 有些手机的API 低于18直接进来声明 这个回调 会直接崩溃,所以 我的回调 就是先声明

然后 INITVIEW()中 进行判断 如果大于 才进行赋值

大家可以看这个回调内部的方法中 最后一个参数

byte[] scanRecord)
我们就是要解析这个 然后过滤其中看是否包含你们自己的UUID,解析代码如下

/**
 * 数组转成十六进制字符串
 *
 * @param b
 * @return HexString
 */
public static String toHexString1(byte[] b) {
    StringBuffer buffer = new StringBuffer();
    for (byte aB : b) {
        buffer.append(toHexString1(aB));
    }
    return buffer.toString();
}

public static String toHexString1(byte b) {
    String s = Integer.toHexString(b & 0xFF);
    if (s.length() == 1) {
        return "0" + s;
    } else {
        return s;
    }
}
以上就是 蓝牙筛选中遇到的坑~


 








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值