我正在尝试从Win7 PC上的C#代码向三星Note 2手机发送bMessage。我有32英尺蓝牙库,我正在使用Visual Studio 2013社区版。
以下是我目前的代码:
string sendMessage = "";
sendMessage = File.ReadAllText(file_path);
BluetoothClient btClient = new BluetoothClient();
btClient.Connect(btEp);
Stream clientStream = btClient.GetStream();
using (StreamWriter utfWriter = new StreamWriter(clientStream, Encoding.UTF8))
{
utfWriter.Write(sendMessage);
}
btEp是传递给函数的蓝牙端点,用于发送消息,并在其他地方定义如下:
BluetoothEndPoint BtEp;
这是使用变量构建的:
BtEp = new BluetoothEndPoint(device.DeviceInfo, mapServiceId);
这两个值都是在运行时从设备获取的,并在执行期间采用以下值:
- mapServiceId {00001132-0000-1000-8000-00805f9b34fb} System.Guid
+ BtEp {BC20A4164A8C:0000113200001000800000805f9b34fb} InTheHand.Net.BluetoothEndPoint
BC20A4164A8C是设备报告的设备地址。
与手机的连接似乎正在运行并且正在访问正确的服务,因为当我执行代码时,手机会提示我询问是否愿意接受来自PC的消息服务器的连接。当语句'btClient.Connect(btEp);'时会发生这种情况。被执行。
据我所知,我通过流阅读并发送到手机的文本文件是正确格式化的bMessage,由蓝牙MAP规范定义并在其他地方验证。它的构造如下:
BEGIN:BMSG
VERSION:1.0
STATUS:UNREAD
TYPE:SMS_GSM
FOLDER:TELECOM/MSG/OUTBOX
BEGIN:VCARD
VERSION:2.1
N:(redacted)
TEL:(redacted)
END:VCARD
BEGIN:BENV
BEGIN:VCARD
VERSION:2.1
N:(redacted)
TEL:(redacted)
END:VCARD
BEGIN:BBODY
ENCODING:G-7BIT
LENGTH:47
BEGIN:MSG
This is a short message
END:MSG
END:BBODY
END:BENV
END:BMSG
我已用(编辑)替换了个人身份信息,但实际的文本文件包含正确的名称和数字。我的总部设在英国,所以SMS_GSM应该是正确的。
非常感谢任何帮助!
更新:我已在目标手机上安装了蓝牙终端,并通过将相同数据发送到设备上的虚拟端口而不是消息访问服务器来验证是否正在接收消息。不确定它是否是终端程序的问题,但是消息的最后一行被附加到前面并且从末尾错过。我已经在文件的末尾添加了一个换行符来解决这个问题,但是当我将bMessage发送到MAS时仍然没有兴趣。
我也试过了许多不同的流写作方法:
1)删除StreamWriter Encoding包装器 - 结果相同 2)从循环中按顺序发送每个字节 - 类似的结果,仍然没有在电话上执行任何操作。
如果有任何蓝牙通信专家,我真的很感激一些建议!不一定必须是消息访问配置文件特定的,也不一定是C#。
我想我的下一步是看看我是否可以找到一款现代汽车,它具有蓝牙配对的MAP服务,并且可以连接到手机,并可能在使用类似功能时嗅探数据包???
03/02/16 - 在我的手机和新车之间嗅探数据包,同时向两个方向发送/接收消息,并将其与我的PC /代码和手机之间的嗅探包进行比较(感谢Android!dev选项本身允许BT数据包记录并能够将其转储到Wireshark进行分析)。我的代码使用的是BluetoothClient,它在BT协议栈中通过RFCOMM运行,而汽车则使用L2CAP。 L2CAP是BT堆栈中低于RFCOMM的级别,32Feet具有等效的L2CapClient以在此级别运行。已经实现了这个,但它抛出了一个错误。事实证明,虽然支持L2CAP,但并非所有使用它的配置文件都是MAP,而MAP似乎就是其中之一。
我将回答这个问题,为偶然发现它的其他人提供可能的选择。
答案 0 :(得分:2)
想想我已经确定使用32Feet / C#这样做是不可行的。如果要使用32Feet.Net库中的高级功能,则无法访问手机的蓝牙消息访问服务器/配置文件/客户端(MAS MAP MAC)。相反,您需要在C ++中使用较低级别的代码,详见MSDN:
https://msdn.microsoft.com/en-us/library/windows/hardware/ff536674%28v=vs.85%29.aspx
19/02/16 - 我已经设法使用手机上的免提配置文件的蓝牙链接发起呼叫(这是我想做的其他事情,但我错误地认为短信会更容易!)。我使用AT命令来实现这一目标。然后我尝试使用AT命令发送短信,但显然我的手机在其HFP的实现中没有为此实现AT命令。所以仍然没有短信。
我的手机和汽车之间有一些关于蓝牙短信的数据包嗅探,所以在某些时候会看看如何处理。我确实需要对SMS进行排序,但可以在项目的当前阶段使用简单的语音呼叫启动来运行。
答案 1 :(得分:2)
我正在努力实现与OP相同的事情,而且我在32feet库中遇到了同样的问题。
但是,我注意到MAC上有一个名为Handsfree的应用程序,它通过蓝牙实现拨号和发送消息。我使用Android的蓝牙HCI监听日志来了解它的工作原理。 可以在此处下载日志:https://www.dropbox.com/s/34ol5kd0o3oceib/btsnoop_hci.log?dl=0
日志包含消息发送的示例。电话还会发送消息通知。 希望这有助于解决短信发送问题。
答案 2 :(得分:1)
所以,我做了一些挖掘工作。我使用blucat扫描手机上的可用服务。其中包括:" MAP SMS / MMS" - btgoep:// 980D2E0CFB51:4 。根据MAP规范,MAP是基于OBEX协议构建的配置文件。因此,使用OBEX链接连接到此服务是有意义的。 BTGOEP =蓝牙通用对象交换协议。 我尝试使用上面的链接使用bluecove java API连接到MAP,但我得到的响应代码为198,这意味着OBEX_HTTP_NOT_ACCEPTABLE。
然后我找到了this post。最后一个答案:您基本上创建了两个OBEX会话:消息访问服务(MAS),然后向设备注册以使用消息通知服务(MNS)接收通知。注册后,设备将与您打开MNS会话,并通知您收到的消息。您还需要使用蓝牙SDP宣传您的MNS服务。
所以我在思考,我没有正确连接到MAP服务,我得到了响应代码198.也许还有另一种连接到MAP服务的方法,通过以某种方式注册电话。