I'm trying to figure out how to search for other devices logged into a wifi network that are hosting the application on a specific port.
How can I detect the presence of these other devices without knowing their address or even necessarily the port they are hosting on?
Once discovered, I should be able to contact the device and establish a connection with it.
The most standard "iOS way" would be to use Bonjour to announce and listen for announcements for the application.
EDIT:
As of iOS7 GKSession is deprecated..
Why don't you use a GameKit Session
Apple GKSession Docs:
A GKSession object provides the ability to discover and connect to nearby iOS devices using Bluetooth or Wi-fi.
Just because it's called GameKit, doesn't mean it can only be used in games :)
Related
I need to communicate my app with 2 devices. A restriction is that I can't use a server but all iOS devices will be in one Wi-Fi network. What options do I have? How I can send a message to another copy of my app running on another device?
I dont know whether its a correct approach or not but as you cannot use server,so the approach i can think of is we can create a socket connection using TCP/IP or UDP(based on reliability) for data exchange.
I dont think you can communicate between 2 devices running the same application without having some kind of server application in-between.
Even if you could find the other device over the WIFI I dont think you can tell if the other device is running the app or not.
I think you may be referring to MultipeerConnectivity
The Multipeer Connectivity framework provides support for discovering
services provided by nearby iOS devices using infrastructure Wi-Fi
networks, peer-to-peer Wi-Fi, and Bluetooth personal area networks and
subsequently communicating with those services by sending
message-based data, streaming data, and resources (such as files).
Source: https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MultipeerConnectivityFramework/
Apple Sample:
https://developer.apple.com/library/ios/samplecode/MultipeerGroupChat/Introduction/Intro.html
First and foremost,
I am looking for a resource to use Private API's.
this is an enterprise application and will never go to the app store
I need to take as much configuration out of the users hands as possible.
That being said, I have a device that an ipad will be connected to and communicate with via an adhoc wifi network supplied by the device. the ipad connects to this device and sends raw data to it via socket connections. I also need to connect to the internet for data syncing.
80% of the time, the ipad will be connected to this adhoc wifi device. Management software on the ipad does not allow the user to adjust wifi settings so I am trying to make sure I am connected to my device without limiting my server syncing. I know I can determine the connection using apples Reachability class, this is not what i am looking for. I need to use BOTH 3g AND wifi.
Is there a way to enforce this in code? Or is there a resource for the private API's that I can look at to find a way?
This will be in iOS 5 and the most preferable method would be to just route my http requests via some private api method to use 3G and let the socket requests use wifi to the adhoc device.
code samples would be awesome, links / class names to research would be very much appreciated.
and once again this is not going into the app store, it is an enterprise app
the resolution i found was to assign an ip in the privately assigned ip range the ipad uses (169.254.x.x) to the adhoc device then let the ipad determine an ip. Then see if i can open a socket connection to the device (to determine if its available) and then issue a print.
Going this route, i am still able to use 3g data as well as communicate with the device via wifi.
Can anyone explain how bonjour works over bluetooth from iphone OS 3.0 onwards?
The documentation says the Bonjour API's used in the application just works even if Wi-fi is off and Bluetooth is on. It also says , a Bluetooth PAN is established and hence IP address comes into picture.
But Bonjour (based on mdns) requires multicast to work. But , Bluetooth PAN (piconet) works on a master-Slave concept. Any data to be exchanged between peers has to go to the master first and then the master forwards to the all clients. Moreover there is a restriction on the number of slaves in piconet i.e., 8. that means bonjour over bluetooth has a limitation that it would work for a max of 8 devices?
Apparently, it's PANU to PANU communication. So the limitation is actually - one-on-one communication. If you use Bluetooth Explorer, included with Xcode, you'll see the iOS device presents a service with ID 0x1115. Since there is no GN nor NAP nodes in the connection, only two devices can participate in the connection.
Bluetooth Explorer also shows various custom fields that serve to exchange metadata about the connection. See my somewhat related question for an example of the service announcement.
I have only been able to get this service to appear when using GameKit, on both iPhone 3G with 4.2.1 and iPad with 5.0.1.
I know nothing about Boujour and iPhone... Perhaps Bonjour just sees the TCP/IP network and multicasts on to it -- regardless of whether the IP network is over bluetooth or WiFi or FooBar...
IIRC PAN just forms a point-to-point link to the PAN peer and, thus if the peer is an access-point (rather than just another end-node) it it it that will handle multicasting the packets.
I've read that as of iPhone OS 3.1, GameKit supports wifi connections. But the documentation states:
"If your application configures the
peer picker to allow Internet
connections, your application must
also dismiss the peer picker and
present its own interface to configure
an internet connection."
Does this still stand? If so, how do I establish a wifi Bonjour session that can be used by GK? (I'm only interested in using the local network.)
Your GKSession object will automatically handle the discovery of peers over WiFi or Bluetooth, and find those that are available on either protocol.
The documentation is stating that unlike Bluetooth, for which GKPeerPickerController provides a UI to enable Bluetooth if it's not already enabled, GKPeerPickerController does not provide a UI to enable wifi, or select the network the user wishes to be on, you will have to provide your own.
You can use GKPeerPicker class..There is connectionTypesMask,it has property
GKPeerPickerConnectionTypeNearby (for bluetooth connection or wireless). For more detail see my original answer..
gamekit over the internet
we can connect by bluetooth only iPodtouch or iPhone using GKSession and GKPeerPickerController right ? , or can we connect other bluetooth device ?
Bluetooth communication using GameKit (GKPeerPickerController and GKSession) is limited to iPhoneOS devices.
You can also use the internet instead of bluetooth, but once again, you are still limited to iPhoneOS devices.
If you are interested in using External Accessories, I suggest you check out Apple's Documentation on the matter. Their documentation states that:
Accessories can be physically connected to the device through the 30-pin dock connector or wirelessly using Bluetooth.
This still will not enable you to play games between devices that aren't iPhoneOS, as you need the iPhoneOS, and it's GameKit framework on both ends. If you are interested in setting such a thing up, you will have to look into managing it manually.
I would strongly advise against using bluetooth, as it's buggy, slow, and has a short range. Peer to peer Wifi or LAN play will be your best bets. I suggest looking into using Bonjour of you're using LAN play. Here are two tutorials (one, two) on using Bonjour. Happy gaming!
the last i heard, bluetooth is 'crippled' on the iphone meaning you can only transfer data via bluetooth to another device with an Apple approved bluetooth chip in it. check out the apple docs for developing 'accessories'.