Flow Group SASFlow Group
L'erp des Processus Relationnels
Systeme d'Information – Audit Industriel
> Accueil > Expertises & Savoirs > Articles techniques
<div class="infotip"><b>Espace client&#160;:</b> <a href="login.aspx">suivez ce lien</a> pour entrer dans l'espace qui vous est réservé.</div>

Articles technique


Utilisation de sipXtapi avec .Net

read the English version English version

Définition de la classe d'interop
Interop sur les callback
Quelques liens utiles...

Le SDK sipXtapi est une API écrite en C pour de la voix sur IP. En particulier, sipXtapi fournit une interface générique au dessus de SIP (Session Initiation Protocol), RFC 3261, et RTP (real-time Transport Protocol), RFC 1889.

Alors que les protocoles SIP et RTP fournissent l'infrastructure de notification et de transport, sipXtapi inclus aussi bien d'autres protocoles et implémentation standard nécessaire à la voie sur IP.

Définition de la classe d'interop

La définition des types énumérés et l'encapsulation des méthodes ne pose aucun problème particulier :

using System; using System.Runtime.InteropServices; namespace sipXtapi.Interop { /// <summary> /// /// </summary> public enum SIPX_RESULT : int { SIPX_RESULT_SUCCESS = 0, // Success SIPX_RESULT_FAILURE, // Generic Failure SIPX_RESULT_NOT_IMPLEMENTED, // Method/API not implemented SIPX_RESULT_OUT_OF_MEMORY, // Unable to allocate enough memory // to perform operation SIPX_RESULT_INVALID_ARGS, // Invalid arguments; bad handle, // argument out of range, etc. SIPX_RESULT_BAD_ADDRESS, // Invalid SIP address SIPX_RESULT_OUT_OF_RESOURCES, // Out of resources } /// <summary> /// /// </summary> public enum SIPX_LOG_LEVEL : int { LOG_LEVEL_DEBUG = 0, ///< debug-level messages LOG_LEVEL_INFO, ///< informational messages LOG_LEVEL_NOTICE, ///< normal, but significant, /// conditions LOG_LEVEL_WARNING, ///< warning conditions LOG_LEVEL_ERR, ///< error conditions LOG_LEVEL_CRIT, ///< critical conditions LOG_LEVEL_ALERT, ///< action must be taken /// immediately LOG_LEVEL_EMERG, ///< system is unusable } ... /// <summary> /// /// </summary> public sealed class sipXtapi { private const string DLLNAME = "sipXtapi.dll"; // Default UDP port public const int DEFAULT_UDP_PORT = 5060; ... // Bind to all interfaces public const string DEFAULT_BIND_ADDRESS = "0.0.0.0"; private sipXtapi() { } /// <summary> /// /// </summary> /// <param name="result"></param> public static void CheckResult(SIPX_RESULT result) { if (result == SIPX_RESULT.SIPX_RESULT_SUCCESS) return; throw new sipXtapi.SIPException(result); } [DllImport(DLLNAME)] public static extern SIPX_RESULT sipxInitialize(ref IntPtr instance, int udpPort, int tcpPort, int tlsPort, int rtpPortStart, int maxConnections, string identity, string szBindToAddr); [DllImport(DLLNAME)] public static extern SIPX_RESULT sipxUnInitialize(IntPtr instance); ... } }

Interop sur les callback

Le seul problème que l'on peut rencontrer concerne les callback qui sont en convention C pour les appels. Or, il n'est pas possible d'utiliser un attribut pour modifier la convention d'appel.

L'astuce consiste donc a écrire la déclaration des callback dans un fichier a part, qui sera compilé comme un assembly séparé.

using System; namespace sipXtapi.Interop.Delegates { public delegate void EventCallBackDelegate(UInt32 hCall, UInt32 hLine, Int32 eMajor, Int32 eMinor, IntPtr userData); public delegate void LineCallBackDelegate(UInt32 hLine, Int32 eMajor, IntPtr userData); }

Ensuite, il faut compiler le fichier et le désassembler :

c:\sipXtapi.net>csc /target:library sipXtapi.delegates.cs¶
¶
c:\sipXtapi.net>ildasm /all sipXtapi.delegates.dll /out=sipXtapi.delegate
s.il¶
// WARNING: Created Win32 resource file sipXtapi.delegates.res¶

Puis, il faut ajouter la convention d'appel C au niveau des méthodes Invoke :

.namespace sipXtapi.Interop.Delegates { .class /*02000002*/ public auto ansi sealed EventCallBackDelegate extends [mscorlib/* 23000001 */]System.MulticastDelegate/* 01000001 */ { .method /*06000001*/ public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed // SIG: 20 02 01 1C 18 { } // end of method EventCallBackDelegate::.ctor .method /*06000002*/ public hidebysig virtual instance void modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) Invoke(unsigned int32 hCall, unsigned int32 hLine, int32 eMajor, int32 eMinor, native int userData) runtime managed // SIG: 20 05 01 09 09 08 08 18 { } // end of method EventCallBackDelegate::Invoke ... }

Enfin, il ne reste plus qu'à ré-assembler le fichier :

c:\sipXtapi.net>ilasm /dll /quiet sipXtapi.delegates.il¶
¶
Assembling 'sipXtapi.delegates.il' , no listing file, to DLL --> 'sipXtap
i.delegates.DLL'¶
Source file is ANSI¶
¶
Operation completed successfully¶
Pour information

Il n'est pas obligatoire de déclarer les callback dans un assembly séparé. C'est juste plus pratique car, comme ce fichier change moins, il n'est pas nécessaire de répéter les étapes manuelles à chaque compilation.

Quelques liens utiles...


les informations fournies ici le sont en tant que telles, sans aucune garantie d'aucune sorte.
© 2022 Flow Group SAS - Flow Group est une marque déposée de GL Conseil SA.