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
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
Vielleicht ist das Problem ein Fehler auf der Dekompressionsseite. Siehe meine Bearbeitung für eine vorgeschlagene Alternative. – davidgyoung
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