【问题标题】:Coding a Windows 10 OBEX client in C用 C 编写 Windows 10 OBEX 客户端
【发布时间】:2018-05-08 19:45:31
【问题描述】:

我正在制作可通过蓝牙进行配置的嵌入式设备。我已经决定 OBEX 是要走的路(类似的设备可以通过以太网使用 FTP 进行配置,我想使用相同的方法)。蓝牙连接的嵌入式侧完成。我可以将手机中的照片上传到嵌入式系统,这样就可以了。

然后是创建用于配置设备的 Windows 应用程序的任务。我从来没有觉得有必要跟上 Windows 应用程序的发展,所以我可能最终会制作一个 MFC 应用程序,但对于初学者来说,我会满足于更少:控制台应用程序。

我发现很难为 Windows 找到任何支持蓝牙的 C 代码,但我确实遇到了 OpenObex,这是 SourceForge 上的一个项目,它不是很活跃(最后一次发布是 18 个月前),但看起来很有希望。我下载了代码,阅读了构建说明并完全忽略了它们(不喜欢使用 cmake),而是创建了一个 Visual C++ 2010 项目,其中包括库的所有源代码和一个测试应用程序。

您要使用此应用程序做的第一件事就是连接。在那里,我遇到了需要深入了解蓝牙的行为,而我似乎无法一起谷歌。

对 connect() 的调用使 GetLastError() 返回 0x2750,我发现这意味着“主机关闭”。谷歌告诉我,如果是 Windows/蓝牙,这意味着主机处于“断开连接模式”,我认为这也来自我制作的日志。

首先:嵌入式系统上的蓝牙告诉我这一点(我自己添加的一些日志记录,以防你去查找):

bluetoothd[195]: src/adapter.c(7795):connected_callback() hci0 device 24:FD:52:14:C2:6B connected eir_len 12
bluetoothd[195]: src/adapter.c(808):btd_adapter_find_device() Trying to find device
bluetoothd[195]: src/device.c(4116):device_addr_type_cmp() Comparing bf:9f:27:e2:87:d0 to 6b:c2:14:52:fd:24
bluetoothd[195]: src/device.c(3736):device_create() dst 24:FD:52:14:C2:6B
bluetoothd[195]: src/device.c(3646):device_new() address 24:FD:52:14:C2:6B
bluetoothd[195]: src/device.c(3682):device_new() Creating device /org/bluez/hci0/dev_24_FD_52_14_C2_6B
bluetoothd[195]: src/adapter.c(1148):adapter_create_device() g_slist_append device 0x1228730
bluetoothd[195]: src/adapter.c(7805):connected_callback() continuing connected callback
bluetoothd[195]: src/adapter.c(7810):connected_callback() going to eir_parse
bluetoothd[195]: src/adapter.c(7816):connected_callback() set class
bluetoothd[195]: src/device.c(3821):device_set_class() /org/bluez/hci0/dev_24_FD_52_14_C2_6B 0x02010C
bluetoothd[195]: src/adapter.c(7821):connected_callback() Going to add connection
bluetoothd[195]: src/adapter.c(3960):adapter_add_connection() g_slist_append device 0x1228730
bluetoothd[195]: src/device.c(3787):btd_device_device_set_name() /org/bluez/hci0/dev_24_FD_52_14_C2_6B HCK06

在此之后,Windows 应用程序需要大约一秒钟的时间才能确定“连接失败”,然后蓝牙告诉我:

bluetoothd[195]: src/adapter.c(7033):new_link_key_callback() hci0 new key for 24:FD:52:14:C2:6B type 4 pin_len 0 store_hint 0
bluetoothd[195]: src/adapter.c(808):btd_adapter_find_device() Trying to find device
bluetoothd[195]: src/device.c(4116):device_addr_type_cmp() Comparing bf:9f:27:e2:87:d0 to 6b:c2:14:52:fd:24
bluetoothd[195]: src/device.c(4116):device_addr_type_cmp() Comparing 6b:c2:14:52:fd:24 to 6b:c2:14:52:fd:24
bluetoothd[195]: src/adapter.c(1228):btd_adapter_get_device() Found device 0x1228730
bluetoothd[195]: src/adapter.c(808):btd_adapter_find_device() Trying to find device
bluetoothd[195]: src/device.c(4116):device_addr_type_cmp() Comparing bf:9f:27:e2:87:d0 to 6b:c2:14:52:fd:24
bluetoothd[195]: src/device.c(4116):device_addr_type_cmp() Comparing 6b:c2:14:52:fd:24 to 6b:c2:14:52:fd:24
bluetoothd[195]: src/adapter.c(1228):btd_adapter_get_device() Found device 0x1228730
bluetoothd[195]: src/device.c(5485):device_bonding_complete() bonding (nil) status 0x00
bluetoothd[195]: src/device.c(5542):device_bonding_complete() setting timer for reverse service discovery
bluetoothd[195]: src/adapter.c(1635):resume_discovery()

bluetoothd[195]: src/device.c(4286):device_probe_profiles() Probing profiles for device 24:FD:52:14:C2:6B
bluetoothd[195]: profiles/network/connection.c:connection_register() /org/bluez/hci0/dev_24_FD_52_14_C2_6B id 4373
bluetoothd[195]: profiles/network/connection.c:create_peer() Registered interface org.bluez.Network1 on path /org/bluez/hci0/dev_24_FD_52_14_C2_6B
bluetoothd[195]: src/service.c(117):btd_service_ref() 0x123f160: ref=2
bluetoothd[195]: profiles/network/connection.c:connection_register() id 4373 registered
bluetoothd[195]: src/service.c(104):change_state() 0x123f160: device 24:FD:52:14:C2:6B profile network-panu state changed: unavailable -> disconnected (0)
bluetoothd[195]: src/device.c(2284):device_svc_resolved() /org/bluez/hci0/dev_24_FD_52_14_C2_6B err 0

“断开连接模式”可能是嵌入式设备发送消息的直接结果,因为 hcidump 告诉我,除其他外,这是:

< ACL data: handle 12 flags 0x00 dlen 8
    L2CAP(d): cid 0x0040 len 4 [psm 3]
      RFCOMM(s): *DM*: cr 1 dlci 8 pf 1 ilen 0 fcs 0xe3

在时间上,这与 Windows 客户端决定“连接失败”同时发生。

很多文字(对不起!:))但我真的很感激任何可以帮助我在 Windows 上从 C 进一步执行 OBEX 的帮助。

【问题讨论】:

  • “我可能最终会制作一个 MFC 应用程序。”抱歉,我无法发表正面评论,但这是Is the Microsoft Foundation Class Library obsolete? 的问题。 . .另一个评论帖子说“仍然有程序员在编写/维护 COBOL 和 Fortran 方面过得很好!”
  • 虽然我目前的解决方案是 C,但我使用的是 Visual C++,任何需要 C++ 的解决方案都是可行的。出于这个原因,我在关键字和标题中添加了 C++,但显然这并不受欢迎。
  • 我不明白为什么我最终只能使用 cmets 去 MFC。 OpenObex 是我目前努力的基础,它是基于 winsock 的。它一直使用套接字(SOCK_STREAM,AF_BLUETOOTH,BTHPROTO_RFCOMM),bind(...),最后是确实连接的connect()函数,但由于“主机关闭”/“断开模式”而立即断开连接,使连接() 返回此错误。我对蓝牙的了解到此为止,谷歌未能填补空白。我的问题是填补这个空白,这样我就可以通过“断开连接模式”问题。

标签: c windows bluetooth obex


【解决方案1】:

原来问题出在客户端的连接方式上。可以通过两种方式连接到服务:通过端口号或通过服务类 ID。 OpenObex 假定在默认为 4 但可以从命令行设置的端口上找到该服务。要使其正常工作,您需要自己进行设备的服务发现。更好的方法是使用服务类 ID,这将使服务器根据为 OBEXFileTransfer (00001106-0000-1000-8000-00805f9b34fb) 保留的 GUID 确定端口

我更改了 OpenObex 的代码来执行此操作,现在对 connect() 的调用成功返回。在此之后我遇到了新问题,但至少现在连接正常!

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 2010-10-31
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2020-11-14
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多