I've been banging my head against this for the last week or so. I've already gone through the following resources:
StackOverflow: Bonjour over bluetooth WITHOUT Gamekit ? (3844189)
StackOverflow: How does Bonjour Over Bluetooth Work (3350094)
StackOverflow: Using iOS GameKit's “Bluetooth Bonjour” with other platforms (8070998)
Technical Q&A QA1753 -- Apple Developer
WiTap sample application
SRVResolver sample application
DNSSDObjects sample application
I'm using Mac OS 10.7, Xcode 4.5, an iPhone 4 with iOS 6, and an iPad 1 with iOS 5.1.1.
My problem is this: I am modifying an application that currently uses GameKit's peer picker to connect between an iPad and a iP{hone|od touch}. We want to modify this to use Bonjour over Bluetooth instead because we've had issues with reconnecting the devices using Gamekit if the connection is lost. I've used dns_sd.h API to some success and have gotten the service to advertise and resolve over wifi, but even though I am passing kDNSServiceFlagsIncludeP2P I am not getting any success over bluetooth.
I thought possibly Bluetooth Bonjour need a PAN established between devices already, but even pairing the iPad to the iMac and browsing for DNS-SD services gives me nothing...and the iPhone won't pair to the iPad anyway.
I just finished solving this in my own app in the last 24 hours. I used the core classes from the OS X sample app DNSSDObjects. I only had to change three lines of code to add support for bluetooth. This works great in my iOS app.
In DNSSDBrowser.m, the call to DNSServiceBrowse needs to have kDNSServiceFlagsIncludeP2P passed in for the 2nd parameter.
In DNSSDRegister.m, the call to DNSServiceRegister needs the same change.
In DNSSDService.m, the call to DNSServiceResolve also needs the same change.
If you want to limit yourself to just bluetooth, and not WiFi, then the same three lines of code should be updated so the 3rd parameter is kDNSServiceInterfaceIndexP2P instead of kDNSServiceInterfaceIndexAny.
Indeed, it looks like the kDNSServiceInterfaceIndexP2P flag won't work on OSX.
If you run the code on IOS, you'll notice that Bonjour will publish two IP Adresses: one for your local WiFi network, and an 169.xx.xx.xx adress for Bluetooth.
The same code on OSX never publishes the 169.xx.xx.xx adress, so it's only found over WiFi.
Related
I have made the simplest app possible to connect to a Mavic Pro (basically the Swift version of this code (which comes from the Aircraft Binding and Activation demo on DJI's website.
My setup is as follows: iPhone running the App is connected via lightning cable to the main USB port on the RC (between the two joysticks on the bottom). The switch on the Mavic is set to "RC" (not Wifi).
When I run the app, the aircraft binding state is unknown and the DJISDKManager.product() returns nil, even though registration of the app completed successfully.
Here are some strange but helpful pieces of information:
With the same setup as above, running the DJI Go App from the same device works perfectly.
Using either the wireless bridge app or the wifi connections works perfectly and I'm able to connect with the aircraft no problem.
Is there some setting I'm missing? I looked at all of DJI's documentation very carefully, and have found no solutions.
The hardware accessory (the remote controller) may be associated with DJI Go now. With your app open, un-plug the lightening cable, and plug it back in. Now it will be associated with your app. With iOS 11 apps sharing hardware devices got a bit challenging.
(but thanks for mentioning DJI Go did work, then we don't have to worry the microUSB in the upper left corner of the RC was activated. Leaving the pigtail connector in will block the USB port you are using.)
I almost had the same problem. Here is the fix that worked for me.
Make sure in your info.plist file you have the following.
DJI-SDK
Also I am assuming that you calling DJISDKManager.startConnectionToProduct() after appRegisteredWithError(_ error: Error?) is called.
I updated iOS on my phone to 8.3 and I saw this message popup on first boot, but I have not seen it since:
I have been searching all day for information and I can't find a single reference to this message or to Xcode supporting wifi debug.
I am using a macbook pro 2009 model, and I have read that this is not compatible with the new continuity features (as well as airdrop etc). I am wondering if this is part of the wifi debug (and also if BTLE is involved at all). Of course it is all speculation since I cannot find any documentation about this.
Has anybody used wifi debug, or can point me to any documentation?
No, the feature was disabled as it causes serious security flows, for example when debugging you can fake location for any app, access confidential data like your number, udid etc. WiFi can be used now only to sync using iTunes.
It's restricted to USB only. You would need to write a bridge between USB and WiFi. You could in theory connect iPhone to Raspberry Pi, use open source crossplatform libMobileDevice. And mirror all USB requests from your XCode to this device USB.
I am developing an iOS application that talks to a lightning accessory. Now, when the accessory is attached, I cannot use the lightning port to debug my application in Xcode.
Is there a way to attach debugger to my application when a lightning accessory is connected to iOS device?
or
Can I somehow attach the lightning accessory to my Mac, and debug it in simulator?
I know some people are talking about WiFi debugging, but that is not supported in Xcode 6.
With Lightning accessories, there doesn't appear to be an option for connecting both Xcode & the Accessory at the same time. I think this has something to do with the way Lightning cables require authentication hardware inside (so nobody has been able to come up with a dongle/splitter). The solution I ended up using was a remote logging tool that sends log messages via network to your Mac. I use NSLogger but there is also CocoaLumberJack.
Granted, you have to pepper your code with log messages for this to be useful and there are other limitations, but it is better than nothing. You can also clean up your log messages by using a custom log macro (Objective-C only).
I am attempting the same thing. I could do it on 30 pin device using the CableJive adapter. But there does not appear to be a way to do this with Lightning. I suspect that since lightning connections (including cable) are all secured though embedded serial number chip, it means that the iOS device only allows one authentication chip per lightning connector, which means no splitters / bridges / Y-Connectors or other items unless approved by Apple.
Apple does have some magic devices for MFI approved developers, but my MFI approval expired, so not sure what they have now for Lightning device testing.
You may be able to connect to XCode wirelessly and develop with the accessory connected. This question may help guide that process.
What does the Xcode 4.2 preference "Support Wirelessly Connected Devices" do?
Wireless debugging is now available as of Xcode 9 or later and iOS 11 or later. A nice write-up on how to connect your mobile device to remotely debug are here:
https://medium.com/swiftist/wireless-debugging-xcode-b6e98e26e022
How do you perform wireless debugging in Xcode 9 with iOS 11, Apple TV 4K, etc?
I am developing a iPhone app like " Eject device" on computer. which means, when I connect USB cable for connecting to computer, this application just disconnect that connection by a single Click. I was googled about this, and I got some idea about EAAccessoryManager . this EAAccessoryManager only for notification. when USB cable connects or disconnect it can notify to the user. But I need to disconnect connection programmatically . is there any API or Tutorial available for this ? Kindly help me please.
You should probably look at IOKit. I believe IOKit works with USB device both on iOS and OS X.
You may be interested to take a look at these link:
https://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/USBBook/USBIntro/USBIntro.html
http://iphonedevwiki.net/index.php/IOKit.framework
Also, there is very good book on iOS/OS X kernel and I believe there is a whole chapter regarding IOKit:
http://www.amazon.com/Mac-OS-iOS-Internals-Apples/dp/1118057651
You can find the private API for the iOS Frameworks in https://github.com/kennytm/iphone-private-frameworks, but I don't think that this capability is present. The reason I think this is because there is no reason to want to do this from the iPhone, and therefore no reason for Apple to include it in the API.
I'm working on an application that does does lots of iOS <--> OSX communication. For the most part I have this solved.
I'm using CocoaPort to do the communication. Over Wifi this worked nicely and was plenty fast.
I'm using Bonjour to find my server. This required publishing the service with a modded DNSSDObjects-style net service on iOS. Apparently services published over Bluetooth on OSX cannot be seen by iOS, but the other way round works nicely, except that you need to keep the devices paired and connected.
Now my question is, how can I improve the speed of the Bluetooth connection? I'm getting maybe 100kb/s max and that seems to just stop after about 1 minute even though the connection is still open.
I think I need to use the AMP/HS stuff in Bluetooth 3.0 to get a fast connection. My understanding is this creates an AdHoc wireless network between my devices (MBP retina and iPad3, so should be capable of a decent speed.)
According to Wiki, Bluetooth 4.0 includes the HS spec in Bluetooth 3.0 and according to Bluetooth Explorer, the iPad is 4.0 spec. Is there a way, maybe via IOBluetooth, to request a high speed connection?
According to an engineer # Apple, this is not currently feasible. The best you can do is Bluetooth Classic, which is probably the speed I'm getting.
If you want this feature, consider opening a feature request at bugreporter.apple.com.