首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eddystone-url设置或禁用扩展

Eddystone-url设置或禁用扩展
EN

Stack Overflow用户
提问于 2016-03-22 10:39:20
回答 1查看 158关注 0票数 0

我正在为android写一个Eddystone-url BLE广告。但是,我在正确编码url方面有问题。根据规范(https://github.com/google/eddystone/tree/master/eddystone-url),方案前缀(如http://www.)可以用单个字节(例如0x00)进行设置。同样的情况应该发生在扩展(例如. .com/ = 0x00)。对于不同的前缀和扩展有一个完整的列表。

当前缀起作用时,扩展的行为很奇怪。

如果我进入:

代码语言:javascript
复制
url = "http://www.orf.at/"

BLE扫描仪准确地检索此url。

如果我进入:

代码语言:javascript
复制
url = "http://www.orf.at"

没有末尾的"/“,BLE扫描仪告诉我添加了".com”,如下所示:

代码语言:javascript
复制
"http://www.orf.at.com"

如果我进入:

代码语言:javascript
复制
url = "http://www.orf.at/test"

检索到的url看起来又像原来的了。

如何使用扩展编码?或者我怎么才能禁用它?这似乎很不可靠。

我的密码是:

代码语言:javascript
复制
 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:

代码语言:javascript
复制
private byte[] string2byte(String st) throws UnsupportedEncodingException {
    return st.getBytes("UTF-8");
}

在logcat中打印字节显示:对于"http://www.orf.at/":

代码语言:javascript
复制
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":

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-22 13:58:18

您不能禁用扩展 --它是规范的一部分。接收者将展开任何与扩展模式匹配的字节。因此,您需要确保传输的任何字节都不会无意中包含扩展字节.

我怀疑在string2byte 函数中存在一个错误,该函数在将"http://www.orf.at“转换为字节时在”http://www.orf.at“末尾添加了一个额外的0字节。这会引起你看到的症状。

如果您发布此函数的定义和实际字节的日志输出到输出流中,这可能有助于诊断问题。

编辑:或者,您所使用的用于解码传输的BLE扫描程序可能没有正确地解压缩。如果你有安卓设备,你可以试试我的定位信标应用程序:https://play.google.com/store/apps/details?id=com.radiusnetworks.locate&hl=en

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36152136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档