草庐IT

iOS蓝牙双模;同时将 BLE (GATT) 连接到已连接的 BR/EDR (A2DP/HFP) 立体声耳机

coder 2023-07-28 原文

我正在开发一款使用经典配置文件(HFP、A2DP、AVRCP)的蓝牙立体声耳机,就像人们对 Ina 立体声耳机的期望一样。但是,我想为 iOS 部署一个远程控制应用程序,并同时将其用于其他经典链接,但我在设计中使用的双模芯片组并没有像我预期的那样运行;

耳机设置为外围设备,让 iOS 设备充当中心。因此,外围设备宣传其 BLE 服务(使用我特定的 128 位 UUID)并且一切正常。我可以从任何中心浏览外围设备,但只有当我没有连接到经典配置文件时(例如,当没有流式传输音频时)。

我的设备在连接 HFP 和/或 A2DP 时似乎无法宣传 BLE!然而,我已经看到了作为 BLE 中央设备的同一芯片组的演示,扫描并连接到其他 BLE 外围设备,同时通过 A2DP 传输音频。然而,在该设置中,设备充当连接到 iPhone 的 A2DP 接收器,同时通过 BLE 扫描/连接到充当 BLE 外围设备的第三个单元。因此,不能将经典蓝牙和智能蓝牙点对点连接到同一设备。

在支持/连接到蓝牙经典配置文件时是否存在不能充当外围设备的双模限制?在那种情况下只支持中央模式吗?

仅供引用,我使用的是 CSR 的 8670 芯片组。

更新

添加了新答案。很抱歉直到现在才澄清/清理我以前的回答——时间过得真快!

最佳答案

好吧,在深入研究规范并尝试更清楚地理解事物之后,我找到了我正在寻找的答案,尽管我更喜欢更乐观的答案......;(

尽管如此,让我们开始吧; 4.0 (BLE) 的蓝牙规范说明了这一点;

Dual-mode gadgets cannot act as BLE peripheral and advertise its presence while still being connectable in "Classic" Bluetooth using BR/EDR.

此外,我正在使用的 CSR8670 双模芯片组的 CSR 源代码示例都以相同的方式表现;当连接任何经典 BT 链接时,作为外围设备的 BLE 广告将被禁用。相反,CSR 源代码提倡该设备应充当 BLE 中心,允许其他 BLE 外围设备广播并连接到它,所有这些在流式传输音频时完全可行(充当 A2DP 接收器)。

这根本不适合我的设置;

  1. BLE centrals 比 BLE peripherals 耗电更多,我的设备需要节能
  2. 双模式“组合”- 将 BR/EDR 设备与 BLE 外围设备功能相结合的问题刚刚转移到手机上,这不会更好地工作,因为我们不能指望 Apple(或其他任何人)违反BLE 规范。

相反,推荐的方法是让我的立体声耳机完全跳过 BLE,而是使用 GATT 而不是 BR/EDR,也称为通过“ Vanilla ”进行广告,这确实很有意义;我的意思是,我已经在两个设备之间设置了 ACL 链接,为什么我需要启动任何类型的发现机制?

Bluetooth SIG 再次派上用场;

https://developer.bluetooth.org/TechnologyOverview/Pages/GATT.aspx

GATT and ATT are not transport specific and can be used in both BR/EDR and LE. However, GATT and ATT are mandatory to implement in LE since it is used for discovering services

因此,SIG 对使用 BR/EDR 作为 GATT 的传输说"is",但问题却变成了;我如何才能从我的 iOS 应用程序中访问那个连接的 BR/EDR 设备,其中典型的场景是使用 CBCentral 扫描、发现并连接到 CBPeripheral?答案很简单;你不能,因为 iOS 7.0(还?)不支持 BR/EDR 的 GATT;

https://www.bluetooth.org/tpg/showDeclaration.cfm?3A000A5A005C5344535D5414403B0C0D0E2405022413010E57503F202A5A72

所以,总结一下;如果你想在两个双模蓝牙设备之间进行点对点设置,同时使用蓝牙经典配置文件和蓝牙智能服务/特性,你应该使用 GATT over BR/EDR,这对苹果设备来说是不行的,但可能会得到 Android 的支持(不知道,最终会将应用程序移植到 Android,但无论如何这对 Android 来说都不是什么大问题,因为最坏的情况将意味着回退到 SPP 和一个简单的字节协议(protocol)来完成这项工作我需要完成)。

就是这样。希望我帮助了某人;) /马库斯

关于iOS蓝牙双模;同时将 BLE (GATT) 连接到已连接的 BR/EDR (A2DP/HFP) 立体声耳机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23056668/

有关iOS蓝牙双模;同时将 BLE (GATT) 连接到已连接的 BR/EDR (A2DP/HFP) 立体声耳机的更多相关文章

  1. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  2. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  7. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  8. ruby-on-rails - 连接字符串时如何在 <%=%> block 内输出 html_safe? - 2

    考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://

  9. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  10. ruby-on-rails - 什么会导致与 APNS 的连接间歇性断开连接? - 2

    我有一个ruby​​脚本可以打开与Apple推送服务器的连接并发送所有待处理的通知。我看不出任何原因,但当Apple断开我的脚本时,我遇到了管道损坏错误。我已经编写了我的脚本来适应这种情况,但我宁愿只是找出它发生的原因,这样我就可以在第一时间避免它。它不会始终根据特定通知断开连接。它不会以特定的字节传输大小断开连接。一切似乎都是零星的。您可以在单个连接上发送的数据传输或有效负载计数是否有某些限制?看到人们的解决方案始终保持一个连接打开,我认为这不是问题所在。我看到连接在3次通知后断开,我看到它在14次通知后断开。我从未见过它能超过14点。有没有人遇到过这种类型的问题?如何处理?

随机推荐