我正在寻找一个支持蓝牙LE连接的Java库,特别是GATT,如果我很幸运Apple的新iBeacon协议.它需要能够自己广播,如果可能的话,能够发起连接.
我见过BlueCove甚至试图扩展它以支持蓝牙LE,但无法让它工作.有没有人知道任何支持蓝牙库的Java SE,而不是Android或Java ME,因为这似乎是我能找到的全部.
有任何想法吗?
这是我关于SO的第一篇文章.
我在Android 5.0.2上订阅GATT通知时遇到了一些问题.
我的目的是将Arduino和BLE Shield连接到我的Android手机.我有一个连接到Arduino的传感器,想要使用BLE屏蔽将数据从Arduino发送到我的手机.盾牌上有一个nRF8001是服务器,我的手机/应用程序是客户端.
到目前为止我所做的是创建一个扫描BLE设备的Android应用程序.它可以连接到设备并读取或写入特征.所以,我可以通过调用"手动"读取特征gatt.readCharacteristic(mCharacteristic);
.这允许我从Arduino获取传感器值.我还使用nRFGo Studio创建了一个自定义服务.我知道这部分工作正常,因为我可以使用Google Play上提供的BLE扫描仪应用程序发现,连接甚至收到有关特征变化的通知.但订阅我自己的应用程序中的通知将无法正常工作.好吧,至少订阅有效,但onCharacteristicChanged(...)
从未调用过.有趣的是,如果我订阅我的应用程序中的特性,然后使用BLE扫描仪应用程序订阅它突然onCharacteristicChanged(...)
被调用,直到我再次通过BLE扫描仪应用程序取消订阅.(我可以通过Log看到这个)
我的android代码如下:GATT回调:
private final BluetoothGattCallback mGattCallback =
new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status,
int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
sendBroadcastConnected();
Log.i("BLE", "Connected to GATT server.");
Log.i("BLE", "Attempting to start service discovery:" + bleManager.startServiceDiscovery());
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
sendBroadcastDisconnected();
Log.i("BLE", "Disconnected from GATT server.");
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用BLE在设备之间交换数据的应用程序.
为了获得更好的性能,在连接两个设备后,我正在协商增加MTU,以便通过BLE交换更大的数据包.
连接BluetoothDevice并读取所有服务和特性后,我请求使用以下命令增加MTU:
private void requestMtu() {
//gatt is a BluetoothGatt instance and MAX_MTU is 512
this.gatt.requestMtu(MAX_MTU);
}
Run Code Online (Sandbox Code Playgroud)
之后,在BluetoothGattCallback
实现中,我获得MTU请求成功,新MTU匹配我请求的MTU:
@Override
public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
super.onMtuChanged(gatt, mtu, status);
if (status == BluetoothGatt.GATT_SUCCESS) {
this.supportedMTU = mtu;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试发送512字节的数据包时,在另一侧(onCharacteristicWriteRequest:
)我得到509字节.
有任何想法吗?
我运行时 使用Ubuntu 16.04 64位操作系统
$ sudo pip3 install gattlib
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息
/ usr/bin/ld:找不到-lboost_python-py34
collect2:错误:ld返回1退出状态
错误:命令'x86_64-linux-gnu-g ++'失败,退出状态为1
我试着谷歌搜索如何解决这个问题,但没有什么对我
有用我想在python使用gatttool,所以我需要安装这个
我怎么解决这个问题?
PS.我已经下载了libboost-dev
我正在寻找蓝牙 GATT 服务列表以及每个服务的简短描述。我正在开发 BLE Android 应用程序,必须选择最好的服务。
在GATT之前,createRfcommSocketToServiceRecord,createInsecureRfcommSocketToServiceRecord
方法可以使配对设备,
但GATT没有关于配对设备的选择,只能使用BluetoothDevice.connectGatt(...)
如果它已连接,我想制作配对设备.
谢谢.
我有Android应用程序暴露BLE服务器.我连接BluetoothGattServer#connect.它有效 - 我的应用程序通过STATE_CONNECTED调用BluetoothGattServerCallback#onConnectionStateChange.当我完成客户端后,我尝试使用BluetoothGattServer#cancelConnection与我的应用程序断开连接.
但我没有接到对BluetoothGattServerCallback#onConnectionStateChange的调用,似乎连接仍然处于活动状态,因为我的BLE客户端没有开始做广告(当没有任何连接时它就会这样做).
在logcat中我只看到:
BluetoothGattServer: cancelConnection() - device: XX:XX:XX:XX:XX:XX
Run Code Online (Sandbox Code Playgroud)
有趣的是,我的应用程序在完全关闭BT后立即调用BluetoothGattServerCallback#onConnectionStateChange和STATE_DISCONNECTED.
android bluetooth-lowenergy android-bluetooth gatt android-ble
在linux中,我们有gatttool
查询蓝牙低功耗设备的工具.如果我们运行,gatttool --device=[MAC] --characteristics
我们将获得相应设备具有的特征列表.示例输出:
handle = 0x0002, char properties = 0x02, char value handle = 0x0003, uuid = 00002a00-0000-1000-8000-00805f9b34fb
handle = 0x0004, char properties = 0x02, char value handle = 0x0005, uuid = 00002a01-0000-1000-8000-00805f9b34fb
handle = 0x0006, char properties = 0x0a, char value handle = 0x0007, uuid = 00002a02-0000-1000-8000-00805f9b34fb
handle = 0x0008, char properties = 0x02, char value handle = 0x0009, uuid = 00002a04-0000-1000-8000-00805f9b34fb
handle = 0x000d, char properties = 0x22, char value handle = 0x000e, uuid …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个连接到BLE设备并读取Gatt服务和Gatt特性的Android应用程序.我使用Android开发站点的BluetoothLeGatt示例项目作为参考.
到目前为止,我能够以编程方式连接到设备(我注意到我的设备地址能够执行此操作)并通过记录UUID过滤掉我想要读取的特定Gatt服务以及服务的特定特征服务和特征.当我的BLE设备向我的Android应用程序发送消息时,Google提供的示例也会更新.总的来说,我没有遇到任何问题.
但是,在GATT上进一步阅读后,我发现可以使用单个Android应用程序(作为主OR客户端 - 连接到多个BLE设备(所有从属设备或服务器 - 发送数据的设备))接收所述数据).所以我试图做的是拥有2个BLE设备(不同的地址),记下他们的地址,然后我的应用程序尝试连接到它们,一旦应用程序看到这两个地址启动并运行.
在代码中,当我看到我的2个BLE设备时,我会调用此函数:
private void connectToDevice(){
mDeviceName = deviceList.get(currentIndex).getName();
mDeviceAddress = deviceList.get(currentIndex).getAddress();
Log.e(TAG, "connecting to device name = " + mDeviceName);
mBluetoothLeService.connect(mDeviceAddress);
}
Run Code Online (Sandbox Code Playgroud)
当currentIndex
最初设置为零.然后,一旦我成功连接,我会:
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
Log.e(TAG, "connected");
mConnected = true;
if(currentIndex < deviceList.size()-1) currentIndex ++;
connectToDevice();
}
}
};
Run Code Online (Sandbox Code Playgroud)
在哪里检查我是否仍然有设备连接到我的deviceList
,如果是这样,增加我的计数器,然后连接,直到我耗尽我的列表中的所有内容.
但是,我似乎完全没有使用这种方法.
请注意,我的设备之间无法切换连接(循环).当我拥有大量设备时,这将是一个问题,重要的是让他们的消息实时无延迟.这就是说,我必须有一个与我的设备的实时连接.
有没有人试图连接到Android中的多个BLE设备?我不确定如何继续这个.
我有一个外围设备,支持 A2DP 配置文件和BR/EDR 上的 gatt。各种 gatt 服务都在蓝牙经典的 sdp 记录中注册。\n我开发了一个 Android 应用程序来与其成功通信,如下所示:
\n\n//here scan the classic Bluetooth to get its address\nBluetoothDevice device = bluetoothAdapter.getRemoteDevice(**CLASSIC_BLUETOOTH_ADDRESS**);\ndevice.connectGatt(context, false, gattCallback, BluetoothDevice.TRANSPORT_BREDR);\n
Run Code Online (Sandbox Code Playgroud)\n\n现在我需要开发一个iOS应用程序,经过大量搜索,似乎iOS 13之后CoreBluetooth确实支持GATT over BR/EDR,但与android不同的是,它无法扫描经典蓝牙设备,但我确实找到了示例代码\ n苹果示例代码在这里,所以我编写我的测试代码如下:
\n\n\nimport CoreBluetooth\nimport UIKit\nimport os.log\n\nstruct BTConstants {\n static let uuidService = CBUUID.init(string: "66666666-8888-7777-5555-123456780000") //our gatt service uuid(modified)\n}\n\nclass CentralViewController: UIViewController {\n private var cbManager: CBCentralManager!\n\n override func viewDidLoad() {\n super.viewDidLoad()\n cbManager = CBCentralManager(delegate: self, queue: nil)\n }\n}\n\nextension CentralViewController: CBCentralManagerDelegate {\n func centralManagerDidUpdateState(_ central: CBCentralManager) …
Run Code Online (Sandbox Code Playgroud) gatt ×10
android ×5
bluetooth ×2
android-ble ×1
arduino ×1
c# ×1
gatttool ×1
ibeacon ×1
ios ×1
java ×1
python-3.x ×1
swift ×1
ubuntu-16.04 ×1
windows-10 ×1