13

我正在尝试将 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 似乎就是其中之一。

我将回答这个问题,以便为任何偶然发现它的人提供可能的选择。

4

3 回答 3

2

所以,我做了更多的挖掘。我使用blucat扫描手机上的可用服务。这些服务包括:“MAP SMS/MMS”- btgoep://980D2E0CFB51:4。根据 MA​​P 规范,MAP 是建立在 OBEX 协议之上的配置文件。因此,使用 OBEX 链接连接到此服务是有意义的。BTGOEP = 蓝牙通用对象交换协议。我尝试使用上面的链接,使用bluecove java API连接到 MAP,但我得到了 198 的响应代码,这意味着 OBEX_HTTP_NOT_ACCEPTABLE。

然后我找到了这个帖子。最后一个答案:您基本上创建了两个 OBEX 会话:一个消息访问服务 (MAS),然后向设备注册以使用消息通知服务 (MNS) 接收通知。注册后,设备将与您打开一个 MNS 会话并通知您收到的消息。您还需要使用蓝牙 SDP 宣传您的 MNS 服务。

所以我在想,我没有正确连接到 MAP 服务,我得到了响应代码 198。也许还有另一种连接到 MAP 服务的方法,通过以某种方式注册手机。

于 2016-04-09T09:52:19.510 回答
2

我正在尝试实现与 OP 相同的目标,但我偶然发现了与 32feet 库相同的问题。

但是,我注意到MAC上有一个名为Handsfree的应用程序,它通过蓝牙实现拨号和发送消息。我使用 Android 的蓝牙 HCI 监听日志来了解它是如何工作的。日志可以在这里下载:https ://www.dropbox.com/s/34ol5kd0o3oceib/btsnoop_hci.log?dl=0

该日志包含一个消息发送示例。还有电话发送的消息通知。希望这有助于解决短信发送问题。

于 2016-04-02T09:13:00.883 回答
2

认为我已经确定使用 32Feet/C# 执行此操作是不可行的。如果您想访问电话的蓝牙消息访问服务器/配置文件/客户端 (MAS MAP MAC),则无法使用 32Feet.Net 库中的高级功能来实现。相反,您需要使用 MSDN 中详述的 C++ 中的较低级别代码:

https://msdn.microsoft.com/en-us/library/windows/hardware/ff536674%28v=vs.85%29.aspx

2016 年 2 月 19 日 - 我设法使用蓝牙链接到我的手机上的免提配置文件来发起呼叫(这是我想做的其他事情,但我错误地认为 SMS 会更容易!)。我已经使用 AT 命令来实现这一点。然后我也尝试使用 AT 命令发送 SMS,但显然我的手机在其 HFP 的实现中没有为此实现 AT 命令。所以还是没有短信。

我在手机和汽车之间通过蓝牙对 SMS 进行了一些数据包嗅探,因此将在某个时候看看如何处理。我确实需要对 SMS 进行排序,但可以在项目的当前阶段通过简单的语音呼叫启动来运行。

于 2016-02-03T08:44:36.730 回答