Android BLE,开始扫描,找到设备,但未与过滤器连接ESP32和Samsung

如何解决Android BLE,开始扫描,找到设备,但未与过滤器连接ESP32和Samsung

我一直在研究一些BLE教程,以开发一个连接到ESP32的应用程序,但是我无法获得连接到ESP32的代码。我使用的三星手机需要时间,但是我尝试了其他手机,但仍然无法将ESP32连接到移动应用程序。

如果我运行BLE扫描器应用程序,则可以连接到ESP32,因此我相信ESP32方面还可以。如果我们扫描设备,则可以在蓝牙设备列表中看到它。

该代码已设置为检测和连接,我尝试了UUID和设备名称文件管理器,但无法连接。 ScanCallback被触发,我们调用了onBatchScanResults函数,因此我们可以看到设备列表,但它不会连接到ESP32。我认为它应该与gatt函数自动连接。

我无法锻炼为什么它不会自动连接到ESP32,因为可以看到设备和扫描连接已被触发。非常感谢您为解决此问题提供的任何帮助,因为我已经不知道要解决此问题了。

package com.example.sandpit_ble002;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import android.Manifest;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanFilter;
import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanSettings;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.ParcelUuid;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

// Based on the following resource
// https://medium.com/@martijn.van.welie/making-android-ble-work-part-1-a736dcd53b02
// https://developer.android.com/guide/topics/connectivity/bluetooth-le#java


public class MainActivity extends AppCompatActivity
{
   UUID BLP_SERVICE_UUID = UUID.fromString("6E400001-B5A3-F393-E0A9-E50E24DCCA9E");
   private static final int REQUEST_ENABLE_BT = 1;
   private static final int ACCESS_COARSE_LOCATION_REQUEST = 2;
   private boolean mScanning;
   private Handler handler = new Handler();


  @Override
  protected void onCreate(Bundle savedInstanceState)
  {

    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner();

    CheckPermissions();
    hasPermissions();

    if (!bluetoothAdapter.isEnabled())
    {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT);
    }

    ScanSettings scanSettings = new ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
            .setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)
            .setNumOfMatches(ScanSettings.MATCH_NUM_ONE_ADVERTISEMENT)
            .setReportDelay(10)
            .build();
    /*
    UUID[] serviceUUIDs = new UUID[]{BLP_SERVICE_UUID};
    List<ScanFilter> filters = null;
    Log.d("Debug","debug 005");

    if(serviceUUIDs != null)
    {
        Log.d("Debug","debug 004");
        filters = new ArrayList<>();
        for (UUID serviceUUID : serviceUUIDs) {
            ScanFilter filter = new ScanFilter.Builder()
                    .setServiceUuid(new ParcelUuid(serviceUUID))
                    .build();

            filters.add(filter);
        }
    }
    */
    String[] names = new String[]{"ESP32 UART Test"};
    List<ScanFilter> filters = null;
    if(names != null) {
        filters = new ArrayList<>();
        for (String name : names) {
            ScanFilter filter = new ScanFilter.Builder()
                    .setDeviceName(name)
                    .build();
            filters.add(filter);
        }
    }


    if (scanner != null)
    {
        scanner.startScan(filters,scanSettings,scanCallback);
        Log.d("Debug","scan started");
    }  else {
        Log.e("Debug","could not get scanner object");
    }

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

private boolean hasPermissions() {
    Log.i("Debug","Debug 020");
        if (getApplicationContext().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Log.i("Debug","Debug 021");
            requestPermissions(new String[] { Manifest.permission.ACCESS_COARSE_LOCATION },ACCESS_COARSE_LOCATION_REQUEST);
            return false;
        }
return false;
}

public void onConnectionStateChange(final BluetoothGatt gatt,final int status,final int newState)
{
    if (newState == BluetoothProfile.STATE_CONNECTED)
    {
        Log.i("Debug","Debug 014");
        gatt.discoverServices();
    } else {
        Log.i("Debug","Debug 015");
        gatt.close();
    }
}

private final ScanCallback scanCallback = new ScanCallback()
{

    @Override
    public void onScanResult(int callbackType,ScanResult result)
    {
        BluetoothDevice device = result.getDevice();
        Log.i("Debug","fScanCallback");
        // ...do whatever you want with this found device
        Log.i("Debug","found something 1");

        BluetoothGatt gatt = device.connectGatt(  getApplicationContext(),true,mGattCallback,BluetoothDevice.TRANSPORT_LE);
        Log.d("Debug","Trying to create a new connection.");

    }

    public void onConnectionStateChange(final BluetoothGatt gatt,final int newState)
    {
        Log.i("Debug","Debug 017");
        if (status == BluetoothGatt.GATT_SUCCESS) {
            if (newState == BluetoothProfile.STATE_CONNECTED)
            {
                // We successfully connected,proceed with service discovery
                Log.i("Debug","Debug 013");
                gatt.discoverServices();
            } else if (newState == BluetoothProfile.STATE_DISCONNECTED)
            {
                // We successfully disconnected on our own request
                Log.i("Debug","Debug 012");
                gatt.close();
            } else
                {
                // We're CONNECTING or DISCONNECTING,ignore for now
                Log.i("Debug","Debug 011");
            }
        } else {
            // An error happened...figure out what happened!
            Log.i("Debug","Debug 010");
            gatt.close();
        }
    }

    // Implements callback methods for GATT events that the app cares about.  For example,// connection change and services discovered.
    private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback()
    {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt,int status,int newState)
        {
            String intentAction;
            if (newState == BluetoothProfile.STATE_CONNECTED)
            {

                Log.i("Debug","Connected to GATT server.");
                // Attempts to discover services after successful connection.
            }
            else if (newState == BluetoothProfile.STATE_DISCONNECTED)
            {
                Log.i("Debug","Debug 009");
            }
        }
    };

        @Override
    public void onBatchScanResults(List<ScanResult> results)
    {
        Log.i("Debug","found something 2");
    }

    @Override
    public void onScanFailed(int errorCode) {
        Log.i("Debug","found something 3");
    }
};

private boolean CheckPermissions() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    {
        if (getApplicationContext().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
        {
            Log.i("Debug","Debug 001");
            requestPermissions(new String[] { Manifest.permission.ACCESS_COARSE_LOCATION },ACCESS_COARSE_LOCATION_REQUEST);
            return false;
        }
        Log.i("Debug","Debug 002");
    }
    return true;
   }
   }

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sandpit_ble002">

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

<application

    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

日志文件

 2020-10-28 20:02:58.856 3867-4291/? I/SurfaceFlinger: createSurf start. lock debugging [Surface(name=AppWindowToken{5872671 token=Token{bc8c18 ActivityRecord{8ccf3fb u0 com.sec.android.app.launcher/.activities.LauncherActivity t256}}})/@0x319a60 - animation-bounds]
 2020-10-28 20:02:58.859 3867-4291/? I/SurfaceFlinger: createSurf start. lock debugging [Surface(name=AppWindowToken{49e6a47 token=Token{9d5c186 ActivityRecord{4490261 u0 com.example.sandpit_ble002/.MainActivity t333}}})/@0x5fb6af6 - animation-leash]
 2020-10-28 20:02:58.860 3867-4291/? I/SurfaceFlinger: createSurf start. lock debugging [Surface(name=AppWindowToken{49e6a47 token=Token{9d5c186 ActivityRecord{4490261 u0 com.example.sandpit_ble002/.MainActivity t333}}})/@0x5fb6af6 - animation-bounds]
 2020-10-28 20:02:59.075 10090-10090/com.example.sandpit_ble002 I/Debug: Debug 002
 2020-10-28 20:02:59.075 10090-10090/com.example.sandpit_ble002 I/Debug: Debug 020
 2020-10-28 20:02:59.085 10090-10090/com.example.sandpit_ble002 D/Debug: scan started
 2020-10-28 20:02:59.295 3867-4291/? I/SurfaceFlinger: createSurf start. lock debugging [1aaa92c com.example.sandpit_ble002/com.example.sandpit_ble002.MainActivity]
 2020-10-28 20:02:59.322 3867-4291/? I/SurfaceFlinger: createSurf start. lock debugging [com.example.sandpit_ble002/com.example.sandpit_ble002.MainActivity$_10090]
 2020-10-28 20:02:59.382 3867-3941/? I/SurfaceFlinger: createSurf start. lock debugging [Surface(name=e0e9827 Splash Screen com.example.sandpit_ble002)/@0x3d1cb48 - animation-leash]
 2020-10-28 20:03:04.132 10090-10090/com.example.sandpit_ble002 I/Debug: found something 2
 2020-10-28 20:03:09.159 10090-10090/com.example.sandpit_ble002 I/Debug: found something 2
 2020-10-28 20:03:14.180 10090-10090/com.example.sandpit_ble002 I/Debug: found something 2

解决方法

从日志中,我看到ScanCallback的onBatchScanResults()方法中记录了“找到了2”。 您应该处理此事件。调用与onScanResult()方法中使用的相同的connectGatt。

当设备连接成功以便从设备读取消息时,您应该订阅服务并为PROPERTY_NOTIFY类型特征设置setCharacteristicNotification。

,

例如,您可以在onBatchScanResults()

中执行类似的操作
@Override
        public void onBatchScanResults(List<ScanResult> results)
        {
            for (ScanResult result: results) {

                BluetoothDevice myDevice = result.getDevice();

                Log.i("Debug","onBatchScanResults: " + myDevice.getName());

                if(myDevice.getName().equals("ESP32 UART Test")){
                    BluetoothGatt bluetoothGatt =  myDevice.connectGatt(getApplicationContext(),true,mGattCallback,BluetoothDevice.TRANSPORT_LE);
                }
            }
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-