Bley Bluetooth 장치(검색/링크/uid 데이터 얻기) 사고 분석 및 전체 데모
19121 단어 Android
:
:
:
:
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 개발 총결산은 이것입니다. 만약에 완전한 블루투스 데모가 필요하면 다운로드를 할 수 있습니다. 블로거가 직접 테스트를 마쳤습니다. 데모 검색-링크-읽기-쓰기, 만약에 이해하지 못하는 부분이 있으면 사신으로 답장을 할 수 있습니다. 더 많은 초보자들에게 도움을 주기를 바랍니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.