我正在尝试将 Win7 PC 上的 C# 代码中的 bMessage 发送到三星 Note 2 手机。我有 32feet 蓝牙库,并且正在使用 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 服务,并且可以连接到手机,并可能在使用类似功能时嗅探数据包???
2016 年 3 月 2 日 - 在我的手机和新车之间嗅探数据包,同时在两个方向发送/接收消息,并将其与我的 PC/代码和手机之间的嗅探数据包进行比较(感谢 Android!开发选项本机允许 BT 数据包记录,并且是能够将其转储到 Wireshark 进行分析)。我的代码使用的是蓝牙客户端,它通过 BT 协议栈中的 RFCOMM 运行,而汽车使用 L2CAP。L2CAP 是 BT 堆栈中低于 RFCOMM 的一个级别,32Feet 有一个等效的 L2CapClient 可以在此级别上运行。已经实现了这一点,但它会引发错误。事实证明,尽管 L2CAP 受支持,但并非所有使用它的配置文件都支持,而 MAP 似乎就是其中之一。
我将回答这个问题,以便为任何偶然发现它的人提供可能的选择。