RSS Feed
Download our iPhone app
Browse DevX
Sign up for e-mail newsletters from DevX


iPhone Bluetooth Programming : Page 2

Learn how to communicate with a server using TCP/IP and also how to build a simple chat application.

The connectionTypesMask property indicates the types of connections that the user can choose from. There are two types available: GKPeerPickerConnectionTypeNearby and GKPeerPickerConnectionTypeOnline. For Bluetooth communication, use the GKPeerPickerConnectionTypeNearby constant. The GKPeerPickerConnectionTypeOnline constant indicates an Internet-based connection.

When remote Bluetooth devices are detected and the user has selected and connected to one of them, the peerPickerController:didConnectPeer:toSession: method will be called. Hence, implement this method as follows:

- (void)peerPickerController:(GKPeerPickerController *)picker 
              didConnectPeer:(NSString *)peerID 
                   toSession:(GKSession *) session {
    self.currentSession = session;
    session.delegate = self;
    [session setDataReceiveHandler:self withContext:nil];
picker.delegate = nil;

    [picker dismiss];
    [picker autorelease];

When the user has connected to the peer Bluetooth device, you save the GKSession object to the currentSession property. This will allow you to use the GKSession object to communicate with the remote device.

If the user cancels the Bluetooth Picker, the peerPickerControllerDidCancel: method will be called. Define this method as follows:

- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker
    picker.delegate = nil;
    [picker autorelease];
    [connect setHidden:NO];
    [disconnect setHidden:YES];

To disconnect from a connected device, use the disconnectFromAllPeers method from the GKSession object. Define the btnDisconnect: method as follows:

-(IBAction) btnDisconnect:(id) sender {
    [self.currentSession disconnectFromAllPeers];
    [self.currentSession release];
    currentSession = nil;
    [connect setHidden:NO];
    [disconnect setHidden:YES];

When a device is connected or disconnected, the session:peer:didChangeState: method will be called. Implement the method as follows:

- (void)session:(GKSession *)session 
           peer:(NSString *)peerID 
 didChangeState:(GKPeerConnectionState)state {
    switch (state)
        case GKPeerStateConnected:
        case GKPeerStateDisconnected:
            [self.currentSession release];
            currentSession = nil;
            [connect setHidden:NO];
            [disconnect setHidden:YES];

Handling this event will allow you to know when a connection is established, or ended. For example, when the connection is established, you might want to immediately start sending data over to the other device.

Figure 4. On the lookout: The GKPeerPickerController looking for other devices.

Sending Data

To send data to the connected Bluetooth device, use the sendDataToAllPeers: method of the GKSession object. The data that you send is transmitted via an NSData object; hence you are free to define your own application protocol to send any types of data (e.g. binary data such as images). Define the mySendDataToPeers: method as follows:

- (void) mySendDataToPeers:(NSData *) data
    if (currentSession) 
        [self.currentSession sendDataToAllPeers:data 

Define the btnSend: method as follows so that the text entered by the user will be sent to the remote device:

-(IBAction) btnSend:(id) sender
    //---convert an NSString object to NSData---
    NSData* data;
    NSString *str = [NSString stringWithString:txtMessage.text];
    data = [str dataUsingEncoding: NSASCIIStringEncoding];        
    [self mySendDataToPeers:data];        

Receiving Data

Figure 5. Name it: Display the names of devices found.

When data is received from the other device, the receiveData:fromPeer:inSession:context: method will be called. Implement this method as follows:

- (void) receiveData:(NSData *)data 
            fromPeer:(NSString *)peer 
           inSession:(GKSession *)session 
             context:(void *)context {

    //---convert the NSData to NSString---
    NSString* str;
    str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Data received" 
    [alert show];
    [alert release];    

Here, the received data is in the NSData format. To display it using the UIAlertView class, you need to convert it to an NSString object.

Testing the Application

Figure 6. Connections: A remote device is prompting to connect to you.

That’s it! You are now ready to test the application. Press Command-R in Xcode to deploy the application onto two iPhones / iPod Touches. For this article, I assume you have two devices -- either iPhones or iPod Touches. In order to run this application, they both need to run at least iPhone OS 3.0.

Once the application is deployed to the two devices, launch the application on both devices. On each device, tap the Connect button. The GKPeerPickerController will display the standard UI to discover other devices (see Figure 4).

After a while, both application should be able to find each other (see Figure 5). When you tap on the name of the found device, the application will attempt to connect to it.

Figure 7. The All-Clear: Receiving data sent by the remote device.

Author's Note: If you test the application on the iPhone Simulator, you should be able to detect the two devices you have. However, that’s all it can do -- you won’t be able to connect to either device.

When another device tries to connect to you, you will see the popup as shown in Figure 6. Tap on Accept to connect and Decline to decline the connection.

If you are connected, you can now enter some text and start sending to the other device. Data received from another device will be shown in an alert view (see Figure 7).


In this article, you have seen how easy it is to connect two iPhones / iPod Touches using Bluetooth. Using the concepts shown in this article, you can build networked games and other interesting applications easily. In the next article, I will show you how you can make use of the Bluetooth connection to transmit voice data. Till then, have fun!

Wei-Meng Lee is a Microsoft MVP and founder of Developer Learning Solutions, a technology company specializing in hands-on training on the latest Microsoft technologies. He is an established developer and trainer specializing in .NET and wireless technologies. Wei-Meng speaks regularly at international conferences and has authored and coauthored numerous books on .NET, XML, and wireless technologies. He writes extensively on topics ranging from .NET to Mac OS X. He is also the author of the .NET Compact Framework Pocket Guide, ASP.NET 2.0: A Developer's Notebook (both from O'Reilly Media, Inc.), and Programming Sudoku (Apress). Here is Wei-Meng's blog.
Email AuthorEmail Author
Close Icon
Thanks for your registration, follow us on our social networks to keep up-to-date