我試圖將BLE設備(Adafruit羽毛M0 Bluefruit LE)連接到Android應用程序。羽毛有一個傳感器發送特殊傳感器事件的UART文本。將BLE設備連接到Android發送數據(nUART)
我想
- 連接到該設備(靜態MAC地址)
- 連接到北歐-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);
}
}
}
此代碼是否適用於智能手機接收的內容?如何連接到特定的服務,或者由於設備只提供一項服務,我該如何自動完成?
請等到您的智能手機到達,然後詢問您的具體問題。 –