diff --git a/.gitignore b/.gitignore index 3fe9858..c1277ae 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .classpath .project .settings/ +.idea +.vscode diff --git a/.travis.yml b/.travis.yml index a6133a7..c745ab4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ before_install: - .travis/prepare script: -- mvn cobertura:cobertura +- mvn clean test after_success: - bash <(curl -s https://codecov.io/bash) diff --git a/pom.xml b/pom.xml index f7862f2..3e48b06 100644 --- a/pom.xml +++ b/pom.xml @@ -116,6 +116,9 @@ org.apache.maven.plugins maven-javadoc-plugin 2.9.1 + + 8 + attach-javadocs @@ -139,19 +142,26 @@ - - org.codehaus.mojo - cobertura-maven-plugin - 2.7 - - - html - xml - - - + + org.jacoco + jacoco-maven-plugin + 0.8.5 + + + + prepare-agent + + + + report + test + + report + + + - + 1.0.1 diff --git a/src/main/java/com/github/mob41/blapi/A1Device.java b/src/main/java/com/github/mob41/blapi/A1Device.java index 03e683e..bb3ce8b 100644 --- a/src/main/java/com/github/mob41/blapi/A1Device.java +++ b/src/main/java/com/github/mob41/blapi/A1Device.java @@ -31,7 +31,7 @@ import java.io.IOException; import java.net.DatagramPacket; -import javax.xml.bind.DatatypeConverter; +import static com.github.mob41.blapi.HexUtil.bytes2hex; import com.github.mob41.blapi.mac.Mac; import com.github.mob41.blapi.pkt.CmdPayload; @@ -68,13 +68,13 @@ public byte[] getData() { }); byte[] data = packet.getData(); - log.debug("A1 check sensors received encrypted bytes: " + DatatypeConverter.printHexBinary(data)); + log.debug("A1 check sensors received encrypted bytes: " + bytes2hex(data)); int err = data[0x22] | (data[0x23] << 8); if (err == 0) { byte[] pl = decryptFromDeviceMessage(data); - log.debug("A1 check sensors received bytes (decrypted):" + DatatypeConverter.printHexBinary(pl)); + log.debug("A1 check sensors received bytes (decrypted):" + bytes2hex(pl)); float temp = (float) ((pl[0x4] * 10 + pl[0x5]) / 10.0); float hum = (float) ((pl[0x6] * 10 + pl[0x7]) / 10.0); diff --git a/src/main/java/com/github/mob41/blapi/BLDevice.java b/src/main/java/com/github/mob41/blapi/BLDevice.java index da60a5f..f9a49ab 100644 --- a/src/main/java/com/github/mob41/blapi/BLDevice.java +++ b/src/main/java/com/github/mob41/blapi/BLDevice.java @@ -38,7 +38,7 @@ import java.util.List; import java.util.Random; -import javax.xml.bind.DatatypeConverter; +import static com.github.mob41.blapi.HexUtil.bytes2hex; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -389,7 +389,7 @@ public boolean auth(boolean reauth) throws IOException { log.debug("auth Sending CmdPacket with AuthCmdPayload: cmd=" + Integer.toHexString(sendPayload.getCommand()) + " len=" + sendPayload.getPayload().getData().length); - log.debug("auth AuthPayload initial bytes to send: {}", DatatypeConverter.printHexBinary(sendPayload.getPayload().getData())); + log.debug("auth AuthPayload initial bytes to send: {}", bytes2hex(sendPayload.getPayload().getData())); DatagramPacket recvPack = sendCmdPkt(10000, 2048, sendPayload); @@ -401,7 +401,7 @@ public boolean auth(boolean reauth) throws IOException { return false; } - log.debug("auth recv encrypted data bytes (" + data.length +") after initial req: {}", DatatypeConverter.printHexBinary(data)); + log.debug("auth recv encrypted data bytes (" + data.length +") after initial req: {}", bytes2hex(data)); byte[] payload = null; try { @@ -417,11 +417,11 @@ public boolean auth(boolean reauth) throws IOException { return false; } - log.debug("auth Packet received payload bytes: " + DatatypeConverter.printHexBinary(payload)); + log.debug("auth Packet received payload bytes: " + bytes2hex(payload)); key = subbytes(payload, 0x04, 0x14); - log.debug("auth Packet received key bytes: " + DatatypeConverter.printHexBinary(key)); + log.debug("auth Packet received key bytes: " + bytes2hex(key)); if (key.length % 16 != 0) { log.error("auth Received key len is not a multiple of 16! Aborting"); @@ -434,7 +434,7 @@ public boolean auth(boolean reauth) throws IOException { id = subbytes(payload, 0x00, 0x04); - log.debug("auth Packet received id bytes: " + DatatypeConverter.printHexBinary(id) + " with ID len=" + id.length); + log.debug("auth Packet received id bytes: " + bytes2hex(id) + " with ID len=" + id.length); log.debug("auth End of authentication method"); alreadyAuthorized = true; @@ -530,7 +530,7 @@ public DatagramPacket sendCmdPkt(int timeout, int bufSize, CmdPayload cmdPayload public DatagramPacket sendCmdPkt(InetAddress sourceIpAddr, int sourcePort, int timeout, int bufSize, CmdPayload cmdPayload) throws IOException { CmdPacket cmdPkt = new CmdPacket(mac, pktCount++, id, aes, cmdPayload); - log.debug("sendCmdPkt - Send Command Packet bytes: {}", DatatypeConverter.printHexBinary(cmdPkt.getData())); + log.debug("sendCmdPkt - Send Command Packet bytes: {}", bytes2hex(cmdPkt.getData())); return sendPkt(sock, cmdPkt, InetAddress.getByName(host), 80, timeout, bufSize); } @@ -1041,7 +1041,7 @@ public static DatagramPacket sendPkt(DatagramSocket sock, Packet pkt, InetAddres } } - log.debug("sendPkt - recv data bytes (" + recepack.getData().length +") after initial req: {}", DatatypeConverter.printHexBinary(recepack.getData())); + log.debug("sendPkt - recv data bytes (" + recepack.getData().length +") after initial req: {}", bytes2hex(recepack.getData())); recepack.setData(removeNullsFromEnd(recepack.getData(), 0)); return recepack; } diff --git a/src/main/java/com/github/mob41/blapi/HexUtil.java b/src/main/java/com/github/mob41/blapi/HexUtil.java new file mode 100644 index 0000000..8629929 --- /dev/null +++ b/src/main/java/com/github/mob41/blapi/HexUtil.java @@ -0,0 +1,30 @@ +package com.github.mob41.blapi; + +public class HexUtil { + + private static final char[] hexCode = "0123456789abcdef".toCharArray(); + + public static String bytes2hex(byte[] data) { + StringBuilder r = new StringBuilder(data.length * 2); + byte[] var3 = data; + int var4 = data.length; + + for(int var5 = 0; var5 < var4; ++var5) { + byte b = var3[var5]; + r.append(hexCode[b >> 4 & 15]); + r.append(hexCode[b & 15]); + } + + return r.toString(); + } + public static final byte[] hex2bytes(String s) { + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i+1), 16)); + } + return data; + } + +} \ No newline at end of file diff --git a/src/main/java/com/github/mob41/blapi/MP1Device.java b/src/main/java/com/github/mob41/blapi/MP1Device.java index c7a8143..d0f2c53 100644 --- a/src/main/java/com/github/mob41/blapi/MP1Device.java +++ b/src/main/java/com/github/mob41/blapi/MP1Device.java @@ -32,7 +32,7 @@ import java.io.IOException; import java.net.DatagramPacket; -import javax.xml.bind.DatatypeConverter; +import static com.github.mob41.blapi.HexUtil.bytes2hex; import com.github.mob41.blapi.mac.Mac; import com.github.mob41.blapi.pkt.CmdPayload; @@ -116,7 +116,7 @@ public byte[] getData() { int err = data[0x22] | (data[0x23] << 8); if (err == 0) { - log.debug("MP1 set state mask received encrypted bytes: " + DatatypeConverter.printHexBinary(data)); + log.debug("MP1 set state mask received encrypted bytes: " + bytes2hex(data)); } else { log.warn("MP1 set state mask received returned err: " + Integer.toHexString(err) + " / " + err); } @@ -171,13 +171,13 @@ public byte[] getData() { byte[] data = packet.getData(); - log.debug("MP1 get states raw received encrypted bytes: " + DatatypeConverter.printHexBinary(data)); + log.debug("MP1 get states raw received encrypted bytes: " + bytes2hex(data)); int err = data[0x22] | (data[0x23] << 8); if (err == 0) { byte[] pl = decryptFromDeviceMessage(data); - log.debug("MP1 get states raw received bytes (decrypted): " + DatatypeConverter.printHexBinary(pl)); + log.debug("MP1 get states raw received bytes (decrypted): " + bytes2hex(pl)); byte state = 0; if (pl[0x3c] >= 48 && pl[0x3c] <= 57) { String decodeValue1; diff --git a/src/main/java/com/github/mob41/blapi/RM2Device.java b/src/main/java/com/github/mob41/blapi/RM2Device.java index 301644d..6b3ba1a 100644 --- a/src/main/java/com/github/mob41/blapi/RM2Device.java +++ b/src/main/java/com/github/mob41/blapi/RM2Device.java @@ -31,7 +31,7 @@ import java.io.IOException; import java.net.DatagramPacket; -import javax.xml.bind.DatatypeConverter; +import com.github.mob41.blapi.HexUtil; import com.github.mob41.blapi.mac.Mac; import com.github.mob41.blapi.pkt.cmd.rm2.CheckDataCmdPayload; @@ -88,7 +88,7 @@ public byte[] checkData() throws Exception { int err = data[0x22] | (data[0x23] << 8); - log.debug("RM2 check data received encrypted bytes: " + DatatypeConverter.printHexBinary(data)); + log.debug("RM2 check data received encrypted bytes: " + HexUtil.bytes2hex(data)); if (err == 0) { @@ -115,7 +115,7 @@ public boolean enterLearning() throws IOException { DatagramPacket packet = sendCmdPkt(10000, cmdPayload); byte[] data = packet.getData(); - log.debug("RM2 enter learning received encrypted bytes: " + DatatypeConverter.printHexBinary(data)); + log.debug("RM2 enter learning received encrypted bytes: " + HexUtil.bytes2hex(data)); int err = data[0x22] | (data[0x23] << 8); if (err == 0) { @@ -139,12 +139,12 @@ public double getTemp() throws Exception { DatagramPacket packet = sendCmdPkt(new RMTempCmdPayload()); byte[] data = packet.getData(); - log.debug("RM2 get temp received encrypted bytes: " + DatatypeConverter.printHexBinary(data)); + log.debug("RM2 get temp received encrypted bytes: " + HexUtil.bytes2hex(data)); int err = data[0x22] | (data[0x23] << 8); if (err == 0) { byte[] pl = decryptFromDeviceMessage(data); - log.debug("RM2 get temp received bytes (decrypted): " + DatatypeConverter.printHexBinary(pl)); + log.debug("RM2 get temp received bytes (decrypted): " + HexUtil.bytes2hex(pl)); return (double) (pl[0x4] * 10 + pl[0x5]) / 10.0; } else { diff --git a/src/main/java/com/github/mob41/blapi/SP1Device.java b/src/main/java/com/github/mob41/blapi/SP1Device.java index 6bc2829..056225c 100644 --- a/src/main/java/com/github/mob41/blapi/SP1Device.java +++ b/src/main/java/com/github/mob41/blapi/SP1Device.java @@ -32,7 +32,7 @@ import java.io.IOException; import java.net.DatagramPacket; -import javax.xml.bind.DatatypeConverter; +import static com.github.mob41.blapi.HexUtil.bytes2hex; import com.github.mob41.blapi.mac.Mac; import com.github.mob41.blapi.pkt.CmdPayload; @@ -70,7 +70,7 @@ public byte[] getData() { byte[] data = packet.getData(); - log.debug("SP1 set power received encrypted bytes: " + DatatypeConverter.printHexBinary(data)); + log.debug("SP1 set power received encrypted bytes: " + bytes2hex(data)); int err = data[0x22] | (data[0x23] << 8); diff --git a/src/main/java/com/github/mob41/blapi/SP2Device.java b/src/main/java/com/github/mob41/blapi/SP2Device.java index ba33cc8..dd03390 100644 --- a/src/main/java/com/github/mob41/blapi/SP2Device.java +++ b/src/main/java/com/github/mob41/blapi/SP2Device.java @@ -32,7 +32,7 @@ import java.io.IOException; import java.net.DatagramPacket; -import javax.xml.bind.DatatypeConverter; +import static com.github.mob41.blapi.HexUtil.bytes2hex; import com.github.mob41.blapi.mac.Mac; import com.github.mob41.blapi.pkt.CmdPayload; @@ -75,7 +75,7 @@ public byte[] getData() { byte[] data = packet.getData(); - log.debug("SP2 set state received encrypted bytes: " + DatatypeConverter.printHexBinary(data)); + log.debug("SP2 set state received encrypted bytes: " + bytes2hex(data)); int err = data[0x22] | (data[0x23] << 8); @@ -109,13 +109,13 @@ public byte[] getData() { }); byte[] data = packet.getData(); - log.debug("SP2 get state received encrypted bytes: " + DatatypeConverter.printHexBinary(data)); + log.debug("SP2 get state received encrypted bytes: " + bytes2hex(data)); int err = data[0x22] | (data[0x23] << 8); if (err == 0) { byte[] pl = decryptFromDeviceMessage(data); - log.debug("SP2 get state received bytes (decrypted): " + DatatypeConverter.printHexBinary(pl)); + log.debug("SP2 get state received bytes (decrypted): " + bytes2hex(pl)); return pl[0x4] == 1 ? true : false; } else { log.warn("SP2 get state received an error: " + Integer.toHexString(err) + " / " + err); diff --git a/src/main/java/com/github/mob41/blapi/dev/hysen/BaseHysenDevice.java b/src/main/java/com/github/mob41/blapi/dev/hysen/BaseHysenDevice.java index d8cf639..4f2b631 100644 --- a/src/main/java/com/github/mob41/blapi/dev/hysen/BaseHysenDevice.java +++ b/src/main/java/com/github/mob41/blapi/dev/hysen/BaseHysenDevice.java @@ -31,7 +31,7 @@ import java.io.IOException; -import javax.xml.bind.DatatypeConverter; +import static com.github.mob41.blapi.HexUtil.bytes2hex; import com.github.mob41.blapi.BLDevice; import com.github.mob41.blapi.mac.Mac; @@ -92,7 +92,7 @@ public double getRoomTemp() throws Exception { public BaseStatusInfo getBasicStatus() throws Exception { byte[] pl = new GetBasicInfoCommand().execute(this); if (pl != null) { - log.debug("getBasicStatus - received bytes: {}", DatatypeConverter.printHexBinary(pl)); + log.debug("getBasicStatus - received bytes: {}", bytes2hex(pl)); return new BaseStatusInfo(pl); } return null; @@ -101,7 +101,7 @@ public BaseStatusInfo getBasicStatus() throws Exception { public AdvancedStatusInfo getAdvancedStatus() throws Exception { byte[] pl = new GetStatusCommand().execute(this); if (pl != null) { - log.debug("getAdvancedStatus - received bytes: {}", DatatypeConverter.printHexBinary(pl)); + log.debug("getAdvancedStatus - received bytes: {}", bytes2hex(pl)); return new AdvancedStatusInfo(pl); } return null; diff --git a/src/main/java/com/github/mob41/blapi/pkt/CmdPacket.java b/src/main/java/com/github/mob41/blapi/pkt/CmdPacket.java index 939625f..9033908 100644 --- a/src/main/java/com/github/mob41/blapi/pkt/CmdPacket.java +++ b/src/main/java/com/github/mob41/blapi/pkt/CmdPacket.java @@ -28,8 +28,6 @@ *******************************************************************************/ package com.github.mob41.blapi.pkt; -import javax.xml.bind.DatatypeConverter; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,7 +35,7 @@ import com.github.mob41.blapi.ex.BLApiRuntimeException; import com.github.mob41.blapi.mac.Mac; import com.github.mob41.blapi.pkt.auth.AES; - +import static com.github.mob41.blapi.HexUtil.bytes2hex; /** * This constructs a byte array with the format of a command to the Broadlink * device @@ -133,7 +131,7 @@ public CmdPacket(Mac targetMac, int count, byte[] id, AES aesInstance, CmdPayloa int checksumpayload = 0xbeaf; for (int i = 0; i < payloadPad.length; i++) { - checksumpayload = checksumpayload + Byte.toUnsignedInt(payloadPad[i]); + checksumpayload = checksumpayload + (int)(Byte.valueOf(payloadPad[i]).intValue() & 0xff); checksumpayload = checksumpayload & 0xffff; } @@ -146,7 +144,7 @@ public CmdPacket(Mac targetMac, int count, byte[] id, AES aesInstance, CmdPayloa log.debug("Encrypting payload"); payload = aesInstance.encrypt(payloadPad); - log.debug("Encrypted payload bytes: {}", DatatypeConverter.printHexBinary(payload)); + log.debug("Encrypted payload bytes: {}", bytes2hex(payload)); log.debug("Encrypted. len=" + payload.length); } catch (Exception e) { @@ -168,7 +166,7 @@ public CmdPacket(Mac targetMac, int count, byte[] id, AES aesInstance, CmdPayloa int checksumpkt = 0xbeaf; for (int i = 0; i < data.length; i++) { - checksumpkt = checksumpkt + Byte.toUnsignedInt(data[i]); + checksumpkt = checksumpkt + (int)(Byte.valueOf(data[i]).intValue() & 0xff); checksumpkt = checksumpkt & 0xffff; // log.debug("index: " + i + ", data byte: " + Byte.toUnsignedInt(data[i]) + ", checksum: " + checksumpkt); } diff --git a/src/main/java/com/github/mob41/blapi/pkt/cmd/hysen/BaseHysenCommand.java b/src/main/java/com/github/mob41/blapi/pkt/cmd/hysen/BaseHysenCommand.java index 0273ad0..dca44c2 100644 --- a/src/main/java/com/github/mob41/blapi/pkt/cmd/hysen/BaseHysenCommand.java +++ b/src/main/java/com/github/mob41/blapi/pkt/cmd/hysen/BaseHysenCommand.java @@ -3,7 +3,7 @@ import java.net.DatagramPacket; import java.util.Arrays; -import javax.xml.bind.DatatypeConverter; +import static com.github.mob41.blapi.HexUtil.bytes2hex; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,14 +33,14 @@ public byte[] execute(BaseHysenDevice device) throws Exception { byte[] data = packet.getData(); log.debug(this.getClass().getSimpleName() + " received encrypted bytes: " - + DatatypeConverter.printHexBinary(data)); + + bytes2hex(data)); int err = data[0x22] | (data[0x23] << 8); if (err == 0) { byte[] pl = device.decryptFromDeviceMessage(data); log.debug(this.getClass().getSimpleName() + " received bytes (decrypted): " - + DatatypeConverter.printHexBinary(pl)); + + bytes2hex(pl)); return Arrays.copyOfRange(pl, 2, pl.length); } else { log.warn(this.getClass().getSimpleName() + " received an error: " + Integer.toHexString(err) + " / " + err);