feat(plc4go/bacnetip): WriteBroadcastDistributionTable
diff --git a/plc4go/internal/bacnetip/BACnetVirtualLinkLayerService.go b/plc4go/internal/bacnetip/BACnetVirtualLinkLayerService.go
index a195173..384bfc5 100644
--- a/plc4go/internal/bacnetip/BACnetVirtualLinkLayerService.go
+++ b/plc4go/internal/bacnetip/BACnetVirtualLinkLayerService.go
@@ -329,7 +329,6 @@
 
 	// encode it as a generic BVLL PDU
 	bvlpdu := NewBVLPDU(nil)
-	// TODO: runtime cast might be dangerous
 	if err := rpdu.(interface{ Encode(Arg) error }).Encode(bvlpdu); err != nil {
 		return errors.Wrap(err, "error encoding PDU")
 	}
diff --git a/plc4go/internal/bacnetip/bvll.go b/plc4go/internal/bacnetip/bvll.go
index fd6f23b..2ba8277 100644
--- a/plc4go/internal/bacnetip/bvll.go
+++ b/plc4go/internal/bacnetip/bvll.go
@@ -21,6 +21,7 @@
 
 import (
 	"context"
+	"encoding/binary"
 	"fmt"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
@@ -109,7 +110,6 @@
 	b := &_BVLPDU{
 		bvlc: bvlc,
 	}
-	//b.bvlc = readWriteModel.NewBVLC() // TODO: using this function leads to a npe
 	b._BVLCI = NewBVLCI(bvlc).(*_BVLCI)
 	b._PDUData = newPDUData(b)
 	return b
@@ -282,7 +282,7 @@
 	for _, opt := range opts {
 		opt(b)
 	}
-	b._BVLPDU = NewBVLPDU(nil).(*_BVLPDU)
+	b._BVLPDU = NewBVLPDU(readWriteModel.NewBVLCWriteBroadcastDistributionTable(b.produceBroadcastDistributionTable(), 0)).(*_BVLPDU)
 	return b, nil
 }
 
@@ -296,6 +296,35 @@
 	return w.bvlciBDT
 }
 
+func (w *WriteBroadcastDistributionTable) produceBroadcastDistributionTable() (entries []readWriteModel.BVLCBroadcastDistributionTableEntry) {
+	for _, address := range w.bvlciBDT {
+		addr := address.AddrAddress[:4]
+		port := uint16(47808)
+		if address.AddrPort != nil {
+			port = *address.AddrPort
+		}
+		mask := make([]byte, 4)
+		if address.AddrMask != nil {
+			binary.BigEndian.PutUint32(mask, *address.AddrMask)
+		}
+		entries = append(entries, readWriteModel.NewBVLCBroadcastDistributionTableEntry(addr, port, mask))
+	}
+	return
+}
+
+func (w *WriteBroadcastDistributionTable) produceBvlciBDT(entries []readWriteModel.BVLCBroadcastDistributionTableEntry) (bvlciBDT []*Address) {
+	for _, entry := range entries {
+		addr := entry.GetIp()
+		port := entry.GetPort()
+		var portArray = make([]byte, 2)
+		binary.BigEndian.PutUint16(portArray, port)
+		address, _ := NewAddress(zerolog.Nop(), append(addr, portArray...))
+		mask := binary.BigEndian.Uint32(entry.GetBroadcastDistributionMap())
+		address.AddrMask = &mask
+		bvlciBDT = append(bvlciBDT, address)
+	}
+	return
+}
 func (w *WriteBroadcastDistributionTable) Encode(bvlpdu Arg) error {
 	switch bvlpdu := bvlpdu.(type) {
 	case BVLPDU:
@@ -324,11 +353,7 @@
 			switch bvlc := pduUserData.(type) {
 			case readWriteModel.BVLCWriteBroadcastDistributionTable:
 				w.setBVLC(bvlc)
-				for _, entry := range bvlc.GetTable() {
-					// TODO: what is with port and the map??
-					address, _ := NewAddress(zerolog.Nop(), entry.GetIp())
-					w.bvlciBDT = append(w.bvlciBDT, address)
-				}
+				w.bvlciBDT = w.produceBvlciBDT(bvlc.GetTable())
 			}
 		}
 		return nil
diff --git a/plc4go/internal/bacnetip/tests/state_machine.go b/plc4go/internal/bacnetip/tests/state_machine.go
index c3f702d..dae5d47 100644
--- a/plc4go/internal/bacnetip/tests/state_machine.go
+++ b/plc4go/internal/bacnetip/tests/state_machine.go
@@ -146,9 +146,9 @@
 			if !equal {
 				switch want := want.(type) {
 				case []byte:
-					localLog.Debug().Bytes("got", got).Bytes("want", want).Msg("mismatch")
+					localLog.Debug().Hex("got", got).Hex("want", want).Msg("mismatch")
 				default:
-					localLog.Debug().Bytes("got", got).Interface("want", want).Msg("mismatch")
+					localLog.Debug().Hex("got", got).Interface("want", want).Msg("mismatch")
 				}
 			}
 			return equal
diff --git a/plc4go/internal/bacnetip/tests/test_bvll/test_codec_test.go b/plc4go/internal/bacnetip/tests/test_bvll/test_codec_test.go
index e38f2cb..a3ab26c 100644
--- a/plc4go/internal/bacnetip/tests/test_bvll/test_codec_test.go
+++ b/plc4go/internal/bacnetip/tests/test_bvll/test_codec_test.go
@@ -154,7 +154,6 @@
 }
 
 func (suite *TestAnnexJCodecSuite) TestWriteBroadcastDistributionTable() {
-	suite.T().Skip("something is odd here") // TODO: check what is going on with the output...
 	// write an empty table
 	pduBytes, err := bacnetip.Xtob("81.01.0004")
 	suite.Require().NoError(err)