[gelöst]Daten über Socketverbindung empfangen

15. Januar 2009 19:45

Hallo,
ich hab mal eine blöde Frage. Habe jetzt schon länger gesucht und auch schon länger rumprobiert. Aber irgendwie kriege ich das nicht ganz auf die Kette.
Ein Scanner ist seriell an einen ComServer (W&T) angeschlossen. Dieser reicht die Daten einfach ins TCP/IP-Netzwerk an einem bestimmten Port weiter. Jetzt möchte ich, daß NAV diese Daten aufnimmt und weiterverarbeitet. Ich habe bereits diese Beispiele aus der devguide.chm nachvollzogen, aber irgendwie fehlt mir noch etwas, denn es klappt nicht. Also, der ComServer leitet die Daten ja nur stupide weiter, d.h. der kann eigenständig keine aktive Verbindung mit NAV eingehen. Ergo muß NAV ja die Verbindung etablieren und darauf warten, daß da vom ComServer was kommt. Am besten über dieses Event MessageReceived. NAV baut zumindest die Gegenstelle auf, so daß die Daten abgesetzt werden können, aber das Event wird nicht gefeuert.
Code:
IF ISCLEAR(CC2) THEN
  CREATE(CC2);
IF ISCLEAR(SBA) THEN
  CREATE(SBA);

SBA.CloseSendWhenWaitForReply(TRUE);
CC2.AddBusAdapter(SBA,0);
OutMsg := CC2.CreateoutMessage(STRSUBSTNO('Sockets://%1:%2',Setup."IP Address",Setup.Port));
OutS := OutMsg.GetStream();

OutMsg.Send(0);

Wer weiß, was ich falsch mache?

Beste Grüße,
Horst
Zuletzt geändert von HattrickHorst am 3. Februar 2009 13:43, insgesamt 1-mal geändert.

Re: Daten über Socketverbindung empfangen

15. Januar 2009 20:56

Hi!
Hast Du bei der Deklaration der Automation-Variablen (CC und SBA) auch die Eigenschaft "WithEvents" aktiviert?
Gruß,
Jörg

Re: Daten über Socketverbindung empfangen

15. Januar 2009 21:45

Jup, den Event sehe ich auch als eigenen Trigger am Ende der Codeunit. Hab auch was reingepackt, aber das wird nicht ausgeführt. Auch der Debugger springt schon gar nicht da rein.

Re: Daten über Socketverbindung empfangen

15. Januar 2009 22:02

HattrickHorst hat geschrieben:Auch der Debugger springt schon gar nicht da rein.

Und wo genau steigt er aus? Hat das vielleicht mit deinem Code gar nichts zu tun?

Re: Daten über Socketverbindung empfangen

15. Januar 2009 22:10

Wie wo steigt er aus? Verstehe ich nicht. Nirgendwo steigt er aus. Er springt schon gar nicht an. D.h. für mich, der Event-Trigger wird gar nicht ausgelöst. Oder verstehe ich das falsch? (Breakpoint on Trigger ist natürlich an.)

Re: Daten über Socketverbindung empfangen

15. Januar 2009 22:11

Die Codeunit ist auch SingleInstance, falls das noch einer fragen wollte.

Re: Daten über Socketverbindung empfangen

16. Januar 2009 08:51

Hier mal ein paar Objekte die ich zum Testen verwendet habe (ist schon ein wenig alt, hab's auch schon lange nicht mehr benutzt):

Code:
OBJECT Form 95000 Communication Test
{
  OBJECT-PROPERTIES
  {
    Date=11.12.06;
    Time=15:58:44;
    Modified=Yes;
    Version List=SSI/COM1.00;
  }
  PROPERTIES
  {
    Width=8580;
    Height=6160;
    Sizeable=No;
    OnOpenForm=BEGIN
                 SetControls();
               END;

    OnQueryCloseForm=BEGIN
                       IF IsStarted[1] OR IsStarted[2] OR IsStarted[3] THEN
                         MESSAGE('Caution! Bus Adaptder is/are still loaded (Single Instance).\' +
                                 'Restart the NAV Client to unload.');
                     END;

  }
  CONTROLS
  {
    { 1000000000;Frame  ;220  ;220  ;8140 ;1100 ;HorzGlue=Both;
                                                 CaptionML=ENU=Session Type }
    { 1000000001;OptionButton;440;660;3740;440  ;ParentControl=1000000000;
                                                 InFrame=Yes;
                                                 CaptionML=ENU=Receiver;
                                                 SourceExpr=SessionType;
                                                 OptionValue=Receiver;
                                                 OnAfterValidate=BEGIN
                                                                   SetControls();
                                                                 END;
                                                                  }
    { 1000000003;OptionButton;4400;660;3740;440 ;ParentControl=1000000000;
                                                 InFrame=Yes;
                                                 CaptionML=ENU=Sender;
                                                 SourceExpr=SessionType;
                                                 OptionValue=Sender;
                                                 OnAfterValidate=BEGIN
                                                                   SetControls();
                                                                 END;
                                                                  }
    { 1000000004;Frame  ;220  ;1540 ;8140 ;1320 ;HorzGlue=Both;
                                                 CaptionML=ENU=Socket Bus Adapter }
    { 1000000005;CommandButton;440;2090;3740;550;Name=Start_SBA;
                                                 ParentControl=1000000004;
                                                 InFrame=Yes;
                                                 PushAction=RunObject;
                                                 CaptionML=ENU=Start SBA;
                                                 RunObject=Codeunit 95000;
                                                 OnPush=BEGIN
                                                          IsStarted[1] := TRUE;
                                                          SetControls();
                                                        END;
                                                         }
    { 1000000006;CommandButton;4400;2090;3740;550;
                                                 Name=Send_SBA;
                                                 ParentControl=1000000004;
                                                 InFrame=Yes;
                                                 PushAction=RunObject;
                                                 CaptionML=ENU=Send Message;
                                                 RunObject=Codeunit 95001 }
    { 1000000002;Shape  ;3740 ;2200 ;330  ;330  ;Name=SBA_On;
                                                 ParentControl=1000000004;
                                                 InFrame=Yes;
                                                 BackColor=65280;
                                                 BackTransparent=No;
                                                 BorderColor=0;
                                                 ShapeStyle=Oval }
    { 1000000013;Shape  ;3740 ;2200 ;330  ;330  ;Name=SBA_Off;
                                                 ParentControl=1000000004;
                                                 InFrame=Yes;
                                                 BackColor=255;
                                                 BackTransparent=No;
                                                 BorderColor=0;
                                                 ShapeStyle=Oval }
    { 1000000007;Frame  ;220  ;3080 ;8140 ;1320 ;HorzGlue=Both;
                                                 CaptionML=ENU=Named Pipe Bus Adapter }
    { 1000000008;CommandButton;440;3630;3740;550;Name=Start_NPBA;
                                                 ParentControl=1000000007;
                                                 InFrame=Yes;
                                                 PushAction=RunObject;
                                                 CaptionML=ENU=Start NPBA;
                                                 RunObject=Codeunit 95002;
                                                 OnPush=BEGIN
                                                          IsStarted[2] := TRUE;
                                                          SetControls();
                                                        END;
                                                         }
    { 1000000009;CommandButton;4400;3630;3740;550;
                                                 Name=Send_NPBA;
                                                 ParentControl=1000000007;
                                                 InFrame=Yes;
                                                 PushAction=RunObject;
                                                 CaptionML=ENU=Send Message;
                                                 RunObject=Codeunit 95003 }
    { 1000000014;Shape  ;3740 ;3740 ;330  ;330  ;Name=NPBA_On;
                                                 ParentControl=1000000007;
                                                 InFrame=Yes;
                                                 BackColor=65280;
                                                 BackTransparent=No;
                                                 BorderColor=0;
                                                 ShapeStyle=Oval }
    { 1000000015;Shape  ;3740 ;3740 ;330  ;330  ;Name=NPBA_Off;
                                                 ParentControl=1000000007;
                                                 InFrame=Yes;
                                                 BackColor=255;
                                                 BackTransparent=No;
                                                 BorderColor=0;
                                                 ShapeStyle=Oval }
    { 1000000010;Frame  ;220  ;4620 ;8140 ;1320 ;HorzGlue=Both;
                                                 CaptionML=ENU=Message Queue Bus Adapter }
    { 1000000011;CommandButton;440;5170;3740;550;Name=Start_MSQBA;
                                                 ParentControl=1000000010;
                                                 InFrame=Yes;
                                                 PushAction=RunObject;
                                                 CaptionML=ENU=Start MSQBA;
                                                 RunObject=Codeunit 95004;
                                                 OnPush=BEGIN
                                                          IsStarted[3] := TRUE;
                                                          SetControls();
                                                        END;
                                                         }
    { 1000000012;CommandButton;4400;5170;3740;550;
                                                 Name=Send_MSQBA;
                                                 ParentControl=1000000010;
                                                 InFrame=Yes;
                                                 PushAction=RunObject;
                                                 CaptionML=ENU=Send Message;
                                                 RunObject=Codeunit 95005 }
    { 1000000016;Shape  ;3740 ;5280 ;330  ;330  ;Name=MSQBA_On;
                                                 ParentControl=1000000010;
                                                 InFrame=Yes;
                                                 BackColor=65280;
                                                 BackTransparent=No;
                                                 BorderColor=0;
                                                 ShapeStyle=Oval }
    { 1000000017;Shape  ;3740 ;5280 ;330  ;330  ;Name=MSQBA_Off;
                                                 ParentControl=1000000010;
                                                 InFrame=Yes;
                                                 BackColor=255;
                                                 BackTransparent=No;
                                                 BorderColor=0;
                                                 ShapeStyle=Oval }
  }
  CODE
  {
    VAR
      SessionType@1000000000 : 'Receiver,Sender';
      IsStarted@1000000001 : ARRAY [3] OF Boolean;

    PROCEDURE SetControls@1000000005();
    BEGIN
      CurrForm.Start_SBA.ENABLED(SessionType = SessionType::Receiver);
      CurrForm.Send_SBA.ENABLED(SessionType = SessionType::Sender);
      CurrForm.Start_NPBA.ENABLED(SessionType = SessionType::Receiver);
      CurrForm.Send_NPBA.ENABLED(SessionType = SessionType::Sender);
      CurrForm.Start_MSQBA.ENABLED(SessionType = SessionType::Receiver);
      CurrForm.Send_MSQBA.ENABLED(SessionType = SessionType::Sender);

      CurrForm.SBA_On.VISIBLE(IsStarted[1] AND (SessionType = SessionType::Receiver));
      CurrForm.SBA_Off.VISIBLE((NOT IsStarted[1]) AND (SessionType = SessionType::Receiver));
      CurrForm.NPBA_On.VISIBLE(IsStarted[1] AND (SessionType = SessionType::Receiver));
      CurrForm.NPBA_Off.VISIBLE((NOT IsStarted[2]) AND (SessionType = SessionType::Receiver));
      CurrForm.MSQBA_On.VISIBLE(IsStarted[1] AND (SessionType = SessionType::Receiver));
      CurrForm.MSQBA_Off.VISIBLE((NOT IsStarted[3]) AND (SessionType = SessionType::Receiver));
    END;

    BEGIN
    END.
  }
}

OBJECT Codeunit 95000 Ex.: Socket Receive
{
  OBJECT-PROPERTIES
  {
    Date=11.12.06;
    Time=15:56:21;
    Modified=Yes;
    Version List=SSI/COM1.00;
  }
  PROPERTIES
  {
    SingleInstance=Yes;
    OnRun=BEGIN
            IP := '127.0.0.1';   // Local Host
            Port := 8079;

            InitInterface();
          END;

  }
  CODE
  {
    VAR
      SBA@1000000003 : Automation "{CF450AFF-91CE-4DF0-92DE-AFE4C28AAFC7} 1.0:{4CBE9566-34EA-429D-963A-911E270CBE4F}:'Navision Socket Bus Adapter'.SocketBusAdapter";
      CC2@1000000002 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{01018FA5-E4B4-413C-A47C-AD34B0CC2647}:'Navision Communication Component version 2'.CommunicationComponent" WITHEVENTS;
      InMsg@1000000001 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{D184D0AC-61C9-4AC1-B537-0D28C277FEDE}:'Navision Communication Component version 2'.InMessage";
      IP@1000000000 : Text[30];
      Port@1000000004 : Integer;
      InS@1000000005 : InStream;
      Text@1000000006 : Text[1024];

    PROCEDURE InitInterface@1000000000();
    BEGIN
      IF ISCLEAR(CC2) THEN
        CREATE(CC2);
      IF ISCLEAR(SBA) THEN
        CREATE(SBA);

      CC2.AddBusAdapter(SBA, 0);
      SBA.Address := IP;
      SBA.OpenSocket(Port, '');
      MESSAGE('Socket Bus Adapter is started.');
    END;

    PROCEDURE GetMessage@1000000001();
    BEGIN
      InS := InMsg.GetStream();
      WHILE NOT InS.EOS DO BEGIN
        InS.READ(Text);
        MESSAGE('SBA:\' + Text);
      END;
      InMsg.CommitMessage();
    END;

    EVENT CC2@1000000002::MessageReceived@1(VAR InMessage@1000000000 : Automation ":{00020400-0000-0000-C000-000000000046}:''.IDISPATCH");
    BEGIN
      BEEP(500, 50);
      InMsg := InMessage;
      GetMessage();
    END;

    BEGIN
    {
      *********************************************************
      ***              STRYK System Improvement             ***
      ***    Performance Optimization & Troubleshooting     ***
      ***  (c) 2006, STRYK System Improvement, J”rg Stryk   ***
      ***             Contact: Contact@Stryk.info           ***
      *********************************************************
    }
    END.
  }
}

OBJECT Codeunit 95001 Ex.: Socket Send
{
  OBJECT-PROPERTIES
  {
    Date=11.12.06;
    Time=15:38:23;
    Modified=Yes;
    Version List=SSI/COM1.00;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            IP := '127.0.0.1';   // Local Host
            Port := 8079;

            InitInterface();
            SendMessage();
          END;

  }
  CODE
  {
    VAR
      SBA@1000000003 : Automation "{CF450AFF-91CE-4DF0-92DE-AFE4C28AAFC7} 1.0:{4CBE9566-34EA-429D-963A-911E270CBE4F}:'Navision Socket Bus Adapter'.SocketBusAdapter";
      CC2@1000000002 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{01018FA5-E4B4-413C-A47C-AD34B0CC2647}:'Navision Communication Component version 2'.CommunicationComponent";
      OutMsg@1000000001 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{6CB9762C-E61C-4F96-BA34-8B20D3A5B46E}:'Navision Communication Component version 2'.OutMessage";
      IP@1000000000 : Text[30];
      Port@1000000004 : Integer;
      OutS@1000000005 : OutStream;

    PROCEDURE InitInterface@1000000000();
    BEGIN
      IF ISCLEAR(CC2) THEN
        CREATE(CC2);
      IF ISCLEAR(SBA) THEN
        CREATE(SBA);

      CC2.AddBusAdapter(SBA, 0);
    END;

    PROCEDURE SendMessage@1000000001();
    BEGIN
      OutMsg := CC2.CreateoutMessage(STRSUBSTNO('Sockets://%1:%2', IP, Port));
      OutS := OutMsg.GetStream();
      OutS.WRITETEXT('Hello World!');
      OutMsg.Send(0);
      MESSAGE('Message has been sent via Socket Bus Adapter.');
    END;

    EVENT CC2@1000000002::MessageReceived@1(VAR InMessage@1000000000 : Automation ":{00020400-0000-0000-C000-000000000046}:''.IDISPATCH");
    BEGIN
    END;

    BEGIN
    {
      *********************************************************
      ***              STRYK System Improvement             ***
      ***    Performance Optimization & Troubleshooting     ***
      ***  (c) 2006, STRYK System Improvement, J”rg Stryk   ***
      ***             Contact: Contact@Stryk.info           ***
      *********************************************************
    }
    END.
  }
}

OBJECT Codeunit 95002 Ex.: Named Pipe Receive
{
  OBJECT-PROPERTIES
  {
    Date=11.12.06;
    Time=15:56:29;
    Modified=Yes;
    Version List=SSI/COM1.00;
  }
  PROPERTIES
  {
    SingleInstance=Yes;
    OnRun=BEGIN
            Pipe := 'Test';   // Local Host

            InitInterface();
          END;

  }
  CODE
  {
    VAR
      NPA@1000000003 : Automation "{DE02F245-15B6-42D1-BA8F-5958814EF71D} 1.0:{B9D54055-572C-41E3-879A-C9845E963494}:'Navision Named Pipe Bus Adapter'.NamePipeBusAdapter";
      CC2@1000000002 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{01018FA5-E4B4-413C-A47C-AD34B0CC2647}:'Navision Communication Component version 2'.CommunicationComponent" WITHEVENTS;
      InMsg@1000000001 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{D184D0AC-61C9-4AC1-B537-0D28C277FEDE}:'Navision Communication Component version 2'.InMessage";
      Pipe@1000000000 : Text[30];
      InS@1000000005 : InStream;
      Text@1000000006 : Text[1024];

    PROCEDURE InitInterface@1000000000();
    BEGIN
      IF ISCLEAR(CC2) THEN
        CREATE(CC2);
      IF ISCLEAR(NPA) THEN
        CREATE(NPA);

      CC2.AddBusAdapter(NPA, 0);
      NPA.OpenNamedPipe(Pipe, 0, 0);
      MESSAGE('Named Pipe Bus Adapter is started.');
    END;

    PROCEDURE GetMessage@1000000001();
    BEGIN
      InS := InMsg.GetStream();
      WHILE NOT InS.EOS DO BEGIN
        InS.READ(Text);
        MESSAGE('NPBA:\' + Text);
      END;
      InMsg.CommitMessage();
    END;

    EVENT CC2@1000000002::MessageReceived@1(VAR InMessage@1000000000 : Automation ":{00020400-0000-0000-C000-000000000046}:''.IDISPATCH");
    BEGIN
      BEEP(500, 50);
      InMsg := InMessage;
      GetMessage();
    END;

    BEGIN
    {
      *********************************************************
      ***              STRYK System Improvement             ***
      ***    Performance Optimization & Troubleshooting     ***
      ***  (c) 2006, STRYK System Improvement, J”rg Stryk   ***
      ***             Contact: Contact@Stryk.info           ***
      *********************************************************
    }
    END.
  }
}

OBJECT Codeunit 95003 Ex.: Named Pipe Send
{
  OBJECT-PROPERTIES
  {
    Date=11.12.06;
    Time=15:38:32;
    Modified=Yes;
    Version List=SSI/COM1.00;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            Pipe := '\\.\pipe\Test';   // Local Host

            InitInterface();
            SendMessage();
          END;

  }
  CODE
  {
    VAR
      NPA@1000000003 : Automation "{DE02F245-15B6-42D1-BA8F-5958814EF71D} 1.0:{B9D54055-572C-41E3-879A-C9845E963494}:'Navision Named Pipe Bus Adapter'.NamePipeBusAdapter";
      CC2@1000000002 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{01018FA5-E4B4-413C-A47C-AD34B0CC2647}:'Navision Communication Component version 2'.CommunicationComponent";
      OutMsg@1000000001 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{6CB9762C-E61C-4F96-BA34-8B20D3A5B46E}:'Navision Communication Component version 2'.OutMessage";
      Pipe@1000000000 : Text[30];
      OutS@1000000005 : OutStream;

    PROCEDURE InitInterface@1000000000();
    BEGIN
      IF ISCLEAR(CC2) THEN
        CREATE(CC2);
      IF ISCLEAR(NPA) THEN
        CREATE(NPA);

      CC2.AddBusAdapter(NPA, 0);
    END;

    PROCEDURE SendMessage@1000000001();
    BEGIN
      OutMsg := CC2.CreateoutMessage(STRSUBSTNO('Named Pipe://%1', Pipe));
      OutS := OutMsg.GetStream();
      OutS.WRITETEXT('Hello World!');
      OutMsg.Send(0);
      MESSAGE('Message has been sent via Named Pipe Bus Adapter.');
    END;

    EVENT CC2@1000000002::MessageReceived@1(VAR InMessage@1000000000 : Automation ":{00020400-0000-0000-C000-000000000046}:''.IDISPATCH");
    BEGIN
    END;

    BEGIN
    {
      *********************************************************
      ***              STRYK System Improvement             ***
      ***    Performance Optimization & Troubleshooting     ***
      ***  (c) 2006, STRYK System Improvement, J”rg Stryk   ***
      ***             Contact: Contact@Stryk.info           ***
      *********************************************************
    }
    END.
  }
}

OBJECT Codeunit 95004 Ex.: Message Queue Receive
{
  OBJECT-PROPERTIES
  {
    Date=11.12.06;
    Time=15:56:37;
    Modified=Yes;
    Version List=SSI/COM1.00;
  }
  PROPERTIES
  {
    SingleInstance=Yes;
    OnRun=BEGIN
            Queue := '.\test';

            InitInterface();
          END;

  }
  CODE
  {
    VAR
      CC2@1000000001 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{01018FA5-E4B4-413C-A47C-AD34B0CC2647}:'Navision Communication Component version 2'.CommunicationComponent" WITHEVENTS;
      MSQ@1000000000 : Automation "{B8BD635A-E191-47EF-84A0-02921E2A44A6} 1.0:{CD49794B-0E84-4A2E-9522-C518C825D390}:'Navision MS-Message Queue Bus Adapter'.MSMQBusAdapter";
      InMsg@1000000002 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{D184D0AC-61C9-4AC1-B537-0D28C277FEDE}:'Navision Communication Component version 2'.InMessage";
      InS@1000000003 : InStream;
      Queue@1000000004 : Text[30];
      Text@1000000005 : Text[1024];

    PROCEDURE InitInterface@1000000000();
    BEGIN
      IF ISCLEAR(CC2) THEN
        CREATE(CC2);
      IF ISCLEAR(MSQ) THEN
        CREATE(MSQ);

      CC2.AddBusAdapter(MSQ, 1);
      MSQ.OpenReceiveQueue(Queue, 0, 0);
      MESSAGE('Message Queue Bus Adapter is started.');
    END;

    PROCEDURE GetMessage@1000000001();
    BEGIN
      InS := InMsg.GetStream();
      WHILE NOT InS.EOS DO BEGIN
        InS.READ(Text);
        MESSAGE('MSQBA:\' + Text);
      END;
      InMsg.CommitMessage();
    END;

    EVENT CC2@1000000001::MessageReceived@1(VAR InMessage@1000000000 : Automation ":{00020400-0000-0000-C000-000000000046}:''.IDISPATCH");
    BEGIN
      BEEP(500, 50);
      InMsg := InMessage;
      GetMessage();
    END;

    BEGIN
    {
      *********************************************************
      ***              STRYK System Improvement             ***
      ***    Performance Optimization & Troubleshooting     ***
      ***  (c) 2006, STRYK System Improvement, J”rg Stryk   ***
      ***             Contact: Contact@Stryk.info           ***
      *********************************************************
    }
    END.
  }
}

OBJECT Codeunit 95005 Ex.: Message Queue Send
{
  OBJECT-PROPERTIES
  {
    Date=11.12.06;
    Time=15:39:04;
    Modified=Yes;
    Version List=SSI/COM1.00;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            Queue := '.\test';
            InitInterface();
            SendMessage();
          END;

  }
  CODE
  {
    VAR
      CC2@1000000001 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{01018FA5-E4B4-413C-A47C-AD34B0CC2647}:'Navision Communication Component version 2'.CommunicationComponent";
      MSQ@1000000000 : Automation "{B8BD635A-E191-47EF-84A0-02921E2A44A6} 1.0:{CD49794B-0E84-4A2E-9522-C518C825D390}:'Navision MS-Message Queue Bus Adapter'.MSMQBusAdapter";
      OutMsg@1000000002 : Automation "{F9A57667-8AC5-45C5-9416-99D3955BCAC0} 1.0:{6CB9762C-E61C-4F96-BA34-8B20D3A5B46E}:'Navision Communication Component version 2'.OutMessage";
      OutS@1000000003 : OutStream;
      Queue@1000000004 : Text[30];

    PROCEDURE InitInterface@1000000000();
    BEGIN
      IF ISCLEAR(CC2) THEN
        CREATE(CC2);
      IF ISCLEAR(MSQ) THEN
        CREATE(MSQ);

      CC2.AddBusAdapter(MSQ, 1);
      MSQ.OpenWriteQueue(Queue, 0, 0);
    END;

    PROCEDURE SendMessage@1000000001();
    BEGIN
      OutMsg := CC2.CreateoutMessage(STRSUBSTNO('Message queue://%1', Queue));
      OutS := OutMsg.GetStream();
      OutS.WRITE('Hello World!');
      OutMsg.Send(0);
      MESSAGE('Message has been sent via Message Queue Bus Adapter.');
    END;

    EVENT CC2@1000000001::MessageReceived@1(VAR InMessage@1000000000 : Automation ":{00020400-0000-0000-C000-000000000046}:''.IDISPATCH");
    BEGIN
    END;

    BEGIN
    {
      *********************************************************
      ***              STRYK System Improvement             ***
      ***    Performance Optimization & Troubleshooting     ***
      ***  (c) 2006, STRYK System Improvement, J”rg Stryk   ***
      ***             Contact: Contact@Stryk.info           ***
      *********************************************************
    }
    END.
  }
}


(In TXT kopieren und in "Object Designer" importieren/kompilieren)

Funzt das?

Re: Daten über Socketverbindung empfangen

16. Januar 2009 09:33

Hallo HattricHorst,

ich gehe davon aus, das NAV bei dir Daten empfangen soll, dann macht es wenig Sinn Daten auf der Verbindung zu senden (CreateMessage).

Bei mir sieht eine INIT-Funktion für eine Socketverbindung, die auf Daten wartet etwa so aus (unter 5.0Sp1).
Code:
CREATE(CC2);
CREATE(SBA);
CC2.AddBusAdapter(SBA,0);
//SBA.ReceivingTimeout(2000);
IF Port=0 THEN
  Port:=9000;
SBA.OpenSocket(Port,'');
SBA.CloseSendWhenWaitForReply :=FALSE;


Was bei dir denke ich fehlt, ist der OpenSocket- Befehl, damit deine Anwendung Daten empfangen kann. Das eigentliche Empfangen der Daten erfolgt dann über die Event-Funktion.

Gruß, Fiddi

Re: Daten über Socketverbindung empfangen

16. Januar 2009 10:10

Schaut mal in diesen Blog, hilft der was?
http://blogs.msdn.com/microsoft_dynamic ... ckets.aspx

Re: Daten über Socketverbindung empfangen

16. Januar 2009 10:42

Erstmal danke an alle für die schnellen Antworten.
Das mit COPYSTREAM hat nicht wirklich was damit zu tun, aber auf jeden Fall interessant zu wissen.
Das Beispiel von stryk werde ich gleich mal ausprobieren.

Ich glaube, fiddi hat es genau erkannt. Das Createoutmessage mache ich nur, weil ich dachte in Kombination mit CloseSendWhenWaitForReply(TRUE) kann man eine kleine Nachricht hinschicken und dann nur noch auf die Antworten warten. Das Problem bei OpenSocket ist nämlich, daß ich dann sozusagen der Server bin. Damit mache ich auf meiner lokalen Ethernetschnittstelle eine wartende Socketverbindung auf dem angegebenen Port auf. Es müßte sich also von außen jemand direkt mit meiner IP und dem Port verbinden, damit die Socketverbindung vollständig etabliert ist. Das kann der ComServer aber nicht. Er stellt ja seinerseits auf seiner IP an einem konfigurierbaren Port solch eine Verbindung bereit. Also möchte ich mich sozusagen in die Ferne verbinden, aber dann nur warten, was vom Server kommt. Eigentlich dachte ich, das kann ja nicht so schwer sein. Aber wie immer liegt der Teufel wohl im Detail.

Gruß,
Horst

Re: Daten über Socketverbindung empfangen

16. Januar 2009 10:59

Hallo HattricHorst,

wenn ich die Anleitung bei W&T richtig gelesen hab, kann man die COM-Server auch als TCP-Client konfigurieren!

Gruß, Fiddi

Re: Daten über Socketverbindung empfangen

16. Januar 2009 11:08

Ja, und was heißt das dann? Daß die Dinger auch von sich aus eine Verbindung aufbauen können? Woher wissen die denn dann, zu welcher IP? Das kann ja immer eine andere sein, je nachdem welcher NAV-Client die Daten abfragen möchte. Oder verstehe ich das falsch?

Re: Daten über Socketverbindung empfangen

16. Januar 2009 11:37

Hallo,

versuch doch mal in deinem Code den Send()- Befehl durch SendWaitForReply zu ersetzen. Dann sollte deine Anwendung auf eine Antwort des COM-Servers warten. Evtl. gib er dir dann deine Daten.

Gruß, Fiddi

Re: Daten über Socketverbindung empfangen

16. Januar 2009 11:54

Jup, das hab ich schon ausprobiert. Das geht. Allerdings ist dann die Anwendung blockiert. Dann hab ich das Ganze in einen Timer ausgelagert. Je nachdem, welche Einstellungen man für den Timer und für das WaitForReply genommen hat, ging das auch einigermaßen. Aber wenn man die Zeit für WaitForReply zu hoch gestellt hat, hing der Client immer, wenn man die zu niedrig eingestellt hat, hat der Client nicht alles mitbekommen, was an Daten abgesetzt wurde. Und eigentlich möchte ich ja auch über das Event gehen.

Re: Daten über Socketverbindung empfangen

16. Januar 2009 12:12

Hallo HattricHorst,

du machst es einem nicht leicht :wink: . Wie währe es, wenn du die Daten zentral mit einem NAS empfängst und dann in einer NAV-Tabelle bereitstellst?
Was setzt du überhaubt ein, ein MDE (mobile Datenerfassung z.B. für Inventur) oder einen Handscanner (z.B. wie an einer Kasse)?

Gruß, Fiddi

Re: Daten über Socketverbindung empfangen

16. Januar 2009 12:30

Einfach kann ja jeder, oder? :wink:
Das wäre theoretisch auch möglich. Und dann über einen Timer gucken, ob ein neuer Datensatz eingestellt wurde, oder wie? Ich zwar nicht so chic, würde aber auf den ersten Blick gehen. Als Probleme sehe ich die Performance und den gleichzeitigen Zugriff von NAS und Client auf die Tabelle mit den Datensätzen.
Das ist eher sowas wie ein Handscanner. Aber nicht sowie beim Barcodescanner, sondern da wird ein Chip per Induktionsschleife ausgelesen. So ähnlich wie beim Keyless Entry bei moderen Autos, nur halt nicht RFID. Ich weiß nicht, kennt ihr das noch?! Früher haben einige Autos ein elektronisches Lenkradschloß mit der gleichen Technik gehabt. Der Chip war dann im Schlüssel versteckt.

Re: Daten über Socketverbindung empfangen

16. Januar 2009 12:39

Hallo HattricHorst,

es ist zwar ein wenig um die Ecke, aber der NAS könnte die Daten ja auch an den bei ihm registrierten NAV-Client (NAV Tabelle) weiterschicken per Socket.


Gruß, Fiddi

Re: Daten über Socketverbindung empfangen

3. Februar 2009 13:35

Hab jetzt eine eigene Kommunikationskomponente genommen, die einfach nur stupide alles eingehende an NAV per Event weitergibt. Die ComCom2 scheint irgendwie nicht das zu sein bzw. nicht alles zu können, was man von ihr erwartet. :-| Das ist jetzt zwar etwas mehr Programmieraufwand, aber wenn man das gegen die ganzen (missglückten) Tests mit der Standardkomponente hält, wäre der Weg von Anfang an sicherlich der effizientere gewesen.