Eddystone-url установить или отключить расширение

Я пишу рекламодателя Eddystone-url BLE для Android. Однако у меня проблемы с правильным кодированием URL-адреса. Согласно спецификациям (https://github.com/google/eddystone/tree/master/eddystone-url), префикс схемы (например, http://www.) может быть установлен одним байтом (например, 0x00) . То же самое должно произойти при расширении (например, .com / = 0x00). Есть целый список разных префиксов и расширений.

Пока приставка работает, расширение ведет себя странно.

Если я войду:

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

сканер BLE получает именно этот URL.

Если я войду:

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

без «/» в конце сканер BLE сообщает мне, что добавляется «.com», например:

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

Если я войду:

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

Полученный URL снова выглядит как оригинал.

Как использовать кодировку расширения? Или как отключить? Вроде очень ненадежно.

Мой код:

 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;
}

Обновить string2byte:

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

А печать байтов в logcat показывает следующее: для "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/

А это для: "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

person Chris    schedule 22.03.2016    source источник


Ответы (1)


Вы не можете отключить расширение - это часть спецификации. Получатели будут расширять любые байты, соответствующие шаблонам расширения. Поэтому необходимо убедиться, что любые передаваемые байты случайно не содержат байты раскрытия.

Я подозреваю, что есть ошибка в функции string2byte, которая добавляет лишний 0 байт в конец "http://www.orf.at "при преобразовании в байты. Это вызовет симптомы, которые вы видите.

Если вы опубликуете определение этой функции и зарегистрированный вывод фактических байтов, помещенных в выходной поток, это может помочь диагностировать проблему.

РЕДАКТИРОВАТЬ: Кроме того, возможно, что приложение BLE Scanner, которое вы используете для декодирования передачи, не распаковывает должным образом. Если у вас есть устройство Android, вы можете попробовать мое приложение Locate Beacon: https://play.google.com/store/apps/details?id=com.radiusnetworks.locate&hl=en

person davidgyoung    schedule 22.03.2016
comment
Спасибо за предложение, но, похоже, это не так. string2byte - это просто url.getBytes (). А также распечатка служебных данных, похоже, не показывает дополнительных пустых байтов. Добавляю журнал. - person Chris; 22.03.2016
comment
Возможно, проблема в ошибке на стороне декомпрессии. См. Мою правку для предлагаемой альтернативы. - person davidgyoung; 22.03.2016
comment
Это действительно сканер не декодировал его правильно (play.google.com/store/apps/). С вашим приложением Locate все работает нормально. Спасибо! - person Chris; 23.03.2016