android ble和ios ble 对比,低功耗蓝牙的坑对比,低功耗蓝牙的总结

1.设备的蓝牙广播

   蓝牙是固定定时发送31个字节的广播。(最多31个字节,可以小于,根据公司自身需要有硬件研发烧录进去)。手机端打开蓝牙扫描,扫描到了设备的mac地址,但是这个mac地址是不能判断身份的,因为ios端每次开关蓝牙搜索到的设备mac可能都不一样。所以就需要统一固定31个字节里边的某些字节代表设备的id,当手机端搜索到了该字段就请求后台的数据判断这个设备的身份。

2. 手机端的扫描

   手机端的扫描最好不要轮询扫描,扫描是比较耗电,并且产生大量临时变量占用内存,最好的方式就是用到就扫描

    android有两个扫描回调,最好用  BluetoothAdapter.LeScanCallback

3. 连接设备    

    1) 连接的过程中:固件设备是从休眠到唤醒,并且唤醒并不是及时唤醒,需要一个时间。所以如果直接扫描开始连接的时候可能有概率连接失败。推荐的方法是扫描到设备,连接设备,连接service之前休眠600ms再连接这样概率比较高。

   2)扫描成功率:当然如果失败都会有重连的这么一个机制。酷派,360连接的速度最快。华为的手机连接过程至少需要2s左右,有些手机扫描不到比如华为畅享5手机升级一下就ok了,但是升级是需要sd卡升级,普通的内升级不行,需要查询华为官方论坛。ios全系列手机连接成功率都是很高的。

   3)固件升级过程中的坑 : 固件升级过程中,底层的连接参数是改动的,而上层手机端app是不知道的。如果在固件升级过程中连接会连接失败,如果不清除连接参数的缓存,会一直连接失败。android清除缓存如下

   public boolean refreshDeviceCache() {
        if (mBluetoothGatt != null) {
            try {
                Method localMethod = mBluetoothGatt.getClass().getMethod("refresh", new Class[0]);
                if (localMethod != null) {
                    boolean bool = ((Boolean) localMethod.invoke(mBluetoothGatt.new Object[0])).booleanValue();
                    return bool;
                }

            } catch (Exception localException) {
                Log.i("wangfeibles", "An exception occured while refreshing device");
            }
        }
        return false;
    }

  4 ) 通用连接参数

    android需要4个uuid保证连接完成 Service-> Notify->Descripter->write

     ios需要3个uuid保证连接完成Service->Notify->write

     注意:1》支付宝小程序中设置了descripter就支持android,不设置不支持。

              2》android的notify的uuid是两种设置,可以设置notify也可以设置indicator如果设置错了就无法收到设备回传数据的通知。需要和硬件研发沟通问问,或者自己用蓝牙测试工具测试出来

4. 传输数据

    1)分包发送。设备统一传送20个字节的数据包,如果大于20个字节就需要分包发送。onCharacteristicWrite 中进行判断,如果第一包数据已经发送会调用这个方法,这时在发送第二包数据

    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
//        if (mOnStateListener != null)
//            mOnStateListener.onStateChange(30000 + status);
        if (status == 0) {//第六步:写入第一包数据后睡眠,发送第二包数据
            if (tempCmd2 != null) {
//                try {
//                    Thread.sleep(50);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
                writeChar(tempCmd2);
            }
        }
    }

     其实在测试中对于部分华为手机可能分包发送的过程中休眠50ms再发送第二包数据,成功概率会更高

    2)数据格式。一般来说各个公司都有自己一套的数据格式大体上有这几部分组成

          判别码+功能码+个数+随机码+校验码

          判别码:是为了统一区分某一类设备,1-2个字节,

          功能码:是为了区别这个数据包的功能是什么方便双方进行互动

         个数是:为了接收方更好的确定数据包的长度,有头有尾,确保信息完整

          随机码:是防止数据被偷窥,对于蓝牙发送的数据肯定可以通过各种方式抓包看见的,如果每包的数据都是固定的很容易破解数据的内容。所以需要手机端和设备在传送数据的同时,加入几个随机的字节把整个数据包进行打乱。

          校验码:有时候在一些特殊的设备是不允许信息出错的,虽然蓝牙本身就已经进行了数据的校验,但是生产环境下会发现会出现数据抖动的情况,也就是明明发送的1234,结果对方却收到了2234.所以需要加入校验码。碰见情况比较多的会使用CRC16校验

5. 断开连接

   建议断开连接的时候,尽可能多清除一些东西,因为蓝牙缓存很容易造成各种各样的问题

public void close() {
        if (mBluetoothGatt != null) {
            mBluetoothGatt.disconnect();
            if (mBluetoothGatt != null) {
                mBluetoothGatt.close();
                if (mBluetoothGatt != null)
                    mBluetoothGatt = null;
            }
        }
        if (mBtAdapter != null) {
            if (mAddress != null && !mAddress.equals("")) {
                BluetoothDevice device = mBtAdapter.getRemoteDevice(mAddress);
                if (device != null) {
                    if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
                        try {
                            BleTool.removeBond(BluetoothDevice.class, device);//适配魅族某款手机
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    记得某款魅族手机yunOS系统,清除是比较麻烦的
          

      

猜你喜欢

转载自blog.csdn.net/qq_36017059/article/details/80893516