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これによってビーコンを計算しています:

InstanceID:e61bdd5c2a9a

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=

誰でも私を助けることができますか?

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 の 16 進値と、これらの実際の基礎となるバイナリ値との間の変換に関するかなり一般的な問題です。

base64 文字列"ZWRkMWViXWFjMDRlNWRlZmEwNTdkMGU3ZDAwMmQ4YmM="は、実際にはテキスト16 進文字列の base64 エンコーディングです"edd1ebfac04e5defa017e61bdd5c2a9a"。しかし、実際に行う必要があるのは、この 16 進文字列の基になるバイナリ値を 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 に答える