diff --git a/eebus.go b/eebus.go index 926fb36..80e1b26 100644 --- a/eebus.go +++ b/eebus.go @@ -1,27 +1,27 @@ package go_eebus import ( - "github.com/LMF-DHBW/go-eebus/ressources" + "github.com/LMF-DHBW/go-eebus/resources" "github.com/LMF-DHBW/go-eebus/spine" ) type EebusNode struct { isGateway bool SpineNode *spine.SpineNode - DeviceStructure *ressources.DeviceModel + DeviceStructure *resources.DeviceModel Update Updater } -type Updater func(ressources.DatagramType, spine.SpineConnection) +type Updater func(resources.DatagramType, spine.SpineConnection) func NewEebusNode(hostname string, isGateway bool, certName string, devId string, brand string, devType string) *EebusNode { - deviceModel := &ressources.DeviceModel{} + deviceModel := &resources.DeviceModel{} newEebusNode := &EebusNode{isGateway, nil, deviceModel, nil} newEebusNode.SpineNode = spine.NewSpineNode(hostname, isGateway, deviceModel, newEebusNode.SubscriptionNofity, certName, devId, brand, devType) return newEebusNode } -func (eebusNode *EebusNode) SubscriptionNofity(datagram ressources.DatagramType, conn spine.SpineConnection) { +func (eebusNode *EebusNode) SubscriptionNofity(datagram resources.DatagramType, conn spine.SpineConnection) { if eebusNode.Update != nil { eebusNode.Update(datagram, conn) } diff --git a/ressources/actuatorswitch.go b/resources/actuatorswitch.go similarity index 80% rename from ressources/actuatorswitch.go rename to resources/actuatorswitch.go index 7290945..9aa7c66 100644 --- a/ressources/actuatorswitch.go +++ b/resources/actuatorswitch.go @@ -1,4 +1,4 @@ -package ressources +package resources type Notifier func(string, string, FeatureAddressType) @@ -11,7 +11,7 @@ type DescriptionElement struct { Description string `xml:"description"` } -func ActuatorSwitch(role string, label string, description string, ChangeNotify Notifier) []*FunctionModel { +func ActuatorSwitch(label string, description string, ChangeNotify Notifier) []*FunctionModel { return []*FunctionModel{ { FunctionName: "actuatorSwitchData", diff --git a/ressources/bindsubscribe.go b/resources/bindsubscribe.go similarity index 98% rename from ressources/bindsubscribe.go rename to resources/bindsubscribe.go index 874287e..93097f3 100644 --- a/ressources/bindsubscribe.go +++ b/resources/bindsubscribe.go @@ -1,4 +1,4 @@ -package ressources +package resources type NodeManagementBindingData struct { BindingEntries []*BindSubscribeEntry `xml:"bindingEntries"` diff --git a/ressources/datagram.go b/resources/datagram.go similarity index 99% rename from ressources/datagram.go rename to resources/datagram.go index 3760ccf..408fbf7 100644 --- a/ressources/datagram.go +++ b/resources/datagram.go @@ -1,4 +1,4 @@ -package ressources +package resources const SPECIFICATION_VERSION = "1.0.0" diff --git a/ressources/discovery.go b/resources/discovery.go similarity index 99% rename from ressources/discovery.go rename to resources/discovery.go index 66ad8fb..fe84001 100644 --- a/ressources/discovery.go +++ b/resources/discovery.go @@ -1,4 +1,4 @@ -package ressources +package resources type NodeManagementDetailedDiscovery struct { SpecificationVersionList []*NodeManagementSpecificationVersionListType `xml:"specificationVersionList"` diff --git a/ressources/helperfunctions.go b/resources/helperfunctions.go similarity index 99% rename from ressources/helperfunctions.go rename to resources/helperfunctions.go index f8af2ce..d0e7481 100644 --- a/ressources/helperfunctions.go +++ b/resources/helperfunctions.go @@ -1,4 +1,4 @@ -package ressources +package resources import ( "encoding/xml" diff --git a/ressources/measurement.go b/resources/measurement.go similarity index 98% rename from ressources/measurement.go rename to resources/measurement.go index f43c53e..2dabe3a 100644 --- a/ressources/measurement.go +++ b/resources/measurement.go @@ -1,4 +1,4 @@ -package ressources +package resources type TimePeriodType struct { StartTime string `xml:"startTime"` diff --git a/ship/comissioning.go b/ship/comissioning.go index be851aa..70f5075 100644 --- a/ship/comissioning.go +++ b/ship/comissioning.go @@ -11,7 +11,7 @@ import ( "os" "strings" - "github.com/LMF-DHBW/go-eebus/ressources" + "github.com/LMF-DHBW/go-eebus/resources" ) func ReadSkis() ([]string, []string) { @@ -21,7 +21,7 @@ func ReadSkis() ([]string, []string) { } file, err := os.Open("skis.txt") - ressources.CheckError(err) + resources.CheckError(err) defer file.Close() var skis []string @@ -35,13 +35,13 @@ func ReadSkis() ([]string, []string) { devices = append(devices, line[1]) } } - ressources.CheckError(scanner.Err()) + resources.CheckError(scanner.Err()) return skis, devices } func WriteSkis(newSkis []string, newDevices []string) { file, err := os.OpenFile("skis.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) - ressources.CheckError(err) + resources.CheckError(err) defer file.Close() if len(newSkis) == len(newDevices) { result := "" @@ -56,7 +56,7 @@ func WriteSkis(newSkis []string, newDevices []string) { } _, err = file.WriteString(result) - ressources.CheckError(err) + resources.CheckError(err) } } @@ -66,7 +66,7 @@ func (shipNode *ShipNode) getSki() string { var err error file, err = os.ReadFile(shipNode.CertName + ".crt") - ressources.CheckError(err) + resources.CheckError(err) crt := string(file) @@ -76,7 +76,7 @@ func (shipNode *ShipNode) getSki() string { pubkey := cert.PublicKey.(*rsa.PublicKey) publicKey, err := x509.MarshalPKIXPublicKey(pubkey) - ressources.CheckError(err) + resources.CheckError(err) hasher := sha1.New() hasher.Write(publicKey) diff --git a/ship/mdns.go b/ship/mdns.go index b58d388..54aea70 100644 --- a/ship/mdns.go +++ b/ship/mdns.go @@ -6,7 +6,7 @@ import ( "strconv" "time" - "github.com/LMF-DHBW/go-eebus/ressources" + "github.com/LMF-DHBW/go-eebus/resources" "github.com/grandcat/zeroconf" ) @@ -15,7 +15,7 @@ func (shipNode *ShipNode) BrowseDns() { log.Println("Browsing for entries") // Discover all ship services on the network resolver, err := zeroconf.NewResolver(nil) - ressources.CheckError(err) + resources.CheckError(err) entries := make(chan *zeroconf.ServiceEntry) go func(results <-chan *zeroconf.ServiceEntry) { @@ -27,7 +27,7 @@ func (shipNode *ShipNode) BrowseDns() { ctx, _ := context.WithCancel(context.Background()) err = resolver.Browse(ctx, "_ship._tcp", "local.", entries) - ressources.CheckError(err) + resources.CheckError(err) <-ctx.Done() } @@ -40,7 +40,7 @@ func (shipNode *ShipNode) RegisterDns() { txtRecord := []string{"txtvers=1", "id=" + id, "path=wss://" + shipNode.hostname + ":" + port, "SKI=" + shipNode.getSki(), "register=true", "brand=" + shipNode.brand, "type=" + shipNode.devType} log.Println("Registering: ", txtRecord) server, err := zeroconf.Register("Device "+port, "_ship._tcp", "local.", shipNode.serverPort, txtRecord, nil) - ressources.CheckError(err) + resources.CheckError(err) defer server.Shutdown() defer log.Println("Registering stopped") diff --git a/ship/message.go b/ship/message.go index 1f17145..a1f4eda 100644 --- a/ship/message.go +++ b/ship/message.go @@ -6,7 +6,7 @@ import ( "io" "time" - "github.com/LMF-DHBW/go-eebus/ressources" + "github.com/LMF-DHBW/go-eebus/resources" "golang.org/x/net/websocket" ) @@ -30,8 +30,8 @@ type Message struct { } type DataValue struct { - Header HeaderType `xml:"header"` - Payload ressources.DatagramType `xml:"payload"` + Header HeaderType `xml:"header"` + Payload resources.DatagramType `xml:"payload"` } type HeaderType struct { @@ -64,7 +64,7 @@ func (SME *SMEInstance) StartCMI() { } SME.connectionState = "CMI_STATE_SERVER_EVALUATE" Message := CmiMessage{} - ressources.CheckError(json.Unmarshal(msg, &Message)) + resources.CheckError(json.Unmarshal(msg, &Message)) if Message.MessageType != 0 || Message.MessageValue != 0 { defer SME.Connection.Close() } @@ -72,7 +72,7 @@ func (SME *SMEInstance) StartCMI() { MessageType: 0, MessageValue: 0, }) - ressources.CheckError(err) + resources.CheckError(err) websocket.Message.Send(SME.Connection, bytes) } else { SME.connectionState = "CMI_STATE_CLIENT_SEND" @@ -80,7 +80,7 @@ func (SME *SMEInstance) StartCMI() { MessageType: 0, MessageValue: 0, }) - ressources.CheckError(err) + resources.CheckError(err) websocket.Message.Send(SME.Connection, bytes) SME.connectionState = "CMI_STATE_CLIENT_WAIT" msg := SME.RecieveTimeout(CMI_TIMEOUT) @@ -90,7 +90,7 @@ func (SME *SMEInstance) StartCMI() { } SME.connectionState = "CMI_STATE_CLIENT_EVALUATE" Message := CmiMessage{} - ressources.CheckError(json.Unmarshal(msg, &Message)) + resources.CheckError(json.Unmarshal(msg, &Message)) if Message.MessageType != 0 || Message.MessageValue != 0 { SME.Connection.Close() } @@ -129,7 +129,7 @@ func (SME *SMEInstance) Recieve(handleFunc dataHandler) { break } Message := Message{} - ressources.CheckError(xml.Unmarshal(msg, &Message)) + resources.CheckError(xml.Unmarshal(msg, &Message)) if Message.MessageType == 2 { handleFunc(Message.MessageValue.Payload) } @@ -137,7 +137,7 @@ func (SME *SMEInstance) Recieve(handleFunc dataHandler) { } /* Sends messages in json format */ -func (SME *SMEInstance) Send(payload ressources.DatagramType) { +func (SME *SMEInstance) Send(payload resources.DatagramType) { bytes, err := xml.Marshal(Message{ MessageType: 2, MessageValue: DataValue{ @@ -147,6 +147,6 @@ func (SME *SMEInstance) Send(payload ressources.DatagramType) { Payload: payload, }, }) - ressources.CheckError(err) + resources.CheckError(err) websocket.Message.Send(SME.Connection, bytes) } diff --git a/ship/ship.go b/ship/ship.go index b50639c..3f91230 100644 --- a/ship/ship.go +++ b/ship/ship.go @@ -9,7 +9,7 @@ import ( "strconv" "strings" - "github.com/LMF-DHBW/go-eebus/ressources" + "github.com/LMF-DHBW/go-eebus/resources" "github.com/grandcat/zeroconf" "github.com/phayes/freeport" @@ -20,7 +20,7 @@ type ConnectionManager func(string, *websocket.Conn) type ConnectionManagerSpine func(*SMEInstance, string) type CloseHandler func(*SMEInstance) type handler func([]byte) -type dataHandler func(ressources.DatagramType) +type dataHandler func(resources.DatagramType) type ShipNode struct { serverPort int @@ -50,7 +50,7 @@ func NewShipNode(hostname string, IsGateway bool, certName string, devId string, func (shipNode *ShipNode) Start() { // ShipNode start -> assign port, create server port, err := freeport.GetFreePort() - ressources.CheckError(err) + resources.CheckError(err) shipNode.serverPort = port // Start server, Register Dns and search for other DNS entries if !shipNode.IsGateway { @@ -67,7 +67,7 @@ func (shipNode *ShipNode) handleFoundService(entry *zeroconf.ServiceEntry) { log.Println("Found new service", entry.HostName, entry.Port) skis, _ := ReadSkis() - if ressources.StringInSlice(strings.Split(entry.Text[3], "=")[1], skis) { + if resources.StringInSlice(strings.Split(entry.Text[3], "=")[1], skis) { // Device is trusted go shipNode.Connect(strings.Split(entry.Text[2], "=")[1], strings.Split(entry.Text[3], "=")[1]) } else { @@ -91,7 +91,7 @@ func (shipNode *ShipNode) handleFoundService(entry *zeroconf.ServiceEntry) { func (shipNode *ShipNode) newConnection(role string, conn *websocket.Conn, ski string) { skiIsNew := "" skis, _ := ReadSkis() - if !ressources.StringInSlice(ski, skis) && shipNode.IsGateway { + if !resources.StringInSlice(ski, skis) && shipNode.IsGateway { skiIsNew = ski } @@ -112,18 +112,18 @@ func (shipNode *ShipNode) newConnection(role string, conn *websocket.Conn, ski s func (shipNode *ShipNode) Connect(service string, ski string) { conf, err := websocket.NewConfig(service, "http://"+shipNode.hostname) - ressources.CheckError(err) + resources.CheckError(err) var cert tls.Certificate cert, err = tls.LoadX509KeyPair(shipNode.CertName+".crt", shipNode.CertName+".key") - ressources.CheckError(err) + resources.CheckError(err) conf.TlsConfig = &tls.Config{ Certificates: []tls.Certificate{cert}, } conn, err := websocket.DialConfig(conf) - ressources.CheckError(err) + resources.CheckError(err) shipNode.newConnection("client", conn, ski) } @@ -144,5 +144,5 @@ func (shipNode *ShipNode) StartServer() { }), } err := server.ListenAndServeTLS(shipNode.CertName+".crt", shipNode.CertName+".key") - ressources.CheckError(err) + resources.CheckError(err) } diff --git a/spine/binding.go b/spine/binding.go index de00cb3..7c456a6 100644 --- a/spine/binding.go +++ b/spine/binding.go @@ -2,16 +2,16 @@ package spine import ( "encoding/xml" - "github.com/LMF-DHBW/go-eebus/ressources" + "github.com/LMF-DHBW/go-eebus/resources" "log" ) -func (conn *SpineConnection) sendBindingRequest(EntityAddress int, FeatureAddress int, DestinationAddr *ressources.FeatureAddressType, FeatureType string) { - clientAddr := ressources.MakeFeatureAddress(conn.OwnDevice.DeviceAddress, EntityAddress, FeatureAddress) +func (conn *SpineConnection) sendBindingRequest(EntityAddress int, FeatureAddress int, DestinationAddr *resources.FeatureAddressType, FeatureType string) { + clientAddr := resources.MakeFeatureAddress(conn.OwnDevice.DeviceAddress, EntityAddress, FeatureAddress) conn.SendXML( conn.OwnDevice.MakeHeader(EntityAddress, FeatureAddress, DestinationAddr, "call", conn.MsgCounter, true), - ressources.MakePayload("nodeManagementBindingRequestCall", &ressources.NodeManagementBindingRequestCall{ - &ressources.BindingManagementRequestCallType{ + resources.MakePayload("nodeManagementBindingRequestCall", &resources.NodeManagementBindingRequestCall{ + &resources.BindingManagementRequestCallType{ ClientAddress: clientAddr, ServerAddress: DestinationAddr, ServerFeatureType: FeatureType, @@ -19,13 +19,13 @@ func (conn *SpineConnection) sendBindingRequest(EntityAddress int, FeatureAddres })) answer, ok := conn.RecieveTimeout(10) if ok { - var Function *ressources.ResultElement + var Function *resources.ResultElement err := xml.Unmarshal([]byte(answer.Payload.Cmd.Function), &Function) if err == nil { if Function.ErrorNumber == 0 { log.Println("Binding to: ", DestinationAddr.Device) - newEntry := &ressources.BindSubscribeEntry{ + newEntry := &resources.BindSubscribeEntry{ ClientAddress: *clientAddr, ServerAddress: *DestinationAddr, } @@ -38,8 +38,8 @@ func (conn *SpineConnection) sendBindingRequest(EntityAddress int, FeatureAddres } } -func (conn *SpineConnection) processBindingRequest(datagram *ressources.DatagramType) { - var Function *ressources.NodeManagementBindingRequestCall +func (conn *SpineConnection) processBindingRequest(datagram *resources.DatagramType) { + var Function *resources.NodeManagementBindingRequestCall err := xml.Unmarshal([]byte(datagram.Payload.Cmd.Function), &Function) entitiyAddr := Function.BindingRequest.ServerAddress.Entity @@ -51,7 +51,7 @@ func (conn *SpineConnection) processBindingRequest(datagram *ressources.Datagram if err == nil && isValidRequest && conn.OwnDevice.Entities[entitiyAddr].Features[featureAddr].MaxBindings > numBindings { log.Println("Binding to: ", Function.BindingRequest.ClientAddress.Device) - newEntry := &ressources.BindSubscribeEntry{ + newEntry := &resources.BindSubscribeEntry{ ClientAddress: *Function.BindingRequest.ClientAddress, ServerAddress: *Function.BindingRequest.ServerAddress, } @@ -62,11 +62,11 @@ func (conn *SpineConnection) processBindingRequest(datagram *ressources.Datagram serverAddr := Function.BindingRequest.ServerAddress conn.SendXML( conn.OwnDevice.MakeHeader(serverAddr.Entity, serverAddr.Feature, Function.BindingRequest.ClientAddress, "result", conn.MsgCounter, false), - ressources.MakePayload("resultData", ressources.ResultData(0, "positive ackknowledgement for binding request"))) + resources.MakePayload("resultData", resources.ResultData(0, "positive ackknowledgement for binding request"))) } else { ownAddr := datagram.Header.AddressDestination conn.SendXML( conn.OwnDevice.MakeHeader(ownAddr.Entity, ownAddr.Feature, datagram.Header.AddressSource, "result", conn.MsgCounter, false), - ressources.MakePayload("resultData", ressources.ResultData(1, "negative ackknowledgement for binding request"))) + resources.MakePayload("resultData", resources.ResultData(1, "negative ackknowledgement for binding request"))) } } diff --git a/spine/connection.go b/spine/connection.go index 1ea8cf9..13087d9 100644 --- a/spine/connection.go +++ b/spine/connection.go @@ -6,51 +6,51 @@ import ( "strings" "time" - "github.com/LMF-DHBW/go-eebus/ressources" + "github.com/LMF-DHBW/go-eebus/resources" "github.com/LMF-DHBW/go-eebus/ship" ) -type Notifier func(ressources.DatagramType, SpineConnection) -type BindSubscribeNotify func(string, *SpineConnection, *ressources.BindSubscribeEntry) +type Notifier func(resources.DatagramType, SpineConnection) +type BindSubscribeNotify func(string, *SpineConnection, *resources.BindSubscribeEntry) type SpineConnection struct { SME *ship.SMEInstance Address string MsgCounter int - OwnDevice *ressources.DeviceModel - recieveChan chan ressources.DatagramType - DiscoveryInformation *ressources.NodeManagementDetailedDiscovery + OwnDevice *resources.DeviceModel + recieveChan chan resources.DatagramType + DiscoveryInformation *resources.NodeManagementDetailedDiscovery bindSubscribeNotify BindSubscribeNotify bindSubscribeInfo []*BindSubscribeInfo SubscriptionNofity Notifier - Features []*Feature + SubscriptionData []*SubscriptionData } -type Feature struct { +type SubscriptionData struct { EntityType string FeatureType string - FeatureAddress ressources.FeatureAddressType + FeatureAddress resources.FeatureAddressType FunctionName string CurrentState string } type BindSubscribeInfo struct { BindSubscribe string - BindSubscribeEntry *ressources.BindSubscribeEntry + BindSubscribeEntry *resources.BindSubscribeEntry } -func NewSpineConnection(SME *ship.SMEInstance, ownDevice *ressources.DeviceModel, bindSubscribeNotify BindSubscribeNotify, SubscriptionNofity Notifier) *SpineConnection { - return &SpineConnection{SME, "", 0, ownDevice, make(chan ressources.DatagramType), nil, bindSubscribeNotify, nil, SubscriptionNofity, make([]*Feature, 0)} +func NewSpineConnection(SME *ship.SMEInstance, ownDevice *resources.DeviceModel, bindSubscribeNotify BindSubscribeNotify, SubscriptionNofity Notifier) *SpineConnection { + return &SpineConnection{SME, "", 0, ownDevice, make(chan resources.DatagramType), nil, bindSubscribeNotify, nil, SubscriptionNofity, make([]*SubscriptionData, 0)} } -func (conn *SpineConnection) SendXML(header *ressources.HeaderType, payload *ressources.PayloadType) { +func (conn *SpineConnection) SendXML(header *resources.HeaderType, payload *resources.PayloadType) { conn.MsgCounter++ - conn.SME.Send(ressources.DatagramType{header, payload}) + conn.SME.Send(resources.DatagramType{header, payload}) } func (conn *SpineConnection) StartRecieveHandler() { log.Println("Recieving") - conn.SME.Recieve(func(datagram ressources.DatagramType) { + conn.SME.Recieve(func(datagram resources.DatagramType) { entitiyAddr := datagram.Header.AddressDestination.Entity featureAddr := datagram.Header.AddressDestination.Feature deviceSource := datagram.Header.AddressSource.Device @@ -58,10 +58,10 @@ func (conn *SpineConnection) StartRecieveHandler() { featureSource := datagram.Header.AddressSource.Feature isValidRequest := len(conn.OwnDevice.Entities) > entitiyAddr && len(conn.OwnDevice.Entities[entitiyAddr].Features) > featureAddr if isValidRequest { - conn.MsgCounter = ressources.Max(conn.MsgCounter, datagram.Header.MsgCounter) + conn.MsgCounter = resources.Max(conn.MsgCounter, datagram.Header.MsgCounter) feature := conn.OwnDevice.Entities[entitiyAddr].Features[featureAddr] - var function *ressources.FunctionModel + var function *resources.FunctionModel for _, v := range feature.Functions { if v.FunctionName == datagram.Payload.Cmd.FunctionName { function = v @@ -74,8 +74,8 @@ func (conn *SpineConnection) StartRecieveHandler() { case "read": if conn.requestAllowed("binding", datagram.Header) { conn.SendXML( - conn.OwnDevice.MakeHeader(entitiyAddr, featureAddr, ressources.MakeFeatureAddress(deviceSource, entitiySource, featureSource), "result", conn.MsgCounter, false), - ressources.MakePayload(function.FunctionName, function.Function)) + conn.OwnDevice.MakeHeader(entitiyAddr, featureAddr, resources.MakeFeatureAddress(deviceSource, entitiySource, featureSource), "result", conn.MsgCounter, false), + resources.MakePayload(function.FunctionName, function.Function)) } case "write": if conn.requestAllowed("binding", datagram.Header) { @@ -85,14 +85,14 @@ func (conn *SpineConnection) StartRecieveHandler() { if conn.requestAllowed("subscription", datagram.Header) { if len(conn.DiscoveryInformation.FeatureInformation) > featureSource && len(conn.DiscoveryInformation.EntityInformation) > entitiySource { featureInList := false - for i := range conn.Features { - if conn.Features[i].FeatureAddress == *datagram.Header.AddressSource && conn.Features[i].FunctionName == datagram.Payload.Cmd.FunctionName { + for i := range conn.SubscriptionData { + if conn.SubscriptionData[i].FeatureAddress == *datagram.Header.AddressSource && conn.SubscriptionData[i].FunctionName == datagram.Payload.Cmd.FunctionName { featureInList = true break } } if !featureInList { - conn.Features = append(conn.Features, &Feature{ + conn.SubscriptionData = append(conn.SubscriptionData, &SubscriptionData{ EntityType: conn.DiscoveryInformation.EntityInformation[entitiySource].Description.EntityType, FeatureType: conn.DiscoveryInformation.FeatureInformation[featureSource].Description.FeatureType, FeatureAddress: *datagram.Header.AddressSource, @@ -100,9 +100,9 @@ func (conn *SpineConnection) StartRecieveHandler() { CurrentState: datagram.Payload.Cmd.Function, }) } else { - for i := range conn.Features { - if conn.Features[i].FeatureAddress == *datagram.Header.AddressSource && conn.Features[i].FunctionName == datagram.Payload.Cmd.FunctionName { - conn.Features[i].CurrentState = datagram.Payload.Cmd.Function + for i := range conn.SubscriptionData { + if conn.SubscriptionData[i].FeatureAddress == *datagram.Header.AddressSource && conn.SubscriptionData[i].FunctionName == datagram.Payload.Cmd.FunctionName { + conn.SubscriptionData[i].CurrentState = datagram.Payload.Cmd.Function break } } @@ -121,7 +121,7 @@ func (conn *SpineConnection) StartRecieveHandler() { if datagram.Payload.Cmd.FunctionName == "saveSkis" { log.Println("Saving new SKIs") - var Function *ressources.ComissioningNewSkis + var Function *resources.ComissioningNewSkis err := xml.Unmarshal([]byte(datagram.Payload.Cmd.Function), &Function) if err == nil { ship.WriteSkis(strings.Split(Function.Skis, ";"), strings.Split(Function.Devices, ";")) @@ -133,7 +133,7 @@ func (conn *SpineConnection) StartRecieveHandler() { }) } -func (conn *SpineConnection) requestAllowed(bindSubscribe string, header *ressources.HeaderType) bool { +func (conn *SpineConnection) requestAllowed(bindSubscribe string, header *resources.HeaderType) bool { entitiyAddr := header.AddressDestination.Entity featureAddr := header.AddressDestination.Feature entitiySource := header.AddressSource.Entity @@ -151,8 +151,8 @@ func (conn *SpineConnection) requestAllowed(bindSubscribe string, header *ressou return false } -func (conn *SpineConnection) RecieveTimeout(seconds int) (ressources.DatagramType, bool) { - var res ressources.DatagramType +func (conn *SpineConnection) RecieveTimeout(seconds int) (resources.DatagramType, bool) { + var res resources.DatagramType err := false select { case res = <-conn.recieveChan: @@ -163,7 +163,7 @@ func (conn *SpineConnection) RecieveTimeout(seconds int) (ressources.DatagramTyp return res, err } -func (conn *SpineConnection) CountBindings(serverAddr ressources.FeatureAddressType) int { +func (conn *SpineConnection) CountBindings(serverAddr resources.FeatureAddressType) int { numBindings := 0 for _, bindSub := range conn.bindSubscribeInfo { if bindSub.BindSubscribe == "binding" && bindSub.BindSubscribeEntry.ServerAddress == serverAddr { @@ -173,7 +173,7 @@ func (conn *SpineConnection) CountBindings(serverAddr ressources.FeatureAddressT return numBindings } -func (conn *SpineConnection) CountSubscriptions(serverAddr ressources.FeatureAddressType) int { +func (conn *SpineConnection) CountSubscriptions(serverAddr resources.FeatureAddressType) int { numSubscriptions := 0 for _, bindSub := range conn.bindSubscribeInfo { if bindSub.BindSubscribe == "subscription" && bindSub.BindSubscribeEntry.ServerAddress == serverAddr { diff --git a/spine/discovery.go b/spine/discovery.go index c154276..46b7cbe 100644 --- a/spine/discovery.go +++ b/spine/discovery.go @@ -4,16 +4,16 @@ import ( "encoding/xml" "log" - "github.com/LMF-DHBW/go-eebus/ressources" + "github.com/LMF-DHBW/go-eebus/resources" ) func (conn *SpineConnection) StartDetailedDiscovery() { funct := conn.OwnDevice.Entities[0].Features[0].Functions[0].Function - conn.SendXML(conn.OwnDevice.MakeHeader(0, 0, ressources.MakeFeatureAddress("", 0, 0), "read", conn.MsgCounter, false), ressources.MakePayload("nodeManagementDetailedDiscoveryData", funct)) + conn.SendXML(conn.OwnDevice.MakeHeader(0, 0, resources.MakeFeatureAddress("", 0, 0), "read", conn.MsgCounter, false), resources.MakePayload("nodeManagementDetailedDiscoveryData", funct)) answer, ok := conn.RecieveTimeout(10) if ok { conn.Address = answer.Header.AddressSource.Device - var Function *ressources.NodeManagementDetailedDiscovery + var Function *resources.NodeManagementDetailedDiscovery err := xml.Unmarshal([]byte(answer.Payload.Cmd.Function), &Function) if err == nil { log.Println("Discovery finished") @@ -26,7 +26,7 @@ func (conn *SpineConnection) StartDetailedDiscovery() { destEntity := FeatureInformation.Description.FeatureAddress.Entity destFeature := FeatureInformation.Description.FeatureAddress.Feature - ownAddr := ressources.FeatureAddressType{ + ownAddr := resources.FeatureAddressType{ conn.OwnDevice.DeviceAddress, Entity.EntityAddress, Feature.FeatureAddress, @@ -36,20 +36,20 @@ func (conn *SpineConnection) StartDetailedDiscovery() { numSubscriptions := conn.CountSubscriptions(ownAddr) if Feature.BindingTo != nil && - ressources.StringInSlice(FeatureInformation.Description.FeatureType, Feature.BindingTo) && + resources.StringInSlice(FeatureInformation.Description.FeatureType, Feature.BindingTo) && (FeatureInformation.Description.Role == "server" || FeatureInformation.Description.Role == "special") && conn.OwnDevice.Entities[Entity.EntityAddress].Features[Feature.FeatureAddress].MaxBindings > numBindings { conn.sendBindingRequest(Entity.EntityAddress, Feature.FeatureAddress, - ressources.MakeFeatureAddress(destDevice, destEntity, destFeature), + resources.MakeFeatureAddress(destDevice, destEntity, destFeature), FeatureInformation.Description.FeatureType) } if Feature.SubscriptionTo != nil && - ressources.StringInSlice(FeatureInformation.Description.FeatureType, Feature.SubscriptionTo) && + resources.StringInSlice(FeatureInformation.Description.FeatureType, Feature.SubscriptionTo) && (FeatureInformation.Description.Role == "server" || FeatureInformation.Description.Role == "special") && conn.OwnDevice.Entities[Entity.EntityAddress].Features[Feature.FeatureAddress].MaxSubscriptions > numSubscriptions { conn.sendSubscriptionRequest(Entity.EntityAddress, Feature.FeatureAddress, - ressources.MakeFeatureAddress(destDevice, destEntity, destFeature), + resources.MakeFeatureAddress(destDevice, destEntity, destFeature), FeatureInformation.Description.FeatureType) } } diff --git a/spine/spine.go b/spine/spine.go index de341b6..603d63e 100644 --- a/spine/spine.go +++ b/spine/spine.go @@ -5,14 +5,14 @@ import ( "strings" "time" - "github.com/LMF-DHBW/go-eebus/ressources" + "github.com/LMF-DHBW/go-eebus/resources" "github.com/LMF-DHBW/go-eebus/ship" ) type SpineNode struct { ShipNode *ship.ShipNode Connections []*SpineConnection - DeviceStructure *ressources.DeviceModel + DeviceStructure *resources.DeviceModel Bindings []*BindSubscribe Subscriptions []*BindSubscribe SubscriptionNofity Notifier @@ -20,10 +20,20 @@ type SpineNode struct { type BindSubscribe struct { Conn *SpineConnection - BindSubscribeEntry *ressources.BindSubscribeEntry + BindSubscribeEntry *resources.BindSubscribeEntry } -func NewSpineNode(hostname string, isGateway bool, deviceModel *ressources.DeviceModel, SubscriptionNofity Notifier, certName string, devId string, brand string, devType string) *SpineNode { +func (bindSubscribe BindSubscribe) Send(payload *resources.PayloadType) { + srv := bindSubscribe.BindSubscribeEntry.ServerAddress + clt := bindSubscribe.BindSubscribeEntry.ClientAddress + bindSubscribe.Conn.SendXML( + bindSubscribe.Conn.OwnDevice.MakeHeader(srv.Entity, srv.Feature, + resources.MakeFeatureAddress(clt.Device, clt.Entity, clt.Feature), + "notify", bindSubscribe.Conn.MsgCounter, false), + payload) +} + +func NewSpineNode(hostname string, isGateway bool, deviceModel *resources.DeviceModel, SubscriptionNofity Notifier, certName string, devId string, brand string, devType string) *SpineNode { return &SpineNode{ship.NewShipNode(hostname, isGateway, certName, devId, brand, devType), make([]*SpineConnection, 0), deviceModel, make([]*BindSubscribe, 0), make([]*BindSubscribe, 0), SubscriptionNofity} } @@ -45,7 +55,7 @@ func (spineNode *SpineNode) newConnection(SME *ship.SMEInstance, newSki string) time.Sleep(time.Second / 10) skis, devices := ship.ReadSkis() - newSpineConnection.SendXML(newSpineConnection.OwnDevice.MakeHeader(0, 0, ressources.MakeFeatureAddress("", 0, 0), "comissioning", newSpineConnection.MsgCounter, false), ressources.MakePayload("saveSkis", &ressources.ComissioningNewSkis{ + newSpineConnection.SendXML(newSpineConnection.OwnDevice.MakeHeader(0, 0, resources.MakeFeatureAddress("", 0, 0), "comissioning", newSpineConnection.MsgCounter, false), resources.MakePayload("saveSkis", &resources.ComissioningNewSkis{ Skis: strings.Join(skis, ";"), Devices: strings.Join(devices, ";"), })) @@ -56,7 +66,7 @@ func (spineNode *SpineNode) newConnection(SME *ship.SMEInstance, newSki string) skis, devices := ship.ReadSkis() log.Println("Sending new SKIs") for _, conn := range spineNode.Connections { - conn.SendXML(conn.OwnDevice.MakeHeader(0, 0, ressources.MakeFeatureAddress("", 0, 0), "comissioning", conn.MsgCounter, false), ressources.MakePayload("saveSkis", &ressources.ComissioningNewSkis{ + conn.SendXML(conn.OwnDevice.MakeHeader(0, 0, resources.MakeFeatureAddress("", 0, 0), "comissioning", conn.MsgCounter, false), resources.MakePayload("saveSkis", &resources.ComissioningNewSkis{ Skis: strings.Join(skis, ";"), Devices: strings.Join(devices, ";"), })) @@ -71,14 +81,14 @@ func (spineNode *SpineNode) newConnection(SME *ship.SMEInstance, newSki string) newSpineConnection.StartRecieveHandler() } -func (spineNode *SpineNode) newBindSubscribe(bindSubscribe string, conn *SpineConnection, entry *ressources.BindSubscribeEntry) { +func (spineNode *SpineNode) newBindSubscribe(bindSubscribe string, conn *SpineConnection, entry *resources.BindSubscribeEntry) { if bindSubscribe == "binding" { log.Println("added binding") spineNode.Bindings = append(spineNode.Bindings, &BindSubscribe{ conn, entry, }) // Add to binding list for bind information - ownBindings := spineNode.DeviceStructure.Entities[0].Features[0].Functions[1].Function.(*ressources.NodeManagementBindingData) + ownBindings := spineNode.DeviceStructure.Entities[0].Features[0].Functions[1].Function.(*resources.NodeManagementBindingData) ownBindings.BindingEntries = append(ownBindings.BindingEntries, entry) spineNode.DeviceStructure.Entities[0].Features[0].Functions[1].Function = ownBindings @@ -87,7 +97,7 @@ func (spineNode *SpineNode) newBindSubscribe(bindSubscribe string, conn *SpineCo conn, entry, }) // Add to subscription list for subscription information - ownSubscriptions := spineNode.DeviceStructure.Entities[0].Features[0].Functions[2].Function.(*ressources.NodeManagementSubscriptionData) + ownSubscriptions := spineNode.DeviceStructure.Entities[0].Features[0].Functions[2].Function.(*resources.NodeManagementSubscriptionData) ownSubscriptions.SubscriptionEntries = append(ownSubscriptions.SubscriptionEntries, entry) spineNode.DeviceStructure.Entities[0].Features[0].Functions[2].Function = ownSubscriptions } @@ -98,11 +108,11 @@ func (spineNode *SpineNode) newBindSubscribe(bindSubscribe string, conn *SpineCo // Only send to right partners if e.BindSubscribeEntry.ServerAddress.Feature == 0 && e.BindSubscribeEntry.ServerAddress.Entity == 0 { e.Conn.SendXML( - e.Conn.OwnDevice.MakeHeader(0, 0, ressources.MakeFeatureAddress(e.BindSubscribeEntry.ClientAddress.Device, e.BindSubscribeEntry.ClientAddress.Entity, e.BindSubscribeEntry.ClientAddress.Feature), "notify", e.Conn.MsgCounter, false), - ressources.MakePayload("nodeManagementBindingData", spineNode.DeviceStructure.Entities[0].Features[0].Functions[1].Function)) + e.Conn.OwnDevice.MakeHeader(0, 0, resources.MakeFeatureAddress(e.BindSubscribeEntry.ClientAddress.Device, e.BindSubscribeEntry.ClientAddress.Entity, e.BindSubscribeEntry.ClientAddress.Feature), "notify", e.Conn.MsgCounter, false), + resources.MakePayload("nodeManagementBindingData", spineNode.DeviceStructure.Entities[0].Features[0].Functions[1].Function)) e.Conn.SendXML( - e.Conn.OwnDevice.MakeHeader(0, 0, ressources.MakeFeatureAddress(e.BindSubscribeEntry.ClientAddress.Device, e.BindSubscribeEntry.ClientAddress.Entity, e.BindSubscribeEntry.ClientAddress.Feature), "notify", e.Conn.MsgCounter, false), - ressources.MakePayload("nodeManagementSubscriptionData", spineNode.DeviceStructure.Entities[0].Features[0].Functions[2].Function)) + e.Conn.OwnDevice.MakeHeader(0, 0, resources.MakeFeatureAddress(e.BindSubscribeEntry.ClientAddress.Device, e.BindSubscribeEntry.ClientAddress.Entity, e.BindSubscribeEntry.ClientAddress.Feature), "notify", e.Conn.MsgCounter, false), + resources.MakePayload("nodeManagementSubscriptionData", spineNode.DeviceStructure.Entities[0].Features[0].Functions[2].Function)) } } } @@ -116,6 +126,9 @@ func (spineNode *SpineNode) closeHandler(SME *ship.SMEInstance) { spineNode.ShipNode.SME[i] = spineNode.ShipNode.SME[len(spineNode.ShipNode.SME)-1] spineNode.ShipNode.SME = spineNode.ShipNode.SME[:len(spineNode.ShipNode.SME)-1] + + spineNode.ShipNode.Requests[i] = spineNode.ShipNode.Requests[len(spineNode.ShipNode.Requests)-1] + spineNode.ShipNode.Requests = spineNode.ShipNode.Requests[:len(spineNode.ShipNode.Requests)-1] log.Println("Connection closed!") break } diff --git a/spine/subscription.go b/spine/subscription.go index 771a93a..83217c0 100644 --- a/spine/subscription.go +++ b/spine/subscription.go @@ -2,16 +2,16 @@ package spine import ( "encoding/xml" - "github.com/LMF-DHBW/go-eebus/ressources" + "github.com/LMF-DHBW/go-eebus/resources" "log" ) -func (conn *SpineConnection) sendSubscriptionRequest(EntityAddress int, FeatureAddress int, DestinationAddr *ressources.FeatureAddressType, FeatureType string) { - clientAddr := ressources.MakeFeatureAddress(conn.OwnDevice.DeviceAddress, EntityAddress, FeatureAddress) +func (conn *SpineConnection) sendSubscriptionRequest(EntityAddress int, FeatureAddress int, DestinationAddr *resources.FeatureAddressType, FeatureType string) { + clientAddr := resources.MakeFeatureAddress(conn.OwnDevice.DeviceAddress, EntityAddress, FeatureAddress) conn.SendXML( conn.OwnDevice.MakeHeader(EntityAddress, FeatureAddress, DestinationAddr, "call", conn.MsgCounter, true), - ressources.MakePayload("nodeManagementSubscriptionRequestCall", &ressources.NodeManagementSubscriptionRequestCall{ - &ressources.SubscriptionManagementRequestCallType{ + resources.MakePayload("nodeManagementSubscriptionRequestCall", &resources.NodeManagementSubscriptionRequestCall{ + &resources.SubscriptionManagementRequestCallType{ ClientAddress: clientAddr, ServerAddress: DestinationAddr, ServerFeatureType: FeatureType, @@ -19,13 +19,13 @@ func (conn *SpineConnection) sendSubscriptionRequest(EntityAddress int, FeatureA })) answer, ok := conn.RecieveTimeout(10) if ok { - var Function *ressources.ResultElement + var Function *resources.ResultElement err := xml.Unmarshal([]byte(answer.Payload.Cmd.Function), &Function) if err == nil { if Function.ErrorNumber == 0 { log.Println("Accepted subscription to: ", DestinationAddr.Device) - newEntry := &ressources.BindSubscribeEntry{ + newEntry := &resources.BindSubscribeEntry{ ClientAddress: *clientAddr, ServerAddress: *DestinationAddr, } @@ -39,8 +39,8 @@ func (conn *SpineConnection) sendSubscriptionRequest(EntityAddress int, FeatureA } } -func (conn *SpineConnection) processSubscriptionRequest(datagram *ressources.DatagramType) { - var Function *ressources.NodeManagementSubscriptionRequestCall +func (conn *SpineConnection) processSubscriptionRequest(datagram *resources.DatagramType) { + var Function *resources.NodeManagementSubscriptionRequestCall err := xml.Unmarshal([]byte(datagram.Payload.Cmd.Function), &Function) entitiyAddr := Function.SubscriptionRequest.ServerAddress.Entity @@ -52,7 +52,7 @@ func (conn *SpineConnection) processSubscriptionRequest(datagram *ressources.Dat if err == nil && isValidRequest && conn.OwnDevice.Entities[entitiyAddr].Features[featureAddr].MaxSubscriptions > numSubscriptions { log.Println("Accept subscription from: ", Function.SubscriptionRequest.ClientAddress.Device) - newEntry := &ressources.BindSubscribeEntry{ + newEntry := &resources.BindSubscribeEntry{ ClientAddress: *Function.SubscriptionRequest.ClientAddress, ServerAddress: *Function.SubscriptionRequest.ServerAddress, } @@ -63,18 +63,18 @@ func (conn *SpineConnection) processSubscriptionRequest(datagram *ressources.Dat serverAddr := Function.SubscriptionRequest.ServerAddress conn.SendXML( conn.OwnDevice.MakeHeader(serverAddr.Entity, serverAddr.Feature, Function.SubscriptionRequest.ClientAddress, "result", conn.MsgCounter, false), - ressources.MakePayload("resultData", ressources.ResultData(0, "positive ackknowledgement for subscription request"))) + resources.MakePayload("resultData", resources.ResultData(0, "positive ackknowledgement for subscription request"))) funct := conn.OwnDevice.Entities[serverAddr.Entity].Features[serverAddr.Feature].Functions[0] conn.SendXML( conn.OwnDevice.MakeHeader(serverAddr.Entity, serverAddr.Feature, Function.SubscriptionRequest.ClientAddress, "notify", conn.MsgCounter, false), - ressources.MakePayload(funct.FunctionName, funct.Function)) + resources.MakePayload(funct.FunctionName, funct.Function)) // Save binding } else { ownAddr := datagram.Header.AddressDestination conn.SendXML( conn.OwnDevice.MakeHeader(ownAddr.Entity, ownAddr.Feature, datagram.Header.AddressSource, "result", conn.MsgCounter, false), - ressources.MakePayload("resultData", ressources.ResultData(1, "negative ackknowledgement for subscription request"))) + resources.MakePayload("resultData", resources.ResultData(1, "negative ackknowledgement for subscription request"))) } }