Bley Bluetooth 장치(검색/링크/uid 데이터 얻기) 사고 분석 및 전체 데모

19121 단어 Android
1. 본고는 주로 블루투스 데이터의 검색 - 링크 - 데이터 값 얻기 - 데이터 값 쓰기를 설명한다.Bluetooth Demo
 :        
 :    
 :        
 :    

Bluetooth 프로젝트 구성에 대한 구체적인 이벤트

    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET">uses-permission>
    
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

자신의 최근 프로젝트 수요와 자신이 배운 것을 결합하여 코드는 기본적으로 정부의sever서비스와gatt링크를 이용하고 수정을 통해 자신이 원하는 결과를 얻을 뿐이다. 다음은 자신의 이해를 간단하게 소개한다.
1: BLE 장치 activity 검색
if (!mBluetoothAdapter.isEnabled()) {
            if (!mBluetoothAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(
                        BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }
        }
        // Initializes list view adapter.
        mLeDeviceListAdapter = new LeDeviceListAdapter(this);
        //       
        devicelist.setAdapter(mLeDeviceListAdapter);

2: 블루투스 관리자를 초기화하고 장치가 블루투스를 지원하는지 확인합니다
 private void checkBluetooth() {
        //           ble   ,         
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            Toast.makeText(this, "      ", Toast.LENGTH_SHORT).show();
            //finish();
        }
        //     Bluetooth adapter,                   (API     android4.3      )
        final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();

        //            
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "       ", Toast.LENGTH_SHORT).show();
            //finish();
            return;
        }
    }

3: Bluetooth 제어 서비스 BluetoothLeService
                  BluetoothGattCallback(),                    。
    private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
        /**
         *         
         * @param gatt
         * @param status
         * @param newState
         */
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            String intentAction;
            if(status==BluetoothGatt.GATT_SUCCESS) {
                //       
                if (newState == BluetoothProfile.STATE_CONNECTED) {
                    //    
                    intentAction = BroadCast.ACTION_GATT_CONNECTED;
                    //    
                    broadcastUpdate(intentAction);
                    //      
                    Log.i(TAG, "   GATT   ");
                    //         
                    gatt.discoverServices();
                }

                //        
                else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                    //    
                    intentAction = BroadCast.ACTION_GATT_DISCONNECTED;
                    //      
                    Log.i(TAG, " GATT       ");
                    //    
                    broadcastUpdate(intentAction);
                }
            }
        }
        }

넷째, 검색 서비스
        /**
         *     
         * @param gatt
         * @param status
         */
        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            //    
            if(status==BluetoothGatt.GATT_SUCCESS){
                //         
                broadcastUpdate(BroadCast.ACTION_GATT_SERVICES_DISCOVERED);
                Log.i(TAG,"        ");
            }else {
                Log.w(TAG, "        : " + status);//            
            }
        }

다섯째, 데이터 읽기와 데이터 변화
        /**
         *     
         * @param gatt
         * @param characteristic
         * @param status
         */
        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            Log.i("      ",gatt+" "+characteristic+" "+status);
            if (status == BluetoothGatt.GATT_SUCCESS) {
                //              
                broadcastUpdate(BroadCast.ACTION_DATA_AVAILABLE, characteristic);
                Log.i(TAG,"");
            }
        }

        /**
         *     
         * @param gatt
         * @param characteristic
         */
        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            broadcastUpdate(BroadCast.ACTION_DATA_AVAILABLE, characteristic);
        }


        /**
         *       
         * @param gatt
         * @param descriptor
         * @param status
         */
        @Override
        public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            if(status == BluetoothGatt.GATT_SUCCESS){
                BluetoothGattCharacteristic characteristic = descriptor.getCharacteristic();
                broadcastUpdate(BroadCast.ACTION_DATA_AVAILABLE, characteristic);
                Log.i(TAG,"success is data");
            }
        }

6. 방송은 데이터를 받아들이고 발송하는데 중점은 다음과 같다.
    /**
     *         
     * @param action
     * @param characteristic
     */
    private void broadcastUpdate(final String action,final BluetoothGattCharacteristic characteristic){
        final Intent intent = new Intent(action);
        //                   
        if (characteristic.getUuid().equals(UUIDDataBase.UUID_HEALTH_THERMOMETER_SENSOR_LOCATION)) {
            String a = BWDataParser.getTempData(characteristic);
            intent.putExtra(BroadCast.EXTRA_DATA, a);
        }
        //                   
        else if (characteristic.getUuid().equals(UUIDDataBase.UUID_HEALTH_THERMOMETER)) {
            String health_temp = BWDataParser.getTempData(characteristic);
            intent.putExtra(BroadCast.EXTRA_DATA_DISPLAY, health_temp);
        }
        else if (characteristic.getUuid().equals(UUIDDataBase.UUID_HEALTH_THERMOMETER_NAME)) {
            String aa = BWDataParser.getTempData(characteristic);
            intent.putExtra(BroadCast.EXTRA_DATA_DISPLAY_TEMPTWO, aa);
        }
        else if (characteristic.getUuid().equals(UUIDDataBase.UUID_HEALTH_TONGDAONAMEDATE)) {
            Log.i("===3333333333===",characteristic.toString());
            String tdname = BWDataParser.getTempData(characteristic);
            intent.putExtra(BroadCast.EXTRA_DATA_DISPLAY_TONGDAONAME, tdname);
        }
        sendBroadcast(intent);
    }

7. 블루투스 장치에 데이터를 쓰는 데 몇 가지 중요한 함수가 있다. 예를 들어 write Characteristic(Bluetooth Gatt Characteristic) 함수로 블루투스의 데이터를 읽는다.
    /**
     *          
     * @param charac
     * @param message
     * @return boolean
     */
    public static boolean writeCharacteristic(BluetoothGattCharacteristic charac,String message){
        //check mBluetoothGatt is available
        if (bluetoothGatt == null) {
            Log.e(TAG, "lost connection");
            return false;
        }
        if(charac!=null&&!message.equals(null)&&!message.equals("")){
            //int a = Integer.parseInt(message);
            byte []a = convertingTobyteArray(message);
            charac.setValue(a);
            boolean status = bluetoothGatt.writeCharacteristic(charac);
            return status;
        }else{
            return false;
        }
    }

8: 브로드캐스트 등록 이벤트:
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;
    }

9: 방송 및 서비스 중단
 @Override
    protected void onDestroy() {
        super.onDestroy();
        //       
        if(isunbind) {
            unregisterReceiver(mGattUpdateReceiver);

            if(progressDialog!=null){
                progressDialog.dismiss();
            }
            //        
            if(bluetoothService!=null){
                BluetoothService.disconnect();
            }
            //      
            if(mServiceConnection!=null) unbindService(mServiceConnection);

            if(mediaPlayerUtil!=null){
                mediaPlayerUtil.mExit();
            }
            ActivityCollector.finishAll();
            isunbind = false;
        }
    }

10: 지원 가능한 서비스가 발견되면 서비스의 onServices Discovered () 함수를 리셋하고 방송을 보냅니다. 공식 데모에서 사용 가능한 서비스가 발견되면 이 BLE 장치가 지원하는 모든 서비스와characteristic를 찾습니다. 여기서 모든 서비스를 찾을 필요가 없습니다.블루투스에 데이터를 쓰고 읽는 서비스와characteristic의 UUID만 있으면 됩니다.BLE(저전력 Bluetooth) 데이터 매뉴얼을 조회하여 필요한 UUID를 얻을 수 있습니다.
public class GattAttributes {
    //    
    public static final String TEMPERATURE_TYPE = "00002a1d-0000-1000-8000-00805f9b34fb";
    //usual
    public static final String CLIENT_CHARACTERISTIC_CONFIG = "00002902-0000-1000-8000-00805f9b34fb";
    //    one
    public static final String HEALTH_TEMP_MEASUREMENT = "333-0e0d-4bd4-33-9868ddsa";
    //    two
    public static final String TEMP_DATA_NAME = "900876-a249-4443-a04e-7655750";
    //    
    public static final String TEMP_DATA_TONGDAONAME = "89765tg-f54d-4abb-aa79-87544ffd21";

}

11: 블루투스 개발의 구체적인 사고방식, 데이터 전송에 관한 서비스, 그 전에 우리는 먼저 몇 가지 전문 어휘를 알아야 한다.
1、profile 
        profile         ,         ,       。            profile,   HID OVER GATT ,    ,    。  profile      service,  service         。
2、service
        service         , ble   ,       ,        、       ,  service      characteristic   。     characteristic     ble     。        80%,        characteristic        profile ,           characteristic   80%    
3、characteristic
        characteristic   ,ble          characteristic   ,         ,                   。
4、UUID
        UUID,     ,       service characteristic,        uuid   

12: 구체적인 블루투스ble 개발 총결산은 이것입니다. 만약에 완전한 블루투스 데모가 필요하면 다운로드를 할 수 있습니다. 블로거가 직접 테스트를 마쳤습니다. 데모 검색-링크-읽기-쓰기, 만약에 이해하지 못하는 부분이 있으면 사신으로 답장을 할 수 있습니다. 더 많은 초보자들에게 도움을 주기를 바랍니다!

좋은 웹페이지 즐겨찾기