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’
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íneamanufacturerData =
?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 extraerAdvertisementDataManufacturerDataKey
del parámetroadvertisementData
.Para extraer los dos valores enteros (254 y 84) de
AdvertisementDataManufacturerDataKey
, se deben hacer los siguientes cambios en el métododidDiscover
:Explicación:
– Primero, se desempaqueta el parámetro
advertisementData
comoData
utilizando enlace opcional, ya que se espera queAdvertisementDataManufacturerDataKey
sea un objetoData
.– El objeto
Data
se convierte en una representación de cadena hexadecimal utilizandomap
yjoined
.– Los dos valores enteros se extraen al analizar los dos primeros y los dos últimos caracteres de la cadena hexadecimal utilizando
prefix
ysuffix
respectivamente. El parámetroradix
con un valor de16
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 queUTF8.self
no es un argumento válido para el parámetroencoding
del inicializadorString(data:encoding:)
. En su lugar, el parámetro.encoding
debe establecerse enString.Encoding.utf8
, de la siguiente manera:Esto debería resolver el error del compilador.