proximus.c
上传用户:mei_mei897
上传日期:2007-01-05
资源大小:82k
文件大小:6k
源码类别:

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* proximus.c */
  5. /* */
  6. /*  Copyright (C) 1998 */
  7. /* */
  8. /*  This library is free software; you can redistribute it and/or */
  9. /*  modify it under the terms of the GNU Library General Public */
  10. /*  License as published by the Free Software Foundation; either */
  11. /*  version 2 of the License, or (at your option) any later version. */
  12. /* */
  13. /*  This library is distributed in the hope that it will be useful, */
  14. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of */
  15. /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU */
  16. /*  Library General Public License for more details. */
  17. /* */
  18. /*  You should have received a copy of the GNU Library General Public */
  19. /*  License along with this library; if not, write to the Free */
  20. /*  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  21. /* */
  22. /*  You can contact the author at this e-mail address: */
  23. /* */
  24. /*  xavier@bru-noc.net */
  25. /* */
  26. /* -------------------------------------------------------------------- */
  27. /* $Id$
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <string.h>
  31. #include "common.h"
  32. #include "logfile.h"
  33. #include "driver.h"
  34. #include "expect.h"
  35. #include "sms_error.h"
  36. #include "sms_resource.h"
  37. /* -------------------------------------------------------------------- */
  38. /* -------------------------------------------------------------------- */
  39. static struct proximus_env
  40. {
  41. DRIVER_DEFAULT_ENV def;
  42. } driver_env;
  43. static  RESOURCE resource_list[] = 
  44. {
  45. { RESOURCE_STRING,  "SMS_comms_params",  0, 1, NULL, 0,  "8N1",  0,   &(driver_env.def.comms_params)   },
  46. { RESOURCE_STRING,  "SMS_centre_number",  0, 1, NULL, 0,  NULL,   0,   &(driver_env.def.centre_number)   },
  47. { RESOURCE_NUMERIC, "SMS_baud",  0, 1, NULL, 0,  NULL,   9600,   &(driver_env.def.baud)   },
  48. { RESOURCE_NUMERIC, "SMS_deliver_timeout",  0, 0, NULL, 0,  NULL,   30,   &(driver_env.def.deliver_timeout)   },
  49. { RESOURCE_NUMERIC, "SMS_timeout",  0, 0, NULL, 0,  NULL,   10,   &(driver_env.def.timeout)   },
  50. { RESOURCE_NUMERIC, "SMS_write_timeout",  0, 0, NULL, 0,  NULL,   10,   &(driver_env.def.write_timeout)   },
  51. { RESOURCE_NUMERIC, "SMS_max_deliver",  0, 0, NULL, 0,  NULL,   0,   &(driver_env.def.max_deliver)          },
  52. { RESOURCE_NULL,     NULL,  0, 1, NULL, 0,  NULL,   0,   NULL   }
  53. };
  54. /* -------------------------------------------------------------------- */
  55. #define DELIVERTIMEOUT  (driver_env.def.deliver_timeout)
  56. #define TIMEOUT  (driver_env.def.timeout)
  57. #define WRITETIMEOUT  (driver_env.def.write_timeout)
  58. /* -------------------------------------------------------------------- */
  59. #define FD (driver_env.def.fd)
  60. /* -------------------------------------------------------------------- */
  61. #define MAX_ENVELOPE  64
  62. #define MAX_NUMBER 20
  63. #define MAX_MOBILENUM 20
  64. #define MAX_MESSAGE 512
  65. #define MAX_TAPMESSAGE 150
  66. #define MAX_BUFSIZE 1024
  67. #define EPROXIMUS_NORESPONSE -1
  68. /* -------------------------------------------------------------------- */
  69. static char buf[MAX_BUFSIZE +1];
  70. /* -------------------------------------------------------------------- */
  71. static void PROXIMUS_buildmessage(char *, char *, char *);
  72. static int  PROXIMUS_sendmessage(char *, char *);
  73. static void PROXIMUS_hangup(void);
  74. /* -------------------------------------------------------------------- */
  75. /* -------------------------------------------------------------------- */
  76. static void PROXIMUS_hangup(void)
  77. { default_hangup((DRIVER_DEFAULT_ENV *)(&driver_env));
  78. }
  79. /* -------------------------------------------------------------------- */
  80. /* -------------------------------------------------------------------- */
  81. static void PROXIMUS_buildmessage(char *proximus_message, char *msisdn, char *message)
  82. {
  83. int  i, j, k;
  84. char buf       [512];
  85. char Originator[10];  /* Phone number of the originator, must be null */
  86. char TextDest  [256]; /* Test to be sent to the GSM */
  87. char TelDest   [20];  /* GSM number of the destination (3275695600) */
  88. char Len2String[6];
  89. char ChecksumString[512];
  90. int  TranNum;         /* Integer which identifiy the message sequence */
  91. char SendString[512]; /* String sent to the SMS-C */
  92. char TextConv  [512];
  93. /* ---------------------------- */
  94. proximus_message[0] = '';
  95.         Originator [0] = '';
  96. TextConv   [0] = '';
  97. sms_strcpy(TelDest, msisdn);
  98.         sms_strcpy(TextDest, message);
  99. /* Convert text */
  100. for (i=0; i < sms_strlen(TextDest); i++)
  101. {
  102. sprintf(buf, "%02X", TextDest[i]);
  103. sms_strcat(TextConv, buf);
  104. }
  105. sprintf(SendString, "/O/01/%s/%s/proximus/3/%s/", TelDest,
  106.                                                    Originator,
  107.                                                    TextConv);
  108. /* Set length of message in a 5 digits string */
  109. sprintf(Len2String, "%05d", sms_strlen(SendString) + 10);
  110. /* Set message sequence in a 2 digites string */
  111. TranNum = 1;
  112. sprintf(ChecksumString, "%02d/%s%s", TranNum, Len2String, SendString);
  113. /* Calculate checksum */
  114. j = 0;
  115. for (i=0; i < sms_strlen(ChecksumString); i++)
  116. {
  117. k = ChecksumString[i];
  118. j += k;
  119. if (j >= 256)
  120. { j -= 256;
  121. }
  122. }
  123. sprintf(buf, "%02X", j);
  124. /* Compile string to be send */
  125. sprintf(proximus_message, "%c%s%s%c", 2, ChecksumString, buf, 3);
  126. }
  127. /* -------------------------------------------------------------------- */
  128. /* -------------------------------------------------------------------- */
  129. static int PROXIMUS_sendmessage(char *msisdn, char *message)
  130. {
  131. char  proximus_message[MAX_MESSAGE + MAX_ENVELOPE];
  132. PROXIMUS_buildmessage(proximus_message, msisdn, message);
  133. twrite(FD, proximus_message, sms_strlen(proximus_message), WRITETIMEOUT);
  134. if (expstr(FD, buf, "01/00019", MAX_BUFSIZE, DELIVERTIMEOUT) == 0)
  135. {
  136. lprintf(LOG_STANDARD, "Received Message Responsen"
  137.                       "SMSC Respsonse: %sn", buf);
  138. }
  139. else
  140. { lprintf(LOG_STANDARD, "No Message Responsen");
  141. PROXIMUS_hangup();
  142. return EPROXIMUS_NORESPONSE;
  143. }
  144. return 0;
  145. }
  146. /* -------------------------------------------------------------------- */
  147. /* -------------------------------------------------------------------- */
  148. DEVICE_ENTRY proximus_device = {
  149. "PROXIMUS",
  150. resource_list,
  151. (DRIVER_DEFAULT_ENV *)(&driver_env),
  152. default_init,
  153. default_main,
  154. default_validate_numeric_id,
  155. default_dial,
  156. default_hangup,
  157. default_send_disconnect,
  158. default_single_deliver,
  159. PROXIMUS_sendmessage,
  160. default_login
  161. };