BLE通信(转)

来源:互联网 发布:初中化学仿真实验软件 编辑:程序博客网 时间:2024/05/03 16:19

新手刚接触蓝牙4.0,好不容易实现了读取蓝牙上的步数,体重上的数据和血压计的数据。网上资料真的很难找。
扫描蓝牙设备的Activity
public class DeviceScanActivity extends ListActivity {

private final static int REQUEST_ENABLE_BT = 1;private boolean mScanning;private LeDeviceListAdapter mLeDeviceListAdapter;private Handler mHandler;private BluetoothAdapter mBluetoothAdapter;private static final long SCAN_PERIOD = 10000;public static int MY_ACCESS_COARSE_LOCATION = 7895;boolean mHasPermission = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    //getActionBar().setTitle(R.string.title_device);    if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {        Toast.makeText(this, R.string.ble_not_support, Toast.LENGTH_SHORT).show();        finish();    }    BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);    mBluetoothAdapter = bluetoothManager.getAdapter();    if (mBluetoothAdapter == null) {        Toast.makeText(this, R.string.error_bluetooth_not_support, Toast.LENGTH_SHORT).show();        finish();        return;    }    if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION)!=PackageManager.PERMISSION_GRANTED){        mHasPermission = false;    }else {        mHasPermission = true;    }    if(!mHasPermission) {        //申请ACCESS_COARSE_LOCATION权限        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},                MY_ACCESS_COARSE_LOCATION);        Toast.makeText(this, "do not has ACCESS_COARSE_LOCATION Permission!!!", Toast.LENGTH_LONG).show();    }    mHandler = new Handler();    scanLeDevice(true);}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);    doNext(requestCode, grantResults);}private void doNext(int requestCode, int[] grantResults) {    if (requestCode == MY_ACCESS_COARSE_LOCATION) {        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {            // Permission Granted 允许授予的权限            // Initializes a Bluetooth adapter.  For API level 18 and above, get a reference to            // BluetoothAdapter through BluetoothManager.            final BluetoothManager bluetoothManager =                    (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);            mBluetoothAdapter = bluetoothManager.getAdapter();            // Checks if Bluetooth is supported on the device.            if (mBluetoothAdapter == null) {                //Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();                finish();                return;            }            //mHasPermission = true;        } else {            // Permission Denied            Toast.makeText(this, "No Permission!!!", Toast.LENGTH_LONG).show();            //mHasPermission = false;            finish();        }    }}@Overrideprotected void onResume() {    super.onResume();    if (mHasPermission) {        if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {            Intent enableBtIntent = new Intent(mBluetoothAdapter.ACTION_REQUEST_ENABLE);            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);        }        mLeDeviceListAdapter = new LeDeviceListAdapter();        setListAdapter(mLeDeviceListAdapter);        scanLeDevice(true);    }}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    if(requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED){        finish();        return;    }    super.onActivityResult(requestCode, resultCode, data);}@Overrideprotected void onPause() {    super.onPause();    mLeDeviceListAdapter.clear();    scanLeDevice(false);}public void scanLeDevice(final boolean enable){    if(enable){        mHandler.postDelayed(new Runnable() {            @Override            public void run() {                mScanning = false;                mBluetoothAdapter.stopLeScan(mLeScanCallback);                invalidateOptionsMenu();            }        },SCAN_PERIOD);        mScanning = true;        mBluetoothAdapter.startLeScan(mLeScanCallback);    }else {        mScanning = false;        mBluetoothAdapter.stopLeScan(mLeScanCallback);    }    invalidateOptionsMenu();}private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {    @Override    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {        runOnUiThread(new Runnable() {            @Override            public void run() {                mLeDeviceListAdapter.addDevice(device);                mLeDeviceListAdapter.notifyDataSetChanged();            }        });    }};public class LeDeviceListAdapter extends BaseAdapter{    private ArrayList<BluetoothDevice> mLeDevices;    private LayoutInflater mInflater;    public LeDeviceListAdapter(){        super();        mLeDevices = new ArrayList<BluetoothDevice>();        mInflater = DeviceScanActivity.this.getLayoutInflater();    }    public void addDevice(BluetoothDevice device){        if(!mLeDevices.contains(device)){            mLeDevices.add(device);        }    }    public void clear(){        mLeDevices.clear();    }    public BluetoothDevice getDevice(int position){        return mLeDevices.get(position);    }    @Override    public int getCount() {        return mLeDevices.size();    }    @Override    public Object getItem(int position) {        return mLeDevices.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View view, ViewGroup parent) {        ViewHolder viewHolder;        if(view == null){            viewHolder = new ViewHolder();            view = mInflater.inflate(R.layout.listitem_device,null);            viewHolder.deviceName = (TextView)view.findViewById(R.id.receiver_data_display);            viewHolder.deviceAddress = (TextView)view.findViewById(R.id.device_address_display);            view.setTag(viewHolder);        }else {            viewHolder = (ViewHolder)view.getTag();        }        BluetoothDevice device = mLeDevices.get(position);        final String deviceName = device.getName();        if(deviceName != null && deviceName.length()>0)            viewHolder.deviceName.setText(deviceName);        else            viewHolder.deviceName.setText(R.string.unknow_device);        viewHolder.deviceAddress.setText(device.getAddress());        return view;    }}public class ViewHolder {    TextView deviceName;    TextView deviceAddress;}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {    final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position);    if(device == null) return;    Intent intent = new Intent(this,DeviceControlActivity.class);    intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_NAME,device.getName());    intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_ADDRESS,device.getAddress());    if(mScanning){        mScanning = false;        mBluetoothAdapter.stopLeScan(mLeScanCallback);    }    startActivity(intent);}

}

管理设备和显示数据的Activity
public class DeviceControlActivity extends Activity {

public static final String EXTRAS_DEVICE_NAME = "DEVICE_NAME";public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS";private String mDeviceName;private String mDeviceAddress;private TextView mConnectionState;private TextView mBattery;private TextView mBleBattery;private TextView mManufacturer;private TextView mStepCount;private TextView mBodyWeight;private TextView mShrink;private TextView mDiastole;private TextView mHeartRate;private TextView mRange;//private ExpandableListView mGattServicesList;private BluetoothLeService mBluetoothLeService;private MyThread mt = null;private double weight;private boolean finish = true;private boolean mConnected = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.gatt_services_characteristics);    Intent intent = getIntent();    mDeviceName = intent.getStringExtra(EXTRAS_DEVICE_NAME);    mDeviceAddress = intent.getStringExtra(EXTRAS_DEVICE_ADDRESS);    mBattery = (TextView)findViewById(R.id.battery);    mBleBattery = (TextView)findViewById(R.id.ble_battery);    mManufacturer = (TextView)findViewById(R.id.manufacturer);    mStepCount = (TextView)findViewById(R.id.step_count);    mBodyWeight = (TextView)findViewById(R.id.body_weight);    mShrink = (TextView)findViewById(R.id.shrink);    mDiastole = (TextView)findViewById(R.id.diastole);    mHeartRate = (TextView)findViewById(R.id.heart_rate);    mRange = (TextView)findViewById(R.id.range);    ((TextView) findViewById(R.id.device_address)).setText(mDeviceAddress);    mConnectionState = (TextView) findViewById(R.id.connection_state);    getActionBar().setTitle(mDeviceName);    getActionBar().setDisplayHomeAsUpEnabled(true);    Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);    bindService(gattServiceIntent, conn, BIND_AUTO_CREATE);}private Handler mHandler = new Handler() {    @Override    public void handleMessage(Message msg) {        switch (msg.what) {            case 1:                String battery = msg.getData().getString("battery");                if (battery != null) {                    Log.d("demo", String.valueOf(Integer.parseInt(battery, 16)));                    int level = Integer.parseInt(battery, 16);                    mBleBattery.setText(level + "%");                }                break;            case 2:                String manufacturer = msg.getData().getString("manufacturer");                if (manufacturer != null) {                    mManufacturer.setText(manufacturer);                }                break;            case 3:                String data = msg.getData().getString("count");                String count = data.substring(4, 10);                int stepCount = Integer.parseInt(count, 16);                mStepCount.setText(stepCount + "");                break;            case 4:                String body_weight = msg.getData().getString("bodyweight");                String bw = body_weight.substring(4, 8);                getWeight(bw);                break;            case 5:                Bundle b = msg.getData();                mBodyWeight.setText(b.getDouble("weight")+" kg");                if (weight == 0.0) {                    mHandler.removeCallbacks(mt);                    mt = null;                }                break;            case 6:                String blood = msg.getData().getString("bloodpressure");                getBloodPressure(blood);                break;            default:                break;        }    }};public void getBloodPressure(String data){    String sk = data.substring(20,24);    int shrink = Integer.parseInt(sk,16);    mShrink.setText(shrink+" mmHg");    String dia = data.substring(24,26);    int diastole = Integer.parseInt(dia,16);    mDiastole.setText(diastole+" mmHg");    String hr = data.substring(26,28);    int heart = Integer.parseInt(hr,16);    mHeartRate.setText(heart+" BPM");    getRange(shrink,diastole);}public void getRange(int shrink,int diastole){    if((shrink>=90 && shrink<140) && (diastole>=60 && diastole<90)){        mRange.setText(R.string.normal);    }else if(shrink>139 || diastole>90){        mRange.setText(R.string.high);    }else if(shrink<90 || diastole<60){        mRange.setText(R.string.low);    }else if(shrink>139 && diastole<90){        mRange.setText(R.string.isolated_systolic_hypertension);    }}public void getWeight(String s){    int a = Integer.parseInt(s,16);    if (mt == null) {        mt = new MyThread();        mt.start();    }    double w = a;    weight = w/10;}@Overrideprotected void onResume() {    super.onResume();    registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());}@Overrideprotected void onPause() {    super.onPause();    unregisterReceiver(mGattUpdateReceiver);}@Overrideprotected void onDestroy() {    super.onDestroy();    unbindService(conn);    mBluetoothLeService = null;}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {    getMenuInflater().inflate(R.menu.gatt_service, menu);    if (mConnected) {        menu.findItem(R.id.menu_connect).setVisible(false);        menu.findItem(R.id.menu_disconnect).setVisible(true);    } else {        menu.findItem(R.id.menu_connect).setVisible(true);        menu.findItem(R.id.menu_disconnect).setVisible(false);    }    return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {    switch (item.getItemId()) {        case R.id.menu_connect:            mBluetoothLeService.connect(mDeviceAddress);            return true;        case R.id.menu_disconnect:            mBluetoothLeService.disconnect();            return true;    }    return super.onOptionsItemSelected(item);}private final ServiceConnection conn = new ServiceConnection() {    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        mBluetoothLeService = ((BluetoothLeService.LocalBind) service).getService();        if (!mBluetoothLeService.initialize()) {            finish();        }        mBluetoothLeService.connect(mDeviceAddress);    }    @Override    public void onServiceDisconnected(ComponentName name) {        mBluetoothLeService = null;    }};private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {    @Override    public void onReceive(Context context, Intent intent) {        final String action = intent.getAction();        Bundle bundle = new Bundle();        Message msg = new Message();        Log.d("demo", action);        if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {            mConnected = true;            updateConnectionState(R.string.connected);            invalidateOptionsMenu();        } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {            mConnected = false;            updateConnectionState(R.string.disconnected);            invalidateOptionsMenu();            //clearUI();        } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVER.equals(action)) {            mBluetoothLeService.readBattery();        } else if (BluetoothLeService.ACTION_DATA_BLOODPRESSURE.equals(action)) {            //displayBloodPressure(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            bundle.putString("bloodpressure", intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            msg.setData(bundle);            msg.what = 6;            mHandler.sendMessage(msg);        } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {            int level = intent.getIntExtra("level", 0);//获取当前电量            int scale = intent.getIntExtra("scale", 100);//电量的总刻度            mBattery.setText(((level * 100) / scale) + "%");//把它转成百分比        } else if (BluetoothLeService.ACTION_DATA_BATTERY.equals(action)) {            //displayBleBattery(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            bundle.putString("battery", intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            msg.setData(bundle);            msg.what = 1;            mHandler.sendMessage(msg);        } else if (BluetoothLeService.ACTION_DATA_MENUFACTURER.equals(action)) {            //displayManufacturer(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            bundle.putString("manufacturer", intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            msg.setData(bundle);            msg.what = 2;            mHandler.sendMessage(msg);        } else if (BluetoothLeService.ACTION_DATA_COUNT.equals(action)) {            //displayCount(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            bundle.putString("count", intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            msg.setData(bundle);            msg.what = 3;            mHandler.sendMessage(msg);        } else if (BluetoothLeService.ACTION_DATA_BODYWEIGHT.equals(action)) {            //displayBodyWeight(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            bundle.putString("bodyweight", intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            msg.setData(bundle);            msg.what = 4;            mHandler.sendMessage(msg);        }    }};private void updateConnectionState(final int resourceId) {    runOnUiThread(new Runnable() {        @Override        public void run() {            mConnectionState.setText(resourceId);        }    });}/*private void clearUI() {    mGattServicesList.setAdapter((SimpleExpandableListAdapter) null);}*/

/* private void displayBloodPressure(String data) {
if (data != null) {
mBloodPressure.setText(data);
}
}

private void displayBodyWeight(String data) {    if (data != null) {        mBodyWeight.setText(data);    }}*/

/* public void displayBleBattery(String data){
Log.d(“demo”, “battery data != null —>”+String.valueOf(data!=null));
if(data != null){
Log.d(“demo”, String.valueOf(Integer.parseInt(data,16)));
int level = Integer.parseInt(data, 16);
mBleBattery.setText(level+”%”);
}
}*/

/* public void displayManufacturer(String data) {
if (data != null) {
mManufacturer.setText(data);
}
}

public void displayCount(String data) {    if (data != null) {        String count = data.substring(4, 10);        Log.d("demo", count);        Log.d("demo", String.valueOf(Integer.parseInt(count, 16)));        int stepCount = Integer.parseInt(count, 16);        mStepCount.setText(stepCount + "");    }}*/private static IntentFilter makeGattUpdateIntentFilter() {    final IntentFilter intentFilter = new IntentFilter();    intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);    intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);    intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVER);    intentFilter.addAction(BluetoothLeService.ACTION_DATA_BLOODPRESSURE);    intentFilter.addAction(BluetoothLeService.ACTION_DATA_BODYWEIGHT);    intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);    intentFilter.addAction(BluetoothLeService.ACTION_DATA_MENUFACTURER);    intentFilter.addAction(BluetoothLeService.ACTION_DATA_BATTERY);    intentFilter.addAction(BluetoothLeService.ACTION_DATA_COUNT);    return intentFilter;}class MyThread extends Thread {    @Override    public void run() {        super.run();        while (finish) {            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            Message msg = new Message();            Bundle bundle = new Bundle();            bundle.putDouble("weight", weight);            msg.setData(bundle);            msg.what = 5;            mHandler.sendMessage(msg);        }    }}

}
服务类
public class BluetoothLeService extends Service {
private BluetoothManager mBluetoothManager;
private BluetoothAdapter mBluetoothAdapter;
private String mBluetoothDeviceAddress;
private BluetoothGatt mBluetoothGatt;
private int mConnectionState = STATE_DISCONNECTED;
private Handler mHandler = new Handler();

private final static int STATE_DISCONNECTED = 0;private final static int STATE_CONNECTING = 1;private final static int STATE_CONNECTED = 2;private final static int RUN_PERIOD = 3000;private final static int COUNT_PERIOD = 3000;public final static String ACTION_GATT_CONNECTED = "com.example.chongyanghu.ble.ACTION_GATT_CONNECTED";public final static String ACTION_GATT_DISCONNECTED = "com.example.chongyanghu.ble.ACTION_GATT_DISCONNECTED";public final static String ACTION_GATT_SERVICES_DISCOVER = "com.example.chongyanghu.ble.ACTION_GATT_SERVICES_DISCOVER";public final static String EXTRA_DATA = "com.example.chongyanghu.ble.EXTRA_DATA";public final static String ACTION_DATA_BATTERY = "com.example.chongyanghu.ble.ACTION_DATA_BATTERY";public final static String ACTION_DATA_MENUFACTURER = "com.example.chongyanghu.ble.ACTION_DATA_MENUFACTURER";public final static String ACTION_DATA_COUNT = "com.example.chongyanghu.ble.ACTION_DATA_COUNT";public final static String ACTION_DATA_BLOODPRESSURE = "com.example.chongyanghu.ble.ACTION_DATA_BLOODPRESSURE";public final static String ACTION_DATA_BODYWEIGHT = "com.example.chongyanghu.ble.ACTION_DATA_BODYWEIGHT";//public final static UUID UUID_HEART_RATE_MEASUREMENT = UUID.fromString(SampleGattAttributes.HEART_RATE_MEASUREMENT);public final static String BATTERY_SERVICE = "0000180F-0000-1000-8000-00805f9b34fb";public final static String BATTERY_CHARATERISTIC = "00002a19-0000-1000-8000-00805f9b34fb";public final static String MANUFACTURER_SERVICE = "0000180a-0000-1000-8000-00805f9b34fb";public final static String MANUFACTURER_CHARATERISTIC = "00002a29-0000-1000-8000-00805f9b34fb";public final static String CUSTOM_SERVICE = "0000ffe0-0000-1000-8000-00805f9b34fb";public final static String CUSTOM_CHARACTERISTIC = "0000ffe1-0000-1000-8000-00805f9b34fb";private final IBinder mBinder = new LocalBind();@Nullable@Overridepublic IBinder onBind(Intent intent) {    return mBinder;}public class LocalBind extends Binder {    BluetoothLeService getService() {        return BluetoothLeService.this;    }}@Overridepublic boolean onUnbind(Intent intent) {    close();    return super.onUnbind(intent);}public boolean initialize() {    if (mBluetoothManager == null) {        mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);        if (mBluetoothManager == null) {            return false;        }    }    mBluetoothAdapter = mBluetoothManager.getAdapter();    if (mBluetoothAdapter == null) {        return false;    }    return true;}public void disconnect() {    if (mBluetoothAdapter == null || mBluetoothGatt == null) {        return;    }    mBluetoothGatt.disconnect();}public boolean connect(final String address) {    if (mBluetoothAdapter == null || address == null) {        return false;    }    if (mBluetoothDeviceAddress != null && mBluetoothGatt != null            && address.equals(mBluetoothDeviceAddress)) {        if (mBluetoothGatt.connect()) {            mConnectionState = STATE_CONNECTING;            return true;        } else {            return false;        }    }    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);    if (device == null) {        return false;    }    mBluetoothGatt = device.connectGatt(this, false, mGattCallBack);    mBluetoothDeviceAddress = address;    mConnectionState = STATE_CONNECTING;    return true;}private final BluetoothGattCallback mGattCallBack = new BluetoothGattCallback() {    @Override    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {        String intentAction;        if (newState == BluetoothProfile.STATE_CONNECTED) {            intentAction = ACTION_GATT_CONNECTED;            mConnectionState = STATE_CONNECTED;            broadcastUpdate(intentAction);            mBluetoothGatt.discoverServices();        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {            intentAction = ACTION_GATT_DISCONNECTED;            mConnectionState = STATE_DISCONNECTED;            broadcastUpdate(intentAction);        }    }    @Override    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {        Log.d("demo", "onCharacteristicChanged");        byte[] data = characteristic.getValue();        final StringBuilder stringBuilder = new StringBuilder(data.length);        for (byte byteChar : data)            stringBuilder.append(String.format("%02X", byteChar));        String builder = stringBuilder.toString();        Log.d("demo", "0x -->" + builder);        if(data[0] == (byte)0xC1){            broadcastUpdate(ACTION_DATA_COUNT, characteristic);        }else if(data[0] == (byte)0xB1){            broadcastUpdate(ACTION_DATA_BLOODPRESSURE, characteristic);        }else if(data[0] == (byte)0xB7){            broadcastUpdate(ACTION_DATA_BODYWEIGHT, characteristic);        }    }    @Override    public void onServicesDiscovered(BluetoothGatt gatt, int status) {        if (status == BluetoothGatt.GATT_SUCCESS) {            broadcastUpdate(ACTION_GATT_SERVICES_DISCOVER);        }    }    @Override    public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {        UUID uuid = descriptor.getCharacteristic().getUuid();    }    @Override    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {        if (status == BluetoothGatt.GATT_SUCCESS) {            Log.d("demo", "state = " + String.valueOf(status == BluetoothGatt.GATT_SUCCESS));            if (characteristic.getUuid().toString().equalsIgnoreCase(BATTERY_CHARATERISTIC)) {                Log.d("demo", String.valueOf(characteristic.getValue()[0]));                broadcastUpdate(ACTION_DATA_BATTERY, characteristic);            } else if (characteristic.getUuid().toString().equalsIgnoreCase(MANUFACTURER_CHARATERISTIC)) {                Log.d("demo", "readManufacturer");                broadcastUpdate(ACTION_DATA_MENUFACTURER, characteristic);            }        }    }    @Override    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {        super.onCharacteristicWrite(gatt, characteristic, status);    }};//打开设备的通知功能public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enable) {    Log.d("demo", "setCharacteristicNotification");    if (mBluetoothAdapter == null || mBluetoothGatt == null) {        return;    }    mBluetoothGatt.setCharacteristicNotification(characteristic, enable);    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);    mBluetoothGatt.writeDescriptor(descriptor);}public void readCharacteristic(BluetoothGattCharacteristic characteristic) {    if (mBluetoothGatt == null || mBluetoothAdapter == null) {        return;    }    Log.d("demo", "readCharacteristic");    mBluetoothGatt.readCharacteristic(characteristic);}private void broadcastUpdate(String action) {    final Intent intent = new Intent(action);    sendBroadcast(intent);}private void broadcastUpdate(String action, BluetoothGattCharacteristic characteristic) {    final Intent intent = new Intent(action);    String uuid = characteristic.getUuid().toString();    Log.d("demo", "into broadcastUpdate");    if (uuid.equalsIgnoreCase(BATTERY_CHARATERISTIC)) {        byte[] databattery = characteristic.getValue();        analysisData(intent, databattery);    } else if (uuid.equalsIgnoreCase(MANUFACTURER_CHARATERISTIC)) {        final byte[] datamanufacturer = characteristic.getValue();        intent.putExtra(EXTRA_DATA,new String(datamanufacturer));        sendBroadcast(intent);    } else if (uuid.equalsIgnoreCase(CUSTOM_CHARACTERISTIC)) {        byte[] data = characteristic.getValue();        analysisData(intent,data);    }}public void analysisData(Intent intent, byte[] data) {    if (data != null && data.length > 0) {        final StringBuilder stringBuilder = new StringBuilder(data.length);        Log.d("demo", String.valueOf(data.length));        for (byte byteChar : data)            stringBuilder.append(String.format("%02X", byteChar));        String builder = stringBuilder.toString();        Log.d("demo", "0x -->" + builder);        intent.putExtra(EXTRA_DATA,builder);        sendBroadcast(intent);    }}public void close() {    if (mBluetoothGatt == null) {        return;    }    mBluetoothGatt.close();    mBluetoothGatt = null;}public List<BluetoothGattService> getSupportedGattServices() {    if (mBluetoothGatt == null) return null;    return mBluetoothGatt.getServices();}public void readBattery() {    Log.d("demo", "readBattery");    BluetoothGattService batteryService = mBluetoothGatt.getService(UUID.fromString(BATTERY_SERVICE));    if (batteryService != null) {        mHandler.postDelayed(new Runnable() {            @Override            public void run() {                Handler mHandler = new Handler();                BluetoothGattService manufacturerService = mBluetoothGatt.getService(UUID.fromString(MANUFACTURER_SERVICE));                if (manufacturerService != null) {                    mHandler.postDelayed(new Runnable() {                        @Override                        public void run() {                            BluetoothGattService customService = mBluetoothGatt.getService(UUID.fromString(CUSTOM_SERVICE));                            if (customService != null) {                                BluetoothGattCharacteristic customCharacteristic = customService.getCharacteristic(UUID.fromString(CUSTOM_CHARACTERISTIC));                                if (customCharacteristic != null) {                                    final int charaProp = customCharacteristic.getProperties();                                    if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {                                        setCharacteristicNotification(customCharacteristic, true);                                    }                                }                            }                        }                    }, COUNT_PERIOD);                    BluetoothGattCharacteristic manufacturerCharacteristic = manufacturerService.getCharacteristic(UUID.fromString(MANUFACTURER_CHARATERISTIC));                    Log.d("demo", "manufacturerCharacteristic = " + String.valueOf(manufacturerCharacteristic != null));                    final int charaProp = manufacturerCharacteristic.getProperties();                    if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {                        Log.d("demo", "intoNotify--->" + String.valueOf((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0));                        readCharacteristic(manufacturerCharacteristic);                    }                }            }        }, RUN_PERIOD);        BluetoothGattCharacteristic batteryCharacteristic = batteryService.getCharacteristic(UUID.fromString(BATTERY_CHARATERISTIC));        if (batteryCharacteristic != null) {            readCharacteristic(batteryCharacteristic);        }    }}

}

0 0
原创粉丝点击