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); } }}
}
- BLE通信(转)
- BLE通信(续)
- BLE 配对后通信其中一方LTK丢失情况(转自襄坤在线)
- iOS ble通信
- Android BLE 扫描 通信
- Android BLE蓝牙通信
- ble蓝牙通信
- Ble设备通信
- Android 蓝牙Ble通信
- android Ble通信
- 【转】Android BLE开发之Android手机与BLE终端通信
- iOS 蓝牙通信技术(EAP和BLE)
- 【BLE】-OTA升级(转)
- IOS实现BLE后台通信
- React Native BLE蓝牙通信
- React Native BLE蓝牙通信
- Android BLE 通信处理过程---串行通信
- Android BLE开发之Android手机与BLE终端通信
- thinking in java学习笔记-第一章
- 【T3】填制凭证参照科目报错:运行时错误35601,未发现元素
- DatePicker.calendarViewShown无效
- 关于struts2框架下 Error setting expression 'pageSize' with value ['15', '15', ]错误提示。
- CI 框架 调用PHPExcel linux 无效问题
- BLE通信(转)
- 3D打印技术之切片引擎(1)
- java.lang.reflect.InvocationTargetException : Entity does not override hashCode
- 10分钟进阶Nuget
- 在Ubuntu上下载、编译和安装Android最新源代码
- AIX 日常管理常用命令
- Unity开发Android游戏(二)Hello world!
- web前后台数据交互的几种方式
- 3D打印技术之切片引擎(2)