android 低功耗BLE蓝牙连接示例代码

来源:互联网 发布:淘宝一件代发怎么加入 编辑:程序博客网 时间:2024/05/28 22:09

android 低功耗ble蓝牙连接跟标准的蓝牙连接还是有很大的不同的。本文低功耗蓝牙连接代码是在sdk的版本4.3以上才支持。所用的核心代码连接也是不一样的。

本文demo下载地址:http://download.csdn.net/detail/qq_16064871/9657885

1、区别

常规的蓝牙连接类是BluetoothSocket

final BluetoothDevice device = mBtAdapter.getRemoteDevice(mstrAddress);try {mTransferSocket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));} catch (IOException e1) {Log.i("err1:", e1.toString());mTransferSocket = null;}mTransferSocket.connect();mInputStream = mTransferSocket.getInputStream();mOutputStream = mTransferSocket.getOutputStream();

2、低功耗蓝牙连接类BluetoothGatt,完整的连接代码如下

/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.southgnss.ble;import android.annotation.SuppressLint;import android.app.Service;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.bluetooth.BluetoothGatt;import android.bluetooth.BluetoothGattCallback;import android.bluetooth.BluetoothGattCharacteristic;import android.bluetooth.BluetoothGattDescriptor;import android.bluetooth.BluetoothGattService;import android.bluetooth.BluetoothManager;import android.bluetooth.BluetoothProfile;import android.content.Context;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.util.Log;import java.util.List;import java.util.UUID;/** * Service for managing connection and data communication with a GATT server hosted on a * given Bluetooth LE device. */@SuppressLint("NewApi")public class BluetoothLeService extends Service {    private final static String TAG = BluetoothLeService.class.getSimpleName();    private BluetoothManager mBluetoothManager;    private BluetoothAdapter mBluetoothAdapter;    private String mBluetoothDeviceAddress;    private BluetoothGatt mBluetoothGatt;    private int mConnectionState = STATE_DISCONNECTED;    private static final int STATE_DISCONNECTED = 0;    private static final int STATE_CONNECTING = 1;    private static final int STATE_CONNECTED = 2;    public final static String ACTION_GATT_CONNECTED           = "com.example.bluetooth.le.ACTION_GATT_CONNECTED";    public final static String ACTION_GATT_DISCONNECTED        = "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";    public final static String ACTION_GATT_SERVICES_DISCOVERED = "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";    public final static String ACTION_DATA_AVAILABLE           = "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";    public final static String EXTRA_DATA                      = "com.example.bluetooth.le.EXTRA_DATA";    public final static UUID UUID_HEART_RATE_MEASUREMENT       = UUID.fromString(SampleGattAttributes.HEART_RATE_MEASUREMENT);    // Implements callback methods for GATT events that the app cares about.  For example,    // connection change and services discovered.    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);                Log.i(TAG, "Connected to GATT server.");                // Attempts to discover services after successful connection.                Log.i(TAG, "Attempting to start service discovery:" +                        mBluetoothGatt.discoverServices());            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {                intentAction = ACTION_GATT_DISCONNECTED;                mConnectionState = STATE_DISCONNECTED;                Log.i(TAG, "Disconnected from GATT server.");                broadcastUpdate(intentAction);            }        }        @Override        public void onServicesDiscovered(BluetoothGatt gatt, int status) {            if (status == BluetoothGatt.GATT_SUCCESS) {                broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);            } else {                Log.w(TAG, "onServicesDiscovered received: " + status);            }        }        //readCharacteristic的时候会触发        @Override        public void onCharacteristicRead(BluetoothGatt gatt,                                         BluetoothGattCharacteristic characteristic,                                         int status) {            if (status == BluetoothGatt.GATT_SUCCESS) {                broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);            }        }        //需要先打开notify,设定特征值发生变化时调用此方法        @Override        public void onCharacteristicChanged(BluetoothGatt gatt,                                            BluetoothGattCharacteristic characteristic) {            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);        }    };    private void broadcastUpdate(final String action) {        final Intent intent = new Intent(action);        sendBroadcast(intent);    }    private void broadcastUpdate(final String action,                                 final BluetoothGattCharacteristic characteristic) {        final Intent intent = new Intent(action);        // This is special handling for the Heart Rate Measurement profile.  Data parsing is        // carried out as per profile specifications:        // http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml        if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {            int flag = characteristic.getProperties();            int format = -1;            if ((flag & 0x01) != 0) {                format = BluetoothGattCharacteristic.FORMAT_UINT16;                Log.d(TAG, "Heart rate format UINT16.");            } else {                format = BluetoothGattCharacteristic.FORMAT_UINT8;                Log.d(TAG, "Heart rate format UINT8.");            }            final int heartRate = characteristic.getIntValue(format, 1);            Log.d(TAG, String.format("Received heart rate: %d", heartRate));            intent.putExtra(EXTRA_DATA, String.valueOf(heartRate));            sendBroadcast(intent);        } else {            // For all other profiles, writes the data formatted in HEX.            final byte[] data = characteristic.getValue();           /* if (data != null && data.length > 0) {                final StringBuilder stringBuilder = new StringBuilder(data.length);                for(byte byteChar : data)                    stringBuilder.append(String.format("%02X ", byteChar));                intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());            }*/            if (data[0]=='A') {            return;            }            else{            intent.putExtra(EXTRA_DATA, new String(data));                        Log.i("yq","data字符串:"+ new String(data));            sendBroadcast(intent);            }        }            }    public class LocalBinder extends Binder {        BluetoothLeService getService() {            return BluetoothLeService.this;        }    }    @Override    public IBinder onBind(Intent intent) {        return mBinder;    }    @Override    public boolean onUnbind(Intent intent) {        // After using a given device, you should make sure that BluetoothGatt.close() is called        // such that resources are cleaned up properly.  In this particular example, close() is        // invoked when the UI is disconnected from the Service.        close();        return super.onUnbind(intent);    }    private final IBinder mBinder = new LocalBinder();    /**     * Initializes a reference to the local Bluetooth adapter.     *     * @return Return true if the initialization is successful.     */    public boolean initialize() {        // For API level 18 and above, get a reference to BluetoothAdapter through        // BluetoothManager.        if (mBluetoothManager == null) {            mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);            if (mBluetoothManager == null) {                Log.e(TAG, "Unable to initialize BluetoothManager.");                return false;            }        }        mBluetoothAdapter = mBluetoothManager.getAdapter();        if (mBluetoothAdapter == null) {            Log.e(TAG, "Unable to obtain a BluetoothAdapter.");            return false;        }        return true;    }    /**     * Connects to the GATT server hosted on the Bluetooth LE device.     *     * @param address The device address of the destination device.     *     * @return Return true if the connection is initiated successfully. The connection result     *         is reported asynchronously through the     *         {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}     *         callback.     */    public boolean connect(final String address) {        if (mBluetoothAdapter == null || address == null) {            Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");            return false;        }        // Previously connected device.  Try to reconnect.        if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)                && mBluetoothGatt != null) {            Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");            if (mBluetoothGatt.connect()) {                mConnectionState = STATE_CONNECTING;                return true;            } else {                return false;            }        }        final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);        if (device == null) {            Log.w(TAG, "Device not found.  Unable to connect.");            return false;        }        // We want to directly connect to the device, so we are setting the autoConnect        // parameter to false.        mBluetoothGatt = device.connectGatt(this, false, mGattCallback);        Log.d(TAG, "Trying to create a new connection.");        mBluetoothDeviceAddress = address;        mConnectionState = STATE_CONNECTING;        return true;    }    /**     * Disconnects an existing connection or cancel a pending connection. The disconnection result     * is reported asynchronously through the     * {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}     * callback.     */    public void disconnect() {        if (mBluetoothAdapter == null || mBluetoothGatt == null) {            Log.w(TAG, "BluetoothAdapter not initialized");            return;        }        mBluetoothGatt.disconnect();    }    /**     * After using a given BLE device, the app must call this method to ensure resources are     * released properly.     */    public void close() {        if (mBluetoothGatt == null) {            return;        }        mBluetoothGatt.close();        mBluetoothGatt = null;    }    /**     * Request a read on a given {@code BluetoothGattCharacteristic}. The read result is reported     * asynchronously through the {@code BluetoothGattCallback#onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int)}     * callback.     *     * @param characteristic The characteristic to read from.     */    public void readCharacteristic(BluetoothGattCharacteristic characteristic) {        if (mBluetoothAdapter == null || mBluetoothGatt == null) {            Log.w(TAG, "BluetoothAdapter not initialized");            return;        }        mBluetoothGatt.readCharacteristic(characteristic);    }    /**     * Enables or disables notification on a give characteristic.     *     * @param characteristic Characteristic to act on.     * @param enabled If true, enable notification.  False otherwise.     */    public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,                                              boolean enabled) {        if (mBluetoothAdapter == null || mBluetoothGatt == null) {            Log.w(TAG, "BluetoothAdapter not initialized");            return;        }        mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);        // This is specific to Heart Rate Measurement.        if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {            BluetoothGattDescriptor descriptor = characteristic.getDescriptor(                    UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);            mBluetoothGatt.writeDescriptor(descriptor);        }    }    /**     * Retrieves a list of supported GATT services on the connected device. This should be     * invoked only after {@code BluetoothGatt#discoverServices()} completes successfully.     *     * @return A {@code List} of supported services.     */    public List<BluetoothGattService> getSupportedGattServices() {        if (mBluetoothGatt == null) return null;        return mBluetoothGatt.getServices();    }}

连接成功,收到数据。是以广播的形式发送出去

    private void broadcastUpdate(final String action,                                 final BluetoothGattCharacteristic characteristic) {        final Intent intent = new Intent(action);        // This is special handling for the Heart Rate Measurement profile.  Data parsing is        // carried out as per profile specifications:        // http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml        if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {            int flag = characteristic.getProperties();            int format = -1;            if ((flag & 0x01) != 0) {                format = BluetoothGattCharacteristic.FORMAT_UINT16;                Log.d(TAG, "Heart rate format UINT16.");            } else {                format = BluetoothGattCharacteristic.FORMAT_UINT8;                Log.d(TAG, "Heart rate format UINT8.");            }            final int heartRate = characteristic.getIntValue(format, 1);            Log.d(TAG, String.format("Received heart rate: %d", heartRate));            intent.putExtra(EXTRA_DATA, String.valueOf(heartRate));            sendBroadcast(intent);        } else {            // For all other profiles, writes the data formatted in HEX.            final byte[] data = characteristic.getValue();           /* if (data != null && data.length > 0) {                final StringBuilder stringBuilder = new StringBuilder(data.length);                for(byte byteChar : data)                    stringBuilder.append(String.format("%02X ", byteChar));                intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());            }*/            if (data[0]=='A') {            return;            }            else{            intent.putExtra(EXTRA_DATA, new String(data));                        Log.i("yq","data字符串:"+ new String(data));            sendBroadcast(intent);            }        }            }

另外一边就是广播接收数据

    // Handles various events fired by the Service.    // ACTION_GATT_CONNECTED: connected to a GATT server.    // ACTION_GATT_DISCONNECTED: disconnected from a GATT server.    // ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.    // ACTION_DATA_AVAILABLE: received data from the device.  This can be a result of read    //                        or notification operations.    private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            final String action = intent.getAction();            if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {                mConnected = true;                updateConnectionState(true);            } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {                mConnected = false;                updateConnectionState(false);            } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {            if (mBluetoothLeService.getSupportedGattServices() != null) {            List<BluetoothGattCharacteristic> gattCharacteristics = mBluetoothLeService.getSupportedGattServices()            .get(mBluetoothLeService.getSupportedGattServices().size()-1).getCharacteristics();                if (gattCharacteristics != null) {                    final BluetoothGattCharacteristic characteristic = gattCharacteristics.get(gattCharacteristics.size()-1);                    final int charaProp = characteristic.getProperties();                    if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {                        if (mNotifyCharacteristic != null) {                            mBluetoothLeService.setCharacteristicNotification(                                    mNotifyCharacteristic, true);                            mNotifyCharacteristic = null;                        }                        mBluetoothLeService.readCharacteristic(characteristic);                    }                    if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {                        mNotifyCharacteristic = characteristic;                        mBluetoothLeService.setCharacteristicNotification(                                characteristic, true);                    }                }}            } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {                displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            }        }    };

广播的相关的注册以及销毁

    @Override    protected void onResume() {        super.onResume();        registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());        if (mBluetoothLeService != null && !mDeviceAddress.isEmpty()) {            mBluetoothLeService.connect(mDeviceAddress);        }    }    @Override    protected void onPause() {        super.onPause();        unregisterReceiver(mGattUpdateReceiver);    }    @Override    protected void onDestroy() {        super.onDestroy();        if (mBluetoothLeService != null) {            unbindService(mServiceConnection);            mBluetoothLeService = null;}    }


3、完整的连接类的UI逻辑代码

package com.southgnss.ble;import java.util.List;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothGattCharacteristic;import android.content.BroadcastReceiver;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.ServiceConnection;import android.content.pm.PackageManager;import android.os.Bundle;import android.os.IBinder;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import com.southgnss.customwidget.CustomActivity;import com.southgnss.southgnssserver.R;public class SouthOtherConnectActivity extends CustomActivityimplements OnClickListener{    private BluetoothLeService mBluetoothLeService;    private String mDeviceName = "";    private String mDeviceAddress = "";    private boolean mConnected = false;private Button mBtnConnect = null;private Button mBtnDisConnect = null;private TextView mTextViewBlueSelect = null;    private BluetoothGattCharacteristic mNotifyCharacteristic;    private View mLinearLayoutEquipmenList;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);getActionBar().setTitle(R.string.sysytem_type_ble_Blue_connect);getActionBar().setDisplayHomeAsUpEnabled(true);setContentView(R.layout.layout_main_other_connect);initView();}private void initView() {mLinearLayoutEquipmenList = findViewById(R.id.linearLayoutEquipmenList);mLinearLayoutEquipmenList.setOnClickListener(this);mTextViewBlueSelect = (TextView)findViewById(R.id.textViewBlueSelect);if (!mDeviceName.isEmpty()) mTextViewBlueSelect.setText(mDeviceName);if (mDeviceName.isEmpty() && !mDeviceAddress.isEmpty()) mTextViewBlueSelect.setText(mDeviceAddress);//连接按钮mBtnConnect = (Button)findViewById(R.id.buttonConnect);if(mBtnConnect != null){mBtnConnect.setOnClickListener(this);mBtnConnect.setEnabled(false);//默认为不可使用mBtnConnect.setVisibility(View.VISIBLE);}mBtnDisConnect  = (Button)findViewById(R.id.buttonDisConnect);mBtnDisConnect.setOnClickListener(this);mBtnDisConnect.setVisibility(View.GONE);}private boolean getBluetoothDivice() {BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();if (adapter == null) {// 不支持蓝牙return false;} if (adapter.isEnabled() == false) {Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);      // 设置蓝牙可见性,最多300秒      intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);      startActivity(intent);     return true;} return true;}@Overridepublic void onClick(View arg0) {switch (arg0.getId()) {case R.id.linearLayoutEquipmenList:        // 检查当前手机是否支持ble 蓝牙,如果不支持退出程序        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)        && android.os.Build.VERSION.SDK_INT > 17) {        ShowTipsInfo(getString(R.string.sysytem_type_ble_Blue_tip));           return;        }                if (!getBluetoothDivice()) {        ShowTipsInfo(getString(R.string.sysytem_type_open_Blue));        return;}Intent newIntent = new Intent(this, BLESearchConnectActivity.class);startActivityForResult(newIntent, 1000);break;case R.id.buttonConnect:if (!mConnected && mBluetoothLeService != null && !mDeviceAddress.isEmpty()) {    mBluetoothLeService.connect(mDeviceAddress);}break;case R.id.buttonDisConnect:if (mConnected && mBluetoothLeService != null) { mBluetoothLeService.disconnect(); displayButton(false);}break;default:break;}}// activity的数据的交互@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (data == null || resultCode != RESULT_OK) return;switch (requestCode) {case 1000: //ble蓝牙搜索返回mDeviceName = data.getExtras().getString(BLESearchConnectActivity.EXTRAS_DEVICE_NAME,"");mDeviceAddress = data.getExtras().getString(BLESearchConnectActivity.EXTRAS_DEVICE_ADDRESS);if (!mDeviceName.isEmpty()) mTextViewBlueSelect.setText(mDeviceName);if (mDeviceName.isEmpty() && !mDeviceAddress.isEmpty()) mTextViewBlueSelect.setText(mDeviceAddress);mBtnConnect.setEnabled(true);        Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);        bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);break;default:break;}}    // Code to manage Service lifecycle.    private final ServiceConnection mServiceConnection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName componentName, IBinder service) {            mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();            if (!mBluetoothLeService.initialize()) {                finish();            }            mBluetoothLeService.connect(mDeviceAddress);        }        @Override        public void onServiceDisconnected(ComponentName componentName) {            mBluetoothLeService = null;        }    };        // Handles various events fired by the Service.    // ACTION_GATT_CONNECTED: connected to a GATT server.    // ACTION_GATT_DISCONNECTED: disconnected from a GATT server.    // ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.    // ACTION_DATA_AVAILABLE: received data from the device.  This can be a result of read    //                        or notification operations.    private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            final String action = intent.getAction();            if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {                mConnected = true;                updateConnectionState(true);            } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {                mConnected = false;                updateConnectionState(false);            } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {            if (mBluetoothLeService.getSupportedGattServices() != null) {            List<BluetoothGattCharacteristic> gattCharacteristics = mBluetoothLeService.getSupportedGattServices()            .get(mBluetoothLeService.getSupportedGattServices().size()-1).getCharacteristics();                if (gattCharacteristics != null) {                    final BluetoothGattCharacteristic characteristic = gattCharacteristics.get(gattCharacteristics.size()-1);                    final int charaProp = characteristic.getProperties();                    if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {                        if (mNotifyCharacteristic != null) {                            mBluetoothLeService.setCharacteristicNotification(                                    mNotifyCharacteristic, true);                            mNotifyCharacteristic = null;                        }                        mBluetoothLeService.readCharacteristic(characteristic);                    }                    if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {                        mNotifyCharacteristic = characteristic;                        mBluetoothLeService.setCharacteristicNotification(                                characteristic, true);                    }                }}            } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {                displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));            }        }    };        private void displayData(String data) {        if (data != null) {        Log.i("Show", data);        TextView textViewShow = (TextView)findViewById(R.id.textViewShow);        if(textViewShow != null)textViewShow.setText(data);        }    }        private void updateConnectionState(final boolean bConnect) {        runOnUiThread(new Runnable() {            @Override            public void run() {            displayButton(bConnect);            }        });    }        private void displayButton(boolean bConnect){if (mBtnDisConnect == null || mBtnConnect == null) return;if (bConnect) {mBtnConnect.setVisibility(View.GONE);mBtnDisConnect.setVisibility(View.VISIBLE);mLinearLayoutEquipmenList.setEnabled(false);} else {mBtnDisConnect.setVisibility(View.GONE);mBtnConnect.setVisibility(View.VISIBLE);mLinearLayoutEquipmenList.setEnabled(true);}    }        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_DISCOVERED);        intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);        return intentFilter;    }        @Override    protected void onResume() {        super.onResume();        registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());        if (mBluetoothLeService != null && !mDeviceAddress.isEmpty()) {            mBluetoothLeService.connect(mDeviceAddress);        }    }    @Override    protected void onPause() {        super.onPause();        unregisterReceiver(mGattUpdateReceiver);    }    @Override    protected void onDestroy() {        super.onDestroy();        if (mBluetoothLeService != null) {            unbindService(mServiceConnection);            mBluetoothLeService = null;}    }    }

使用服务来进行低功耗的蓝牙连接,收到数据后使用广播的发送数据。需要用数据的地方进行接收即可。

整个demo的完整代码:

本文demo下载地址:http://download.csdn.net/detail/qq_16064871/9657885



3 0
原创粉丝点击