Jump to content
Welcome to InsanelyMac Forum

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.

Sign in to follow this  

Bluetooth programming question

1 post in this topic

Recommended Posts

I don't know if this really is a Mac specific question but since that's the system I'm programming in I'll ask anyway :-)


I'm writing a program that connects to a mobile phone (For now just Sony Ericsson dumbphones) through Bluetooth (Connects through a RFCOMM channel) and then sends AT-commands to control this phone. The purpose of this program is that people with disabilities that might have trouble working a mobile can use this program to perform calls, receive calls and modify a contact list.


The user interface is written in wxWidgets since it's supposed to be as cross platform as possible, and the phone manager is written in Objective-C++ using the OS X Bluetooth stack.


My problem now is that when a user calls a number and the number is busy, I'm not getting a BUSY reply back from the phone as the Sony Ericsson developer guide says should happen. Other messages from the phone gets received, like RING when an incoming call happens, or +CLIP when returning the number of the caller.


Here is the function responsible for reading incoming data:


-(void) rfcommChannelData:(IOBluetoothRFCOMMChannel *)rfcommChannel data:(void *)dataPtr length:(size_t)length {

 * Fetch data
char buf[256];

strncpy(buf, (char*)dataPtr, length);
buf[length] = '\0';

std::string cppbuf(buf);
cppbuf = cppbuf.substr(2, length-2);

 * Incoming call
if(cppbuf.substr(0,4).compare("RING") == 0) {
	NSLog(@"Incoming call!");
	// Fetch incoming number
	char ATCommand[40];
	strcpy(ATCommand, "AT+CLIP=1\r\n");
	[self sendrfcommData:ATCommand];

	 * Number request reply
} else if(cppbuf.substr(0,7).compare("+CLIP: ") == 0) {
	 * Incoming reply has syntax "+CLIP: "<number>",...
	 * To find the number, we first look up index for space
	 * and increment that value by 2. We then look up index for the
	 * first comma, and decrease that value by 1.
	 * The number is now the substring starting at startindex
	 * with length (endIndex - startIndex).

	int startIndex = cppbuf.find(" ");
	int endIndex = cppbuf.find(",");

	if(!call_window_shown) {
		call_window_shown = TRUE;
		incoming_call_func(incoming_call_object, cppbuf.substr(startIndex, endIndex-startIndex));

	 * User hung up
} else if(cppbuf.substr(0,5).compare("+CHUP") == 0) {
	NSLog(@"Hanging up");
	call_window_shown = FALSE;

	 * Busy reply
} else if(cppbuf.substr(0,4).compare("BUSY") == 0) {
	call_window_shown = FALSE;

	 * Aborted call
} else if(cppbuf.substr(0,10).compare("NO CARRIER") == 0) {
	NSLog(@"No carrier!");
	call_window_shown = FALSE;
} else
	std::cout << "Unhandled incoming data: " << cppbuf << std::endl;


As I mentioned, the RING (From phone), +CLIP (From phone), and +CHUP (From user interface) messages all gets read correctly, but when the called number is busy no BUSY reply is ever sent. I've tried printing the incoming data before any of the if-statements but BUSY is never received.


If anyone can see something wrong with this code or have any ideas, please let me know. I've been scratching my head for days trying to figure out why this issue exists.

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.