【发布时间】:2011-08-23 01:04:29
【问题描述】:
我正在尝试为某人提供蓝牙设备(例如手机)的“点击拨号”解决方案。我一直在尝试使用 32feet.net 蓝牙 api。
我还没有真正对蓝牙做过任何事情(自从通过蓝牙串行端口发出 at 命令的日子以来),但我已经将有问题的设备配对,它支持与 pc 的免提服务。我有以下代码尝试连接并发送拨号命令。
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");
由于它似乎运行通过这些代码行,因此需要适当的时间在相关位置连接或如果设备地址错误并且无法连接则崩溃。显然,AT 命令发送它是不正确的。
谁能告诉我我可能需要通过免提配置文件发送到蓝牙设备以使其拨号?
开始编辑-------------------------------
我决定从流中读取数据,看看在发送 AT 命令后是否有任何类型的响应。由于我只是在测试是否可以使其工作,因此我只是将响应转储到文本框中。
我从流中读取的响应是:
ERROR
似乎没有错误代码或任何东西。
结束编辑 ---------------------------------------------
编辑 ---------------------------------------------- ----
发送指令:AT+CMER\r
结果:正常
然后
发送指令:AT+CIND=?\r
结果: +CIND: ("service",(0-1)),("call",(0-1)),("callsetup",(0-3)),("batchg",(0-5)) ,("信号",(0-5)),("漫游",(0-1)),("呼叫保持",(0-2))
然后
发送命令:ATD 0000000000\r
结果: 好的 D: ("service",(0-1)),("call",(0-1)),("callsetup",(0-3)),("batchg",(0-5)), ("signal",(0-5)),("roam",(0-1)),("callheld",(0-2))
但它实际上并没有拨号:(
结束编辑 --------------------------------------------- -
解决办法----------------------------------------------------------
下面的代码现在可以通过我的 iPhone 拨号了。目前真的很艰难,因为我刚刚在测试是否可以让它工作。对于其他想要做类似事情的人来说,这足以开始。
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();
【问题讨论】:
-
是的。当我连接到我的 wm6 手机时,与 HF 的 RFCOMM 连接在打开后立即关闭,当我在 iPhone 上尝试时,我看到 ATD 命令的错误结果。
-
如果 HF 配置文件正在使用并且串行端口配置文件不可用,是否可以通过任何其他蓝牙配置文件发送拨号命令。比如AVRCP、A2DP还是PBAP?我知道它们是出于其他目的,但有可能吗?
-
如果输入的字符超过 39 个,或者在命令行的任意位置发现语法错误,调制解调器将返回 ERROR 结果代码,并且命令输入被忽略。那么语法错误呢?我的 ATD 命令有什么问题?
-
请注意,在各种堆栈上... MSFT 有一个驱动程序级 SCO API,但必须处理每个数据包 AFAICS。 Widcomm 有一个“使用音频”API。 BlueSoleil 的 API 支持 AG 和 HS 的 HFP/HSP,例如有一个名为 Btsdk_HFAP_Dial 的函数。因此,如果您可以更改堆栈,请先尝试 BlueSoleil,然后再尝试 Widcomm。
-
好东西!现在可能无关紧要,或者可能与某些手机无关:我刚刚注意到手机通常有 一个 注册耳机,并且可能需要将手机配置为使用 PC(因此需要在 PC 上为耳机运行蓝牙监听器)。
标签: c# mobile bluetooth telephony