kopia lustrzana https://github.com/bertrik/ttnhabbridge
Update CayenneMessage: it's now a list of CayenneItems.
rodzic
4d9d9bb675
commit
6078b8eaff
|
@ -0,0 +1,45 @@
|
||||||
|
package nl.sikken.bertrik.cayenne;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Representation of one measurement item in a cayenne message.
|
||||||
|
*/
|
||||||
|
public final class CayenneItem {
|
||||||
|
|
||||||
|
private final int channel;
|
||||||
|
private final ECayenneItem type;
|
||||||
|
private final String[] value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param channel the unique channel
|
||||||
|
* @param type the type
|
||||||
|
* @param value the (string) value
|
||||||
|
*/
|
||||||
|
public CayenneItem(int channel, ECayenneItem type, String[] value) {
|
||||||
|
this.channel = channel;
|
||||||
|
this.type = type;
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getChannel() {
|
||||||
|
return channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ECayenneItem getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format(Locale.US, "{chan=%d,type=%s,value=%s}", channel, type, Arrays.toString(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -2,18 +2,17 @@ package nl.sikken.bertrik.cayenne;
|
||||||
|
|
||||||
import java.nio.BufferUnderflowException;
|
import java.nio.BufferUnderflowException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A cayenne message containing cayenne data items.
|
* A cayenne message containing cayenne data items.
|
||||||
*/
|
*/
|
||||||
public final class CayenneMessage {
|
public final class CayenneMessage {
|
||||||
|
|
||||||
private final Map<Integer,String[]> map = new HashMap<>();
|
private final List<CayenneItem> items = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the byte array into a cayenne message.
|
* Parses the byte array into a cayenne message.
|
||||||
|
@ -34,7 +33,8 @@ public final class CayenneMessage {
|
||||||
throw new CayenneException("Invalid cayenne type " + type);
|
throw new CayenneException("Invalid cayenne type " + type);
|
||||||
}
|
}
|
||||||
final String[] formatted = ct.format(bb);
|
final String[] formatted = ct.format(bb);
|
||||||
message.map.put(channel, formatted);
|
final CayenneItem item = new CayenneItem(channel, ct, formatted);
|
||||||
|
message.items.add(item);
|
||||||
}
|
}
|
||||||
} catch (BufferUnderflowException e) {
|
} catch (BufferUnderflowException e) {
|
||||||
throw new CayenneException(e);
|
throw new CayenneException(e);
|
||||||
|
@ -43,19 +43,35 @@ public final class CayenneMessage {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a map from a channel number to a formatted String[].
|
* @return an immutable list of measurement items in the order it appears in the raw data
|
||||||
*/
|
*/
|
||||||
public Map<Integer, String[]> getItems() {
|
public List<CayenneItem> getItems() {
|
||||||
return Collections.unmodifiableMap(map);
|
return Collections.unmodifiableList(items);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds an item by type.
|
||||||
|
*
|
||||||
|
* @param type the desired type
|
||||||
|
* @return the item, or null if it does not exist
|
||||||
|
*/
|
||||||
|
public CayenneItem ofType(ECayenneItem type) {
|
||||||
|
return items.stream().filter(i -> (i.getType() == type)).findFirst().orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds an item by channel.
|
||||||
|
*
|
||||||
|
* @param channel the desired channel
|
||||||
|
* @return the item, or null if it does not exist
|
||||||
|
*/
|
||||||
|
public CayenneItem ofChannel(int channel) {
|
||||||
|
return items.stream().filter(i -> (i.getChannel() == channel)).findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
final StringBuilder sb = new StringBuilder();
|
return Arrays.toString(items.toArray());
|
||||||
map.forEach((k,v) -> {
|
|
||||||
sb.append(String.format(Locale.US, "[%d]='%s',", k, Arrays.toString(v)));
|
|
||||||
});
|
|
||||||
return sb.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package nl.sikken.bertrik.cayenne;
|
package nl.sikken.bertrik.cayenne;
|
||||||
|
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
@ -23,11 +22,10 @@ public final class CayenneMessageTest {
|
||||||
public void testTwoTemperatureSensors() throws CayenneException {
|
public void testTwoTemperatureSensors() throws CayenneException {
|
||||||
final byte[] data = {0x03, 0x67, 0x01, 0x10, 0x05, 0x67, 0x00, (byte) 0xFF};
|
final byte[] data = {0x03, 0x67, 0x01, 0x10, 0x05, 0x67, 0x00, (byte) 0xFF};
|
||||||
final CayenneMessage payload = CayenneMessage.parse(data);
|
final CayenneMessage payload = CayenneMessage.parse(data);
|
||||||
LOG.info("payload = {}", payload);
|
LOG.info("payload: {}", payload);
|
||||||
|
|
||||||
final Map<Integer, String[]> items = payload.getItems();
|
Assert.assertArrayEquals(new String[] {"27.2"}, payload.ofChannel(3).getValue());
|
||||||
Assert.assertArrayEquals(new String[] {"27.2"}, items.get(3));
|
Assert.assertArrayEquals(new String[] {"25.5"}, payload.ofChannel(5).getValue());
|
||||||
Assert.assertArrayEquals(new String[] {"25.5"}, items.get(5));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -40,9 +38,8 @@ public final class CayenneMessageTest {
|
||||||
{0x01, 0x67, (byte) 0xFF, (byte) 0xD7, 0x06, 0x71, 0x04, (byte) 0xD2, (byte) 0xFB, 0x2E, 0x00, 0x00};
|
{0x01, 0x67, (byte) 0xFF, (byte) 0xD7, 0x06, 0x71, 0x04, (byte) 0xD2, (byte) 0xFB, 0x2E, 0x00, 0x00};
|
||||||
final CayenneMessage payload = CayenneMessage.parse(data);
|
final CayenneMessage payload = CayenneMessage.parse(data);
|
||||||
|
|
||||||
final Map<Integer, String[]> items = payload.getItems();
|
Assert.assertArrayEquals(new String[] {"-4.1"}, payload.ofChannel(1).getValue());
|
||||||
Assert.assertArrayEquals(new String[] {"-4.1"}, items.get(1));
|
Assert.assertArrayEquals(new String[] {"1.234", "-1.234", "0.000"}, payload.ofChannel(6).getValue());
|
||||||
Assert.assertArrayEquals(new String[] {"1.234", "-1.234", "0.000"}, items.get(6));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -55,8 +52,7 @@ public final class CayenneMessageTest {
|
||||||
{0x01, (byte) 0x88, 0x06, 0x076, 0x5f, (byte) 0xf2, (byte) 0x96, 0x0a, 0x00, 0x03, (byte) 0xe8};
|
{0x01, (byte) 0x88, 0x06, 0x076, 0x5f, (byte) 0xf2, (byte) 0x96, 0x0a, 0x00, 0x03, (byte) 0xe8};
|
||||||
final CayenneMessage payload = CayenneMessage.parse(data);
|
final CayenneMessage payload = CayenneMessage.parse(data);
|
||||||
|
|
||||||
final Map<Integer, String[]> items = payload.getItems();
|
Assert.assertArrayEquals(new String[] {"42.3519", "-87.9094", "10.00"}, payload.ofChannel(1).getValue());
|
||||||
Assert.assertArrayEquals(new String[] {"42.3519", "-87.9094", "10.00"}, items.get(1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -68,8 +64,8 @@ public final class CayenneMessageTest {
|
||||||
final byte[] data = {1, 104, 100};
|
final byte[] data = {1, 104, 100};
|
||||||
final CayenneMessage payload = CayenneMessage.parse(data);
|
final CayenneMessage payload = CayenneMessage.parse(data);
|
||||||
|
|
||||||
final Map<Integer, String[]> items = payload.getItems();
|
// final Map<Integer, String[]> items = payload.getItems();
|
||||||
Assert.assertArrayEquals(new String[] {"50.0"}, items.get(1));
|
Assert.assertArrayEquals(new String[] {"50.0"}, payload.ofChannel(1).getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -82,10 +78,9 @@ public final class CayenneMessageTest {
|
||||||
final byte[] data = Base64.getDecoder().decode(base64);
|
final byte[] data = Base64.getDecoder().decode(base64);
|
||||||
final CayenneMessage payload = CayenneMessage.parse(data);
|
final CayenneMessage payload = CayenneMessage.parse(data);
|
||||||
|
|
||||||
final Map<Integer, String[]> items = payload.getItems();
|
Assert.assertArrayEquals(new String[] {"52.0225", "4.6928", "-2.00"}, payload.ofChannel(1).getValue());
|
||||||
Assert.assertArrayEquals(new String[] {"52.0225", "4.6928", "-2.00"}, items.get(1));
|
Assert.assertArrayEquals(new String[] {"247.84"}, payload.ofChannel(2).getValue());
|
||||||
Assert.assertArrayEquals(new String[] {"247.84"}, items.get(2));
|
Assert.assertArrayEquals(new String[] {"27.0"}, payload.ofChannel(3).getValue());
|
||||||
Assert.assertArrayEquals(new String[] {"27.0"}, items.get(3));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -98,10 +93,23 @@ public final class CayenneMessageTest {
|
||||||
final byte[] data = Base64.getDecoder().decode(base64);
|
final byte[] data = Base64.getDecoder().decode(base64);
|
||||||
final CayenneMessage payload = CayenneMessage.parse(data);
|
final CayenneMessage payload = CayenneMessage.parse(data);
|
||||||
|
|
||||||
final Map<Integer, String[]> items = payload.getItems();
|
// verify we can get at the data by channel
|
||||||
Assert.assertArrayEquals(new String[] {"52.0225", "4.6925", "-17.00"}, items.get(1));
|
Assert.assertArrayEquals(new String[] {"52.0225", "4.6925", "-17.00"}, payload.ofChannel(1).getValue());
|
||||||
Assert.assertArrayEquals(new String[] {"4.15"}, items.get(2));
|
Assert.assertArrayEquals(new String[] {"4.15"}, payload.ofChannel(2).getValue());
|
||||||
Assert.assertArrayEquals(new String[] {"24.0"}, items.get(3));
|
Assert.assertArrayEquals(new String[] {"24.0"}, payload.ofChannel(3).getValue());
|
||||||
|
|
||||||
|
// verify we can also get data by type
|
||||||
|
Assert.assertArrayEquals(new String[] {"52.0225", "4.6925", "-17.00"},
|
||||||
|
payload.ofType(ECayenneItem.GPS_LOCATION).getValue());
|
||||||
|
Assert.assertArrayEquals(new String[] {"4.15"}, payload.ofType(ECayenneItem.ANALOG_INPUT).getValue());
|
||||||
|
Assert.assertArrayEquals(new String[] {"24.0"}, payload.ofType(ECayenneItem.TEMPERATURE).getValue());
|
||||||
|
|
||||||
|
// verify non-existing channel and type
|
||||||
|
Assert.assertNull(payload.ofChannel(0));
|
||||||
|
Assert.assertNull(payload.ofType(ECayenneItem.BAROMETER));
|
||||||
|
|
||||||
|
// verify toString method
|
||||||
|
Assert.assertNotNull(payload.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Ładowanie…
Reference in New Issue