Re: How to get the updated advertisementData (kCBAdvDataManufacturerData) value?
I think one issue with that code, is that you aren't keeping a reference the peripheral. Here is a sample file that works, I tested it on our device. We are not connecting to the device, just scanning. Our advertisement data change when you press a button to let the app know which device was just pressed. https://gist.github.com/christophercotton/0993c9702b416dcee242 import UIKit import CoreBluetooth class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate { var centralManager:CBCentralManager! var queue:dispatch_queue_t! var datas = [String : String]() var peripherals = [CBPeripheral]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. queue = dispatch_queue_create("MyBLE", DISPATCH_QUEUE_SERIAL) centralManager = CBCentralManager(delegate: self, queue: queue); } func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) { if (!contains(peripherals, peripheral)) { peripherals.append(peripheral) } let key = peripheral.identifier.UUIDString let data = advertisementData.description if let previous = datas[key] { if (previous != data) { println("Different \(peripheral.name): \(data)") } } else { println("\(peripheral.name): \(data)"); datas[key] = data } } func centralManagerDidUpdateState(central: CBCentralManager!) { println("centralManagerDidUpdateState"); if (central.state == .PoweredOn ) { println("Scanning") centralManager.scanForPeripheralsWithServices(nil, options:[CBCentralManagerScanOptionAllowDuplicatesKey:true]); } } } On Fri, Jan 16, 2015 at 1:48 PM, Hank Li <hank.h.li@gmail.com> wrote:
Here is my testing code to get the advertisement data, the repeat scan does not get the updated advertisement data.
import UIKit import CoreBluetooth
class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate { var centralManager:CBCentralManager! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. centralManager = CBCentralManager(delegate: self, queue: nil); } override func viewWillAppear(animated: Bool) { NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: Selector("startScan"), userInfo: nil, repeats: true); } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func startScan() { println("startScan"); centralManager.scanForPeripheralsWithServices(nil, options: nil); NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("stopScan"), userInfo: nil, repeats: false); } func stopScan() { println("stopScan"); centralManager.stopScan(); } func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) { println("\(peripheral.name): \(advertisementData)"); } func centralManagerDidUpdateState(central: CBCentralManager!) { println("centralManagerDidUpdateState"); } }
Thanks, Hank Li
On Fri, Jan 16, 2015 at 10:46 AM, Hank Li <hank.h.li@gmail.com> wrote:
Hi, Chris:
can you email me your test app? I'd like to test it on my phone.
Thanks, Hank Li
On Fri, Jan 16, 2015 at 7:32 AM, Christopher Cotton <christopher.cotton@gmail.com> wrote:
I'll have to write a short simple app to demonstrate. But, we change our manufacturer data and haven't had any issue with caching. The change shows up almost immediately. We don't have to connect to it either.
Which part of the data are you changing?
On Fri, Jan 16, 2015 at 9:20 AM, Zach Dennis <zach.dennis@gmail.com> wrote:
iOS caching will be problematic for purely advertisement data changes. We have seen related issues as well where it will cache advertisement data based on the advertiser's address in the advertisement. We have a switch that causes a BLE device to act as different devices when toggled, but iOS caching causes an issue.
Our resolution so far is to have the user toggle wifi on and off which seems to force the iOS BLE cache to be cleared.
One thing to try if you own the firmware code on the BLE device is to change the advertiser address whenever you change advertising data, then iOS will think it sees a new device. But, that may defeat whatever it is you're trying to do. I'm assuming you're trying to avoid making the device connectable.
Zach
On Fri, Jan 16, 2015 at 6:09 AM, David Chu <storywithoutend@gmail.com> wrote:
Hey Hank,
I believe this is the problem.
CoreBluetooth only discovers a device once and then caches the data to save energy. In order to keep getting the updated data you would need to do one of two things.
- Connect to the device and then ask for an update of the advertising data. It seems this is what you are avoiding.
- Stop stop and restart your scan. (perhaps on a time delay? I have never stopped and restarted a scan right after each other. But I can confirm that restarting the scan will make the device discoverable again).
Dave
On Jan 16, 2015, at 10:52 AM, Hank Li <hank.h.li@gmail.com> wrote:
The peripheral is saved. the issue is that when the advertisement data is changed on the device, the ios app could not get the updated value. It seems the ios cached the advertisementdata.
Thanks, Hank Li
On Thu, Jan 15, 2015 at 5:05 PM, Christopher Cotton <me@christophercotton.com> wrote:
We use changing advertisement data just fine in our iOS app. Are you keeping a reference to the peripheral that is given to you? you should get a ton of logs. You need to keep a reference otherwise it discards that peripheral as per the docs in the header:
* @discussion This method is invoked while scanning, upon the discovery of <i>peripheral</i> by <i>central</i>. A discovered peripheral must
* be retained in order to use it; otherwise, it is assumed to not be of interest and will be cleaned up by the central manager.
On Thu, Jan 15, 2015 at 6:33 PM, Hank Li <hank.h.li@gmail.com> wrote: > For my IOS app (on ios8), once it get the advertisementData, it > will > stay > the same, even the data has been changed on the BLE device. How can > I > get > the updated advertisementData in my ios app? > > Here is the code, the startScan is called every 5 seconds. > > func startScan() { > let opts = [CBCentralManagerScanOptionAllowDuplicatesKey:true]; > centralManager.scanForPeripheralsWithServices(nil, options:opts); > } > > func centralManager(central: CBCentralManager!, > didDiscoverPeripheral > peripheral: CBPeripheral!, advertisementData: [NSObject : > AnyObject]!, > RSSI: > NSNumber!) { > println("\(advertisementData)"); > } > > Here is the output, > [kCBAdvDataLocalName: MyDevice001, kCBAdvDataIsConnectable: 1, > kCBAdvDataManufacturerData: <11e467f7 7ec2ed>] > > the output will never change. how to get the updated > advertisementData > value? > > Thanks, > Hank Li > > > > _______________________________________________ > Do not post admin requests to the list. They will be ignored. > Bluetooth-dev mailing list (Bluetooth-dev@lists.apple.com) > Help/Unsubscribe/Update your Subscription: > > > https://lists.apple.com/mailman/options/bluetooth-dev/christopher.cotton%40g... > > This email sent to christopher.cotton@gmail.com
-- Christopher
_______________________________________________ Do not post admin requests to the list. They will be ignored. Bluetooth-dev mailing list (Bluetooth-dev@lists.apple.com) Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/bluetooth-dev/storywithoutend%40gmai...
This email sent to storywithoutend@gmail.com
_______________________________________________ Do not post admin requests to the list. They will be ignored. Bluetooth-dev mailing list (Bluetooth-dev@lists.apple.com) Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/bluetooth-dev/zach.dennis%40gmail.co...
This email sent to zach.dennis@gmail.com
-- @zachdennis http://www.continuousthinking.com http://www.mutuallyhuman.com
-- Christopher
-- Christopher _______________________________________________ Do not post admin requests to the list. They will be ignored. Bluetooth-dev mailing list (Bluetooth-dev@lists.apple.com) Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/bluetooth-dev/site_archiver%40lists.... This email sent to site_archiver@lists.apple.com
participants (1)
-
Christopher Cotton