一、Android 中进行蓝牙开发需要用到的类和执行过程
1,使用BluetoothAdapter.startLeScance来扫描设备
2,在扫描到设备的回调函数中的得到BluetoothDevice 对象,并使用Bluetooth.stopLeScan停止扫描
3,使用BluetoothDevice.connectGatt来获取到BluetoothGatt对象
4,执行BluetoothGatt.discoverServices,这个方法是异步操作,在回调函数onServicesDiscovered中得到status,通过判断status是否等于BluetoothGatt.GATT_SUCCESS来 判断查找Service是否成功
5,如果成功了,则通过BluetoothGatt.getService来获取BluetoothGattService
6,接着通过BluetoothGattService.getCharacteristic获取BluetoothGattCharacteristic
7,然后通过BluetoothGattCharacteristic.getDescriptor获取BluetoothGattDescriptor
二、收发数据
收发数据是通过GATT,GATT是通过蓝牙收发数据的一种协议,包含Characteristic,Descriptor,Service 三个属性值,BLE 分为三个部分Service , Characteristic ,Descriptor 这三个部分都是由UUID做为唯一的标识符,一个蓝牙终端可以包含多个Service ,一个Service 可以包含多个Characteristic ,一个Characteristic 包含一个Value 和多个Descriptor,一个Descriptor包含一个Value
三、上代码(有些工具类是在其他文件里面,我这里没有在改了,直接复制上来了)
MainActivice.java:
BluetoothManager bluetoothManager; BluetoothAdapter mBluetoothAdapter;
Intent intentBluetoothLeService = new Intent();
//低功耗蓝牙的文件名 public static String BLUETOOTHSERVICE = "com.boe.navapp.remote.BluetoothLeService";
bluetoothManager = (BluetoothManager) MainActivity.this .getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) { if (!(CommonUtil.isServiceRunning(MainActivity.this, Constants.BLUETOOTHSERVICE))) { intentBluetoothLeService = new Intent(MainActivity.this, BluetoothLeService.class); startService(intentBluetoothLeService); } }
// 判断当前服务是否启动 public static boolean isServiceRunning(Context mContext, String className) { boolean isRunning = false; ActivityManager activityManager = (ActivityManager) mContext .getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningServiceInfo> serviceList = activityManager .getRunningServices(70); if (!(serviceList.size() > 0)) { return false; } for (int i = 0; i < serviceList.size(); i++) { if (serviceList.get(i).service.getClassName().equals(className) == true) { isRunning = true; break; } } return isRunning; }
BluetoothLeService.java:(這里我讲下主要代码,文件我会传上去)
public final static String REMOTE_CONNECT_STATUS = "REMOTE_CONNECT_STATUS";// 当前选择的遥控器连接状态
public final static String REMOTE_CONNECTED_DEVICES = "REMOTECONNECTEDDEVICES";// 存储已经连接的设备列表
public final static String REMOTE_DEVICE_INFO = "REMOTEDEVICEINFO";
public final static String REMOTE_CURR_ADDR = "REMOTECURRADDR";// 当前连接设备的地址
public final static String ACTION_GATT_REMOTESEVEN_DISCONNECTED = "com.infisight.hudprojector.bluetooth.le.ACTION_GATT_REMOTESEVEN_DISCONNECTED";
private static final String SP_NAME = "address";
@Override public void onCreate() { super.onCreate(); LogTools.i(TAG, "BluetoothLeService onCreate"); prefs = PreferenceManager.getDefaultSharedPreferences(this); telMgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); prefs.edit().putBoolean(Constants.REMOTE_CONNECT_STATUS, false) .commit(); LogTools.i(TAG, "BluetoothLeService before SaveUtils.loadArray"); addressList = SaveUtils.loadArray(this, SP_NAME); //存放连接的地址 GetDeviceInfo(); LogTools.i(TAG, "BluetoothLeService GetDeviceInfo"); }
/** * 获取设备信息 lstNeedConnectDevices */ private void GetDeviceInfo() { String connectedinfo = prefs.getString( Constants.REMOTE_CONNECTED_DEVICES, ""); if (!connectedinfo.equals("")) { Gson gson = new Gson();