Android 저전력 Bluetooth(BLE)

7799 단어
BLE는 세 부분의 서비스,Characteristic,Descriptor로 나뉘는데 이 세 부분은 모두 UUID가 유일한 표시자로 한다.하나의 블루투스 4.0 터미널은 여러 개의 서비스를 포함할 수 있고, 하나의 서비스는 여러 개의Characteristic를 포함할 수 있으며, 하나의Characteristic는Value와 여러 개의Descriptor를 포함하고, 하나의Descriptor는Value를 포함한다.일반적으로 Characteristic는 핸드폰과 BLE 단말기에서 데이터를 교환하는 관건이다.Characteristic는 권한과 관련된 필드가 비교적 많은데 예를 들어 PERMISSION과 PROPERTY이다. 그 중에서 가장 자주 사용하는 것은 PROPERTY이다. 본고에서 사용한 BLE블루투스 모듈에는 표준적인Characteristic의PERMISSION이 없다.Characteristic의 PROPERTY는 비트 연산자 조합을 통해 READ|WRITE, READ|WRITE 와 같은 읽기와 쓰기 속성을 설정할 수 있습니다.NO_RESPONSE | NOTIFY, 따라서 PROPERTY를 읽은 후 사용하는 조합으로 분해합니다. (본 코드는 이미 이 분해 방법을 포함하고 있습니다.)
Service가 보낸 다양한 시간을 처리합니다.
ACTION_GATT_CONNECTED: GATT 서비스가 연결되었습니다.ACTION_GATT_DISCONNECTED:GATT 서비스가 끊겼습니다.ACTION_GATT_SERVICES_DISCOVERED: GATT 서비스가 발견되었습니다.ACTION_DATA_AVAILABLE: 장치에서 데이터를 받습니다.이것은 읽거나 알림 작업의 결과일 수도 있습니다.
BluetoothAdapter.ACTION_STATE_CHANGED Bluetooth 상태 값이 변경되었습니다. Bluetooth Adapter.ACTION_SCAN_MODE_CHANGED 블루투스 스캐닝 상태(SCAN MODE)가 BluetoothAdapter를 변경합니다.ACTION_DISCOVERY_STARTED Bluetooth Adapter가 시작됩니다.ACTION_DISCOVERY_FINISHED 블루투스 스캐닝 과정 종료 Bluetooth Adapter.ACTION_LOCAL_NAME_CHANGED 블루투스 장치Name Bluetooth Adapter가 변경되었습니다.ACTION_REQUEST_DISCOVERABLE은 사용자에게 이 블루투스가 스캔될 수 있는지 여부를 선택하라고 요청합니다. 만약에 블루투스가 켜지지 않으면 사용자가 확인을 누르면 먼저 블루투스를 켜고 블루투스가 스캔될 수 있도록 설정합니다.BluetoothAdapter. ACTION_REQUEST_ENABLE이 Bluetooth 사용 여부를 선택해 달라고 요청
BluetoothDevice.ACTION_Bluetooth Device 클래스에 있는 이 상수 필드는 Bluetooth 스캔 시 블루투스 장치가 원격 블루투스 장치로 스캔될 때 이 브로드캐스트를 보냅니다.
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(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_DISCOVERED.equals(action)) {
            //        service characteristic。
            displayGattServices(mBluetoothLeService.getSupportedGattServices());

        } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
            displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));

        }else  if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
                addBandDevices(device);
            } else {
                addUnbondDevices(device);
            }
        }
    }
};

1. Bluetooth Adapter STATE 상태 값, 즉 스위치 상태
          int STATE_OFF              
          int STATE_ON              
          int STATE_TURNING_OFF                ,  ing
          int STATE_TURNING_ON                  ,  ing

2. 여기서 먼저 블루투스 조작의 핵심 클래스인 Bluetooth Adapter를 알아야 한다.
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();  
//               
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  
startActivityForResult(intent, 0x1);  
//        
adapter.enable();  
//      
adapter.disable();  
//           (    120 ,          300 )  
Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);  
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);//      (  300 )  

3. 블루투스 장치 검색
Bluetooth Adapter의 start Discovery () 방법을 사용하여 블루투스 장치 start Discovery () 를 검색하는 방법은 비동기적인 방법으로 호출되면 바로 되돌아옵니다.이 방법은 다른 블루투스 장치에 대한 검색을 진행하는데 이 과정은 12초간 지속된다.이 방법이 호출되면 검색 과정은 사실상 하나의 시스템 서비스에서 진행되기 때문에 cancelDiscovery () 방법을 호출해서 검색을 중지할 수 있습니다. (이 방법은 디스커버리 요청이 실행되지 않았을 때 호출할 수 있습니다.)
Discovery 요청 후 Bluetooth 디바이스 검색이 시작되며 이 과정에서 ACTIONDISCOVERY_START: ACTION 검색 시작DISCOVERY_FINISHED: 검색 종료 ACTIONFOUND: 장치를 찾았습니다. 이 Intent에는 두 개의 extra fields:EXTRA 가 포함되어 있습니다.DEVICE 및 EXTRA각각 BluetooDevice 및 BluetoothClass가 포함된 CLASS
GATT 층에 정의된 모든 속성은 하나의 UUID 값을 가지고 있으며 UUID는 전 세계에서 유일한 128자리 번호로 서로 다른 특성을 식별하는 데 사용된다.먼저 의미를 설명하자면 GATT(Generic Attribute Profile), 유니버설 속성 프로필, 그 중의 데이터는 모두 실제 발송된 것이다. 즉, 블루투스 이벤트가 발생하는 프로토콜 창고 이벤트는 모두 이곳에서 발생한 것이다.UUID(Universally Unique Identifier), 일반 고유 식별 코드입니다.UUID는 일반적으로 두 가지로 나눌 수 있다. 첫째, 블루투스 기술 연맹 UUIDs.2. 공급업체별 UUID
1. Bluetooth 기술 제휴 UUIDs
블루투스 핵심 규범은 두 가지 서로 다른 UUID를 제정했다. 첫째, 기본적인 UUID.2. 기본 UUID를 대체하는 16비트 UUUID.
참고: 모든 Bluetooth Technology Alliance 정의 UUID는 0x0000xxx-0000-10000-8000805F9B34FB의 기본 UID를 공유합니다.총 128자리, 8자리 그룹(octet)으로 환산하면 16개의 8자리 그룹(8*16=128이잖아요.기본 UUID를 더욱 간소화하기 위해 모든 블루투스 기술 연맹이 정의한 속성은 유일한 16개의 UUID를 가지고 위의 기본 UUID의'x'부분, 즉 12, 13개의 8위 그룹을 대체한다.
2. 공급업체별 UUID
Bluetooth Technology Alliance가 정의한 UUID와 유사하며, 공급업체별 UUID에도 기본 UUID와 16비트 UUID(별칭 유사, 기본 UUID 위에 로드됨)가 있습니다.기본 UUID는 nRFgo Studio에서 생성되며, 16비트 UUID는 원하는 대로 할당할 수 있습니다.따라서 상기 원칙에 따라 nRF51822의 SDK는 UUID에 대한 데이터 구조가 다음과 같다.
/** @brief 128 bit UUID values. */  
typedef struct  
{   
    unsigned char uuid128[16];  
} ble_uuid128_t;  

/** @brief  Bluetooth Low Energy UUID type, encapsulates both 16-bit and 128-bit UUIDs. */  
typedef struct  
{  
    uint16_t    uuid; /**< 16-bit UUID value or octets 12-13 of 128-bit UUID. */  
    uint8_t     type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is   BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */  
} ble_uuid_t;  

구조체bleuuid128_t 내부에는 하나의 구조체 구성원만 있는데 그 중에서 구조체 구성원은 16개의 무기호 문자형 요소를 포함하는 1차원 그룹, 즉 16개의 8비트 그룹으로 128비트 UUID를 나타낼 수 있다.SDK의 주석에 따라 구조체bleuuid_t는 저전력 블루투스 UUID 유형으로 16비트와 128비트 UUID를 압축했다.그 중에서 두 개의 구조체 구성원, 1. 기호가 없는 16자리 정형수 uid, 즉 16자리 UUID 값 또는 128자리 UUID의 12-13자리 그룹을 포함한다.2. 기호가 없는 8자리 정수 type, 즉 UUID 유형은 다음과 같은 세 가지 상황이 있습니다.
/** @defgroup BLE_UUID_TYPES Types of UUID 
 * @{ */  
        #define BLE_UUID_TYPE_UNKNOWN       0x00 /**< Invalid UUID type. */  
        #define BLE_UUID_TYPE_BLE           0x01 /**< Bluetooth SIG UUID (16-bit). */  
        #define BLE_UUID_TYPE_VENDOR_BEGIN  0x02 /**< Vendor UUID types start at this index (128-bit). */  
/** @} */  

1、BLE_UUID_TYPE_UNKNOWN: 사용할 수 없는 UUID 유형입니다.bleuuid_t의 유형이 BLE 이면UUID_TYPE_UNKNOWN, UUID 값은 정의되지 않았습니다.2、BLE_UUID_TYPE_BLE: Bluetooth 관심 그룹의 UUID입니다.3、BLE_UUID_TYPE_VENDOR_BEGIN: 공급업체 UUID 유형이 포인터(128비트)에서 시작됩니다.
다음 스택 함수를 사용하여 협력업체별 UUID를 추가할 수 있습니다.uint32_t sd_ble_uuid_vs_add| ( ble_uuid128_t const *const p_vs_uuid)
Note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by the 16-bit uuid field inble_uuid_t
Parameters
[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific UUID disregarding bytes 12 and 13. [out] p_uuid_type Pointer where the type field inble_uuid_tcorresponding to this UUID will be stored.
참고로 제공된 UUID의 12, 13 바이트는 내부에서 직접 사용되지 않습니다. 왜냐하면 그들은 보통bleuuid_t의 16비트 UUID 비트 도메인이 대체됩니다.
5. 휴대전화의 BLE는 기본적으로 2개의 서비스가 있다
(1)Service        00001801-0000-1000-8000-00805f9b34fb (null) 
         a)Characteristic      00002a05-0000-1000-8000-00805f9b34fb 
(2)Service        00001800-0000-1000-8000-00805f9b34fb 
         a)Characteristic      00002a00-0000-1000-8000-00805f9b34fb 
         b)Characteristic      00002a01-0000-1000-8000-00805f9b34fb (00 00) 
         c)Characteristic      00002aa6-0000-1000-8000-00805f9b34fb (01) 

주의: 00002aa6은 정의에 없기 때문에 제조업체나 사용자가 정의한 특징(또는 서비스)으로 볼 수 있습니다

좋은 웹페이지 즐겨찾기