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

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* cimd.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 "common.h"
  33. #include "logfile.h"
  34. #include "driver.h"
  35. #include "expect.h"
  36. #include "sms_error.h"
  37. #include "sms_resource.h"
  38. #include "ascii.h"
  39. /* -------------------------------------------------------------------- */
  40. static struct cimd_env
  41. {
  42. DRIVER_DEFAULT_ENV def;
  43. /* Place any extended driver */ 
  44. /* variables here  */
  45. char *login,
  46. *password,
  47. *message_terminator;
  48. long  login_delay;
  49. } driver_env;
  50. /* -------------------------------------------------------------------- */
  51. static  RESOURCE resource_list[] = 
  52. {
  53. { RESOURCE_STRING,  "SMS_comms_params",  0, 0, NULL, 0,  "8N1",        0,  &(driver_env.def.comms_params)   },
  54. { RESOURCE_STRING,  "SMS_centre_number",  0, 0, NULL, 0,  "0708222901", 0,  &(driver_env.def.centre_number)   },
  55. { RESOURCE_NUMERIC, "SMS_baud",  0, 0, NULL, 0,  NULL,         9600,  &(driver_env.def.baud)   },
  56. { RESOURCE_NUMERIC, "SMS_deliver_timeout",  0, 0, NULL, 0,  NULL,         45,    &(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_NUMERIC, "SMS_max_deliver",  0, 0, NULL, 0,  NULL,         1,     &(driver_env.def.max_deliver)   },
  60. { RESOURCE_STRING,  "SMS_login",  0, 1, NULL, 0,  "EURO_CIMD",  0,    &(driver_env.login)   },
  61. { RESOURCE_STRING,  "SMS_password",  0, 1, NULL, 0,  "2062",       0,     &(driver_env.password)   },
  62. { RESOURCE_STRING,  "SMS_message_terminator",  0, 0, NULL, 0,  "",           0,     &(driver_env.message_terminator)   },
  63. { RESOURCE_NUMERIC, "SMS_login_delay",  0, 0, NULL, 0,  NULL,         2000000,  &(driver_env.login_delay)   },
  64. { RESOURCE_NULL,     NULL,  0, 1, NULL, 0,  NULL,         0,     NULL   }
  65. };
  66. /* -------------------------------------------------------------------- */
  67. #define DELIVERTIMEOUT  (driver_env.def.deliver_timeout)
  68. #define TIMEOUT  (driver_env.def.timeout)
  69. #define WRITETIMEOUT  (driver_env.def.write_timeout)
  70. /* -------------------------------------------------------------------- */
  71. #define MSGTERM (driver_env.message_terminator)
  72. #define FD (driver_env.def.fd)
  73. /* -------------------------------------------------------------------- */
  74. static int CIMD_login(void);
  75. static int CIMD_sendmessage(char *msisdn, char *message);
  76. static int CIMD_send_disconnect(void);
  77. static void CIMD_hangup(void);
  78. static void calculate_checksum(char *checksum, char *ptr);
  79. /* -------------------------------------------------------------------- */
  80. /* -------------------------------------------------------------------- */
  81. static void calculate_checksum(char *checksum, char *ptr)
  82. {
  83. int  sum,
  84. high,
  85. low;
  86. sum = 0;
  87. while (*ptr != '')
  88. {
  89.         sum += *ptr++;
  90.         sum &= 0x00FF;
  91. }
  92. high = (sum >> 4) & 0x000F;
  93. low  = (sum     ) & 0x000F;
  94. if (high <10)
  95. { checksum[0] = '0' + high;
  96. }
  97. else
  98. { checksum[0] = 'A' + (high -10);
  99. }
  100. if (low <10)
  101. { checksum[1] = '0' + low;
  102. }
  103. else
  104. { checksum[1] = 'A' + (low -10);
  105. }
  106. }
  107. /* -------------------------------------------------------------------- */
  108. /* -------------------------------------------------------------------- */
  109. static int CIMD_login(void)
  110. {
  111. char  buf[MAX_RESPONSE_BUFSIZE],
  112. message[512];
  113. if (expstr(FD, buf, "login: ", MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  114. {
  115. lprintf(LOG_STANDARD, "Received login requestn");
  116. }
  117. else
  118. { lprintf(LOG_STANDARD, "No login requestn");
  119. CIMD_hangup();
  120. return -1;
  121. }
  122. lprintf(LOG_STANDARD, "Sending Service Login...n");
  123. twrite(FD, "sc3cimd1n", sms_strlen("sc3cimd1n"), WRITETIMEOUT);
  124. if (expstr(FD, buf, "CIMD", MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  125. {
  126. if (expstr(FD, buf, "n", MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  127. {
  128. lprintf(LOG_STANDARD, "CIMD Service Detectedn");
  129. }
  130. else
  131. { lprintf(LOG_STANDARD, "No CIMD Service Detectedn");
  132. CIMD_hangup();
  133. return -1;
  134. }
  135. }
  136. else
  137. { lprintf(LOG_STANDARD, "No CIMD Service Detectedn");
  138. CIMD_hangup();
  139. return -1;
  140. }
  141. sms_usleep(driver_env.login_delay);
  142. sprintf(message, "%c%s%c%s%c%s%c%s%c%s", S_STX,
  143. "01", 
  144. S_HT, 
  145. driver_env.login, 
  146. S_HT, 
  147. driver_env.password, 
  148. S_HT, 
  149. "XX",
  150. S_ETX,
  151. MSGTERM);
  152. calculate_checksum(&message[sms_strlen(message) - (3 + sms_strlen(MSGTERM))], message);
  153. twrite(FD, message, sms_strlen(message), WRITETIMEOUT);
  154. if (expstr(FD, buf, "n", MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  155. {
  156. /* should check for:
  157. <STX>Ack<TAB>C:01<TAB>chksum<ETX><LF>
  158. */
  159. if ((buf[0] = S_STX) &&
  160.     (strncmp(&buf[1], "Ack", 3) == 0))
  161. {
  162. lprintf(LOG_STANDARD, "Completed CIMD Loginn");
  163. }
  164. else
  165. { lprintf(LOG_STANDARD, "CIMD Login failedn");
  166. CIMD_hangup();
  167. return -1;
  168. }
  169. }
  170. else
  171. { lprintf(LOG_STANDARD, "CIMD Login failedn");
  172. CIMD_hangup();
  173. return -1;
  174. }
  175. return 0;
  176. }
  177. /* -------------------------------------------------------------------- */
  178. /* -------------------------------------------------------------------- */
  179. static int CIMD_sendmessage(char *msisdn, char *message)
  180. {
  181. char  buf[MAX_RESPONSE_BUFSIZE],
  182. nmessage[512];
  183. sprintf(nmessage, "%c%s%c%s%c%s%c%s%c%s",   S_STX,
  184. "03", 
  185. S_HT, 
  186. msisdn, 
  187. S_HT, 
  188. message,
  189. S_HT,
  190. "XX",
  191. S_ETX,
  192. MSGTERM);
  193. calculate_checksum(&nmessage[sms_strlen(nmessage) - (3 + sms_strlen(MSGTERM))], nmessage);
  194. twrite(FD, nmessage, sms_strlen(nmessage), WRITETIMEOUT);
  195. if (expstr(FD, buf, "n", MAX_RESPONSE_BUFSIZE, DELIVERTIMEOUT) == 0)
  196. {
  197. /* should check for:
  198. <STX>Ack<TAB>C:04<TAB>status<TAB>err_desc<TAB>dest<TAB>scts<TAB>time<TAB>chksum<ETX><LF>
  199. */
  200. if ((buf[0] = S_STX) &&
  201.     (strncmp(&buf[1], "Ack", 3) == 0))
  202. { lprintf(LOG_STANDARD, "Received Message Delivery Responsen");
  203. }
  204. else
  205. { lprintf(LOG_STANDARD, "No Message Delivery Responsen");
  206. CIMD_hangup();
  207. return -1;
  208. }
  209. }
  210. else
  211. { lprintf(LOG_STANDARD, "No Message Delivery Responsen");
  212. CIMD_hangup();
  213. return -1;
  214. }
  215. lprintf(LOG_STANDARD, "Sending Acknowledgment...n");
  216. sprintf(nmessage, "%c%s%c%s%c%s",  S_STX,
  217. "Ack", 
  218. S_HT, 
  219. "XX",
  220. S_ETX,
  221. MSGTERM);
  222. calculate_checksum(&nmessage[sms_strlen(nmessage) - (3 + sms_strlen(MSGTERM))], nmessage);
  223. twrite(FD, nmessage, sms_strlen(nmessage), WRITETIMEOUT);
  224. return 0;
  225. }
  226. /* -------------------------------------------------------------------- */
  227. /* -------------------------------------------------------------------- */
  228. static int CIMD_send_disconnect(void)
  229. {
  230. char  buf[MAX_RESPONSE_BUFSIZE],
  231. message[512];
  232. sprintf(message, "%c%s%c%s%c%s",  S_STX,
  233. "02", 
  234. S_HT, 
  235. "XX",
  236. S_ETX,
  237. MSGTERM);
  238. calculate_checksum(&message[sms_strlen(message) - (3 + sms_strlen(MSGTERM))], message);
  239. twrite(FD, message, sms_strlen(message), WRITETIMEOUT);
  240. if (expstr(FD, buf, "n", MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0)
  241. {
  242. /* should check for:
  243. <STX>Ack<TAB>C:02<TAB>time. Sess:time.Sub:n (M)<TAB>chksum<ETX><LF>
  244. */
  245. if ((buf[0] = S_STX) &&
  246.     (strncmp(&buf[1], "Ack", 3) == 0))
  247. { lprintf(LOG_STANDARD, "Received Disconnection Responsen");
  248. }
  249. else
  250. { lprintf(LOG_STANDARD, "No Disconnection Responsen");
  251. CIMD_hangup();
  252. return -1;
  253. }
  254. }
  255. else
  256. { lprintf(LOG_STANDARD, "No Disconnection Responsen");
  257. CIMD_hangup();
  258. return -1;
  259. }
  260. return 0;
  261. }
  262. /* -------------------------------------------------------------------- */
  263. /* -------------------------------------------------------------------- */
  264. static void CIMD_hangup(void)
  265. { default_hangup((DRIVER_DEFAULT_ENV *)(&driver_env));
  266. }
  267. /* -------------------------------------------------------------------- */
  268. /* -------------------------------------------------------------------- */
  269. DEVICE_ENTRY cimd_device = {
  270. "CIMD",
  271. resource_list,
  272. (DRIVER_DEFAULT_ENV *)(&driver_env),
  273. default_init,
  274. default_main,
  275. default_validate_numeric_id,
  276. default_dial,
  277. default_hangup,
  278. CIMD_send_disconnect,
  279. default_multiple_counted_deliver,
  280. CIMD_sendmessage,
  281. CIMD_login
  282. };