[英]Connect BLE device to Android an Send Data (nUART)
我正在嘗試將 BLE 設備(Adafruit Feather M0 Bluefruit LE)連接到 Android 應用程序。 Feather 有一個傳感器,可在特殊傳感器事件上發送 UART 文本。
我想要
現在我正在嘗試了解 BLE 的工作原理。 就連接到設備而言,我理解它,但在那之后我不明白。
這是現在的代碼。 現在有檢查,所以當事情沒有按計划發生時它會崩潰。 但我試圖了解 BLE 的事情。 它也不是服務,只是一個活動。 我無法對其進行測試,因為智能手機最遲會在本周末交付。
package de.example.bluetoothletest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
private BluetoothAdapter mBluetoothAdapter;
private BluetoothGatt mBluetoothGatt;
private String deviceaddress=("FC:57:1A:B7:22:AD");
public final static String ACTION_DATA_AVAILABLE = "de.example.BluetoothLETest.ACTION_DATA_AVAILABLE";
public static final UUID RX_SERVICE_UUID = UUID.fromString("6e400001-b5a3-f393-e0a9-e50e24dcca9e");
public static final UUID RX_CHAR_UUID = UUID.fromString("6e400002-b5a3-f393-e0a9-e50e24dcca9e");
public static final UUID TX_CHAR_UUID = UUID.fromString("6e400003-b5a3-f393-e0a9-e50e24dcca9e");
public static String EXTRA_DATA="de.example.BluetoothLETest.EXTRA_DATA";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//get the BluetoothAdapter
final BluetoothManager mbluetoothManager=(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter=mbluetoothManager.getAdapter();
}
public void connect(){
//connect to the given deviceaddress
BluetoothDevice device=mBluetoothAdapter.getRemoteDevice(deviceaddress);
mBluetoothGatt=device.connectGatt(this, false, mGattCallback);
//now we get callbacks on mGattCallback
}
//get callbacks when something changes
private final BluetoothGattCallback mGattCallback=new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState== BluetoothProfile.STATE_CONNECTED){
//device connected
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status==BluetoothGatt.GATT_SUCCESS){
//all Services have been discovered
}
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
//we are still connected to the service
if (status==BluetoothGatt.GATT_SUCCESS){
//send the characteristic to broadcastupdate
broadcastupdate(ACTION_DATA_AVAILABLE, characteristic);
}
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
//send the characteristic to broadcastupdate
broadcastupdate(ACTION_DATA_AVAILABLE, characteristic);
}
};
//Get the 'real' data out of characteristic
private void broadcastupdate(final String action,final BluetoothGattCharacteristic characteristic){
final Intent intent= new Intent(action);
//only when it is the right characteristic?/service?
if (TX_CHAR_UUID.equals(characteristic.getUuid())){
//get the 'real' data from the stream
intent.putExtra(EXTRA_DATA, characteristic.getValue());
//send the extracted data via LocalBroadcastManager
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
}
此代碼是否有效,智能手機接收到什么? 我如何連接到特定服務,還是因為設備只提供一項服務而自動完成?
將您的連接方法更改為此:
if (newState == BluetoothProfile.STATE_CONNECTED) {
intentAction = ACTION_GATT_CONNECTED;
broadcastUpdate(intentAction);
gatt.discoverServices();
}
並在服務發現
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
List<BluetoothGattService> services = gatt.getServices();
gatt.readCharacteristic(services.get(1).getCharacteristics().get(0));
String uuid;
List<BluetoothGattCharacteristic> gattCharacteristics;
ArrayList<BluetoothGattCharacteristic> charas;
for (BluetoothGattService gattService : services) {
gattCharacteristics =
gattService.getCharacteristics();
charas = new ArrayList<>();
for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
charas.add(gattCharacteristic);
uuid = gattCharacteristic.getUuid().toString();
if (uuid.equals("0000fff4-0000-1000-8000-00805f9b34fb")) {
final int charaProp = gattCharacteristic.getProperties();
if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {
BluetoothGattCharacteristic mNotifyCharacteristic = gattCharacteristic;
setCharacteristicNotification(
gattCharacteristic, true);
}
}
}
}
}
public void setCharacteristicNotification(final BluetoothGattCharacteristic characteristic,
boolean enabled) {
if (mBluetoothAdapter == null || mGatt == null) {
return;
}
mGatt.setCharacteristicNotification(characteristic, enabled);
Log.e("uuid service", characteristic.getUuid() + "");
String uuid = "0000fff2-0000-1000-8000-00805f9b34fb";
if (uuid.equals(characteristic.getUuid().toString())) {
Log.e("uuid service2", characteristic.getUuid() + "");
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
if (descriptor != null) {
descriptor.setValue(enabled ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : new byte[]{0x00, 0x00});
mGatt.writeDescriptor(descriptor);
}
}
}
現在終於你讀卡的特點:
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicRead(gatt, characteristic, status);
updateStatus(characteristic);
Log.e("gatt", "readChar");
}
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicWrite(gatt, characteristic, status);
updateStatus(characteristic);
Log.e("gatt", "writeChar");
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);
updateStatus(characteristic);
Log.e("gatt", "changeChar");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.