无效的AdvertisedId id字节长度

时间:2015-12-02 11:21:01

标签: google-beacon-platform proximityapi

我正在尝试在OAuth2.0 Playground上注册我的灯塔。当我试图注册我的灯塔时,它会给我以下错误:

{   "error": {
"status": "INVALID_ARGUMENT", 
"message": "Invalid AdvertisedId id bytes length", 
"code": 400   } 
}

我正在向POST https://proximitybeacon.googleapis.com/v1beta1/beacons:register身体发送一个application/json请求:

 {
  "advertisedId": {
    "type": "EDDYSTONE",
    "id": "ZWRkMWViXWFjMDRlNWRlZmEwNTdkMGU3ZDAwMmQ4YmM="
  },
  "status": "ACTIVE",
}

我正在计算信标的advertiseID

InstanceIDe61bdd5c2a9a

Namespace: edd1ebfac04e5defa017

我正在通过此方法创建advertiseId

[1] 连接Namespace+Instance。 => edd1ebfac04e5defa017e61bdd5c2a9a

[2] 使用以下代码将其转换为字节流:

byte[] message = "edd1ebfac04e5defa017e61bdd5c2a9a".getBytes(StandardCharsets.UTF_8);

[3] 然后使用以下代码将其转换为Base64

String encoded = Base64.getEncoder().encodeToString(message);

现在encoded是我们的advertisedId ZWRkMWViXWFjMDRlNWRlZmEwNTdkMGU3ZDAwMmQ4YmM=

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

如果有人需要java中的完整工作示例,那么

import java.util.Base64;
import javax.xml.bind.DatatypeConverter;

public class Eddystone{

    public static byte[] toByteArray(String s) {
        return DatatypeConverter.parseHexBinary(s);
    }

    public static String convertHexBeaconIDToAdvertisementID(String hex) {
        byte[] encoded = toByteArray(hex);
        return Base64.getEncoder().encodeToString(encoded);
    }

    public static void main(String[] args){
        System.out.println("Base64 Eddystone AdvertisementID: " + 
            convertHexBeaconIDToAdvertisementID("edd1ebfac04e5defa017e61bdd5c2a9a"));
    }
}

答案 1 :(得分:2)

这是一个相当普遍的问题,在信标ID的十六进制值和这些的实际基础二进制值之间进行转换。

base64字符串"ZWRkMWViXWFjMDRlNWRlZmEwNTdkMGU3ZDAwMmQ4YmM="实际上是文本十六进制字符串"edd1ebfac04e5defa017e61bdd5c2a9a"的base64编码。但你真正需要做的是base64编码这个十六进制字符串下面的二进制值。

在Node.jS中,例如:

var b = Buffer("edd1ebfac04e5defa017e61bdd5c2a9a", "hex");
b.length;
> 16 bytes    // The 32 char string above represents 16 bytes!

b.toString("base64");
> '7dHr+sBOXe+gF+Yb3Vwqmg=='
b.toString("base64").length;
> 24

因此,正如您所看到的,您应该获得一个大约24个字节的base64字符串。

所以,你的转换函数应该是以下几行:

String convertHexBeaconIDToAdvertisementID(String hex) {
    byte[] bytes = ByteString.decodeHex(hex).toByteArray();
    return Base64.getEncoder().encodeToString(bytes);
}