2016-03-22 19 views
0

Ich bin ein Eddystone-url BLE Inserent für Android schreiben. Jedoch habe ich Probleme mit der korrekten Codierung der URL. Gemß den Spezifikationen (https://github.com/google/eddystone/tree/master/eddystone-url) kann das Schema-Präfix (z. B. http://www) mit einem einzelnen Byte (z. B. 0x00) festgelegt werden. Das gleiche gilt für die Erweiterung (z. B. .com/= 0x00). Es gibt eine ganze Liste für verschiedene Präfixe und Erweiterungen. seltsamEddystone-url gesetzt oder deaktivieren Erweiterung

Während das Präfix arbeitet, verhält sich die Expansion.

Wenn ich ein:

url = "http://www.orf.at/" 

ein BLE Scanner ruft genau diese URL.

Wenn ich ein:

url = "http://www.orf.at" 

ohne die "/" am Ende der BLE Scanner mir sagt, dass ein ".com" wie wird hinzugefügt:

"http://www.orf.at.com" 

Wenn ich ein:

url = "http://www.orf.at/test" 

Die abgerufene URL sieht wieder wie das Original aus.

Wie verwende ich die Erweiterungscodierung? Oder wie kann ich es deaktivieren? Es scheint sehr unzuverlässig zu sein.

Mein gemäß Code:

private AdvertiseData buildEddystoneURLData(String url) throws UnsupportedEncodingException { 
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 

    //frame type 
    os.write((byte) 0x10); 
    //TX Power 
    os.write((byte) 0xB5); 

    //URL scheme code 
    /* 
    0 0x00 http://www. 
    1 0x01 https://www. 
    2 0x02 http:// 
    3 0x03 https:// 
    */ 
    if(url.startsWith("http://www.")){ 
     os.write((byte) 0x00); 
     url = url.substring(11,url.length()); 
     log("starts with http://www."); 
     log("cutting to: "+url); 
    }else if(url.startsWith("https://www.")){ 
     os.write((byte) 0x01); 
     url = url.substring(12,url.length()); 
     log("starts with https://www."); 
     log("cutting to: "+url); 
    } 
    else if(url.startsWith("http://")){ 
     os.write((byte) 0x02); 
     url = url.substring(7,url.length()); 
     log("starts with http://"); 
     log("cutting to: "+url); 
    } 
    else if(url.startsWith("https://")){ 
     os.write((byte) 0x03); 
     url = url.substring(8,url.length()); 
     log("starts with https://"); 
     log("cutting to: "+url); 
    } 

    byte [] advertiseBytes = string2byte(url); 
    //0-17: url 
    for (Byte bt: advertiseBytes) { 
     os.write(bt); 
    } 

    byte[] serviceData = os.toByteArray(); 

    ParcelUuid SERVICE_UUID = ParcelUuid.fromString("0000FEAA-0000-1000-8000-00805F9B34FB"); 
    AdvertiseData.Builder builder = new AdvertiseData.Builder(); 
    if(serviceData!=null) { 
     builder.addServiceData(SERVICE_UUID, serviceData) 
       .addServiceUuid(SERVICE_UUID) 
       .setIncludeTxPowerLevel(false) 
       .setIncludeDeviceName(false); //don't include device name - it does not work 

     return builder.build(); 
    } 
    else 
     return null; 
} 

aktualisieren string2byte:

private byte[] string2byte(String st) throws UnsupportedEncodingException { 
    return st.getBytes("UTF-8"); 
} 

und zeigt den Druck der Bytes in logcat dies: für "http://www.orf.at/":

starts with http://www. 
cutting to: orf.at/ 
getServiceData at: 0000feaa-0000-1000-8000-00805f9b34fb 
byte: 16 
byte: -75 
byte: 0 
byte: 111 
byte: 114 
byte: 102 
byte: 46 
byte: 97 
byte: 116 
byte: 47 
getServiceData as String: ���orf.at/ 

Und dies für: "http://www.orf.at":

starts with http://www. 
cutting to: orf.at 
getServiceData at: 0000feaa-0000-1000-8000-00805f9b34fb 
byte: 16 
byte: -75 
byte: 0 
byte: 111 
byte: 114 
byte: 102 
byte: 46 
byte: 97 
byte: 116 
getServiceData as String: ���orf.at 

Antwort

0

Sie nicht Erweiterung deaktivieren können - es ist Teil der Spezifikation ist. Empfänger erweitern alle Bytes, die mit Erweiterungsmustern übereinstimmen. So müssen Sie sicherstellen, dass alle übertragenen Bytes nicht versehentlich Erweiterungs-Bytes enthalten.

I vermuten, gibt es einen Fehler in der string2byte Funktion, die ein zusätzliches Byte 0 am Ende der „http://www.orf.at“ erweitert, wenn es um Bytes zu konvertieren. Dies würde die Symptome verursachen, die Sie sehen.

Wenn Sie die Definition dieser Funktion und eine protokollierte Ausgabe des tatsächlichen Bytes stellte in den Ausgabestrom zu veröffentlichen, kann dies helfen, das Problem zu diagnostizieren.

EDIT: Alternativ ist es möglich, dass die BLE Scanner App, die Sie zum Dekodieren der Übertragung verwenden, nicht ordnungsgemäß dekomprimiert wird.Wenn Sie ein Android-Gerät haben, versuchen Sie vielleicht meine Locate Beacon App: https://play.google.com/store/apps/details?id=com.radiusnetworks.locate&hl=en

+0

Danke für den Vorschlag, aber das scheint nicht der Fall zu sein. string2byte ist nur eine url.getBytes(). Und auch das Ausdrucken der Servicedaten scheint keine zusätzlichen leeren Bytes zu zeigen. Ich füge das Protokoll hinzu. – Chris

+0

Vielleicht ist das Problem ein Fehler auf der Dekompressionsseite. Siehe meine Bearbeitung für eine vorgeschlagene Alternative. – davidgyoung

+0

Es war tatsächlich der Scanner, der es nicht richtig entschlüsselt hat (https://play.google.com/store/apps/details?id=de.flurp.beaconscanner.app). Mit der locate App von Ihnen funktioniert es gut. Vielen Dank! – Chris