使用附近连接,每个设备都有一个endpointId,类似于zkHk
。
获取其他设备的endpointId非常简单,因为它在扫描或连接到其他设备时由API返回。
我必须遗漏一些东西,但我无法找到获得自己的endpointId的方法(除了实现连接的对等体与我的id相呼应的机制之外)。在某些协议中,我想遵循发送给谁的内容,这是非常有用的。
我找到的唯一东西是getLocalEndpointName
,但是它返回我的名字,而不是我的id。尽管它看起来像附近的C++版本有!
你对Java/Kotlin有什么想法吗?我特别寻求获得endpointId,而不是使用替代方法,比如在本地端点名称中使用某种GUID作为替代。
编辑:一些用法的例子
1)例如,实现一些网络mesh协议是很有趣的。几个设备相互连接,形成一个全局网络,每个设备在再次发送之前将其endpointId
添加到传入的有效负载中,因此其他设备可以检查是否应该将有效负载发送到已经有有效负载的设备。
2)我还可能希望通过作为中继的B从设备A到C发送数据包,并在有效载荷中添加一些" from : A“和" to : C”字段,以便网络知道如何路由数据和避免某些重传周期。使用endpointId
更容易做到这一点,因为每个设备都有一个连接到的endpointId
列表。
3)对于调试来说,它也是很有趣的。如果我用一部连接到其他几个电话(例如星型网络)的手机进行一些测试,就更容易知道一部新的数据是从哪部手机来的,尤其是如果我想将name
用于其他目的的话。
注意:所有这些都可以用不同的方式来完成(例如,使用一些唯一的标识符作为设备的“名称”,并检查它而不是endpointId
),但这似乎有点麻烦。更多的是因为endpointId
保证了某种唯一性,而我必须为name
执行它。此外,在交换数据之前,我在另一个设备上没有太多的信息(只有endpointId
和name
),所以我觉得如果使用name
代替endpointId
,我就会删除最后一个元数据槽。
发布于 2017-11-28 07:11:04
从今天起,您无法获得自己的端点id。我们没看到你需要它的原因。您能给出一个更详细的算法示例,您需要知道自己的id吗?
发布于 2018-05-15 10:47:00
我认为你想要得到你的endpointId,并把它发送到其他设备,以了解你?如果是
让我们这样想:其他设备将获得您的EndpointID并在每次连接到它们时保存它。
1)您有一个Arrylist<EndPointObject> listOfUsers
,其中EndPointObject
是一个对象,包含有关连接端点设备的信息(您创建这个类)。我们将使用这个Arry列表来保存接收到的端点信息
2)您需要通过实现EndPointObject使Serializable
类可序列化,这样做是为了使它能够转换为Byte[]并以有效负载的形式发送
public class EndPointObject implements Serializable
{
String endpointId ;
.
.
.
}
3)这是转换类,将它添加到项目中
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);
}
}
我在附近的技术方面非常新,但我希望这会有所帮助,通过这种方式,您可以要求其他端点每次发送您自己的终结点。
https://stackoverflow.com/questions/47519121
复制相似问题