plc4go: enabled eip driver test
+ fixed several issues in eip
+ fixed wrong defaults for backplane and slot
+ Fixed xml rendering of fields
+ Fixed endianness
+ Fixed ansi encoding
diff --git a/plc4go/cmd/main/drivers/tests/eip_driver_test.go b/plc4go/cmd/main/drivers/tests/eip_driver_test.go
index e28299d..ca2ed1f 100644
--- a/plc4go/cmd/main/drivers/tests/eip_driver_test.go
+++ b/plc4go/cmd/main/drivers/tests/eip_driver_test.go
@@ -27,6 +27,5 @@
)
func TestEIPDriver(t *testing.T) {
- t.Skip("Driver should work, currently there is a issue where the session id comes too late (due to Testframework won't wait)")
testutils.RunDriverTestsuite(t, eip.NewDriver(), "assets/testing/protocols/eip/DriverTestsuite.xml")
}
diff --git a/plc4go/internal/plc4go/eip/Configuration.go b/plc4go/internal/plc4go/eip/Configuration.go
index aadb0e4..bc9620c 100644
--- a/plc4go/internal/plc4go/eip/Configuration.go
+++ b/plc4go/internal/plc4go/eip/Configuration.go
@@ -32,8 +32,8 @@
func ParseFromOptions(options map[string][]string) (Configuration, error) {
configuration := Configuration{
- backplane: 1,
- slot: 1,
+ backplane: 0,
+ slot: 0,
}
if localRackString := getFromOptions(options, "backplane"); localRackString != "" {
atoi, err := strconv.Atoi(localRackString)
diff --git a/plc4go/internal/plc4go/eip/Connection.go b/plc4go/internal/plc4go/eip/Connection.go
index a2514bf..6b0a9d8 100644
--- a/plc4go/internal/plc4go/eip/Connection.go
+++ b/plc4go/internal/plc4go/eip/Connection.go
@@ -93,7 +93,7 @@
result := make(chan plc4go.PlcConnectionCloseResult)
go func() {
log.Debug().Msg("Sending UnregisterSession EIP Packet")
- m.messageCodec.SendRequest(
+ _ = m.messageCodec.SendRequest(
readWriteModel.NewEipDisconnectRequest(m.sessionHandle, 0, make([]byte, 8), 0),
func(message interface{}) bool {
return true
diff --git a/plc4go/internal/plc4go/eip/Field.go b/plc4go/internal/plc4go/eip/Field.go
index 01923c4..3edaf1c 100644
--- a/plc4go/internal/plc4go/eip/Field.go
+++ b/plc4go/internal/plc4go/eip/Field.go
@@ -71,21 +71,27 @@
func (m PlcField) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
log.Trace().Msg("MarshalXML")
- if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "Field"}}); err != nil {
+ if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "EipField"}}); err != nil {
return err
}
if err := e.EncodeElement(m.Tag, xml.StartElement{Name: xml.Name{Local: "node"}}); err != nil {
return err
}
- if err := e.EncodeElement(m.Type, xml.StartElement{Name: xml.Name{Local: "type"}}); err != nil {
- return err
+ if m.Type != 0 {
+ if err := e.EncodeElement(m.Type, xml.StartElement{Name: xml.Name{Local: "type"}}); err != nil {
+ return err
+ }
}
if err := e.EncodeElement(m.ElementNb, xml.StartElement{Name: xml.Name{Local: "elementNb"}}); err != nil {
return err
}
+ // TODO: remove this from the spec
+ if err := e.EncodeElement("java.lang.Object", xml.StartElement{Name: xml.Name{Local: "defaultJavaType"}}); err != nil {
+ return err
+ }
- if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "Field"}}); err != nil {
+ if err := e.EncodeToken(xml.EndElement{Name: xml.Name{Local: "EipField"}}); err != nil {
return err
}
return nil
diff --git a/plc4go/internal/plc4go/eip/MessageCodec.go b/plc4go/internal/plc4go/eip/MessageCodec.go
index 0aab08f..be105e1 100644
--- a/plc4go/internal/plc4go/eip/MessageCodec.go
+++ b/plc4go/internal/plc4go/eip/MessageCodec.go
@@ -48,7 +48,7 @@
// Cast the message to the correct type of struct
eipPacket := model.CastEipPacket(message)
// Serialize the request
- wb := utils.NewWriteBufferByteBased()
+ wb := utils.NewLittleEndianWriteBufferByteBased()
err := eipPacket.Serialize(wb)
if err != nil {
return errors.Wrap(err, "error serializing request")
@@ -74,7 +74,7 @@
return nil, nil
}
//Second byte for the size and then add the header size 24
- packetSize := uint32(((uint16(data[2]) << 8) + uint16(data[3])) + 24)
+ packetSize := uint32(((uint16(data[3]) << 8) + uint16(data[2])) + 24)
if num < packetSize {
log.Debug().Msgf("Not enough bytes. Got: %d Need: %d\n", num, packetSize)
return nil, nil
@@ -85,7 +85,7 @@
// TODO: Possibly clean up ...
return nil, nil
}
- rb := utils.NewReadBufferByteBased(data)
+ rb := utils.NewLittleEndianReadBufferByteBased(data)
eipPacket, err := model.EipPacketParse(rb)
if err != nil {
log.Warn().Err(err).Msg("error parsing")
diff --git a/plc4go/internal/plc4go/eip/Reader.go b/plc4go/internal/plc4go/eip/Reader.go
index d4756c6..a6e1a52 100644
--- a/plc4go/internal/plc4go/eip/Reader.go
+++ b/plc4go/internal/plc4go/eip/Reader.go
@@ -20,7 +20,6 @@
package eip
import (
- "encoding/ascii85"
readWriteModel "github.com/apache/plc4x/plc4go/internal/plc4go/eip/readwrite/model"
"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
plc4goModel "github.com/apache/plc4x/plc4go/internal/plc4go/spi/model"
@@ -330,20 +329,8 @@
return nil, err
}
- tagBytes := make([]byte, ascii85.MaxEncodedLen(len([]byte(tagFinal))))
- encodedBytes := ascii85.Encode(tagBytes, []byte(tagFinal))
- tagBytes = tagBytes[:encodedBytes]
-
- err = buffer.WriteByteArray("", tagBytes)
- if err != nil {
- return nil, err
- }
-
- err = buffer.WriteByte("", 0x00)
- if err != nil {
- return nil, err
- }
- err = buffer.WriteByte("", 0x00)
+ quoteToASCII := strconv.QuoteToASCII(tagFinal)
+ err = buffer.WriteByteArray("", []byte(quoteToASCII)[1:len(quoteToASCII)-1])
if err != nil {
return nil, err
}
diff --git a/plc4go/internal/plc4go/eip/Writer.go b/plc4go/internal/plc4go/eip/Writer.go
index e1655fc..6e6a61b 100644
--- a/plc4go/internal/plc4go/eip/Writer.go
+++ b/plc4go/internal/plc4go/eip/Writer.go
@@ -278,7 +278,7 @@
}
func encodeValue(value values.PlcValue, _type readWriteModel.CIPDataTypeCode, elements uint16) ([]int8, error) {
- buffer := utils.NewWriteBufferByteBased()
+ buffer := utils.NewLittleEndianWriteBufferByteBased()
switch _type {
case readWriteModel.CIPDataTypeCode_SINT:
err := buffer.WriteByte("", value.GetUint8())
diff --git a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
index 158505f..7181e21 100644
--- a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
+++ b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
@@ -291,25 +291,25 @@
case "modbus":
expectation := expectedSerializable.(*modbusModel.ModbusTcpADU)
actual, err := modbusModel.ModbusTcpADUParse(utils.NewReadBufferByteBased(actualRawOutput), false)
- log.Error().Err(err).Msgf("A readabled render of expectation:\n%v\nvs actual paket\n%v\n", expectation, actual)
+ log.Error().Err(err).Msgf("A readable render of expectation:\n%v\nvs actual paket\n%v\n", expectation, actual)
case "ads":
expectation := expectedSerializable.(*adsModel.AmsTCPPacket)
actual, err := adsModel.AmsTCPPacketParse(utils.NewLittleEndianReadBufferByteBased(actualRawOutput))
- log.Error().Err(err).Msgf("A readabled render of expectation:\n%v\nvs actual paket\n%v\n", expectation, actual)
+ log.Error().Err(err).Msgf("A readable render of expectation:\n%v\nvs actual paket\n%v\n", expectation, actual)
case "eip":
expectation := expectedSerializable.(*eipModel.EipPacket)
actual, err := eipModel.EipPacketParse(utils.NewLittleEndianReadBufferByteBased(actualRawOutput))
- log.Error().Err(err).Msgf("A readabled render of expectation:\n%v\nvs actual paket\n%v\n", expectation, actual)
+ log.Error().Err(err).Msgf("A readable render of expectation:\n%v\nvs actual paket\n%v\n", expectation, actual)
case "s7":
expectation := expectedSerializable.(*s7Model.TPKTPacket)
actual, err := s7Model.TPKTPacketParse(utils.NewReadBufferByteBased(actualRawOutput))
- log.Error().Err(err).Msgf("A readabled render of expectation:\n%v\nvs actual paket\n%v\n", expectation, actual)
+ log.Error().Err(err).Msgf("A readable render of expectation:\n%v\nvs actual paket\n%v\n", expectation, actual)
case "knx":
expectation := expectedSerializable.(*knxModel.KnxNetIpMessage)
actual, err := knxModel.KnxNetIpMessageParse(utils.NewReadBufferByteBased(actualRawOutput))
- log.Error().Err(err).Msgf("A readabled render of expectation:\n%v\nvs actual paket\n%v\n", expectation, actual)
+ log.Error().Err(err).Msgf("A readable render of expectation:\n%v\nvs actual paket\n%v\n", expectation, actual)
}
- return errors.Errorf("actual output doesn't match expected output:\nactual: 0x%X\nexpected: 0x%X", actualRawOutput, expectedRawOutput)
+ return errors.Errorf("actual output doesn't match expected output:\nactual:\n%s\nexpected:\n%s", utils.Dump(actualRawOutput), utils.Dump(expectedRawOutput))
}
}
// If there's a difference, parse the input and display it to simplify debugging