I have multiple accelerometer sensors and I need to update the advertisementData name (CBAdvertisementDataLocalNameKey) of the each sensors for the first time of starting to use that sensors. What is the best way to update that from iOS (Objective-C or Swift) app?
You cannot control this data from your app as this data arrives directly "as is" from the remote BLE device. In this case, this is the name of the device that you are scanning for. Have a look at this:-
CBAdvertisementDataLocalName Apple Developer page
The Ultimate Guide to Apple's Core Bluetooth
The only way you can actually change this is if you have access to the accelerometer sensors' source code, and then changing the name will be dependent on the specific software running on these sensors.
Related
For a project of mine I need a pairless bluetooth data transfer. I have first thought about doing it with BLE IBeacons but they can only advertise a very limited amount of data. I looked further through the Apple documentation and found this tutorial about Central/ Peripheral
BLE data transfer. I've implemented the code in my project but even though the devices were very close together they could not "see" each other. I have since looked up on the Internet and could not find a hint about whether the devices need pairing or not and what the problem of mine could be(the code is not throwing any errors nor warnings).
If it does require pairing, is there some way to do that in the background without requiring the user to perform an action, so that I could theoretically advertise some kind of pair request via. IBeacons to then transfer the data? If that's not the case, is there even a way to transfer data (mono directional, round about 512 bytes) between nearby bluetooth devices without user actions?
greets from germany!
To get started with Bluetooth Low Energy or any other protocol, it's best to learn how it works. At least basics.
Simplifying. BLE allows you to send data:
"Passive" (without conncetion) - over Advertisement Data. The size of the packages depends on the BLE version.
"Active" (requires connection with the device) - bidrirectional comunication. In this case size of the data package also depends on the BLE version.
Bonding and pairing is a separate issues.
I suggested you look at the following book:
https://www.oreilly.com/library/view/getting-started-with/9781491900550/
The websites of BLE module manufacturers also offer a lot of information about this technology. For example Nordic or TI. Very often with sample programs for various platforms.
For iOS:
https://developer.apple.com/videos/play/wwdc2017/712/
https://developer.apple.com/bluetooth/
You may also be interested in sending more data without connection using version BLE 5.0
https://www.bluetooth.com/blog/exploring-bluetooth5-whats-new-in-advertising/
I'm hoping to create a BLE advertisement on iOS where I can control the advertisement on a byte level.
One use case would be to mimic an iBeacon advertisement. What is the iBeacon Bluetooth Profile (I want to advertise while my app is in the background which is why I'm not using CoreLocation)
I do not see a way to do this with the Core Bluetooth API. Is this correct? Are there alternatives using private API's or jailbreaking?
As the others already pointed out, there is no API on iOS that allows you to do this.
You can advertise as an iBeacon, but only when your app is in the foreground. When in background, the advertisement is removed and therefore cannot be discovered anymore (except for other iOS devices which explicitly scan for that service UUID). Also see the documentation here: Core Bluetooth Background Processing
If you would share your use case and what you want to achieve, maybe there are other ways to realise it.
My experience with iOS is that if it is something is not exposed in the API, there is no way around, except jailbreaking. For Bluetooth low energy the API is at GAP/GATT level, and very little at the lower levels (if anything) is exposed. Advertising is a LL (link layer) feature.
To illustrate how restricted the access is: When scanning for BLE devices you will not have access to the advertiser's MAC address iOS. In Android you have it.
I do not see a way to do this with the Core Bluetooth API. Is this
correct?
Since you have to set Manufacture Specific Data in order to achieve this, if nothing has changed you will experience exactly the same issue that I did. Explained here:
The advertisement key 'Manufacturer Data' is not allowed in CoreBluetooth
It is not possible.
I am looking for a BLE that could send live sensor data from arduino to iOS custom apps, not the app that is already in the app store. I would like to create my own apps to receive the sensor data.
Or are there any other ways to achieve it?
Please help. Thank you.
You want to use Core Bluetooth. It's a fairly low-level API that lets you set up one device as a "central" and another device as a "peripheral". You can then transfer data back and forth. Do a search on "Core Bluetooth Overview" in the Xcode docs to get started.
As Computer_ACE suggested you should also check out the Arduino Stack Exchange, or you might want to go to the Arduio forums at https://www.arduino.cc.
EDIT
A quick google search on "iOS Arduino BLE example" found this link:
https://www.google.com/search?client=safari&rls=en&q=ios+arduino+BLE+example&ie=UTF-8&oe=UTF-8
I'm writing an iOS app to display real-time Heart Rate from a BTLE device (the Polar H7). I've found 2 ways to do this:
Using CBCentralManager and bit-twiddling the Heart Rate Measurement Characteristic by hand
Using HealthKit's HKObserverQuery
As I see it, there are pros/cons to each approach.
Using CBCentralManager enables more control (e.g., you can store the sensor location) and quicker setup (i.e., you can start displaying values immediately). But, from what I can tell, the BTLE device will not be seen by CBCentralManager if the BTLE device is already paired with HealthKit.
Using HealthKit appears to be the preferred approach (and is much simpler to implement) but requires an extra trip to the Health app to turn on the "Update Health Data" switch.
Should I implement both? Has anyone dealt with this issue?
I haven't dealt with your issue specifically, but I am working on HealthKit integration as well. Based on what you've outline here, I would go with the HealthKit approach and only that approach unless there's some requirement to really push you do to both. If you do have to implement both, I would probably put some abstraction in there so the controllers don't have to know what the source is.
I'm not sure about the extra trip to the Health app you mention. You can ask for permission to the heart rate data from within your app using requestAuthorizationToShareTypes:readTypes:completion:. Here's a tutorial that has a walk through, in case that helps at all: HealthKit Tutorial with Swift: Getting Started.
I'm trying to get a better understanding of Bluetooth LE and been playing around with both iOS and Android's bluetooth stacks and various beacons (StickNFind, Estimote etc...)
On Android, when a device is discovered I get a raw "scan record" - a blob of data that I can parse myself to get the device's advertised data.
On iOS, this is parsed by iOS and presented as a dictionary.
Fair enough, except I was trying to use CoreBluetooth (ie: not location services) to read the advertisement data from an iBeacon and noticed that iOS seems to strip out the manufacturer specific advertisement data for iBeacon devices.
I realise I should probably be using Apple sanctioned ways for detecting iBeacons but it doesn't really fit our use case and wondering if there's a way around it.
EDIT: iOS does let you access the raw data for any Bluetooth advertisement that does not match the iBeacon format.
Unfortunately, iOS blocks access to the raw data of all BLE advertisements, including those of iBeacons. This makes it impossible to access the iBeacon identifiers with CoreBluetooth.
See details in this blog post.