使用32feet.net和c#实现蓝牙拨号

7
我正在尝试为某人提供一个“点击拨号”的解决方案,使其能够连接到蓝牙设备,例如手机。 我一直在尝试使用32feet.net蓝牙API来实现这一点。
我之前没有使用过蓝牙(自通过蓝牙串口进行AT命令的日子以来),但我已将支持免提服务的设备与电脑配对。 我有以下代码来尝试连接并发送拨号命令。
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

结果:OK

然后

发送指令:AT+CIND=?\r

结果: +CIND: ("service",(0-1)),("call",(0-1)),("callsetup",(0-3)),("battchg",(0-5)),("signal",(0-5)),("roam",(0-1)),("callheld",(0-2))

然后

发送指令:ATD 0000000000\r

结果: OK D: ("service",(0-1)),("call",(0-1)),("callsetup",(0-3)),("battchg",(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手机时,RFCOMM连接到HF在打开后立即关闭,而当我尝试连接iPhone时,我看到ATD命令的ERROR结果。 - alanjmcf
如果HF配置文件正在使用且没有可用的串行端口配置文件,是否可以通过任何其他蓝牙配置文件发送拨号命令,例如AVRCP、A2DP或PBAP?我知道它们是为其他目的而设计的,但这是否可能? - Tim
如果输入的超过39个字符,或者命令行中存在语法错误,则调制解调器将返回一个ERROR结果码,并忽略命令输入。 那么是语法错误吗?我的ATD命令有什么问题? - Tim
1
仅供参考,在不同的堆栈上... MSFT 有一个驱动程序级别的 SCO API,但是据我所知,必须处理每个数据包。Widcomm 有一个“使用音频”API。BlueSoleil 的 API 支持 HFP/HSP,包括 AG 和 HS,因此例如有一个名为 Btsdk_HFAP_Dial 的函数。因此,如果您可以更改堆栈,请首先尝试 BlueSoleil,然后再尝试 Widcomm。 - alanjmcf
1
好东西!也许现在已经不相关了,或者对于某些手机来说是这样:我只想指出通常一个手机只有一个注册的耳机,也许需要配置手机来使用PC(因此需要在PC上运行BluetoothListener for Headset)。 - alanjmcf
2个回答

3

尝试查找AT\r(或)ATH\r的响应。 如果响应是“OK\r\n”,请在ATD和号码之间不要加空格,尝试拨号命令。


谢谢。AT\r 返回 AT+OK... ATH\r 和 ATDxxxxxxxxxx\r 一样返回 ERROR。 - Tim
尝试使用ATDxxxxxxxxxx;命令进行语音呼叫,末尾的分号表示结束。为了测试,请尝试使用AT命令发送短信。 - Umesh CHILAKA
我把分号放回了拨号字符串的末尾,就像一开始那样,再加上其他命令,现在它已经按预期拨号了。谢谢。 :) - Tim

1
作为32feet.NET的维护者,我很想找到答案。希望了解HSP/HFP的人能够解释为什么这不起作用。我的一般猜测是,由于我们没有接受/创建音频通道的SCO通道,手机拒绝连接。
然而,在您的情况下... AT命令以CR(0Dh)结尾;或者分号是否起同样的作用?

谢谢。我已经尝试在AT命令的末尾添加回车符,但仍然没有成功。 - Tim
还添加了代码以从流中读取,导致响应为:ERROR。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接