es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede convertir los datos de anuncio BLE a String en Swift.

Estoy utilizando una llamada estándar a CentralManager para obtener algunos datos de publicidad BLE sin conectar.
Mi fragmento de código es:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

print("El valor de ManufacturerData es \(String(describing: advertisementData[CBAdvertisementDataManufacturerDataKey]))")

var manufacturerData: String!

if let mData = advertisementData[CBAdvertisementDataManufacturerDataKey] {
    manufacturerData = String(data: mData as! Data, encoding: UTF8.self)
}
else {
    manufacturerData = ""
}

….
}`


La línea de impresión produce

El valor de ManufacturerData es Opcional(<3235343a 3834>)

que muestra los 2 valores enteros que quiero como 254:84, por lo que sé que los valores están ahí.
No encuentro una forma de obtener los datos del fabricante en una forma para comenzar a extraer los 2 valores.
El error en la línea ‘manufacturerData =’ es

No se puede convertir el valor de tipo ‘UTF8.Type’ (también conocido como ‘Unicode.UTF8.Type’) en el tipo de argumento esperado ‘String.Encoding’

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Pregunta:

    ¿Cómo puedo extraer los 2 valores enteros del advertisementData en el fragmento de código proporcionado y qué significa el error en la línea manufacturerData =?


    En el fragmento de código proporcionado, se utiliza el método de devolución de llamada de CoreBluetooth didDiscover para extraer los datos de publicidad del periférico sin conectarse. Específicamente, el código intenta extraer AdvertisementDataManufacturerDataKey del parámetro advertisementData.

    Para extraer los dos valores enteros (254 y 84) de AdvertisementDataManufacturerDataKey, se deben hacer los siguientes cambios en el método didDiscover:

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    
        // Extraer el valor de AdvertisementDataManufacturerDataKey
        if let manufacturerData = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data {
    
            // Convertir los datos en una representación de cadena
            let hexString = manufacturerData.map { String(format: "%02hhx", $0) }.joined()
    
            // Extraer los dos valores enteros de la representación hexadecimal
            let firstValue = Int(hexString.prefix(2), radix: 16)
            let secondValue = Int(hexString.suffix(2), radix: 16)
    
            // Imprimir los valores extraídos
            print("Primer valor: \(firstValue ?? 0), Segundo valor: \(secondValue ?? 0)")
        }
    }
    

    Explicación:
    – Primero, se desempaqueta el parámetro advertisementData como Data utilizando enlace opcional, ya que se espera que AdvertisementDataManufacturerDataKey sea un objeto Data.
    – El objeto Data se convierte en una representación de cadena hexadecimal utilizando map y joined.
    – Los dos valores enteros se extraen al analizar los dos primeros y los dos últimos caracteres de la cadena hexadecimal utilizando prefix y suffix respectivamente. El parámetro radix con un valor de 16 se utiliza para especificar que la cadena debe interpretarse como un número en base 16 que representa el valor hexadecimal.
    – Los valores extraídos se imprimen en la consola.

    En cuanto al error en la línea manufacturerData =, el mensaje de error sugiere que UTF8.self no es un argumento válido para el parámetro encoding del inicializador String(data:encoding:). En su lugar, el parámetro .encoding debe establecerse en String.Encoding.utf8, de la siguiente manera:

    manufacturerData = String(data: mData as! Data, encoding: .utf8)
    

    Esto debería resolver el error del compilador.

Comments are closed.