SMS avec TAPI - Stp help me!!!

SMS avec TAPI - Stp help me!!! - C++ - Programmation

Marsh Posté le 21-07-2004 à 12:30:20    

Salut à tous,  
j'voudrais utiliser TAPI pour envoyer des sms et de la donnée via n'importe quel modem, au moins ceux qui sont compatible avec TAPI. A part les fonctions comme lineInitialize(...) et lineOpen(...) que je sais à peu pret utiliser, j'en connais pas d'autre. Bien sûr, la MSDN de Microsoft nous donne tout un tas de fonctions utiles mais y'a aucun exemple concret. Alors si quelqu'un à au moins déjà utilisé TAPI dans le passé, qu'il me fasse signe svp.
P.S.: le_zell, t'aurais pas fais un stage à la SNCF par hazard en 2003???

Reply

Marsh Posté le 21-07-2004 à 12:30:20   

Reply

Marsh Posté le 21-07-2004 à 12:52:49    

Juste une question pour ma culture perso.
T'es sur qu'il est possible d'envoyer des SMS avec un modem ?  ;)

Reply

Marsh Posté le 21-07-2004 à 12:59:04    

Je ne parle pas de modem GSM ou GPRS bien sur !

Reply

Marsh Posté le 21-07-2004 à 14:01:29    

comme tu dis, on peux envoyer des SMS qu'avec des modems GSM ou GPRS comme par exemple des modems WAVECOM WMOD2 qui utilisent les commandes HAYES ("AT+..." ).

Reply

Marsh Posté le 21-07-2004 à 14:23:24    

sinon, quelqu'un aurait'il déjà experimenté l'interface TAPI? merci...

Reply

Marsh Posté le 21-07-2004 à 14:37:38    

J'ai utilisé TAPI l'été dernier, mais c'était pour développer une application de monitoring de ligne téléphonique numérique. Je ne connais pas bien les possibilités de TAPI avec des interfaces GSM. Par contre le code d'ouverture de ligne doit être le même, je regarderai ce soir si je peux le retrouver chez moi (j'ai changé de boîte entre temps).
 
C'est très dur de trouver des exemples vraiment utilisables sur le net, je me souviens m'être inscrit à un newsgroup qui m'avait bien aidé (je rechercherai les coordonnées) et j'avais commandé un bouquin aux US (qui n'a pas été traduit) écrit par l'un des créateurs de TAPI et qui était pas trop mal.
 
Donc tout ça pour dire que je chercherai mes codes ce soir (ou demain soir) mais ça ne concernera que les initialisations et ouvertures de ligne, faudra que tu te débrouilles pour l'envoi de SMS ;) (mon application ne faisait qu'écouter et envoyer un callback en cas d'appel reçu)
 
Bon courage

Reply

Marsh Posté le 21-07-2004 à 14:41:49    

ok, je te remercie d'avance pilou. bonne soirée

Reply

Marsh Posté le 21-07-2004 à 14:53:41    

Bon correction, j'avais mon code dans mes MP, on me l'avait déjà demandé :p
 
Donc le code de détection des appels entrants :  

Code :
  1. :
  2.   #include <stdio.h>
  3.   #include <stdlib.h>
  4.   #include <windows.h>
  5.   #include <tapi.h>
  6.   #include "entrant.h"
  7.  
  8.   // Valeur de retour de succès des méthodes TAPI = 0  
  9.   #define SUCCESS 0
  10.  
  11.   // Constructeur par défaut  
  12.   Centrant::Centrant(){
  13.      m_hLineApp=NULL;
  14.      m_hCall=NULL;
  15.      m_hLine=NULL;
  16.      m_dwNumDevs=0;
  17.      m_dwDeviceID=0;
  18.      m_dwAPIVersion = 0x00020000;// Ici 2.0 pour l'Alcate  
  19.      m_dwRequestedID = 0;
  20.      m_lAsyncReply = 0;
  21.      m_bShuttingDown = 0;
  22.      m_bStoppingCall = 0;
  23.      m_bInitializing = FALSE;
  24.      m_bReplyReceived = FALSE;
  25.      m_bTapiInUse = FALSE;
  26.      m_bInitialized = FALSE;
  27.      memset(&(lip), 0, sizeof (lip));
  28.      lip.dwOptions = NULL;
  29.      lip.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
  30.      lip.dwTotalSize = sizeof(lip);
  31.   }
  32.    
  33.   // Destructeur  
  34.   Centrant::~Centrant(){}
  35.  
  36.   // Unique instance globale de la classe Centrant  
  37.   Centrant App;
  38.  
  39.  
  40.   void FindCallerNumber (HCALL hCall, char *pOut, int size) {
  41.      int len;
  42.      char *pIn;
  43.      union {
  44.         char c[1024];
  45.         LINECALLINFO lci;
  46.      } u;
  47.    
  48.      memset(pOut, 0, size);
  49.      size = size - 1;
  50.      memset(&u.lci, 0, sizeof(u));
  51.      u.lci.dwTotalSize = sizeof (u);
  52.    
  53.      if (lineGetCallInfo(hCall, &u.lci) == 0) {
  54.         pIn = (char*)&u.lci;
  55.         pIn += u.lci.dwCallerIDOffset;
  56.         len = u.lci.dwCallerIDSize;
  57.      
  58.         if (size > len) size = len;
  59.           memcpy (pOut, pIn, size);
  60.      }
  61.   }
  62.  
  63.   // Fonction Callback  
  64.   void Centrant::HandleLineCallState(DWORD dwDevice, DWORD dwMessage, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3) {
  65.      char chaine[100] = "http://gpl/prod/formulaires/appelentrant.php?num=";
  66.      char pOut[20];
  67.      if (dwMessage == LINE_APPNEWCALL && dwParam1 == LINECALLSTATE_OFFERING) {
  68.         FindCallerNumber((HCALL)dwParam2, pOut, 1024);
  69.         strcat(chaine, pOut);
  70.         // Vérification du numéro entrant (bugs de l'OmniPCX + numéros cachés)  
  71.         if (strcmp(pOut, "10" ) && pOut[0] == '0') ShellExecute(NULL, "open", "c:/progra~1/Plus!/Micros~1/IEXPLORE.EXE", chaine, NULL, SW_SHOWNA);
  72.        }
  73.   }
  74.  
  75.   // Fonction de test d'erreur à la création du hLineApp  
  76.   BOOL Centrant::HandleLineErr(long lLineErr)
  77.   {
  78.      BOOL bRet=FALSE;
  79.    
  80.      if(lLineErr > SUCCESS)
  81.         return bRet;
  82.    
  83.      switch(lLineErr)
  84.      {
  85.        case SUCCESS:
  86.         bRet=TRUE;
  87.         break;
  88.        case LINEERR_INVALCARD: // Erreurs non gérée sur une ligne RNIS  
  89.        case LINEERR_INVALLOCATION:
  90.        case LINEERR_INIFILECORRUPT:
  91.         printf("Valeurs du fichier de configuration invalides\n" );
  92.         break;
  93.        case LINEERR_NODRIVER:
  94.         printf("Problème avec le driver de téléphonie\n" );
  95.         break;
  96.        case LINEERR_REINIT:
  97.         printf("Reinitialisation\n" );
  98.         break;
  99.        case LINEERR_NOMULTIPLEINSTANCE:
  100.         printf("Supprimez une des copies du driver de téléphonie\n" );
  101.         break;
  102.        case LINEERR_NOMEM:
  103.         printf("Pas assez de mémoire, abandon de l'opération\n" );
  104.         break;
  105.        case LINEERR_OPERATIONFAILED:
  106.         printf("L'opération de TAPI a échoué\n" );
  107.         break;
  108.        case LINEERR_RESOURCEUNAVAIL:
  109.         printf("Une ressource TAPI est actuellement indisponible\n" );
  110.         break;
  111.        default:
  112.         printf("Erreur survenue lors du HandleLineErr()" );
  113.         break;
  114.      }
  115.      return bRet;
  116.   }
  117.  
  118.   // Fonction de création de l'objet hLineApp  
  119.   BOOL Centrant::Create() {
  120.      long lReturn, lReturn2;
  121.      if (m_hLineApp) return TRUE;
  122.        if (m_bInitializing) return FALSE;
  123.        m_bInitializing = TRUE;
  124.      //Initilisation de TAPI  
  125.      do {
  126.         lReturn = ::lineInitializeEx(&(m_hLineApp), NULL, NULL/*lineCallbackFunc*/, "Appel entrant", &m_dwNumDevs, &m_dwAPIVersion, &lip);
  127.         if (m_dwNumDevs == 0) {
  128.            m_bInitializing = FALSE;
  129.            printf("Erreur de NumDevs", lReturn);
  130.            return FALSE;
  131.         }
  132.         if (HandleLineErr(lReturn)) continue;
  133.         else {
  134.            printf("Erreur d'initialisation de la ligne\n" );
  135.            m_bInitializing = FALSE;
  136.            return FALSE;
  137.         }
  138.      }
  139.      while (lReturn != SUCCESS);
  140.      // Ouverture de la ligne RNIS à écouter (DeviceID 0)  
  141.      lReturn2 = lineOpen(m_hLineApp, 0, &m_hLine, m_dwAPIVersion, 0, NULL, LINECALLPRIVILEGE_MONITOR, NULL, NULL);
  142.      App.m_bInitializing = FALSE;
  143.      printf("Connection effectuee ! \n" );
  144.      printf("lReturn : %ld, lReturn2 : %ld, Nombre de peripheriques : %ld\n", lReturn, lReturn2, App.m_dwNumDevs);
  145.      return TRUE;
  146.   }
  147.  
  148.   // Fonction principale  
  149.   int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
  150.      DWORD dwStatus;
  151.      linemessage_tag lmsg;
  152.      HANDLE hTapiEvent = NULL;
  153.      if (!App.Create()) return -1; 
  154.        // Création du handle sur event  
  155.      hTapiEvent = App.lip.Handles.hEvent;
  156.      while (1) {
  157.         printf("En attente d'un event\n" );
  158.         // En attente d'un event  
  159.         dwStatus = WaitForSingleObject(hTapiEvent, INFINITE);
  160.         // Récupération de l'event et traitement  
  161.         dwStatus = lineGetMessage(App.m_hLineApp, &lmsg, 0);
  162.         App.HandleLineCallState(lmsg.hDevice, lmsg.dwMessageID, lmsg.dwCallbackInstance, lmsg.dwParam3, lmsg.dwParam2, lmsg.dwParam3);
  163.      }
  164.      lineShutdown(App.m_hLineApp);
  165.      getchar();
  166.      return 0;
  167.   }


 
et le .h correspondant :  

Code :
  1. class Centrant {
  2.     public
  3.      DWORD m_dwNumDevs;
  4.      DWORD m_dwDeviceID;
  5.      DWORD m_dwRequestedID;
  6.      LONG m_lAsyncReply;
  7.    
  8.      BOOL m_bShuttingDown;
  9.      BOOL m_bStoppingCall;
  10.      BOOL m_bInitializing;
  11.      BOOL m_bReplyReceived;
  12.      BOOL m_bTapiInUse;
  13.      BOOL m_bInitialized;
  14.    
  15.      HLINEAPP m_hLineApp;
  16.      HCALL m_hCall;
  17.      HLINE m_hLine;
  18.      DWORD m_dwAPIVersion;
  19.      char m_szPhoneNumber[20];
  20.      char szLineName[256];
  21.    
  22.      LINEINITIALIZEEXPARAMS lip;
  23.    
  24.      Centrant();
  25.      ~Centrant(); 
  26.      BOOL Create();
  27.      BOOL HandleLineErr(long lLineErr);
  28.      void lineCallbackFunc(DWORD dwDevice, DWORD dwMsg, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3);
  29.      void HandleLineCallState(DWORD dwDevice, DWORD dwMessage, DWORD dwCallbackInstance, DWORD dwParam1, DWORD dwParam2, DWORD dwParam3);
  30.   };


 
Pas de commentaire sur la qualité du code, j'étais jeune (:sol:) et surtout je n'avais jamais fait de C++ avant ça. Et TAPI pour débuter le C++ y'a mieux je pense. :)
 
Voilà j'espère que ça t'aidera, en tout cas ça marchait :hello:

Reply

Marsh Posté le 21-07-2004 à 15:43:32    

ok je te remercie, je vais regarder de plus pres ton code. sympa en tout cas d'avoir cherché.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed