title: Bluetooth dial with 32feet.net and c#
body: <p>I am trying to provide a "click to dial" solution for someone to a bluetooth device such as a mobile phone. I have been trying to do so using the 32feet.net bluetooth api.</p>
  
  <p>I haven't really done anything with bluetooth (since the days of at commands via a bluetooth serial port) but I have paired the device in question, which supports the handsfree service with the pc. I have the following code to attempt to connect and send a dial command.</p>
  
  <pre><code>String deviceAddr = "11:11:11:11:11:11";
  BluetoothAddress addr = BluetoothAddress.Parse(deviceAddr);
  BluetoothEndPoint rep = new BluetoothEndPoint(addr, BluetoothService.Handsfree);
  BluetoothClient cli = new BluetoothClient();
  cli.Connect(rep);
  Stream peerStream = cli.GetStream();
  
  String dialCmd = "ATD 0000000000\r\n";
  Byte[] dcB = System.Text.Encoding.ASCII.GetBytes(dialCmd);
  peerStream.Write(dcB, 0, dcB.Length);
  
  // Begin Edit ------------------------------------------------------------
  Byte[] sResponse = new Byte[100];
  peerStream.Read(sResponse, 0, 99);
  TextBox1.Text = System.Text.Encoding.ASCII.GetString(sResponse);
  // End Edit --------------------------------------------------------------
  
  peerStream.Close();
  cli.Close();
  MessageBox.Show("Done");
  </code></pre>
  
  <p>Since it seems to run through these lines of code, taking an appropriate time to connect at the relevant spot or crashing out if the device address is wrong and it can't connect. Obviously the AT command is not the right thing to be sending it.</p>
  
  <p>Can anyone enlighten me as to what I might need to send to a bluetooth device via the handsfree profile to get it to dial?</p>
  
  <p>Begin Edit -------------------------------------------</p>
  
  <p>I decided to read from the stream and see if there was a response of any sort after sending the AT command through. Since I am just testing to see if I can make it work I am just dumping the response into a textbox.</p>
  
  <p>The response I read from the stream is :</p>
  
  <pre><code>ERROR
  </code></pre>
  
  <p>There doesn't seem to be an error codes or anything.</p>
  
  <p>End Edit ---------------------------------------------</p>
  
  <p>Edit --------------------------------------------------</p>
  
  <p>Sent command : AT+CMER\r</p>
  
  <p>Result : OK</p>
  
  <p>then</p>
  
  <p>Sent command : AT+CIND=?\r</p>
  
  <p>Result :
  +CIND: ("service",(0-1)),("call",(0-1)),("callsetup",(0-3)),("battchg",(0-5)),("signal",(0-5)),("roam",(0-1)),("callheld",(0-2))</p>
  
  <p>then</p>
  
  <p>Send command : ATD 0000000000\r</p>
  
  <p>Result:
  OK
  D: ("service",(0-1)),("call",(0-1)),("callsetup",(0-3)),("battchg",(0-5)),("signal",(0-5)),("roam",(0-1)),("callheld",(0-2))</p>
  
  <p>Still it doesn't actually dial :(</p>
  
  <p>End Edit ----------------------------------------------</p>
  
  <p>Solution ----------------------------------------------</p>
  
  <p>The following code now works to dial via my iPhone. It's really rough at the moment, as I have just been testing to see if I could make it work. It's enough to get started for anyone else wanting to do a similar thing.</p>
  
  <pre><code>String deviceAddr = "00:00:00:00:00:00"; 
          BluetoothAddress addr = BluetoothAddress.Parse(deviceAddr);
          BluetoothEndPoint rep = new BluetoothEndPoint(addr, BluetoothService.Handsfree);
  
          BluetoothClient cli = new BluetoothClient();
          cli.Connect(rep);
          Stream peerStream = cli.GetStream();
  
          String dialCmd1 = "AT+CMER\r";
          String dialCmd2 = "AT+CIND=?\r";
          String dialCmd3 = "AT+BRSF=\r";
          String dialCmd4 = "ATD 0000000000;\r";
  
          Byte[] dcB = System.Text.Encoding.ASCII.GetBytes(dialCmd1);
          peerStream.Write(dcB, 0, dcB.Length);
  
          Byte[] sRes = new Byte[200];
          peerStream.Read(sRes, 0, 199);
          textBox1.Text = textBox1.Text + "\n\r----------\n\r" + System.Text.Encoding.ASCII.GetString(sRes);
  
          dcB = System.Text.Encoding.ASCII.GetBytes(dialCmd2);
          peerStream.Write(dcB, 0, dcB.Length);
  
          peerStream.Read(sRes, 0, 199);
          textBox1.Text = textBox1.Text + "\n\r----------\n\r" + System.Text.Encoding.ASCII.GetString(sRes);
  
          dcB = System.Text.Encoding.ASCII.GetBytes(dialCmd3);
          peerStream.Write(dcB, 0, dcB.Length);
  
          peerStream.Read(sRes, 0, 199);
          textBox1.Text = textBox1.Text + "\n\r----------\n\r" + System.Text.Encoding.ASCII.GetString(sRes);
  
          dcB = System.Text.Encoding.ASCII.GetBytes(dialCmd4);
          peerStream.Write(dcB, 0, dcB.Length);
  
          peerStream.Read(sRes, 0, 199);
          textBox1.Text = textBox1.Text + "\n\r----------\n\r" + System.Text.Encoding.ASCII.GetString(sRes);
  
          peerStream.Close();
          cli.Close();
  </code></pre>