1

我正在尝试在 OAuth2.0 Playground 上注册我的信标。当我尝试注册我的信标时,它给了我以下错误:

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

我正在向以下正文发送POST请求:https://proximitybeacon.googleapis.com/v1beta1/beacons:registerapplication/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是我们advertisedIdZWRkMWViXWFjMDRlNWRlZmEwNTdkMGU3ZDAwMmQ4YmM=

谁能帮我?

4

2 回答 2

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"));
    }
}
于 2016-01-18T06:57:38.733 回答
2

这是在信标 ID 的十六进制值和这些的实际底层二进制值之间转换的一个相当常见的问题。

base64 字符串"ZWRkMWViXWFjMDRlNWRlZmEwNTdkMGU3ZDAwMmQ4YmM="实际上是文本十六进制字符串的 base64 编码"edd1ebfac04e5defa017e61bdd5c2a9a"。但是你真正需要做的是 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);
}
于 2015-12-07T11:53:21.167 回答