Neues Thema starten

Auslesen der Seriennummer

Hallo zusammen,


wir sind uns inzwischen unsicher geworden, ob die Art und Weise, wie wir die Seriennummer auslesen korrekt ist... 


Ich bekomme von der entsprechenden DLL Funktion Bytes zurück, die ich dann nach Dokumentation Gastro-Mis nur mit Base64 encode?


Ist das korrekt? Vielleicht kann ein anderer Delphi-Kollege mir da helfen? :)


 

function TSwissbitAccess.tsePublicKey(pi : pWormInfo) : String;
var
  publicKey: PPByte;
  publicKeyLength: Pworm_uint;
  n : Integer;
  bytes : TBytes;
begin
  GetMem(publicKeyLength, 10);
  GetMem(publicKey, 20);

  worm_info_tsePublicKey(pi, publicKey, publicKeyLength);

  SetLength(bytes, (serialNumberLength^)-1);
  for n := 0 to (serialNumberLength^)-1 do begin
    bytes[n] := serialNumber^[n];
  end;

  Result := TNetEncoding.Base64.EncodeBytesToString(bytes);
end;

 


Danke und VG

Kevin


1 Person hat diese Frage

octet
Notwendige Informationen auf der Rechnung
TSE-Seriennummer - Finish-Transaktion (worm_info_tseSerialNumber-Diese Seriennummer muss als octet dargestellt werden)
Hat das schon jemand gemacht? Ist das so richtig von mir?

-------------------------------------------------------------------------------------------------------------------------------------

public string mytseSerialNumber_2()
 {
            worm_info_tseSerialNumber(info, out var intptr, out var count);

            byte[] Seriennummer = new byte[count];
          
            Marshal.Copy(intptr, Seriennummer, 0, count);

            string bitString = ByteArrayToHexStringViaStringJoinArrayConvertAll(Seriennummer);

            //string bitString = Convert.ToBase64String(Seriennummer);
                      
            return bitString;
        }

        static string ByteArrayToHexStringViaStringJoinArrayConvertAll(byte[] bytes)
        {
            return string.Join(string.Empty, Array.ConvertAll(bytes, b => b.ToString("X2")));
        }

@Dennis Glittenberg

Dennis, hast Du mal ein Beispiel wie Du das mit dem DLL einbinden in Delphi machst?
Stehe auf dem Schlauch ;-)


Hallo,


wir benutzen ein Tablet als mobile Kasse für den Einsatz im Heimdienst(fester Kundenstamm)

Das ganze wurde auf Delphi XE4 entwickelt und läuft auf Windows 10.


Natürlich müssen wir auch TSE einsetzen und ich habe echt keine Ahnung wie ich die

Funktionen der DLL aufrufen kann da ich bisher überhaupt nicht damit gearbeitet habe.

Das dynamische einbinden der DLL hat geklappt, beim einbinden Funktionen hört es aber dann auf

Es wäre echt schön wenn einer von euch ein zusammenhängendes Beispiel hat wie er z.B. die Seriennummer  aufruft.


DANKE!!!


Hallo Jürgen,


das sollten wir doch hinkriegen :)



Ich hab mal versucht dir das zusammen zuschreiben auch insbesondere mit dem Init.

  

function TSwissbitAccess.Init(driveletter : char) : WormError;
var
  s : UTF8String;
  mountPoint : PUTF8Char;
  err : WormError;
  serialNumber: PPByte;
  serialNumberLength: Pworm_uint;
  n : Integer;
 s : String;
begin

  GetMem(ppContext, 2000 );
  GetMem(mountPoint, 5); // TODO: notwendig?

  s := UTF8String(driveletter + ':');
  mountPoint := pUTF8Char(s);           // TODO: notwendig?

  err := worm_init(ppContext, mountPoint);

  if (err = WORM_ERROR_NOERROR) then
    begin
      pContext := ppContext^;

      pInfo := worm_info_new(pContext);
      err := worm_info_read(pinfo);

     GetMem(serialNumberLength, 10);
     GetMem(serialNumber, 20);

     worm_info_tseSerialNumber(pi, serialNumber, serialNumberLength);

     s := '';
     for n := 0 to (serialNumberLength^)-1 do begin
       s := s+IntToHex(serialNumber^[n], 2);
    end;

    end;
  Result := err;
end;

  Funktionsdeklarationen für die TSE

  

const
  LIBWORMAPI = 'wormapi.dll';
  _PU = '';

function worm_init(context: PPWormContext; mountPoint: PUTF8Char): WormError; stdcall;
  external LIBWORMAPI name _PU + 'worm_init';

function worm_info_new(context: PWormContext): PWormInfo; stdcall;
  external LIBWORMAPI name _PU + 'worm_info_new';

function worm_info_read(info: PWormInfo): WormError; stdcall;
  external LIBWORMAPI name _PU + 'worm_info_read';

procedure worm_info_tseSerialNumber(info: PWormInfo; serialNumber: PPByte; serialNumberLength: Pworm_uint); stdcall;
  external LIBWORMAPI name _PU + 'worm_info_tseSerialNumber';

  

Bei Fragen gerne einfach fragen.


Schöne Grüße

Zwei Fragen dazu:

  • Die S/N als Octet mit Bindestrichen (so bekommt mans in c#) oder ohne?
  • Beim PubKey steht's dabei, dass es Bse64-codiert sein soll. Bei der Signatur aber nicht. Ist diese sicher auch base64-codiert anzugeben? In QR-Code (ja) aber auch im Export?


Die s/n schaut bei uns so aus:

C8-D1-92-4F-23-9A-F0-7E-CB-DB-43-B7-0F-F4-F1-6F-29-6D-49-72-C7-EE-8F-B7-37-9B-40-BF-2A-93-F2-31


Beispielhafte Signatur (octet):

51-ED-0C-9A-2D-35-31-31-4A-90-08-9D-10-B8-81-56-37-0D-8C-23-4F-06-0B-58-07-B6-1E-1B-20-F1-61-A1-87-66-36-1F-50-2F-E4-E0-2B-15-39-48-7B-0E-62-8D-46-E2-E1-CD-49-CD-4A-95-43-6E-D0-8B-E3-72-3B-BB-FE-68-37-F5-F8-B0-09-41-25-66-99-CD-68-1B-3F-D1-9B-45-E5-CA-65-1A-87-57-F1-ED-B2-5F-52-BC-D0-99


Als Base64 encodiert:

NTEtRUQtMEMtOUEtMkQtMzUtMzEtMzEtNEEtOTAtMDgtOUQtMTAtQjgtODEtNTYtMzctMEQtOEMtMjMtNEYtMDYtMEItNTgtMDctQjYtMUUtMUItMjAtRjEtNjEtQTEtODctNjYtMzYtMUYtNTAtMkYtRTQtRTAtMkItMTUtMzktNDgtN0ItMEUtNjItOEQtNDYtRTItRTEtQ0QtNDktQ0QtNEEtOTUtNDMtNkUtRDAtOEItRTMtNzItM0ItQkItRkUtNjgtMzctRjUtRjgtQjAtMDktNDEtMjUtNjYtOTktQ0QtNjgtMUItM0YtRDEtOUItNDUtRTUtQ0EtNjUtMUEtODctNTctRjEtRUQtQjItNUYtNTItQkMtRDAtOTk=


PublicKey:

MDQtNjgtMEMtNTAtMDEtNTUtOUQtMzQtNzMtRDctMkMtMkItODYtNjMtMzQtQjItMDgtNTAtRkQtNkUtODMtMjEtNTAtMTItQjItQzktOTQtNjMtNDItRTktMkYtMDEtRTctMTYtRjAtNDUtOTUtNUMtNDUtNDUtRDgtMTUtNjktQ0EtQTQtQjEtMzYtQzMtQzUtMDgtNkItNEQtRDAtNDYtRTYtRjEtQ0QtMEItMUEtMEEtQUItQjctMjYtOEItODQtMkQtNDEtQjQtQjctOTYtRjctRkItQzgtMjctQkItQzgtMUItQkYtMUYtNDAtNjMtNEEtOTQtNUMtOUEtQTctMDMtRTYtNUMtNzgtNjQtNDMtMTEtMjEtN0MtQ0EtRkY=

function worm_init(context: PPWormContext; mountPoint: PUTF8Char): WormError; stdcall;
  external LIBWORMAPI name _PU + 'worm_init';

Hallo Kevin:

ich habe ein Problem mit dm worm_init.


kannst du mir bitte sagen, wie du

PPWormContext   und  PWormContext deklariert hast?


danke!

Hallo MadjidV,


ich habe die Funktion wie folgt deklariert: 

 

TWorm_init = function (out context: Pointer; driverLetter: PAnsiChar): Integer;stdcall;

 Somit kann ich die Funktion dann so aufrufen: 

 

Result := worm_init(context, driverLetter);

 

Dennis

@Texh Nick -> Darstellung der Seriennr als Octet String
Hast Du schon eine Antwort bezüglich zur Darstellung? Ich hatte als Darstellung statt dem "-" ein Leerzeichen.
Vielleicht ist es auch egal welcher Trenner genommen wird.
Und mit welchem Befehl bekommst DU in C# ein fertigen Octet String?
Ich lese die Bytes einzeln...


Danke für die Antwort
Stefan

Mahlzeit,


und wo zum Henker wird das geheimnisvolle "Oktettformat" beschrieben ?

Ich hatte noch nie soviel "Ratespaß" wie mit der Dokumentation von Swissbit/Gastrmis,

wenn die Bemerkung erlaubt ist.

MfG

Hallo Andreas,
hier können GastroMIS/ Swissbit doch auch nix für. In der Beschreibung des BSI https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03153/TR-03153.pdf?__blob=publicationFile steht auch nichts anderes als "muss als Octet-String" ausgegeben werden. Und GstroMIS hat ja schon erläutert das das die Hexwerte des PKey sind. Eigentlich bleibt nur die Frage der Darstellung, Trenner oder nicht. Wahrscheinlich ist das sogar egal...


Stefan

@stefan: system.BitConverter.ToString(value) - wobei value das byte-array ist.

@Tech Nick
mein Danke fehlte noch ...

Hallo Kevin,


da ich in Borland Delphi 5 noch programmiere muss ich das ein oder andere umprogrammieren.


Kannst du mir bitte sagen, wie du

PPWormContext   und  PWormContext deklariert hast?


Leider hast du oben nichts dazu geschrieben


PWormContext   :   ????

PPWormContext    :   ????


Vielen Dank

Context und WINFO Mahlzeit,


die Objekte Context und Winfo vereinbare ich als IntPtr.

Allerdings benutze ich Delpi X


Anmelden oder Registrieren um einen Kommentar zu veröffentlichen