2015-12-02 2 views
1

Я пытаюсь зарегистрировать свой маяк на игровой площадке OAuth2.0. Когда я пытаюсь зарегистрировать свой маяк, это дает мне следующую ошибку:Invalid AdsisedId длина байтов ID

{ "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 маяком этим :

InstanceID: e61bdd5c2a9a

Namespace:edd1ebfac04e5defa017

я создаю advertiseId этим методом:

[1] Concatenate Namespace+Instance. =>edd1ebfac04e5defa017e61bdd5c2a9a

[2] Преобразование его в поток байтов, используя следующий код:

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

[3] затем преобразовать его в Base64 используя следующий код:

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

Сейчас encoded является нашим advertisedId, которая составляет ZWRkMWViXWFjMDRlNWRlZmEwNTdkMGU3ZDAwMmQ4YmM=

Может ли кто-нибудь мне помочь?

ответ

2

Это довольно распространенная проблема с преобразованием между шестнадцатеричными значениями идентификатора маяка и фактическими базовыми двоичными значениями для них.

в 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 

Итак, как вы можете видеть, вы должны получить строку base64, что примерно 24 байт в длину.

Таким образом, ваша функция преобразования должна быть что-то по следующим направлениям:

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

В случае кому-то нужен полный рабочий пример в 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")); 
    } 
} 
Смежные вопросы