Asn1API

Une Asn1API est une librairie contenant tout le matériel nécessaire à l'encodage et au décodage de données respectant un schéma ASN.1. Elle comprend un runtime ASN.1 qui regroupe les primitives de codage/décodage des types de base.

Elles sont disponibles en Java et C#.

Le développeur intègre directement dans son application la librairie et le runtime.

Contenu de la librairie Asn1API

Les classes Java ou C# issues du schéma ASN.1/XML. Elles sont produites par Asn1Compiler.

Le runtime de codage/décodage.

Le guide d'utilisation décrit les packages et namespaces, détaille les méthodes d'accès aux classes Java ou C# ainsi que les procédures de codage/décodage.

La documentation des classes au format javadoc ou MSDN-style HTML Help.

Des exemples d'utilisation.

Les API disponibles

3GPP

CDR_3GPP, CDR_3GPP_32298, TAP3,

NBAP, HNBAP, RANAP, RUA, RNSAP, SABP, SBCAP, URRC, PCAP, MAP, RRLP, PMF_3GPP, LTE_RRC, LTE_S1AP, LTE_X2AP

ECMA

CSTAp1, CSTAp2, CSTAp3, CSTAp3XML

ETSI

ETSI_LI, ITS

ITU-T

H245, H323, T120, MEGACO, E115

ISO

MMS, Z39.50, FTAM, RFID

IETF

LDAPv3, SNMPv2, CMS, PKIX

OASIS

XCBF

Open Mobile Alliance

SUPL, USUPL

Exemple

Voici un exemple Java et C# d'utilisation d'API générée à partir du fichier sample.asn1 :

SampleModule 
DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
MainStruct ::= SEQUENCE {
name IA5String,
age INTEGER
}
END

Les fichiers générés principaux sont :

  • Sample/src/java/Sample/SampleFactory.java
  • Sample/src/java/samplemodule/MainStruct.java

SampleFactory est une classe qui permet la gestion de l'API notamment la création des encodeurs et décodeurs. MainStruct est la classe associée au type ASN.1 MainStruct. Elle contient notamment les méthodes set/get pour accéder aux valeurs des composantes "name" et "age". Un exemple d'utilisation est :

import com.unigone.asn1RT.IDecoder;
import com.unigone.asn1RT.IEncoder;
import com.unigone.asn1RT.Asn1Exception;
import com.unigone.asn1RT.util.ByteArray;

import Sample.*;
import Sample.samplemodule.*;

...

/* encoder/decoder creation */
_encoder = SampleFactory.createEncoder();
_decoder = SampleFactory.createDecoder();

// fill a value
MainStruct mainStruct = new MainStruct();
mainStruct.setName("ABC");
mainStruct.setAge(7);

try
{
// ensure type is valid before encoding it
mainStruct.validate();
// Encode data (it could be written directly into a stream)
_encoder.encode(mainStruct);
}
catch (Asn1ValidationException avex)
{
System.out.println("ERROR WHILE VALIDATING pdu : "
+ avex.getMessage());
return;
}
catch (Asn1Exception aex)
{
System.out.println("ERROR WHILE ENCODING pdu : "
+ aex.getMessage());
return;
}

// dump data
System.out.println("mainStruct encoding :");
byte[] mainStruct_encoding = _encoder.getData();
System.out.println(ByteArray.byteArrayToHexString(mainStruct_encoding, null, -1));

// decode an encoding
mainStruct = new MainStruct();
try
{
// Decode data (it could be read directly from a stream).
_decoder.decode(mainStruct_encoding, mainStruct);
// ensure type is valid
mainStruct.validate();
}
catch (Asn1ValidationException avex)
{
// display already decoded values...
System.out.println(mainStruct.toString());
System.out.println("ERROR WHILE VALIDATING pdu : "
+ ex.getMessage());
return;
}
catch (Asn1Exception aex)
{
// display already decoded values...
System.out.println(mainStruct.toString());
System.out.println("decoder stopped at "+_decoder.usedBytes());
System.out.println("ERROR WHILE DECODING pdu : "
+ aex.getMessage());
return;
}

// access the value
String _name = mainStruct.getName();
long _age = mainStruct.getAge();

// using toString() with mainStruct
System.out.println(mainStruct.toString());

Les fichiers générés principaux sont :

  • Sample/src/cSharp/Sample/SampleFactory.cs
  • Sample/src/cSharp/SampleModule/MainStruct.cs

SampleFactory est une classe qui permet la gestion de l'Asn1API notamment la création des encodeurs et décodeurs. MainStruct est la classe associée au type ASN.1 MainStruct. Elle contient notamment les properties C# pour accéder aux valeurs des composantes "name" et "age". Un exemple d'utilisation est :

using IEncoder = Unigone.Asn1RT.IEncoder;
using IDecoder = Unigone.Asn1RT.IDecoder;
using Asn1Exception = Unigone.Asn1RT.Asn1Exception;
using ByteArray = Unigone.Asn1RT.Util.ByteArray;

using Sample;
using Sample.SampleModule;

...

/* encoder/decoder creation */
_encoder = SampleFactory.CreateEncoder();
_decoder = SampleFactory.CreateDecoder();

// fill a value
MainStruct mainStruct = new MainStruct();
mainStruct.Name = "ABC";
mainStruct.Age = 7;

try
{
// ensure type is valid before encoding it
mainStruct.Validate();
// Encode data (it could be written directly into a stream)
_encoder.Encode(mainStruct);
}
catch (Asn1ValidationException avex)
{
Console.Out.WriteLine("ERROR WHILE VALIDATING pdu : "
+ avex.Message);
return;
}
catch (Asn1Exception aex)
{
Console.Out.WriteLine("ERROR WHILE ENCODING pdu : "
+ aex.Message);
return;
}

// dump data
Console.Out.WriteLine("mainStruct encoding :");
byte[] mainStruct_encoding = _encoder.Data;
Console.Out.WriteLine(ByteArray.ByteArrayToHexString(mainStruct_encoding, null, -1));

// decode an encoding
mainStruct = new MainStruct();
try
{
// Decode data (it could be read directly from a stream).
_decoder.Decode(mainStruct_encoding, mainStruct);
// ensure type is valid
mainStruct.Validate();
}
catch (Asn1ValidationException avex)
{
// display already decoded values...
Console.Out.WriteLine(mainStruct.ToString());
Console.Out.WriteLine("ERROR WHILE VALIDATING pdu : "
+ avex.Message);
return;
}
catch (Asn1Exception aex)
{
// display already decoded values...
Console.Out.WriteLine(mainStruct.ToString());
Console.Out.WriteLine("decoder stopped at "+_decoder.UsedBytes());
Console.Out.WriteLine("ERROR WHILE DECODING pdu : "
+ aex.Message);
return;
}

// access the value
string _name = mainStruct.Name;
long _age = mainStruct.Age;

// using ToString() with mainStruct
Console.Out.WriteLine(mainStruct.ToString());