我不是蓝牙专家,并想知道当它们彼此的范围时,可以自动找到已配对的蓝牙设备的可能性.
背景:在我们的案例中,Android应用程序需要通过蓝牙(Rfcomm)连接到专用附件.两个设备彼此已知(它们是配对的).Android应用程序注册广播接收器.在应用程序启动期间,应用程序启动发现以查找专用附件.如果配件在范围内,一切都很好.
问题:用户在专用附件范围之外启动应用程序.Android应用程序试图发现附件但没有成功.然后用户进入蓝牙配件的范围.广播接收器现在不会收到有关范围内配件的通知.
类似的主题/可能的解决方案 在stackoverflow上已经提出了类似的问题(例如,在范围内时自动连接到蓝牙设备).但是不断尝试发现范围内的蓝牙设备并不是我想要的,因为这会导致Android设备的电池消耗过多.
另一种解决方案是尝试连接到Activity的onResume方法中的配对设备.这可行,但缺点是应用程序无法在后台运行.因此,用户必须至少将应用程序带到前台以启动连接.
我想到的第三个想法是在Android应用程序中实现服务器套接字.当Android应用程序启动并且发现完成但没有成功时,Android应用程序可以创建服务器套接字并监听附件的传入通知.这在某些情况下会有所帮助(例如,用户启动他的应用程序,接近附件,激活附件,并且附件在启动时通知应用程序它现在在范围内).但这仍然不是100%解决方案,因为两个设备都可以在彼此的范围之外启动.此外,必须实施其他功能(Android设备中的蓝牙服务器插槽......).
所以我想知道是否存在更好的解决方案.我正在寻找一个解决方案,其中不需要额外的ServerSockets,我总是得到两个已经配对的设备在彼此范围内的通知:-)
谢谢你的帮助!
从我从Bluetooth Essentials for Programmers中读到的内容,这本书提到了一些我不太了解的观点.
RFCOMM是一种可靠的基于流的协议.L2CAP是一种基于数据包的协议,可配置不同级别的可靠性.
L2CAP实际上充当RFCOMM的传输协议,因此每个RFCOMM连接实际上封装在L2CAP连接中.
这真的让我困惑,因为这两个协议是不同类型的协议(一个是基于流的,而另一个是基于分组的).所以基于它的解释,我在下面有一些问题.
由于RFCOMM连接是封装的,那么串口配置文件(SPP)如何使用RFCOMM连接?它也应该使用L2CAP.
A2DP使用L2CAP连接.这对我来说意味着相同,因为L2CAP和RFCOMM封装在ACL连接中,这是否意味着A2DP使用ACL连接?我知道这是不正确的但是如何解释这里.
谢谢你的解释.
虽然使用Android BLE apis的无证,传统智慧是某些操作,如读/写特征和描述符应该一次一个(虽然有些设备比其他设备更宽松).但是,我不清楚此策略是仅应用于单个连接还是应用于所有活动连接.
我听说最好一次启动一个设备连接.这可能是应该在所有设备之间串行执行的操作(connect/connectGatt)的示例.
但是对于其他操作,比如读写特性,如果每个连接串行执行操作,或者我是否需要在所有设备之间共享一些全局操作队列,以便在所有设备之间只执行一个操作?
我必须使用热敏打印机打印发票收据.我用Zjiang Thermal打印机打印收据.他们还提供手动和演示项目.在演示项目中,他们使用libray"btsdk.jar"来实现连接和打印.
我已成功建立打印机和Android设备之间的连接.但是没有文本对齐(中心,左,右)和单元格宽度,高度的准则.
我如何通过蓝牙打印机打印发票.
还请解释这一节 -
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) 我正在浏览Stack和互联网,以获得一个简单的解决方案来获取UUID我目前正在使用的设备.我偶然发现了这样的帖子,但他们似乎都没有帮助我.
该文档告诉我有关此 getUuids()功能的信息,但在浏览Android蓝牙文档时,我最终得到了一个BluetoothAdapter,但我需要BluetoothDevice执行此功能.
所以我需要知道以下内容:
1)功能是否真的返回设备UUID?因为这个名字叫复数(getUuid s)
2)如何获得此实例BluetoothDevice?
谢谢!
我一直在寻找所有这三个操作平台所需的蓝牙连接参数.我正在使用此项目的HOGP(Bluetooth over HID GATT)配置文件.
我的项目是一个由我自己编写的带有BLE模块的嵌入式系统,我可以控制以下连接参数.
我要连接的目标设备将满足Android> = 4.3,iOS7和> = Win 8.1的连接.
Apple非常友好地在下面的链接中提供了第22页上带有相应参数的文档.我无法找到有关Android和Win 8的任何信息.
https://developer.apple.com/hardwaredrivers/bluetoothdesignguidelines.pdf
我目前的iOS7工作设置完全测试与免费软件lightBlue的双向通信如下.我的iOS7嵌入式代码和主机软件可以使用.
我从另一个堆栈溢出页面发现,据称android可以通过以下链接在7.5ms连接间隔上工作.
不幸的是苹果iOS规范的第二个要求是"IntervalMin≥20ms".
我不理解这些范围或如何解释它们?如果我将Interval min设置为7.5ms for Android不会使苹果要求无效吗?如果可能,我如何满足两个系统和Win8?
我的理解是从设备在最小值和最大值之间提供建议设置,并且主设备(智能手机)警告用户该范围内的实际选定值.
我对这个问题的任何帮助表示感谢,并希望这篇文章能够让其他人考虑到BLE相当新的和不完整的知识基础.
提前致谢!
android bluetooth bluetooth-lowenergy android-bluetooth ios7
我的应用程序在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项目中进行蓝牙低功耗.我正在做的项目基本上是检测所有蓝牙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) 我正在扫描蓝牙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中它将蓝牙堆栈Bluedroid改为Fluoride?
Bluedroid和之间有什么区别Fluoride吗?如果是的话他们是什么?Fluoride Bluetooth stack