从Java创建设备驱动程序包

从Java创建设备驱动程序包,java,serialization,deserialization,packet,device-driver,Java,Serialization,Deserialization,Packet,Device Driver,现在我手头有一些空闲时间,我决定创建一个Java程序,将我的XBee(即zigbee)芯片连接到我的新SmartThings hub。我发现了一个很好的教程,通过手工创建数据包来实现这一点()。我的下一个任务是创建一组Java例程来创建、发送、接收和访问所需的数据包(即字节序列) 在用C语言为其他项目做了类似的工作之后,我的第一个想法是简单地创建一个具有数据包结构的类并发送它。大概是这样的: class DeviceAnnounce { public byte frameId;

现在我手头有一些空闲时间,我决定创建一个Java程序,将我的XBee(即zigbee)芯片连接到我的新SmartThings hub。我发现了一个很好的教程,通过手工创建数据包来实现这一点()。我的下一个任务是创建一组Java例程来创建、发送、接收和访问所需的数据包(即字节序列)

在用C语言为其他项目做了类似的工作之后,我的第一个想法是简单地创建一个具有数据包结构的类并发送它。大概是这样的:

class DeviceAnnounce {
    public byte frameId;
    public byte addr64[];
    public byte addr16[];
    public byte capability;
};
问题是,似乎没有办法将此“结构”强制转换为要发送到设备的字节数组

接下来我想,我们在Java运行时中内置了序列化功能。因此,我向类中添加了Serializable,并使用writeObject()方法将实例转换为字节流。这里的问题是writeObject()不仅转换字节,而且在编码中包含对象的定义。对于将对象读写到磁盘非常有用,但它不会创建我需要发送到xbee设备的数据包

我最终以艰难的方式编写了代码,向类中显式添加了一个创建字节数组的方法

class DeviceAnnounce {
public DeviceAnnounce(byte frameId, byte[] addr64, byte[] addr16, byte capability) {
    super();
    this.frameId = frameId;
    this.addr64 = addr64;
    this.addr16 = addr16;
    this.capability = capability;
}

public byte frameId;
public byte addr64[];
public byte addr16[];
public byte capability;

byte[] getBytes() throws IOException {
    byte[] data=new byte[12];
    data[0]=frameId;
    data[1]=addr64[7];
    data[2]=addr64[6];
    data[3]=addr64[5];
    data[4]=addr64[4];
    data[5]=addr64[3];
    data[6]=addr64[2];
    data[7]=addr64[1];
    data[8]=addr64[0];
    data[9]=addr16[1];
    data[10]=addr16[0];
    data[11]=capability;
    return data;
}

@Override
public String toString() {
    return "DeviceAnnounce [frameId=" + frameId + ", addr64=" + HexUtils.prettyHexString(addr64) + ", addr16="
            + HexUtils.prettyHexString(addr16) + ", capability=" + capability + "]";
}
}


这是可行的,但我一直认为一定有更好的办法。现在是64美元(或比特)的问题。有没有办法将POJO转换成简单的字节流/数组?

要构建用于传输的字节块,我建议使用内置的,例如,它有用于16位、32位和64位整数的帮助器(以大端或小端为单位)

然后,您应该在使用这些值时存储它们,例如

public byte frameId;
public long addr64;
public short addr16;
public byte capability;

byte[] getBytes() throws IOException {
    ByteBuffer buf = ByteBuffer.allocate(12)
            .order(ByteOrder.BIG_ENDIAN/*Network Byte Order*/);
    buf.put(frameId);
    buf.putLong(addr64);
    buf.putShort(addr16);
    buf.put(capability);
    return buf.array(); // or return the ByteBuffer itself
}