着信バイナリ データのストリームを読み取るために Preon Binding を使用しています。
私たちが抱えている問題は、特定のフィールド値が適切な表現のためにいくつかの単純な算術演算を必要とすることです。
- フィールド lat: デバイス座標からの緯度コンポーネント。バイナリ形式では、緯度を 1.000.000 で割る必要があります
- フィールド方向: デバイスの方位角を 3 で割った値
Preon はバインド時にそのような算術演算をサポートできますか、それともデコード後に具体的に行う必要がありますか (デコードされた DTO 値の一貫性が失われます)。
他のフィールド (latPositive および lngPositive) は、対応する値 (lat および lng フィールド) の数学記号 (負または正) を提供します。これは、負の場合に -1 を掛けるだけでサポートできると思いますが、それはある種の演算が実際に Preon でサポートされている場合は可能です。
マッピングは基本的に次のとおりです。
// ok
@BoundString(size = "1")
private String start;
// ??
@BoundNumber(size = "8")
private short size;
// ok
@BoundNumber(size = "8")
private short header;
// ok
@BoundNumber(size = "56", byteOrder = ByteOrder.BigEndian)
private long imei;
// ok
@BoundNumber(size = "8")
private short mask;
// ok
@BoundNumber(size = "5", byteOrder = ByteOrder.BigEndian)
private short day;
// ok
@BoundNumber(size = "4", byteOrder = ByteOrder.BigEndian)
private short month;
// ok
@BoundNumber(size = "5", byteOrder = ByteOrder.BigEndian)
private short year;
// ok
@BoundNumber(size = "5", byteOrder = ByteOrder.BigEndian)
private short hour;
// ok
@BoundNumber(size = "6", byteOrder = ByteOrder.BigEndian)
private short minute;
// ok
@BoundNumber(size = "6", byteOrder = ByteOrder.BigEndian)
private short second;
@Bound
private boolean latPositive;
@BoundNumber(size = "27", byteOrder = ByteOrder.BigEndian)
private int lat;
@Bound
private boolean lngPositive;
@BoundNumber(size = "28", byteOrder = ByteOrder.BigEndian)
private int lng;
// ok
@BoundNumber(size = "8", byteOrder = ByteOrder.BigEndian)
private int speed;
@BoundNumber(size = "7", byteOrder = ByteOrder.BigEndian)
private int direction;
// ok
@Bound
private boolean gpsFix;
// ok
@BoundNumber(size = "13", byteOrder = ByteOrder.BigEndian)
private int altitude;
// ok
@BoundNumber(size = "20", byteOrder = ByteOrder.BigEndian)
private int odometer;
// ok
@BoundNumber(size = "8", byteOrder = ByteOrder.BigEndian)
private int batteryLevel;
PS: Preon ユーザーのメーリング リストはありますか?