蓝牙模块

ble4.2 支持一主都从,手机是主,而后锁是从,一个手机能够链接多个蓝牙,可是一个蓝牙只能被一个手机链接
若是是ble5.0,那么支持多对多

1. 权限
2.获取蓝牙适配器并打开蓝牙,开启蓝牙
3. 扫描蓝牙
4. 蓝牙设备的配对
5. 蓝牙通讯

问题:
android6.0之后蓝牙权限问题:https://blog.csdn.net/tangxl2008008/article/details/51334604


蓝牙配对的时候两边都会同时产生一个密钥,确认密钥


蓝牙扫描Api区别:https://blog.csdn.net/panade/article/details/82620941
BluetoothAdapter.startDiscovery()//能够扫描经典蓝牙和ble蓝牙两种
BluetoothAdapter.startLeScan()//扫描低功耗蓝牙,在api21已经弃用,不过仍是能够使用
BluetoothLeScanner.startScan()//新的ble扫描方法
html

==================================================================================================
BluetoothAdapter 标识基本本机蓝牙设备
扫描之后获取BluetoothDevice,标识扫描到的蓝牙设备
而后BluetoothDevice调用链接方法之后获取BluetoothGatt对象,链接蓝牙

链接成功之后调用    mGatt.discoverServices(); 发现服务
public void onServicesDiscovered(BluetoothGatt gatt, int status) {} 回调发现服务和特征值


public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status){}
读取特征值,这里才是真的读取,必需要在onServicesDiscovered方法中调用readCharacteristic()
 特征值: 可读、可写、可订阅


  public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {} 蓝牙发送psw2到app
  ble->app


  psw1: 12个字节   psw2:4个字节  psw1+psw2 = key 16个字节
发送鉴权帧: 用key加密 systemId(旧的用mac地址替代)
蓝牙锁收到之后发送psw3给App

使用Mac地址链接:final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(deviceMac);

==========================================
入网:  App 链接锁之后, 锁进入入网模式-》生成psw2发送给App,
App从服务获取psw1, 经过mac地址或者sn
psw1做用,用于解密psw2
App获取psw2之后请求服务器, psw2+mac+userId绑定蓝牙设备该用户
App回复Ack到锁, 锁提示入网成功

App和蓝牙鉴权:
App经过Mac地址连蓝牙设备
从服务器获取该蓝牙设备的psw2,psw1
App链接蓝牙设备之后,锁等待鉴权30S内,30S过了,断开超时
APP发送鉴权信息, psw1+psw2加密 systemId(旧版本加密mac地址发送给锁)
锁收到之后鉴权成功生成psw3, 发送psw3给app,
App 会ack

APP和蓝牙通讯:
  使用 psw1+psw3加密数据发送,
  心跳包不用加密

App和蓝牙解绑:
  锁进入用户管理模式,退出网络,
  发送退网针,使用psw1+psw3加密数据,
  锁回ACK
  删除 psw2


  psw1是死的存在服务器
  每次绑定都须要生成psw2
  每次链接都须要鉴权生成psw3



==========================================
android

OTA升级: 补丁升级
DFU升级: 刷机
api