如何使用 Nearby Connections 获取我自己的 endpointId?

How to get my own endpointId with Nearby Connections?

使用 Nearby Connections,每个设备都有一个 endpointId,类似于 zkHk

获取其他人的 endpointId 很简单,因为它在扫描或连接到其他设备时由 API 返回。

我一定错过了一些东西,但我找不到获取我自己的 endpointId 的方法(除了实现一种连接的对等点回应我的 id 的机制)。它对于某些我想跟踪发送给谁的内容的协议很有用。

我唯一找到的是 getLocalEndpointName but it returns my name, not my id. Even though it seems the C++ version of Nearby have it!

您对 Java/Kotlin 有什么想法吗?我特别寻求获取 endpointId,而不是使用替代方法,例如在 localendpoint 名称中使用一种 GUID 作为替代。


编辑:一些用法示例

1) 例如,实现一些网络网状协议可能很有趣。几个设备相互连接形成一个全球网络,每个设备在再次发送之前将其 endpointId 添加到传入的有效载荷中,因此其他人可以检查他们是否应该将有效载荷发送到已经拥有它的设备。

2) 我可能还想专门通过充当中继的 B 从设备 A 向 C 发送数据包,并在有效负载中添加一些 "from: A" 和 "to: C" 字段,以便网络知道如何路由数据并避免一些重传周期。使用 endpointId 可以更简单地做到这一点,因为每个设备都有一个 endpointId 列表与其连接。

3) 它对于调试目的也很有趣。如果我用 phone 连接到其他几个(例如星形网络)进行一些测试,则更容易知道来自哪个 phone 的新数据,如果我想使用name 用于其他目的。

注意:所有这些都可以以不同的方式完成(例如,对设备的 "name" 使用一些唯一标识符并检查它而不是 endpointId),但这似乎有点麻烦。更何况 endpointId 保证了一种单一性,而我必须为 name 强制执行它。此外,在交换数据之前我无法在另一台设备上获得很多信息(仅 endpointIdname),所以我觉得如果我将 name 用作endpointId.

的替代品

截至今天,您无法获取自己的端点 ID。我们没有看到您需要它的理由。您能否给出更详细的算法示例,您需要知道自己的 ID?

我想你想获取你的 endpointId 并将其发送到其他设备以重新认识你? 如果是

让我们这样想: 其他设备将获取您的 EndpointID 并在您每次连接到它们时保存它

1) 你有一个 Arrylist<EndPointObject> listOfUsers,其中 EndPointObject 它是一个对象,包含有关连接的端点设备的信息(你创建这个 class)。 我们将使用这个 Arry 列表来保存接收到的端点信息

2) 你需要使 EndPointObject class 可以通过实现 Serializable 序列化,你这样做是为了使其能够转换为 Byte[] 并在 payload[=16= 中发送]

public class EndPointObject implements Serializable 
    {
      String endpointId ;
       .
       .
       .
    }

3)这是转换class将其添加到您的项目

public class SerializeHelperForPayLoad {
    public static byte[] serialize(Object object) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        // transform object to stream and then to a byte array
        objectOutputStream.writeObject(object);
        objectOutputStream.flush();
        objectOutputStream.close();
        return byteArrayOutputStream.toByteArray();
    }

    public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException{
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        return objectInputStream.readObject();
    }
}

4) 现在的策略是每次你连接到一个端点设备时你都会交换你的 EndpointObject 信息,所以在 payloadcallback

 PayloadCallback mPayloadCallback =
            new PayloadCallback() {
                @Override
                public void onPayloadReceived(String endpointId, Payload payload) {


                    if (payload.getType() == Payload.Type.BYTES) {

                        try{
                            onDataReceived(endpointId, SerializeHelperForPayLoad.deserialize(payload.asBytes()));
                        } catch (IOException | ClassNotFoundException e) { e.getMessage(); }
                    }

                    } 
    // onData recieved void 
    void onDataReceived(String endpointId, Object object) {
                    // do something with your Object
                    EndPointObject recieved_user_info = new EndPointObject();


                   if (object.getClass() == EndPointObject.class){

                        //casting
                        recieved_user_info = (EndPointObject) object;
//now add his end pointid to his information
                        recieved_user_info.setEndpointId(endpointId);
                        listOfUsers.add(recieved_user_info);

                    }


                }

我对附近的技术很陌生,但我希望这对您有所帮助, 通过这种方式,您可以要求其他端点每次都向您发送您自己的端点ID