标签: android-bluetooth

当它们在范围内时,自动查找已配对的蓝牙设备

我不是蓝牙专家,并想知道当它们彼此的范围时,可以自动找到已配对的蓝牙设备的可能性.

背景:在我们的案例中,Android应用程序需要通过蓝牙(Rfcomm)连接到专用附件.两个设备彼此已知(它们是配对的).Android应用程序注册广播接收器.在应用程序启动期间,应用程序启动发现以查找专用附件.如果配件在范围内,一切都很好.

问题:用户在专用附件范围之外启动应用程序.Android应用程序试图发现附件但没有成功.然后用户进入蓝牙配件的范围.广播接收器现在不会收到有关范围内配件的通知.

类似的主题/可能的解决方案 在stackoverflow上已经提出了类似的问题(例如,在范围内时自动连接到蓝牙设备).但是不断尝试发现范围内的蓝牙设备并不是我想要的,因为这会导致Android设备的电池消耗过多.

另一种解决方案是尝试连接到Activity的onResume方法中的配对设备.这可行,但缺点是应用程序无法在后台运行.因此,用户必须至少将应用程序带到前台以启动连接.

我想到的第三个想法是在Android应用程序中实现服务器套接字.当Android应用程序启动并且发现完成但没有成功时,Android应用程序可以创建服务器套接字并监听附件的传入通知.这在某些情况下会有所帮助(例如,用户启动他的应用程序,接近附件,激活附件,并且附件在启动时通知应用程序它现在在范围内).但这仍然不是100%解决方案,因为两个设备都可以在彼此的范围之外启动.此外,必须实施其他功能(Android设备中的蓝牙服务器插槽......).

所以我想知道是否存在更好的解决方案.我正在寻找一个解决方案,其中不需要额外的ServerSockets,我总是得到两个已经配对的设备在彼此范围内的通知:-)

谢谢你的帮助!

android bluetooth android-bluetooth

15
推荐指数
1
解决办法
5361
查看次数

蓝牙协议(RFCOMM,L2CAP和ACL)

从我从Bluetooth Essentials for Programmers中读到的内容,这本书提到了一些我不太了解的观点.

RFCOMM是一种可靠的基于流的协议.L2CAP是一种基于数据包的协议,可配置不同级别的可靠性.

L2CAP实际上充当RFCOMM的传输协议,因此每个RFCOMM连接实际上封装在L2CAP连接中.

这真的让我困惑,因为这两个协议是不同类型的协议(一个是基于流的,而另一个是基于分组的).所以基于它的解释,我在下面有一些问题.

  1. 由于RFCOMM连接是封装的,那么串口配置文件(SPP)如何使用RFCOMM连接?它也应该使用L2CAP.

  2. A2DP使用L2CAP连接.这对我来说意味着相同,因为L2CAP和RFCOMM封装在ACL连接中,这是否意味着A2DP使用ACL连接?我知道这是不正确的但是如何解释这里.

谢谢你的解释.

bluetooth l2cap rfcomm android-bluetooth

15
推荐指数
1
解决办法
2万
查看次数

在Android上同时与多个BLE设备进行稳健通信

虽然使用Android BLE apis的无证,传统智慧是某些操作,如读/写特征和描述符应该一次一个(虽然有些设备比其他设备更宽松).但是,我不清楚此策略是仅应用于单个连接还是应用于所有活动连接.

我听说最好一次启动一个设备连接.这可能是应该在所有设备之间串行执行的操作(connect/connectGatt)的示例.

但是对于其他操作,比如读写特性,如果每个连接串行执行操作,或者我是否需要在所有设备之间共享一些全局操作队列,以便在所有设备之间只执行一个操作?

android bluetooth-lowenergy android-bluetooth

15
推荐指数
2
解决办法
1165
查看次数

如何使用蓝牙热敏打印机打印发票收据

我必须使用热敏打印机打印发票收据.我用Zjiang Thermal打印机打印收据.他们还提供手动和演示项目.在演示项目中,他们使用libray"btsdk.jar"来实现连接和打印.

我已成功建立打印机和Android设备之间的连接.但是没有文本对齐(中心,左,右)和单元格宽度,高度的准则.

试过了.它只通过更改格式2变量来更改文本高度.

我如何通过蓝牙打印机打印发票.

还请解释这一节 -

 byte[] cmd = new byte[3];
 cmd[0] = 0x1b;
 cmd[1] = 0x21;
 cmd[2] |= 0x10;
Run Code Online (Sandbox Code Playgroud)

cmd 2 - 用于更改字体高度使用cmd [0]和cmd 1

代码将打印消息发送到蓝牙打印机在演示项目中

 String msg = "";
 byte[] cmd = new byte[3];
 cmd[0] = 0x1b;
 cmd[1] = 0x21;
 cmd[2] |= 0x10;
 mService.write(cmd);           
 mService.sendMessage("Congratulations!\n", "GBK"); 
 cmd[2] &= 0xEF;
 mService.write(cmd);          
 msg = "  You have sucessfully created communications between your device and our bluetooth printer.\n\n"
      +" …
Run Code Online (Sandbox Code Playgroud)

android thermal-printer android-bluetooth

15
推荐指数
1
解决办法
1万
查看次数

Android - 获取此设备的蓝牙UUID

我正在浏览Stack和互联网,以获得一个简单的解决方案来获取UUID我目前正在使用的设备.我偶然发现了这样的帖子,但他们似乎都没有帮助我.

该文档告诉我有关此 getUuids()功能的信息,但在浏览Android蓝牙文档时,我最终得到了一个BluetoothAdapter,但我需要BluetoothDevice执行此功能.

所以我需要知道以下内容:

1)功能是否真的返回设备UUID?因为这个名字叫复数(getUuid s)

2)如何获得此实例BluetoothDevice

谢谢!

uuid android bluetooth android-bluetooth

14
推荐指数
1
解决办法
4万
查看次数

适用于Android,iOS和Win8的蓝牙低功耗连接参数

我一直在寻找所有这三个操作平台所需的蓝牙连接参数.我正在使用此项目的HOGP(Bluetooth over HID GATT)配置文件.

我的项目是一个由我自己编写的带有BLE模块的嵌入式系统,我可以控制以下连接参数.

  1. 连接间隔最小值
  2. 连接间隔最大值
  3. 奴隶潜伏期
  4. 监督超时
  5. 广告间隔分钟
  6. 广告间隔最大

我要连接的目标设备将满足Android> = 4.3,iOS7和> = Win 8.1的连接.

Apple非常友好地在下面的链接中提供了第22页上带有相应参数的文档.我无法找到有关Android和Win 8的任何信息.

https://developer.apple.com/hardwaredrivers/bluetoothdesignguidelines.pdf

我目前的iOS7工作设置完全测试与免费软件lightBlue的双向通信如下.我的iOS7嵌入式代码和主机软件可以使用.

  1. 连接间隔最小30ms
  2. 连接间隔最大56.25ms
  3. 奴隶潜伏期3
  4. 监督超时5000ms

我从另一个堆栈溢出页面发现,据称android可以通过以下链接在7.5ms连接间隔上工作.

  1. Android BLE连接时间间隔
  2. http://processors.wiki.ti.com/index.php/Bluetooth_SensorTag?DCMP=lprf-stdroid&HQS=lprf-stdroid-pr-wiki1#Supported_Android_devices

不幸的是苹果iOS规范的第二个要求是"IntervalMin≥20ms".

我不理解这些范围或如何解释它们?如果我将Interval min设置为7.5ms for Android不会使苹果要求无效吗?如果可能,我如何满足两个系统和Win8?

我的理解是从设备在最小值和最大值之间提供建议设置,并且主设备(智能手机)警告用户该范围内的实际选定值.

我对这个问题的任何帮助表示感谢,并希望这篇文章能够让其他人考虑到BLE相当新的和不完整的知识基础.

提前致谢!

android bluetooth bluetooth-lowenergy android-bluetooth ios7

14
推荐指数
1
解决办法
2万
查看次数

检查Android互联网连接的完美功能,包括蓝牙平台

我的应用程序在wifi和移动网络中工作得很完美,但无法检测何时通过蓝牙网络共享连接.

public boolean isNetworkAvailable() {
    ConnectivityManager cm = (ConnectivityManager) 
      getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();

    if (networkInfo != null && networkInfo.isConnected()) {
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我尝试运行其他一些应用程序.他们也没有显示网络连接,但谷歌应用程序工作得很好,所以像其他一些应用程序,如whatsap.想知道他们是如何做到的,以及为什么大多数应用程序都忽略了这一点.

任何人都可以告诉我一种方法来检查Android中的互联网连接,通过所有可用的方式,包括蓝牙泛和代理等.

任何帮助将不胜感激.提前致谢..

android android-bluetooth

14
推荐指数
2
解决办法
1677
查看次数

Android BLE-如何在ScanCallback中调用onScanResult方法?

这是我第一次在Android项目中进行蓝牙低功耗.我正在做的项目基本上是检测所有蓝牙LE设备并连接它们以发现它们的服务.

我想问一下是否有人知道如何在ScanCallback中调用onScanResult(),onBatchScanResults()和onScanFailed()方法?

首先,运行scanLeDevice()方法.

BluetoothLeScanner mLEScanner = mBluetoothAdapter.getBluetoothLeScanner();
ScanSettings settings = new ScanSettings.Builder()
           .setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
           .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
           .build();
List<ScanFilter> filters = new ArrayList<ScanFilter>();

scanLeDevice(true);
Run Code Online (Sandbox Code Playgroud)

在这种方法中,它将启动扫描.所以我假设扫描结果是使用这些回调传递的.

@TargetApi(21)
private void scanLeDevice(final boolean enable) {
    if (enable) {
        //stops scanning after a pre-defined scan period
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                    System.out.println("BLE// mLEScanner.stopScan(mScanCallback) ");
                    mLEScanner.stopScan(mScanCallback);
                }
            }
        }, SCAN_PERIOD);
            System.out.println("BLE// mLEScanner.startScan(filters, settings, mScanCallback)");
            mLEScanner.startScan(filters, settings, mScanCallback);

    } else {
            System.out.println("BLE// mLEScanner.stopScan(mScanCallback)");
            mLEScanner.stopScan(mScanCallback);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在ScanCallback中,我不知道它如何触发onScanResult并使用回调传递扫描结果.在我的测试中(如下所示),既不调用onScanResult()也不调用onBatchScanResults()和onScanFailed().有人可以向我解释这个概念吗?它会帮助我很多!

 /* Scan result for SDK >= 21 */
 private …
Run Code Online (Sandbox Code Playgroud)

android bluetooth-lowenergy android-bluetooth

14
推荐指数
2
解决办法
2万
查看次数

蓝牙LE扫描有时无法找到设备

我正在扫描蓝牙LE设备并作为外围设备运行(在Moto G第二代上运行Android 6.0)

我遇到的问题是,有时(随机似乎但经常)它不会找到我的任何其他外围设备,其他时候它工作正常.

我有一个配套的iOS设备运行类似的代码(扫描外围设备和充当外围设备),当Android扫描无法找到iOS设备时,我的iOS发现Android设备充当外围设备就好了.因此,似乎只是扫描方面的问题.

它不仅仅是找不到我的配套iOS设备,而且找不到任何蓝牙设备.当它工作时,它会找到我的配套iOS设备以及许多其他设备.

我已经尝试过使用和不使用ScanFilters,并得到同样的问题.我正在使用最低SDK为23的SDK 26构建.

我正在设置所需的权限,因为它有时会起作用.

相关代码如下:

private void startScanning() {
    mHandler = new Handler(mContext.getMainLooper());

    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            ScanSettings settings = new ScanSettings.Builder()
                                        .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
                                        .setReportDelay(0)
                                        .build();

            mBluetoothLeScanner.startScan(null, settings, mScanCallback);
        }
    }, 1000);
}

private ScanCallback mScanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        super.onScanResult(callbackType, result);

        if( result == null || result.getDevice() == null )
            return;

        Log.e("myTest", "Found Device");

        BluetoothDevice device = result.getDevice();
        final String deviceAddress = device.getAddress(); …
Run Code Online (Sandbox Code Playgroud)

android bluetooth bluetooth-lowenergy android-bluetooth

14
推荐指数
1
解决办法
4456
查看次数

氟化物蓝牙堆栈

为什么在最近发布的android中它将蓝牙堆栈Bluedroid改为Fluoride

  1. Bluedroid和之间有什么区别Fluoride吗?如果是的话他们是什么?
  2. 从哪里可以获得架构/参考 Fluoride Bluetooth stack

android bluetooth android-bluetooth android-8.0-oreo

14
推荐指数
1
解决办法
1832
查看次数