如何读取我的 BLE 设备的所有特性值?

2023-12-01

我正在使用 Android Studio 构建一个应用程序,可以从设备 BLE 读取值。该设备有 4 个服务。第四项服务有3个特点。 我想了解第四项服务的所有特征。

该设备可以发送更多信息,因此我希望应用程序可以存储从设备 BLE 到达的所有信息。

这是我的代码:

@TargetApi(21)
public class BLEActivity extends BaseActivity {

    private BluetoothAdapter mBluetoothAdapter;
    private int REQUEST_ENABLE_BT = 1;
    private Handler mHandler;
    private static final long SCAN_PERIOD = 10000;
    private BluetoothLeScanner mLEScanner;
    private ScanSettings settings;
    private List<ScanFilter> filters;
    private BluetoothGatt mGatt;
    String mCurrentService;
    TextView tvBLE;
    ImageButton ibDownload;
    BluetoothDevice currDevice;
    private int id = 1000;
    public SensorDataAdapter adapter;
    final BLEActivity classe = this;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ble);
        mHandler = new Handler();

        //mSensors = db.getAllSensorTypes();
        //BLUETOOTH LOW ENERGY NON SUPPORTATO
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            Toast.makeText(this, "BLE Not Supported",
                    Toast.LENGTH_SHORT).show();
            finish();
        }
        final BluetoothManager bluetoothManager =
                (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();
        //VERIFICO SE IL BLUETOOTH DEL DISPOSITIVO E' ABILITATO
        //OPPURE NO. SE NON è ABILITATO DEVO CHIEDERE ALL'UTENTE DI ATTIVARLO
        // Ensures Bluetooth is available on the device and it is enabled. If not,
        if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }

        ibDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(currDevice!=null){
                    mGatt = currDevice.connectGatt(getBaseContext(), false, gattCallback);
                    scanLeDevice(false);// will stop after first device detection
                }
            }
        });
    }

    private void scanLeDevice(final boolean enable) {
        if (enable) {
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (Build.VERSION.SDK_INT < 21) {
                        mBluetoothAdapter.stopLeScan(mLeScanCallback);
                    } else {
                        mLEScanner.stopScan(mScanCallback);

                    }
                }
            }, SCAN_PERIOD);
            if (Build.VERSION.SDK_INT < 21) {
                mBluetoothAdapter.startLeScan(mLeScanCallback);
            } else {
                mLEScanner.startScan(filters, settings, mScanCallback);
            }
        } else {
            if (Build.VERSION.SDK_INT < 21) {
                mBluetoothAdapter.stopLeScan(mLeScanCallback);
            } else {
                mLEScanner.stopScan(mScanCallback);
            }
        }
    }


    private ScanCallback mScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            Log.i("callbackType", String.valueOf(callbackType));
            Log.i("result", result.toString());
            BluetoothDevice btDevice = result.getDevice();
            connectToDevice(btDevice);
        }

        @Override
        public void onBatchScanResults(List<ScanResult> results) {
            for (ScanResult sr : results) {
                Log.i("ScanResult - Results", sr.toString());
            }
        }

        @Override
        public void onScanFailed(int errorCode) {
            Log.e("Scan Failed", "Error Code: " + errorCode);
        }
    };

    private BluetoothAdapter.LeScanCallback mLeScanCallback =
            new BluetoothAdapter.LeScanCallback() {
                @Override
                public void onLeScan(final BluetoothDevice device, int rssi,
                                     byte[] scanRecord) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.i("onLeScan", device.toString());
                            connectToDevice(device);
                        }
                    });
                }
            };

    public void connectToDevice(BluetoothDevice device) {
        if (mGatt == null) {
            currDevice = device;
            ibDownload.setEnabled(true);
            ibDownload.setImageResource(R.drawable.download_ok);
        }
    }

    private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            Log.i("onConnectionStateChange", "Status: " + status);
            switch (newState) {
                case BluetoothProfile.STATE_CONNECTED:
                    Log.i("gattCallback", "STATE_CONNECTED");
                    gatt.discoverServices();
                    break;
                case BluetoothProfile.STATE_DISCONNECTED:
                    Log.e("gattCallback", "STATE_DISCONNECTED");
                    break;
                default:
                    Log.e("gattCallback", "STATE_OTHER");
            }
        }

     @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            List<BluetoothGattService> services = gatt.getServices();
            Log.i("onServicesDiscovered", services.toString());
            ;
            for(BluetoothGattService srv : services){
               // if(srv.getUuid().toString().equals(mSensors.get(1).getServUid())){
                    mCurrentService = srv.getUuid().toString();
                    //RECUPERO SOLO IL SERVIZIO CON UID 1130
                if(mCurrentService.contains("1130")){
                    List<BluetoothGattCharacteristic> mListCars = srv.getCharacteristics();
                    //leggo le caratteristiche del servizio che cerco
                    for(BluetoothGattCharacteristic bc : mListCars){
                        //recupero solo le caratteristiche 1131, 1132
                        if(bc.getUuid().toString().contains("1131") ||
                                bc.getUuid().toString().contains("1132")){
                            //LEGGO LE 2 CARATTERISTICHE NECESSARIE
                           gatt.readCharacteristic(srv.getCharacteristic(bc.getUuid()));
                        }

                    }
                }else{
                    Log.i("SERVIZIO NON CORRETTO", "SERVIZIO NON CORRETTO");
                }

              //  }
            }


        }

        @Override
        public void onCharacteristicRead(BluetoothGatt gatt,
                                         BluetoothGattCharacteristic
                                                 characteristic, int status) {
            Log.i("onCharacteristicRead", characteristic.toString());

               SensorData mSenData = new SensorData();
                    mSenData.setValue(characteristic.getStringValue(0));
                    Log.i("LETTURA DATI ", mSenData.getValue());
                    mSenData.setIdType(++id);
                    mSenData.setCharacteristic(characteristic.getUuid().toString());
                    mSenData.setValueTimestamp(db.getDateTime());
                    db.insertSensorData(mSenData);


        }




    };
}

使用此代码,我可以读取我的服务的第一个特征,并且只能读取第一个特征的一个值。

我想自动读取我的 BLE 设备的所有特性的所有值。 我怎样才能改变我的代码来做到这一点?


您可以使用以下代码实现多次读取: 首先创建一个列表

private int ReadQueueIndex;
private List<BluetoothGattCharacteristic> ReadQueue;

In onServicesDiscovered在ReadQueue中添加特征:

ReadQueue = new ArrayList<>();
ReadQueue.add(characteristicsList.get(2));        
ReadQueue.add(characteristicsList.get(1));            
ReadQueue.add(characteristicsList.get(0));
ReadQueueIndex = 2;
ReadCharacteristics(ReadQueueIndex);

Create ReadCharacteristics method

private void ReadCharacteristics(int index){
   bluetoothGatt.readCharacteristic(ReadQueue.get(index));
}

然后在你的onCharacteristicRead打回来:

String value =  Arrays.toString(characteristic.getValue());
if(characteristic.getUuid().equals(characteristicsList.get(0).getUuid())){
  Log.i("Characteristic 0:", value);
} else if(characteristic.getUuid().equals(characteristicsList.get(1).getUuid())){
  Log.i("Characteristic 1:", value);
} else if(characteristic.getUuid().equals(characteristicsList.get(2).getUuid())){
  Log.i("Characteristic 2:", value);
}
ReadQueue.remove(ReadQueue.get(ReadQueueIndex));
if (ReadQueue.size() >= 0) {
    ReadQueueIndex--;
    if (ReadQueueIndex == -1) {
       Log.i("Read Queue: ", "Complete");
    }
    else {
       ReadCharacteristics(ReadQueueIndex);
    }
 }

希望它有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何读取我的 BLE 设备的所有特性值? 的相关文章

随机推荐

  • 显示:块内显示:内联

    我想了解当 CSS 为的元素时会发生什么display block是 CSS 为的元素的 DOM 子元素display inline 这样块元素是内联元素的子元素 这种情况在匿名块盒CSS 2 1 规范部分 示例包括以下规则 body di
  • iOS:可以在 Google Plus 中发送或发布消息

    在 google plus 中 是否有一个 API 可以在 iOS 中向 Google Plus 发送消息或提交帖子 我已经尝试阅读 google 文档 但还没有看到任何可以做到这一点的内容 好的 我明白了 在他们的文档上 https de
  • 结构成员的概念检查

    检查特定结构成员是否验证给定概念的简单 惯用的方法是什么 我尝试了以下方法 但它不起作用 因为 T f 产量类型float include
  • 如何在 Froyo 中检测设备的准确方向?

    我试图暂时锁定 Android 设备的方向 大多数时候它会随着传感器的变化而变化 所以我想做的是弄清楚当前的方向 横向 反向横向 纵向 反向纵向 是什么 将方向更改为该方向 然后将其改回原来的方向 我知道我可以使用诸如 int 方向 thi
  • Python 3 异常处理抛出错误

    我上周开始学习 python 但我无法弄清楚这里出了什么问题 def add x y Adds 2 numbers and returns the result return x y def sub x y Subtracts 2 numb
  • PHP 中的详细正则表达式?

    在 php net 上搜索我找不到任何支持详细的正则表达式在 PHP 中 这是我不知道如何搜索它的错 还是php没有实现它的错 如果php缺少这个功能 除了将正则表达式分成更小的段之外 还有其他方法来注释正则表达式吗 您还可以在正则表达式中
  • 将大型文本 (xyz) 数据库拆分为 x 个相等的部分

    我想拆分一个大型文本数据库 约 1000 万行 我可以使用类似的命令 sed i e 4 s dB e 4 s Best unit Best Unit e 1 3 d cygdrive c Radio Mobile Output TRC T
  • TensorFlow 中 sigmoid 后跟交叉熵和 sigmoid_cross_entropy_with_logits 有什么区别?

    当尝试使用 sigmoid 激活函数获取交叉熵时 两者之间存在差异 loss1 tf reduce sum p tf log q 1 loss2 tf reduce sum tf nn sigmoid cross entropy with
  • Mysql 5.5.10 - Mac 10.6.x - 自动启动

    我正在尝试在我的 mac pro 上自动启动 mysql 5 5 10 社区服务器 gpl 我读过这个论坛上的几个帖子 我仍然感到困惑 因为这些线程引用了一个文件 Library StartupItems MySQLCOM 我好像没有这个文
  • 无法将自定义日志添加到 Log Analytics

    大家好 我无法添加自定义日志日志分析 gt 高级设置 gt 数据 gt 自定义日志 尽管在连接的资源中显示我的计算机已连接 我错过了什么吗 PS 我使用的是azure Trail帐户 目前 自定义日志处于预览状态 您需要先在 OMS Por
  • sum 函数返回的结果与显式循环不同

    我正在将 f77 代码转换为 f90 代码 部分代码需要对 3d 矩阵的元素求和 在 f77 中 这是通过使用 3 个循环 通过外部 中间 内部索引 来完成的 我决定使用 f90 内在和 3 次 来完成此操作 令我惊讶的是答案不同 我正在使
  • 如何在 iOS gui 自动化中检查元素属性?

    所有 UI 自动化examples我见过使用标准组件 可以使用 JavaScript API 检查其状态value 方法 这有点限制 假设您想检查颜色或 alpha 值等 如何检查视图的属性 一个例子 点击某个元素应该使其 被选中 我想点击
  • 如何将 JSON 传递到 Azure 函数并在 Azure 数据工厂 V2 中嵌入动态内容

    在 ADFv2 中 我查找日期并将其传递给 Azure 函数 我可以像这样传递数据 activity GetLastDateProcessed output firstRow LastDateProcessed 但是 如果我将其嵌入到 JS
  • 在现有状态转换期间无法更新

    当我加载流星项目时 我的浏览器不断崩溃 如果我注释掉 我只能避免浏览器崩溃this setState input 36 currentApp input 36 在 App jsx 文件中 有人可以告诉我如何修复我的代码 以便项目可以加载而不
  • Python 间隔三角形

    我应该编写一个最终结果如下的程序 我已经为常规代码编写了代码 但我不确定如何将空格合并到其中 def triangle i t 0 if i 0 return 0 else print t 1 i 2 1 return triangle i
  • 比较 Google 电子表格上的行

    我想在同一个电子表格的两个不同工作表中识别相同的行 我尝试了下面的代码 它不起作用 function getMyEqualRows var ss SpreadsheetApp getActiveSpreadsheet var sheet1
  • 向 Android 可穿戴设备发送数据

    我正在尝试将字符串数组从手机发送到我的穿戴设备 我在手机上创建了一项服务 该服务应该使用以下代码发送数据 public class SendDataService extends Service private static final S
  • PyGTK隐藏光标

    问题很简单 如何使用 PyGTK 隐藏活动窗口上的光标 这是我为学习这一点而制作的一个基本应用程序 usr bin env python import gtk class app def init self window gtk Windo
  • 运行默认的 Gluon 项目后出错 (: dex FAILED)

    我下载了 Netbeans 的 Gluon 插件 以将 JavaFX 应用程序部署到 Android 它在桌面上成功运行 但是当我执行android任务 它会抛出错误 Executing gradle android compileJava
  • 如何读取我的 BLE 设备的所有特性值?

    我正在使用 Android Studio 构建一个应用程序 可以从设备 BLE 读取值 该设备有 4 个服务 第四项服务有3个特点 我想了解第四项服务的所有特征 该设备可以发送更多信息 因此我希望应用程序可以存储从设备 BLE 到达的所有信