I’m trying to access Telemetry Datas with iOS SDK. I’ve got no luck so far and everything I tried doesn’t work.
I tried to follow the explications on the SDK’s GitHub README and translate it into Swift. However, the notificationBlock is never called.
let lightNotification = ESTTelemetryNotificationAmbientLight.init(notificationBlock:
{ (light : ESTTelemetryInfoAmbientLight) in
print("New Temperature : \(light.ambientLightLevelInLux)")
})
deviceManager.registerForTelemetryNotification(lightNotification)
My problems are the following :
How to specify which beacon we want to read the values ? (Maybe this is what I missed and the reason I’m never getting notified)
Why is it never called ? What did I miss ?
What I did try :
Set in the Estimote App that the Beacon does advertise Estimote Telemetry (also did it for Eddystone TLM, because we never know :/)
Connect to the beacon before trying to get notified
Put this code in the “DidRangeBeacon” and using the manager from parameters instead of the attribute one.
How to specify which beacon we want to read the values ? (Maybe this is what I missed and the reason I’m never getting notified)
Every ESTTelemetryInfo object has a property called shortIdentifier, which is the first 8 bytes of the identifier of the beacon from which the Telemetry data has come. So if you want to do any filtering, that’s the way to go.
Why is it never called ? What did I miss ?
Can you double check whether you hold a strong reference to the ESTDeviceManager object? If this object gets deallocated (e.g., because you only store a reference to it in a local variables, which gets removed when a function finishes execution), Telemetry notifications will stop. I just updated the README file to make this a bit more clear—I think the previous code snippet may have been slightly confusing in that regard indeed.
I do have a strong reference to ESTDeviceManager. It is a parameter of my class, instantiated in the constructor. I tried an “outside” instantiation too but it doesn’t change.
I changed all the code with the new one from the README, yet no change. I never get the temperature printed. The function registering is clearly called by the way (printing around are showing in console).
By the way, is there a way to access Telemetry values once connected to the beacon ?
We’re actually aware of a bug in the iOS SDK that prevents Telemetry from being discovered if the beacon is on firmware 4.5.0 or later. A fix is already in the works, and should go out soon!
Thanks Piotr, but this implies that you already know the shortIdentifier, and knows which Beacon this telemetry belongs to. How do you figure out how to correspond the telemetry to a beacon?
e.g., you can fetch a list of all your devices from Estimote Cloud (ESTRequestV2GetDevices), and match the short identifiers to long identifiers, and then look up the UUID/major/minor/Eddystone-UID/whatever else you need.
Thanks, Piotr. I figured this out for iOS, but I wasn’t specific when I asked. I meant, how do you do it for Android?
Right now when receiving telemetry for beacons, I looks up the tlm device with fetchDeviceDetails and its device id. Getting this callback means I get a “identifier” for this tlm including major and minor, which I compare against the beacon ranged.
This works, but it could be better and quicker if you didn’t need to look up the tlm device in the cloud in order to get a identifier you could compare with the ranged beacons.
So eg. if the tlm device could contain proxUUID, major and minor or just the MAC address, then the comparison can happen instantly without having to do a lookup in the cloud.