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

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* snpp.c */
  5. /* */
  6. /*  Copyright (C) 1997,1998 Angelo Masci */
  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. /*  angelo@styx.demon.co.uk */
  25. /* */
  26. /* -------------------------------------------------------------------- */
  27. /* $Id$
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <string.h>
  31. #include <unistd.h>
  32. #include <stdlib.h>
  33. #include <errno.h>
  34. #include "common.h"
  35. #include "logfile.h"
  36. #include "driver.h"
  37. #include "expect.h"
  38. #include "sms_error.h"
  39. #include "sms_resource.h"
  40. #include "sms_tcpip.h"
  41. /* -------------------------------------------------------------------- */
  42. static struct snpp_env
  43. {
  44. DRIVER_DEFAULT_ENV def;
  45. /* Place any extended driver */ 
  46. /* variables here  */
  47. char  *server_name;
  48. long server_port;
  49. } driver_env;
  50. /* -------------------------------------------------------------------- */
  51. static  RESOURCE resource_list[] = 
  52. {
  53. { RESOURCE_STRING,  "SMS_comms_params",  0, 0, NULL, 0,  NULL,        0,  &(driver_env.def.comms_params)   },
  54. { RESOURCE_STRING,  "SMS_centre_number",  0, 0, NULL, 0,  NULL,        0,  &(driver_env.def.centre_number)   },
  55. { RESOURCE_NUMERIC, "SMS_baud",  0, 0, NULL, 0,  NULL,        0,  &(driver_env.def.baud)   },
  56. { RESOURCE_NUMERIC, "SMS_deliver_timeout",  0, 0, NULL, 0,  NULL,        30, &(driver_env.def.deliver_timeout)  },
  57. { RESOURCE_NUMERIC, "SMS_timeout",  0, 0, NULL, 0,  NULL,        10, &(driver_env.def.timeout)   },
  58. { RESOURCE_NUMERIC, "SMS_write_timeout",  0, 0, NULL, 0,  NULL,        10, &(driver_env.def.write_timeout)   },
  59. { RESOURCE_STRING,  "SMS_server_name",  0, 1, NULL, 0,  "localhost", 0,  &(driver_env.server_name) },
  60. { RESOURCE_NUMERIC, "SMS_server_port",  0, 1, NULL, 0,  NULL,       444, &(driver_env.server_port) },
  61. { RESOURCE_NULL,     NULL,  0, 1, NULL, 0,  NULL,        0,  NULL   }
  62. };
  63. /* -------------------------------------------------------------------- */
  64. #define DELIVERTIMEOUT  (driver_env.def.deliver_timeout)
  65. #define TIMEOUT  (driver_env.def.timeout)
  66. #define WRITETIMEOUT  (driver_env.def.write_timeout)
  67. /* -------------------------------------------------------------------- */
  68. #define FD (driver_env.def.fd)
  69. /* -------------------------------------------------------------------- */
  70. static int SNPP_login(void);
  71. static int SNPP_sendmessage(char *msisdn, char *message);
  72. static int SNPP_send_disconnect(void);
  73. static void SNPP_hangup(void);
  74. static int SNPP_dial(DRIVER_DEFAULT_ENV *env);
  75. /* -------------------------------------------------------------------- */
  76. /* -------------------------------------------------------------------- */
  77. static int SNPP_dial(DRIVER_DEFAULT_ENV *env)
  78. {
  79. lprintf(LOG_STANDARD, "Connecting to SNPP Server %s:%ld...n", 
  80. ((struct snpp_env *)env)->server_name, 
  81. ((struct snpp_env *)env)->server_port);
  82. env->fd = TCPIP_connect(((struct snpp_env *)env)->server_name,
  83.                        ((struct snpp_env *)env)->server_port);
  84. if (env->fd < 0)
  85. {  lprintf(LOG_WARNING, "Failed to Connect.n"); 
  86. return EDIAL;
  87. }
  88. lprintf(LOG_STANDARD, "Connection Established.n");
  89. return 0;
  90. }
  91. /* -------------------------------------------------------------------- */
  92. /* -------------------------------------------------------------------- */
  93. static int SNPP_login(void)
  94. {
  95. char buf[MAX_RESPONSE_BUFSIZE];
  96. if (expstr(FD, buf, "n", MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  97. {
  98. if (strncmp(buf, "220", 3) == 0)
  99. {
  100. lprintf(LOG_STANDARD, "SNPP Service Loginn");
  101. lprintf(LOG_VERBOSE, "SNPP Response: %s", buf);
  102. }
  103. else
  104. { lprintf(LOG_STANDARD, "SNPP Service Login Failed - Bad responsen");
  105. SNPP_hangup();
  106. return ESNPP_NORESPONSE;
  107. }
  108. }
  109. else
  110. {
  111. lprintf(LOG_STANDARD, "SNPP Service Login Failedn");
  112. SNPP_hangup();
  113. return ESNPP_NORESPONSE;
  114. }
  115. return 0;
  116. }
  117. /* -------------------------------------------------------------------- */
  118. /* -------------------------------------------------------------------- */
  119. static int SNPP_sendmessage(char *msisdn, char *message)
  120. {
  121. char buf[MAX_RESPONSE_BUFSIZE];
  122. twrite(FD, "PAGE ", sms_strlen("PAGE "), WRITETIMEOUT);
  123. twrite(FD, msisdn, sms_strlen(msisdn), WRITETIMEOUT);
  124. twrite(FD, "n", sms_strlen("n"), WRITETIMEOUT);
  125. if (expstr(FD, buf, "n", MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  126. {
  127. if (strncmp(buf, "250", 3) == 0)
  128. {
  129. lprintf(LOG_STANDARD, "Pager ID Acceptedn");
  130. lprintf(LOG_VERBOSE, "SNPP Response: %s", buf);
  131. }
  132. else
  133. { lprintf(LOG_STANDARD, "Pager ID NOT Acceptedn");
  134. SNPP_hangup();
  135. return ESNPP_NONUMBER;
  136. }
  137. }
  138. else
  139. { lprintf(LOG_STANDARD, "Pager ID NOT Acceptedn");
  140. SNPP_hangup();
  141. return ESNPP_NONUMBER;
  142. }
  143. twrite(FD, "MESS ", sms_strlen("MESS "), WRITETIMEOUT);
  144. twrite(FD, message, sms_strlen(message), WRITETIMEOUT);
  145. twrite(FD, "n", sms_strlen("n"), WRITETIMEOUT);
  146. if (expstr(FD, buf, "n", MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  147. {
  148. if (strncmp(buf, "250", 3) == 0)
  149. {
  150. lprintf(LOG_STANDARD, "Message Acceptedn");
  151. lprintf(LOG_VERBOSE, "SNPP Response: %s", buf);
  152. }
  153. else
  154. { lprintf(LOG_STANDARD, "Message NOT Acceptedn");
  155. SNPP_hangup();
  156. return ESNPP_NOMESSAGE;
  157. }
  158. }
  159. else
  160. { lprintf(LOG_STANDARD, "Message NOT Acceptedn");
  161. SNPP_hangup();
  162. return ESNPP_NOMESSAGE;
  163. }
  164. twrite(FD, "SENDn", sms_strlen("SENDn"), WRITETIMEOUT);
  165. if (expstr(FD, buf, "n", MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  166. {
  167. if (strncmp(buf, "250", 3) == 0)
  168. {
  169. lprintf(LOG_STANDARD, "Message Sentn");
  170. lprintf(LOG_VERBOSE, "SNPP Response: %s", buf);
  171. }
  172. else
  173. { lprintf(LOG_STANDARD, "Message NOT Sentn");
  174. SNPP_hangup();
  175. return ESNPP_NODELIVERY;
  176. }
  177. }
  178. else
  179. { lprintf(LOG_STANDARD, "Message NOT Sentn");
  180. SNPP_hangup();
  181. return ESNPP_NODELIVERY;
  182. }
  183. return 0;
  184. }
  185. /* -------------------------------------------------------------------- */
  186. /* -------------------------------------------------------------------- */
  187. static int SNPP_send_disconnect(void)
  188. {
  189. char buf[MAX_RESPONSE_BUFSIZE];
  190. twrite(FD, "QUITn", sms_strlen("QUITn"), WRITETIMEOUT);
  191. if (expstr(FD, buf, "n", MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  192. {
  193. if (strncmp(buf, "221", 3) == 0)
  194. {
  195. lprintf(LOG_STANDARD, "Sent Diconnectionn");
  196. lprintf(LOG_VERBOSE, "SNPP Response: %s", buf);
  197. }
  198. else
  199. { lprintf(LOG_STANDARD, "Failed to send Disconnectionn");
  200. SNPP_hangup();
  201. return ESNPP_NODISCONNECT;
  202. }
  203. }
  204. else
  205. { lprintf(LOG_STANDARD, "Failed to send Disconnectionn");
  206. SNPP_hangup();
  207. return ESNPP_NODISCONNECT;
  208. }
  209. return 0;
  210. }
  211. /* -------------------------------------------------------------------- */
  212. /* -------------------------------------------------------------------- */
  213. static void SNPP_hangup(void)
  214. { TCPIP_disconnect(FD);
  215. }
  216. /* -------------------------------------------------------------------- */
  217. /* -------------------------------------------------------------------- */
  218. static void SNPP_wrapper_hangup(DRIVER_DEFAULT_ENV *env)
  219. { SNPP_hangup();
  220. }
  221. /* -------------------------------------------------------------------- */
  222. /* -------------------------------------------------------------------- */
  223. DEVICE_ENTRY snpp_device = {
  224. "SNPP",
  225. resource_list,
  226. (DRIVER_DEFAULT_ENV *)(&driver_env),
  227. default_init,
  228. default_main,
  229. default_validate_always_true,
  230. SNPP_dial,
  231. SNPP_wrapper_hangup,
  232. SNPP_send_disconnect,
  233. default_single_deliver,
  234. SNPP_sendmessage,
  235. SNPP_login
  236. };