我有一个应用程序可以工作(到目前为止一直很好)将我的iOS设备连接到蓝牙arduino,到目前为止这主要是为了练习,但现在我收到了我应该的真实的东西连接到。
问题是我无法找到它! (当我搜索它时)。
如果我使用scanwithservices:nil,我可以看到设备并连接到它。但是,如果我使用服务扫描:[device' sCBUUID],那么我什么都得不到。
我使用我自己的应用程序并查看设备文档,我使用其他应用程序检查了CBUUID的双/三/四重检查,但无论我无法找到它。
它有一个自定义的CBUUID,根据我所读的标准,CBUUID是:
BLETPodService = CBUUID(string: "4D494B45-414c-5741-5953-524F434B5321")
搜索这个没有产生任何结果,但是如果我扫描nil我找到它并且如果我使用Bluefruit应用程序(来自Adafruit)检查它的特征,我可以看到它的服务和特征ID和它们匹配我在这里发布的字符串!
我告诉一位朋友,他说这是一个多年来一直存在的BLE漏洞(关于自定义CBUUID),这是真的吗?真的没有解决这个问题吗?
编辑仅添加完整扫描代码FYI:
func centralManagerDidUpdateState(_ central: CBCentralManager) {
var statusMessage = ""
switch (central.state)
{
case .unsupported:
statusMessage = "Bluetooth Low Energy is not supported!"
displayStatusAlert(localmsg: statusMessage)
print(statusMessage)
case .unauthorized:
statusMessage = "Bluetooth Low Energy is not authorized!"
displayStatusAlert(localmsg: statusMessage)
print(statusMessage)
case .unknown:
statusMessage = "Bluetooth Low Energy is unknown!"
displayStatusAlert(localmsg: statusMessage)
print(statusMessage)
case .poweredOff:
statusMessage = "Bluetooth Low Energy is powered off!"
displayStatusAlert(localmsg: statusMessage)
print(statusMessage)
case .resetting:
statusMessage = "Bluetooth Low Energy is resetting!"
displayStatusAlert(localmsg: statusMessage)
print(statusMessage)
case .poweredOn:
statusMessage = "BLE is ready!" //If BLE is ready then start scanning right away!
peripheralsFoundNames.removeAll()
peripheralsFoundCB.removeAll()
peripheralsFoundRSSIs.removeAll()
peripheralsFoundData.removeAll() //Remove previous data from previous scans
central.scanForPeripherals(withServices: nil, options: nil)
}
}
//What happens when you discover a peripheral
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
//What to do when it discovers a peripheral, add it to the array list
print("Peripheral found: " + (peripheral.name ?? "Unknown Name"))
peripheralsFoundNames.append((peripheral.name ?? "Unknown Name"))
peripheralsFoundData.append((advertisementData.description ))
peripheralsFoundCB.append(peripheral)
peripheralsFoundRSSIs.append(RSSI)
}
答案 0 :(得分:2)
我碰巧同时在BLE固件和iOS App上工作。 我遇到了同样的问题,即过滤器无法正常工作。
iOS找不到具有UUID的设备的原因是,该设备在广告时不包括UUID。
我必须更改设备固件以在广告数据包中添加服务UUID。随着设备发布UUID,UUID过滤器将按预期工作。
答案 1 :(得分:1)
我也有这个问题,但我发现了一些棘手的方法。
您可以尝试直接在didDiscoverPeripheral func中匹配UUID(字符串值):
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
if let services = peripheral.services {
for service in services {
if service.uuid.uuidString.lowercased() == "4D494B45-414c-5741-5953-524F434B5321".lowercased() {
if !peripheralsFoundCB.contains(peripheral) {
peripheralsFoundCB.append(peripheral)
}
}
}
}
}
如果这种方式不适合你,我还有一个:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
peripheral.discoverServices(nil)
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
if let services = peripheral.services {
for service in services {
if service.uuid.uuidString.lowercased() == "4D494B45-414c-5741-5953-524F434B5321".lowercased() {
if !peripheralsFoundCB.contains(peripheral) {
peripheralsFoundCB.append(periphera
}
}
}
}
}
当然你应该使用
scanwithservices:nil
答案 2 :(得分:0)
斯威夫特3:
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
self.selectPeripheral.discoverServices(nil)
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
let services = peripheral.services as [CBService]!{
for service in services{
if service.uuid.uuidString == "4D494B45-414c-5741-5953-524F434B5321"{
print("service found")
}
}
}
}
答案 3 :(得分:0)
我有完全相同的问题。目前我可能会在这里提出相同的解决方案!但我认为这是硬件方面的问题。
我相信您的EE不会广播服务UUID的情况!我的意思是,如果您打印advertisedInfo,您将不会在信息中看到以下键值对:
"kCBAdvDataServiceUUIDs": <__NSArrayM 0x14e6f3b0>("Your CBUUID")
您可能会看到名称键值和其他内容,但绝对不是我指定的名称。
出于这个原因,如果他可以通过广播服务UUID来完成他的工作,那么你将能够使用以下方法进行扫描。
scanForPeripherals(withServices: ["Your CBUUID"], options: nil)
你会看到它:)