gpt4 book ai didi

android - 将 BLE 设备连接到 Android 并发送数据 (nUART)

转载 作者:搜寻专家 更新时间:2023-11-01 09:37:42 24 4
gpt4 key购买 nike

我正在尝试将 BLE 设备 (Adafruit Feather M0 Bluefruit LE) 连接到 Android 应用程序。 Feather 有一个传感器,可以在特殊传感器事件上发送 UART 文本。

我要

  • 连接到设备(静态 MAC 地址)
  • 连接到 nordic-UART 服务
  • 接收来自 Feather 的短信
  • 实现连接监控

现在我正在尝试了解 BLE 的工作原理。就连接到设备而言,我了解它,但在那之后我就不明白了。

  1. 我如何连接到该服务,或者它会自动连接到该服务吗?
    1. 我需要什么来获取数据或传入数据的通知?

这是现在的代码。现在有检查,所以当某些事情没有按计划发生时它会崩溃。但我想了解 BLE 的东西。它也不是一个服务,只是一个 Activity 。我无法对其进行测试,因为智能手机最迟会在本周末交付。

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();
}

和 serviceDiscoverd

@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");
}

关于android - 将 BLE 设备连接到 Android 并发送数据 (nUART),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41801626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com