Ankündigung

Einklappen
Keine Ankündigung bisher.

KNX Telegramm

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #91
    Ich bräuchte mal ein bisschen Hilfe.

    Code:
    b0 11 04 11 6e 50 80 f5
    
    {
    'raw': [176, 17, 4, 17, 110, 80, 128, 245],
    ## ControlField1 (b0)
    'ctrl1': {
       'Repeat': 1, 
       'Prio': 'system', 
       'Confirm': 0, 
       'BroadCast': 1, 
       'AckReq': 0, 
       'FrameType': 1},
    ## ControlField2 (11)
    'ctrl2': {
       'DestAddrType': 0, 
       'HopCount': 1, 
       'ExtFormat': 1}
    'srcaddr': '1.1.4', (04 11)
    'dstaddr': '2/1/110',  (6e 50)
    ## NPDU (80)
    'N_AddressType': 0, 
    'networkControlField': 5, 
    'datalen': 0, 
    
    }
    Eigentlich müsste doch jetzt noch eine APDU folgen, oder ?
    Wo ist mein Fehler ?
    1.1.4 ist der HS
    2/1/110 gibt es dort eigentlich nicht

    kann mich da mal jemand aufklären ?
    Nils

    aktuelle Bausteine:
    BusAufsicht - ServiceCheck - Pushover - HS-Insight

    Kommentar


      #92
      Zitat von NilsS Beitrag anzeigen
      Ich bräuchte mal ein bisschen Hilfe.

      Code:
      b0 11 04 11 6e 50 80 f5
      
      {
      'raw': [176, 17, 4, 17, 110, 80, 128, 245],
      ## ControlField1 (b0)
      'ctrl1': {
         'Repeat': 1, 
         'Prio': 'system', 
         'Confirm': 0, 
         'BroadCast': 1, 
         'AckReq': 0, 
         'FrameType': 1},
      ## ControlField2 (11)
      'ctrl2': {
         'DestAddrType': 0, 
         'HopCount': 1, 
         'ExtFormat': 1}
      'srcaddr': '1.1.4', (04 11)
      'dstaddr': '2/1/110',  (6e 50)
      ## NPDU (80)
      'N_AddressType': 0, 
      'networkControlField': 5, 
      'datalen': 0, 
      
      }
      Eigentlich müsste doch jetzt noch eine APDU folgen, oder ?
      Wo ist mein Fehler ?
      1.1.4 ist der HS
      2/1/110 gibt es dort eigentlich nicht


      kann mich da mal jemand aufklären ?
      2/1/110 ist falsch

      Der Aufbau ist:
      1 byte controlbyte
      2 byte src
      2 byte dest
      1 byte (Adresstype, Routingzähler und Länge Daten)
      x byte Nutzdaten
      1 byte Checksumme

      also
      1.1.4 kommuniziert mit 1.1.110
      Aus der Erinnerung heraus. Genaueres muss ich dann nachlesen.
      Schau mal hier für weitere Infos: Grundlagen und Infos

      Gruß
      Dirk

      Kommentar


        #93
        Danke, aber wo ist das 2. ControlByte ?

        das ist ja nicht so als würde ich nur diese eine Packet auflösen, das ist ca. 1 von 1000 alle anderen funzen nach obigem Schema.

        Code:
                ######################################################################################
                ## 11111111 22222222 SSSSSSSS SSSSSSSS DDDDDDDD DDDDDDDD LLLLLLLL AAAAAAAA AAAAAAAA
                ## 1 Control Field 1
                ## 2 Control Field 2
                ## S Source Address
                ## D Destination Address
                ## L Data Len
                ## A APDU
                ######################################################################################
        btw. ich hab auch keine 1/1/110 der gesamte 1/1/x Bereich wäre bei mir dann auch 4bit dimmen.

        Ich les mich mal in deinem Link schlau.
        Nils

        aktuelle Bausteine:
        BusAufsicht - ServiceCheck - Pushover - HS-Insight

        Kommentar


          #94
          Zitat von NilsS Beitrag anzeigen
          Danke, aber wo ist das 2. ControlByte ?

          das ist ja nicht so als würde ich nur diese eine Packet auflösen, das ist ca. 1 von 1000 alle anderen funzen nach obigem Schema.

          Code:
                  ######################################################################################
                  ## 11111111 22222222 SSSSSSSS SSSSSSSS DDDDDDDD DDDDDDDD LLLLLLLL AAAAAAAA AAAAAAAA
                  ## 1 Control Field 1
                  ## 2 Control Field 2
                  ## S Source Address
                  ## D Destination Address
                  ## L Data Len
                  ## A APDU
                  ######################################################################################
          Hmm. Vielleicht reden wir aneinander vorbei.
          Woher ist dein Telegramm? Dein o.g. rawframe sieht aus wie ein direktes Telegramm vom Bus. Deshalb auch 1.1.4 -> 1.1.110 (nicht 1/1/110)
          Aber dein Aufbau passt überhaupt nicht dazu.

          Übrigens der Paketaufbau steht auch hier im Lexikon.

          Kommentar


            #95
            Zitat von do13 Beitrag anzeigen
            Hmm. Vielleicht reden wir aneinander vorbei.
            Woher ist dein Telegramm? Dein o.g. rawframe sieht aus wie ein direktes Telegramm vom Bus.
            Das kommt vom eibd mittels EIBConnection.py
            EIBConnection.EIBOpenVBusmonitor_async()

            Deshalb auch 1.1.4 -> 1.1.110 (nicht 1/1/110)
            Aber dein Aufbau passt überhaupt nicht dazu.

            Übrigens der Paketaufbau steht auch hier im Lexikon.

            Code:
            if __name__ == "__main__":
                import sys
                sys.path.append( "" )
            import DPT_Types
            import time
            
            class busmonitor:
                def __init__(self, WireGateInstance):
                    self.WG = WireGateInstance
                    self.nicehex=lambda x: " ".join(map(lambda y:"%.2x" % y,x))
                    self.tobinstr=lambda n,b=8: "".join([str((n >> y) & 1) for y in range(b-1, -1, -1)])
                    self.dpt = DPT_Types.dpt_type()
            
                    ## FIXME: Not fully implemented
                    self.apcicodes = [
                        'A_GroupValue_Read', 
                        'A_GroupValue_Response',
                        'A_GroupValue_Write',
                        'A_PhysicalAddress_Write',
                        'A_PhysicalAddress_Read',
                        'A_PhysicalAddress_Response',
                        'A_ADC_Read',
                        'A_ADC_Response',
                        'A_Memory_Read',
                        'A_Memory_Response',
                        'A_Memory_Write',
                        'A_UserMemory',
                        'A_DeviceDescriptor_Read',
                        'A_DeviceDescriptor_Response',
                        'A_Restart',
                        'A_OTHER'
                    ]
                    ## FIXME: Not fully implemented
                    self.tpducodes = [
                        'T_DATA_XXX_REQ',
                        'T_DATA_CONNECTED_REQ',
                        'T_DISCONNECT_REQ',
                        'T_ACK'
                    ]
                    self.prioclasses = [
                        'system',
                        'alarm',
                        'high',
                        'low'
                    ]
                    ##
            
            
            
                def decode(self,buf):
                    ######################################################################################
                    ## 11111111 22222222 SSSSSSSS SSSSSSSS DDDDDDDD DDDDDDDD LLLLLLLL AAAAAAAA AAAAAAAA
                    ## 1 Control Field 1
                    ## 2 Control Field 2
                    ## S Source Address
                    ## D Destination Address
                    ## L Data Len
                    ## A APDU
                    ######################################################################################
                    ## Accept List Hex or Binary Data
                    if type(buf)==str:
                        tmp = buf
                        buf = []
                        try:
                            ##Hex or Binary
                            if ord(tmp[0])>122:
                                ##Binary
                                for char in tmp:
                                    buf.append(ord(char))
                            else:
                                ##Hex
                                for hex in range(0,len(tmp),2):
                                    buf.append(int(tmp[hex:hex+2],16))
                        except:
                            self.errormsg(tmp)
                            
                    msg = {'raw':buf,'value':''}
                    try:
                        msg['ctrl1'] = self._decodeCtrlField1(buf[0])
                        msg['ctrl2'] = self._decodeCtrlField2(buf[1])
                        msg['srcaddr'] = self._decodePhysicalAddr(buf[1:3])
                        msg['AddressType'], msg['nctrl'], msg['datalen'] = self._decodeNPDU(buf[5])
                        msg['apdu'], msg['data'] = self._decodeAPDU(buf[6:-1],msg['AddressType'],msg['datalen'])
            
                        if msg['ctrl2']['DestAddrType'] == 0:
                            msg['dstaddr'] = self._decodeGrpAddr(buf[3:5])
                            id = "KNX:%s" % msg['dstaddr']
                            
                            ## search Datastoreobject
                            dsobj = self.WG.DATASTORE.get(id)
                            
                            ## Decode the DPT Value
                            msg['value'] = self.dpt.decode( msg['data'],dsobj=dsobj)
                            
                            ## update Object in Datastore
                            self.WG.DATASTORE.update(id,msg['value'])
                            if not dsobj:
                                name = "unknown"
                            else:
                                name = dsobj.name
            
                            print "%s (%s): %r" % (name, msg['dstaddr'], msg['value'])
                        else:
                            print "NONGROUP"
                            ## non Group Communication
                            msg['dstaddr'] = self._decodePhysicalAddr(buf[3:5])
                    except:
                        self.errormsg(msg)
            
                    self.debug(msg)
                    
                    return msg
            
            
                def errormsg(self,msg=''):
                    f=open("/tmp/WGerror","a+")
                    f.write(time.asctime())
                    __import__('traceback').print_exc(file=__import__('sys').stdout)
                    __import__('traceback').print_exc(file=f)
                    f.write("MSG:"+repr(msg))
                    f.close()
                    print repr(msg)
            
                    
                def _decodeCtrlField1(self,raw):
                    ############################
                    ## Control Field 1
                    ## TRrBPPAC
                    ## T FrameType
                    ## R Reserved 
                    ## r Repeat
                    ## B Broadcast
                    ## P Priority
                    ## A ACK req
                    ## C Confirm
                    return {
                        'FrameType':(raw >>7) & 0x1,
                        'Repeat':(raw >> 5) & 0x1,
                        'BroadCast':(raw >> 4) & 0x1,
                        'Prio':self.prioclasses[(raw >>2) & 0x3],
                        'AckReq':(raw >>1) & 0x1,
                        'Confirm':raw & 0x1
                    }
            
            
                def _decodeCtrlField2(self,raw):
                    ############################
                    ## Control Field 2
                    ## DHHHEEEE
                    ## D Destination addr. Type 0=individual/1=group
                    ## H Hop Count
                    ## E Extended Frame Format 0=standard 
                    return {
                        'DestAddrType':(raw >>7) & 0x1,
                        'HopCount': (raw >>4) & 0x7,
                        'ExtFormat':raw & 0x7
                    }
                    
            
                    
                def _decodePhysicalAddr(self,raw):
                    ############################
                    ## Source Address (indiduell Address)
                    ## AAAALLLLDDDD
                    ## A Area
                    ## L Line
                    ## D Device
                    area = raw[0] >> 4
                    line = raw[0] & 0xf
                    device = raw[1]
            
                    return "%d.%d.%d" % (area,line,device)
                    
                def _decodeGrpAddr(self,raw):
                    ############################
                    ## Destination Address (group Address)
                    ## RHHHHMMM SSSSSSSS
                    ## R Reserved
                    ## H Maingroup
                    ## M Middlegroup
                    ## S Subgroup
                    main = (raw[0] >> 3) & 0xf
                    middle = raw[0] & 0x7
                    sub = raw[1]
            
                    return "%d/%d/%d" % (main,middle,sub)
                    
                def _decodeNPDU(self,raw):
                    ############################
                    ## Data length
                    ## ANNNLLLL
                    ## A Addresstype
                    ## N NectworkControlField
                    ## L Data Length
                    AddressType = (raw >> 7) & 0x1
                    NetworkCtrl = (raw >> 4) & 0x7
                    DataLength = raw & 0xf
                    self.debug("NPDU: %s " % self.tobinstr(raw))
                    
                    return AddressType,NetworkCtrl,DataLength
              
                def _decodeAPDU(self,raw, addresstype, datalength):
                    ############################
                    ## TPDU Bytes 7 and 8
                    ## TTTTTTAA AAMMMMMM
                    ## T Transport Control Field
                    ## A APCI
                    ## M APCI/data
                    tcf = raw[0] >> 2
                    tpdu,sequence = self._decodeTransportCtrl(tcf,addresstype)
                    if tpdu =="T_DATA_XXX_REQ":
                        if datalength == 1:
                            ## 6bit only
                            self.debug("DEBUG:6BIT")
                            apci = raw[0] >> 6
                            data = [raw[1] & 0x3f]
                        else:
                            val = (raw[0] << 8) + raw[1]
                            apci = (val & 0x3c0)
                            data = raw[2:]
                    
                        return {
                            'tpdu':tpdu,
                            'seq':sequence,
                            'apci':apci }, data
            
            
                def _decodeTransportCtrl(self,tcf,adresstype):
                    ## Transport Control Field
                    ## 1 0 0 0 0 0 0     T_Data_Broadcast-PDU (destination_address = 0)
                    ## 1 0 0 0 0 0 0     T_Data_Group-PDU (destination_address <> 0)
                    ## 1 0 0 0 0 0 1     T_Data_Tag_Group-PDU
                    ## 0 0 0 0 0 0 0     T_Data_Individual-PDU
                    ## 0 0 1 S S S S     T_Data_Connected-PDU
                    ## 0 1 0 0 0 0 0 0 0 T_Connect-PDU
                    ## 0 1 0 0 0 0 0 0 1 T_Disconnect-PDU
                    ## 0 1 1 S S S S 1 0 T_ACK-PDU
                    ## 0 1 1 S S S S 1 1 T_NAK-PDU
                    ## FIXME: Incomplete, only Data/ControlFlag and Numbered used
                    sequence = 0
                    try:
                        tpdu = self.tpducodes[(tcf & 0xc0) >> 6]
                    except KeyError:
                        tpdu = "T_NOTIMPLEMENTED_ERROR"
                        
                    return tpdu,sequence
                    
                    
                def _decodeAPCI(self,apci):
                    ## APCI
                    return apci
                    
                def debug(self,msg):
                    #print "DEBUG: BUSMON: "+ repr(msg) 
                    pass
            Nils

            aktuelle Bausteine:
            BusAufsicht - ServiceCheck - Pushover - HS-Insight

            Kommentar


              #96
              Zitat von NilsS Beitrag anzeigen
              Ich bräuchte mal ein bisschen Hilfe.

              Code:
              b0 11 04 11 6e 50 80 f5
              Eigentlich müsste doch jetzt noch eine APDU folgen, oder ?
              Wo ist mein Fehler ?
              1.1.4 ist der HS
              2/1/110 gibt es dort eigentlich nicht

              kann mich da mal jemand aufklären ?
              b0 11 04 11 6e 50 80 f5 ist ein T_CONNECT_REQ von 1.1.4 auf 1.1.110

              jede Wette du hast in deinem Trace auch ein b0 11 04 11 6e 50 81 f6
              das ist dann der zugehörige T_DISCONNECT_REQ. Der sollte von deinem HS noch kommen, egal ob 1.1.110 existiert oder nicht


              Dirk

              Kommentar


                #97
                OK, Danke.

                Das kann ja dann eigentlich nur über iETS gehen, oder ?

                Ich werte den Rest der ADPU jetzt nur aus wenn die TPDU T_DATA_XXX_REQ ist.
                Nils

                aktuelle Bausteine:
                BusAufsicht - ServiceCheck - Pushover - HS-Insight

                Kommentar


                  #98
                  Zitat von NilsS Beitrag anzeigen
                  OK, Danke.

                  Das kann ja dann eigentlich nur über iETS gehen, oder ?
                  Nein, nicht nur.
                  Diese Kommandos gehören zur Sicherungsschicht. Damit werden Kommandos wie Memoryread,-write, DevicedescriptorRead usw eingeleitet bzw. beendet.

                  Zitat von NilsS Beitrag anzeigen
                  Ich werte den Rest der ADPU jetzt nur aus wenn die TPDU T_DATA_XXX_REQ ist.
                  Sollte gehen, wenn du nur die Gruppentelegramme benötigst.

                  Dirk

                  Kommentar


                    #99
                    Zitat von do13 Beitrag anzeigen
                    Zitat von NilsS Beitrag anzeigen
                    Das kann ja dann eigentlich nur über iETS gehen, oder ?
                    Nein, nicht nur.
                    Diese Kommandos gehören zur Sicherungsschicht. Damit werden Kommandos wie Memoryread,-write, DevicedescriptorRead usw eingeleitet bzw. beendet.
                    Aber auf dem HS gibts nix was das selber könnte. ?? Der HS kann eigentlich nur Gruppenkommunikation
                    Nils

                    aktuelle Bausteine:
                    BusAufsicht - ServiceCheck - Pushover - HS-Insight

                    Kommentar


                      Zitat von NilsS Beitrag anzeigen
                      Aber auf dem HS gibts nix was das selber könnte. ?? Der HS kann eigentlich nur Gruppenkommunikation
                      Kann ich nicht sagen. Ich habe keinen HS

                      Was ist 1.1.110 bei dir? Bzw hast du noch die Kommandos die danach an diesen Teilnehmer gesendet werden? Vielleicht kann man dann ergründen was das soll.

                      Dirk

                      Kommentar


                        Ist ein Triton RTR 3fach

                        ich will jetzt mal einfach nicht ausschließen das ich ein Geräteinfo abgerufen hab,

                        A_DEVICE_DESCRIPTOR_READ war im WG Log, dort waren aber src als auch dst voll daneben und TPDU T_ACK.

                        Besten Dank, ich denke ich suche mal den Fehler im _decodeTransportCtrl dort sind ein paar BITS verschoben.
                        Nils

                        aktuelle Bausteine:
                        BusAufsicht - ServiceCheck - Pushover - HS-Insight

                        Kommentar


                          Hallo zusammen!

                          Kann mir jemand den Unterschied zwischen Tunneling und Routing erklären?
                          Wir setzen im Moment Router ein. Aus der ETS habe ich nur Routing-Telegramme gefunden. Habe diese 1-zu-1 implementiert und das läuft.
                          Gibt mir Tunneling mehr sicherheit in der Übertragung?
                          Wie siehts aus wenn man nur Gateways statt Router verwendet?

                          Gruss
                          Rolf

                          Kommentar


                            Routing ist wie UDP, Tunneling wie TCP. beim Routing kann schon mal ein Telegramm verloren gehen, ohne das es jemand bemerkt.

                            Kommentar


                              OK, danke!
                              Aber das detektieren und wiederholen der Telegramme muss dann selbst implementiert werden nehm ich an?
                              Aber rein von der Sicherheit her muss ich das wohl so tun.

                              Gruss
                              Rolf

                              Kommentar


                                Hallo Leute.

                                Ich habe es schon mal in einem neuen Thread versucht, aber leider geht der in der Flut von Posts immer unter. Oder es will mir keiner Antworten

                                Ich versuche einen Tunnel per UDP zu einem EibD per KNXNet/IP aufzubauen. Der EibD soll eine Brücke per USB-Interface zum Bus bilden. Irgendwie behält der EibD aber alle Telegramme für sich. Hat vielleicht jemand eine Ahnung was mir noch fehlt?

                                Zitat von micha149 Beitrag anzeigen
                                Habe mir die Sourcen von Calimero angesehen um ein Bild davon zu bekommen, was ich für eine adäquate Verbindung tun muss. Leider bekomme ich nach dem Aufbau einer Verbindung keine weiteren Pakete vom Server übertragen. Ich gehe wie folgt vor:

                                Ich sende einen Connection-Request per UDP an meinen Eibd mit der Adresse 192.168.56.101 auf Port 3671:
                                Code:
                                <Buffer 06 10 02 05 00 1a 08 01 c0 a8 38 01 a1 12 08 01 c0 a8 38 65 0e 57 04 04 02 00>
                                Dieser anwortet mir mit einer Connection-Response und weist mir ChannelID 1 zu:
                                Code:
                                <Buffer 06 10 02 06 00 14 01 00 08 01 c0 a8 38 65 0e 57 04 04 00 00>
                                Danach müsste er mir doch beim Schalten einer Gruppenadresse ein entsprechendes Paket schicken, oder? Im Eibd Debug log tauchen auch Einträge auf, wenn zB das Licht eingeschaltet wird. Diese Telegramme werden mir allerdings nicht weitergeleitet.

                                Ich habe mal versucht im einfach nach dem Connect ein Telegram zum schalten einer Lampe geschickt. Darauf hin taucht im Log „Layer 8(0A026A38,51B8C2F3) Invalid data endpoint“ auf.
                                Viele Grüße
                                Michael

                                Kommentar

                                Lädt...
                                X