背景 : 理想情况下,我希望我的Android设备始终能够扫描Bluetooth Low Energy设备,以便每当出现具有特定属性的新设备时启动应用程序。 因此,BLE中的广播包例如列举了由广播设备提供的一组服务。 然后,应用程序就可以注册某些服务的兴趣,并在具有此服务的设备进入范围时自动启动。 从我的理解,这不是如何Android BLE API的作品? 那么我怎么能得到类似的东西? 最简单的例子 : 我有一个BLE传感器可以logging环境温度。 每当我的Android手机足够接近我想连接并下载所有的数据,发送到一些云存储解决scheme。 这个应用程序不需要任何GUI(至less在configuration完成后)。 但是如何在不消耗电池的情况下在后台运行,但是一旦处于范围之内,还是给了我一个很好的连接设备的机会? 问题 : 我是否需要设置计时器并每隔一段时间唤醒应用程序,然后手动开始扫描? 我应该select什么样的间隔。 多久可以让扫描仪运行而不会对电池产生负面影响? 可能的scheme 这是我到目前为止所提出的。 configuration活动来设置要扫描的时间间隔和设备 configuration活动将设置一个类似于Scheduler例子的WakefulBroadcastReceiver 当接收者得到onReceive事件时,我开始一个BLE扫描服务(我写的)作为一个醒目的服务。 扫描服务开始扫描(使用注册callback)。 该服务可能会得到副作用的报告 超时后,服务将停止扫描器并结束清醒的服务。 这工作,但我不知道这是最好的方法。 我也不知道我可以有多less间隔,并且仍然避免破坏电池寿命。 我想要的是开始扫描每两分钟,扫描10-20秒。 但是,恐怕这会很频繁地唤醒设备?
我有一个使用CoreBluetooth在iPad(中央)和iPhone(外设)之间进行通信的应用程序。 我有一个有两个特点的服务。 我有一个运行最新的Android 4.3与BTLE支持的Nexus 7。 Android在BTLE的风潮上稍微晚了一点,但似乎他们已经接近iOS的样子了,最初他们只支持作为中央处理器的外设模式进入后期版本。 我可以加载示例Android BTLE应用程序并浏览附近的外围设备。 通过我的iPhone广告作为外设,我可以在Android端的附近外围设备列表中看到来自CBAdvertisementDataLocalNameKey的值。 我可以连接到iPhone,连接时蓝牙符号从浅灰色变成黑色。 连接总是持续10秒,然后断开连接。 在Android方面,我应该看到一个可用的服务和特性列表在连接时立即出现。 我已经certificateAndroid代码安装正确,因为我可以将它连接到TI的CC2541DK-SENSOR硬件,并且在连接到它时列出所有服务和特性。 我花了几天的时间解决这个问题,但没有成功。 问题是我无法确定哪个设备出现错误,从而导致断开连接。 CBPeripheralManagerDelegate在连接阶段或服务发现阶段没有callback,所以我不知道在哪一点发生错误(如果错误是在iOS端)。 在Android端调用一个方法来启动服务发现,但是他们的callback“onServicesDiscovered”永远不会被调用,这是令人困惑的。 有没有什么办法可以深入到iOS端的BTLE通信的内部,看看发生了什么事情,并确定发生了什么错误?
我正在研究使用多个iBeacons做一个“粗糙的”室内位置的可能性。 应用程序是一种“博物馆”的设置,能够形成一个网格与不同的对象,然后单独的信标(尽pipe这可能不是不可能的)将更容易。 有没有例子,经验,使用多个信标三angular形到某种位置,或一些逻辑来帮助我自己写的方式?
我试图制作一个使用Android的新型蓝牙低功耗API的应用程序。 为此,我开始使用API级别18的BLE示例。 当我读到Android不能作为外围设备时,我把Android手机置于中央模式,扫描周围的BLE设备 。 为此,我使用模拟心脏传感器的北欧平台进行了一些testing。 一切都以完美的方式运作! 在此之后,我尝试挑选一个iPhone(iOS 7 beta 4) ,并将其设置为外设方式,并像之前的testing一样模拟心率传感器 。 Android应用程序能够看到设备并连接到它。 但连接激活后,两台设备将在3-4秒内断开连接。 除此之外,当我在Android端调用discoverServices()时,不会触发callback! 在某些情况下,即使iOS蓝牙芯片处于closures状态,Android设备也会收到“已连接”事件。 这很奇怪。 为了certificate这一点,我把北欧板放在中央模式下 ,我正确地连接到iOS设备,没有任何问题。 会是什么呢? Android或iOS有一些限制,不允许从Android连接到iOS或反之亦然? 谢谢。 编辑:经过一番艰苦的testing,我在AOSP页面上提出了一个问题。 可以在这里检查
我试图编写一个应用程序通过蓝牙低功耗发送消息,然后通过UART在外设中传递消息。 我已经按照这里的步骤,应用程序扫描并find设备成功。 但是,使用BluetoothGatt = BluetoothDevice.connectGatt(context,autoconnect,callback)方法的连接失败,logcat说“无法注册callback”。 呼叫来自: //device scan callback private BluetoothAdapter.LeScanCallback btScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) { some stuff currBtGatt = device.connectGatt(parentActivity, false, btGattCallback); } }; 而加特callback: //GATT callback private BluetoothGattCallback btGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, […]
通过连接到外部BLE设备,我可以发送多达20个字节的数据。 如何发送大于20个字节的数据。 我已经读过,我们必须要分割数据或分割特征到所需的部分。 如果我假设我的数据是32字节,你能告诉我的变化,我需要在我的代码使这个工作吗? 以下是我的代码所需的片段: public boolean send(byte[] data) { if (mBluetoothGatt == null || mBluetoothGattService == null) { Log.w(TAG, "BluetoothGatt not initialized"); return false; } BluetoothGattCharacteristic characteristic = mBluetoothGattService.getCharacteristic(UUID_SEND); if (characteristic == null) { Log.w(TAG, "Send characteristic not found"); return false; } characteristic.setValue(data); characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE); return mBluetoothGatt.writeCharacteristic(characteristic); } 这是我用来发送数据的代码。 “发送”function用于以下onclick事件。 sendValueButton = (Button) findViewById(R.id.sendValue); sendValueButton.setOnClickListener(new […]