I'm tasked with developing an iPhone app whose first bit of functionality is to connect to a bluetooth transmitting device, receive data from that device, and use that data to do other important things. The issue I'm having is that there doesn't seem to be any good sort of SDK to work with, so I'm thinking of using the GameKit framework to search for bluetooth transmitting devices, connect to the (correct) device, and to receive data from this device.
Bullet points:
- search for bluetooth device
- connect to bluetooth device
- receive data only from the device
Tips/advice?
Apple doesn't let just any Bluetooth device to connect to an iOS device. The device must be MFi compliant.
Assuming you've been tasked with writing the app to work with your company's product, start with signing up with the MFi developer program from Apple.
Assuming the opposite, that you've been tasked with writing the app to work with a third party device make sure the product is MFi compliant. Finding a "Made for iPhone" or "Made for iPad" logo on the device or packaging is likely to indicate it is MFi compliant.
From there you should investigate the External Accessory Framework. Try reading External Accessory Programming Topics
Related
So my question is can we create an iOS app that can receive data from any bluetooth devices? Even the devices we buy it form eBay?
Any encoding when the data sent from the devices make us can not decode them? Or another description : Can the bluetooth device limit the app that can connect to them ?
Thank you very much.
An iOS app can receive data from any bluetooth device which must confirm the protocol of Bluetooth(GATT, ATT, L2CAP).
Bluetooth device can limit the device to connect by the data format(such as CRC, XOR), the device even can limit the special MAC address of bluetooth to connect if your app not sale on App Store
Below is a simple description to Core Bluetooth, please check the detail Core Bluetooth Programming Guide
The bluetooth device is a Peripheral to produce data, iOS app is a Central that can receive data or send limited data to Central.
When the Peripheral begins advertise, the Central can search and connect to it, when the connection is build, Central can notify or read the Characters in Services of Peripheral
An iOS app can connect to any device that supports the GATT profile with Bluetooth Low Energy/Bluetooth Smart using the Core Bluetooth framework.
Generally, a peripheral cannot prevent your app from connecting to the device, but your ability to read/interpret the data offered by the device will be limited by:
The documentation provided by the device vendor
Your ability to "reverse engineer" the information if documentation is not provided
Any handshake/security methods that the vendor may have implemented; For example the device may require your app to respond with specific data in response to data from the device - see point 2.
Devices that use legacy Bluetooth (i.e. not BLE) are only supported if they offer generic services such as audio - these are supported by the AV framework, or if they are MFi certified - these are supported by the External Accessory framework.
I'm currently digging my through the nest of using Bluetooth in my iOS application and I find it quite hard to find the information I'm looking for.
Can I turn on Bluetooth from within my app or does the user have to do it manually?
Can I use the basic Bluetooth fetaures (such as Discovery, connecting and Sending Data) with other devices running Bluetooth < 4.0 (classic)
AFAIK CoreBluetooth Framework can only be used to communicate with devices running Bluetooth 4.0+. Which framework is used to communicate with Bluetooth < 4.0 devices?
Is it possible to use Bluetooth in such a way that Apple will reject my App on App Store? And which ways would that be?
Is there a difference between paired and unparied communication? Can one communicate with another device without being paried? Can pairing be initated from an app?
To give some Context to my question: I'm currently developing a part of a Home Automation Application where the App needs to communicate with an embedded device which does not yet have Wifi. It has not been decided which Bluetooth version will run on the embedded device. The same functionality will be implemented in an Android application.
Thankful for some input from some with Bluetooth experience for iOS.
you cannot turn on Bluetooth from your app. The user must do it using settings or the control center.
unless you device is MFi certified you can only communicate with Bluetooth Low Energy devices
the external accessory framework is used to communicate with MFi devices that use "classic" Bluetooth
I am not aware of any use of Core Bluetooth that will lead to app rejection. If your app supports an MFi accessory that isn't associated with your company then your app will be rejected.
you can initiate bonding (commonly known as pairing but it is actually different) by requiring encryption for an attribute. Once the bonding is complete there is no difference in how you transfer data, but the data will be encrypted over the air.
I'd really like to start testing my iOS apps Bluetooth capabilities, but have run into a few problems:
I have a device made with a RN-42 module, but it's not the Apple version and I don't have the Apple authentication module at the moment (I ordered it, but shipping from China can take a while). I know what the messages will look like, but can't send them to my iPhone!
I can use the module with my Macbook, but not in the iOS simulator! Apple has taken down all of the documentation related to getting the iOS < 7.0 to use a separate bluetooth dongle, and my efforts have left my 6.1 simulator endlessly spinning on the bluetooth screen.
I'm new to using Bluetooth, so this may be a dumb question...
Is there a way of getting a bluetooth client device (I have a Mac, another iPhone, and an Android tab) to act as a server module that can send (and receive) Bluetooth data to my iPhone?
Client/Server as per developer.bluetooth.org
Thanks!
Not 100% sure your meaning of "server module". But in CoreBluetooth, you can use CBPeripheralManager to broadcast data to other iOS or Mac apps.
https://developer.apple.com/library/ios/documentation/CoreBluetooth/Reference/CBPeripheralManager_Class/Reference/CBPeripheralManager.html
If you're using standard Bluetooth (i.e. not Bluetooth LE or Bluetooth Smart or whatever you want to call it), you'll need to enroll in the MFI program or work with an MFI certified device (such as a Redpark cable) and use the External Accessories library provided by Apple. If you're using Bluetooth LE, you can use the Core Bluetooth library provided by Apple. If you fall into neither of those cases, sorry, you can't use Bluetooth on iOS.
The vibe I'm getting from Stackoverflow and the internet at large is that unless I'm using an LE device, any Bluetooth device I make for an iOS app must be MFi certified.
However, on the MFi FAQ page, I found this line:
...developers of accessories that rely solely on standard technology
(e.g., Bluetooth Low Energy or standard Bluetooth profiles) do not
need to join the MFi Program.
My device will be able to use the standard Bluetooth profile File Transfer Protocol (FTP).
Now this sounds like some conflicting advice to me, or perhaps I'm just not understanding correctly. So, having provided the above evidence, I'm just going to ask outright: Can I write and publish an iOS app that connects to a proprietary Bluetooth device using the standard Bluetooth profile FTP without certifying my device as MFi? And if so, what details, caveats, etc do I need to know?
The new Bluetooth 4.0 Low Energy (hereafter BLE 4.0) specification which is implemented in Apple's latest iOS devices does allow one to create app-specific profiles and connect to BLE 4.0 devices without jailbreaking, using an approved Bluetooth 2.1 profile, or becoming part of Apple'd MFI program and using the previously required MFI cryptographic chips.
In other words with the proper BLE 4.0 compatible bluetooth radios you can create wireless devices that connect to iOS apps without having the device pre-approved by Apple. However, you must write a custom app for the device, and Apple still holds the ability to reject that app if they want to. So they still control this to a great degree. This is essentially Apple's answer to the Android ADK, while not fully relinquishing the ability to shut down apps and devices they don't like.
Your app must include specific XML schema for your app's bluetooth profile, and use CoreBluetoothFramework APIs, so it's very obvious to Apple during the app approval process that your app connects to a device. If your app does not work without the device present, then it's likely to be rejected if you are not part of the MFI program, as Apple cannot test the app without your device. The apps that appear to be successful in passing this test use the device as an accessory to app functionality, rather than a requirement. For instance an exercise app might connect to a BLE 4.0 heart rate monitor, but the app doesn't depend on it.
Some apps seem to be getting around this by displaying simulated, or online information in place of the device information when no device is present. Thus the app can be tested without the device, and functionally works when the device is present.
You can find out some successful efforts online:
http://blog.makezine.com/2012/03/19/bluetooth-4-0-from-arduino-to-iphone-no-jailbreaking-no-mfi/
BlueGiga in particular has been pushing their devices specifically for this use, so there are probably forums and support for this elsewhere.
Keep in mind that the devices that currently support BLE 4.0 are limited, and currently only include
iPhone 4S and later iPhones
recent MacBook Air, Mac Mini
iPad (3rd generation and later, and iPad mini)
Macbook Pro Retina
There may be other Apple devices that support this standard, it's something Apple is advertising openly on each product's technical specifications page so it's easy to find for current products.
That line is referring to standard profiles supported natively by ios devices, such as HFP or A2DP. If you build a headset device that does HFP, the iphone will be able to connect to it and route your call to the headset without the headset being part of MFi.
If you want to write an app that does other things with bluetooth, inlcuding FTP, you would have to use MFi.
I am developing an App which needs to connect to a bluetooth device. I dont want to deploy this app in the app store. I only need this for personal use. Is there any way to connect to this bluetooth device (which is old as hell and definitely not MFI certified). In the FAQ of the MFI program (http://mfi.apple.com/faqs) it says that it is possible with third party solutions. Does anyone know something about that? I havent found any products which builds a bridge between the iPhone and the bluetooth device.
Furthermore the faq says:
"app developers and developers of accessories that rely solely on standard technology (e.g., Bluetooth Low Energy or standard Bluetooth profiles) do not need to join the MFi Program."
My bluetooth device uses a standard bluetooth profile, but i can't connect to it.
If your app is not going to app store, you can try using the private framework called BlueToothManager. I haven't worked with it but it can help you.
The MFI compatible devices are registered with Apple and communicate with a Bluetooth Profile registered with Apple. That particular protocol string (Eg. com.apple.ps1) will be given by the MFI device manufacturer, which you will need to include in the info.plist file.
If you are targeting devices which have ios 5 and up you can try using the CoreBluetooth Framework. Here is the link
https://developer.apple.com/library/ios/#documentation/CoreBluetooth/Reference/CoreBluetooth_Framework/_index.html#//apple_ref/doc/uid/TP40011295