【问题标题】:Send bMessage to Message Access Server from Windows using 32feet.net library in C#使用 C# 中的 32feet.net 库从 Windows 向消息访问服务器发送 bMessage
【发布时间】:2016-03-09 13:54:40
【问题描述】:

我正在尝试从 Win7 PC 上的 C# 代码向三星 Note 2 手机发送 bMessage。我有 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 服务,可以连接到手机,并在使用类似功能时可能嗅探数据包???

03/02/16 - 在我的手机和新车之间嗅探数据包,同时在两个方向发送/接收消息,并将其与我的 PC/代码和手机之间的嗅探数据包进行比较(感谢 Android!开发选项本机允许 BT 数据包记录并能够将其转储到 Wireshark 进行分析)。我的代码使用的是蓝牙客户端,它通过 BT 协议栈中的 RFCOMM 运行,而汽车使用 L2CAP。 L2CAP 是 BT 堆栈中低于 RFCOMM 的一个级别,32Feet 有一个等效的 L2CapClient 可以在此级别上运行。已经实现了这一点,但它会引发错误。事实证明,尽管 L2CAP 受支持,但并非所有使用它的配置文件都支持,而 MAP 似乎就是其中之一。

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

【问题讨论】:

  • 为投票干杯!假设他们是对花费的赏金的同情票,但仍然没有答案?非常感谢,几乎让我的代表达到了在我提供赏金之前的水平!如果我能解决这个问题,我会相应地更新帖子......

标签: c# bluetooth 32feet


【解决方案1】:

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

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 进行排序,但可以在项目的当前阶段通过简单的语音呼叫启动来运行。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 干杯 Mihail,我使用 Android BT HCI snoop 制作了类似的日志,以了解车载系统如何执行此类操作,快速浏览您链接到的日志非常相似。如果最近来自 Win Dev Build 会议的这篇文章是正确的,我猜我所追求的功能很快就会出现在 Win10 中:uk.businessinsider.com/…
    • 我不确定微软是否会使用蓝牙实现这个功能。它很可能会使用他们的云基础设施来实现。这意味着手机必须连接到网络(Wi-Fi 或数据连接)。由于 Windows 10 上的所有间谍活动已经在进行,我正在犹豫是否要使用此功能。
    • 如果你今天想使用Wi-Fi发送短信,已经有解决方案mysms.com;也基于云;或使用直接连接(BT 或 Wi-Fi)的justremotephone.com。我个人不喜欢这些应用,我想构建一个基于蓝牙标准的解决方案。
    • 感谢您的提醒:MS 不太可能使用 BT,仅将标题标记为后续/监控。我绝对必须为此使用BT。使用在线解决方案不是一种选择。不能通过 BT 做到这一点似乎很疯狂,我认为你可以在 Vista 中(不知道,我跳过了那个,直接进入 Win7)。我认为唯一的选择是探索 C++
    • 我也考虑过在 Android 上编写客户端软件,但我不是 Android 编码员!当然可以设想通过 BT 串行数据配置文件从 PC 到手机建立通信,然后您可以发送自定义数据报供手机软件实施。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-05
      • 2011-11-23
      • 1970-01-01
      • 2016-07-13
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多