smsc_at2.h
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:7k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * gw/smsc_at2.h
  3.  *
  4.  * New driver for serial connected AT based
  5.  * devices.
  6.  * 4.9.2001
  7.  * Andreas Fink <afink@smsrelay.com>
  8.  * 
  9.  */
  10. #ifndef SMSC_AT2_H
  11. #define SMSC_AT2_H
  12. #include "gwlib/gwlib.h"
  13. /* maximum data to attempt to read in one go */
  14. #define MAX_READ        1023
  15. /* Message types defines */
  16. #define AT_DELIVER_SM   0
  17. #define AT_SUBMIT_SM    1
  18. #define AT_STATUS_REPORT_SM 2
  19. /* type of phone number defines */
  20. #define PNT_UNKNOWN     0
  21. #define PNT_INTER       1
  22. #define PNT_NATIONAL    2
  23. /* The number of times to attempt to send a message should sending fail */
  24. #define RETRY_SEND 3
  25. /* 
  26.  * defines for use with the so-called "SIM buffering techinique":
  27.  * once in how many seconds to poll the memory locations, 
  28.  * if keepalive is _not_ set (will use keepalive time if set) 
  29.  */
  30. #define AT2_DEFAULT_SMS_POLL_INTERVAL 60
  31. /*
  32.  * Structures used in at2
  33.  */
  34. typedef struct ModemDef {
  35.     Octstr *id;
  36.     Octstr *name;
  37.     Octstr *detect_string;
  38.     Octstr *detect_string2;
  39.     Octstr *init_string;
  40.     long speed;
  41.     Octstr *enable_hwhs;
  42.     int need_sleep;
  43.     int no_pin;
  44.     int no_smsc;
  45.     long sendline_sleep;
  46.     Octstr *keepalive_cmd;
  47.     int broken;
  48.     Octstr *message_storage;
  49.     int enable_mms;
  50. } ModemDef;
  51. typedef struct PrivAT2data {
  52.     List *outgoing_queue;
  53.     ModemDef *modem;
  54.     long device_thread;
  55.     int shutdown; /* Internal signal to shut down */
  56.     Octstr *device;
  57.     long speed;
  58.     long keepalive;
  59.     int fd; /* file descriptor */
  60.     Octstr *ilb; /* input line buffer */
  61.     Octstr *lines; /* the last few lines before OK was seen */
  62.     Octstr *pin; /* PIN code */
  63.     int pin_ready;
  64.     SMSCConn *conn;
  65.     int phase2plus;
  66.     Octstr *validityperiod;
  67.     int alt_dcs;
  68.     int retry;
  69.     Octstr *my_number;
  70.     Octstr *sms_center;
  71.     Octstr *name;
  72.     Octstr *configfile;
  73.     int sms_memory_poll_interval;
  74.     int sms_memory_capacity;
  75.     int sms_memory_usage;
  76. } PrivAT2data;
  77. /*
  78.  * Macro that is used inside smsc_at2.c in order to handle
  79.  * octstr destruction more carefully.
  80.  */
  81. #define O_DESTROY(a) { if(a) octstr_destroy(a); a = NULL; }
  82. /* 
  83. #define at2_write_ctrlz(a) at2_write(a,"32") 
  84. */
  85. /*
  86.  * open the specified device using the serial line
  87.  */
  88. int at2_open_device(PrivAT2data *privdata);
  89. /*
  90.  * close the specified device and hence disconnect from the serial line 
  91.  */
  92. void at2_close_device(PrivAT2data *privdata);
  93. /*
  94.  * checks if there are any incoming bytes and adds them to the line buffer
  95.  */
  96. void at2_read_buffer(PrivAT2data *privdata);
  97. /* 
  98.  * Looks for a full line to be read from the buffer. 
  99.  * Returns the line and removes it from the buffer or if no full line 
  100.  * is yet received waits until the line is there or a timeout occurs.
  101.  * If gt_flag is set, it is also looking for a line containing '>' even 
  102.  * there is no CR yet.
  103.  */
  104. Octstr *at2_wait_line(PrivAT2data *privdata, time_t timeout, int gt_flag);
  105. /*
  106.  * Looks for a full line to be read from the buffer.
  107.  * Returns the line and removes it from the buffer or if no full line 
  108.  * is yet received returns NULL. If gt_flag is set, it is also looking for
  109.  * a line containing > even there is no CR yet.
  110.  */
  111. Octstr *at2_read_line(PrivAT2data *privdata, int gt_flag);
  112. /*
  113.  * Writes a line out to the device and adds a carriage return/linefeed to it. 
  114.  * Returns number of characters sent.
  115.  */
  116. int at2_write_line(PrivAT2data *privdata, char* line);
  117. int at2_write_ctrlz(PrivAT2data *privdata);
  118. int at2_write(PrivAT2data *privdata, char* line);
  119. /*
  120.  * Clears incoming buffer
  121.  */
  122. void at2_flush_buffer(PrivAT2data *privdata);
  123.  
  124. /*
  125.  * Initializes the device after being opened, detects the modem type, 
  126.  * sets speed settings etc.
  127.  * On failure returns -1.
  128.  */
  129. int at2_init_device(PrivAT2data *privdata);
  130. /*
  131.  * Sends an AT command to the modem and waits for a reply
  132.  * Return values are:
  133.  *   0 = OK
  134.  *   1 = ERROR
  135.  *   2 = SIM PIN
  136.  *   3 = >
  137.  *   4 = READY
  138.  *   5 = CMGS
  139.  *  -1 = timeout occurred
  140.  */
  141. int at2_send_modem_command(PrivAT2data *privdata, char *cmd, time_t timeout, 
  142.                            int greaterflag);
  143. /*
  144.  * Waits for the modem to send us something.
  145.  */
  146. int at2_wait_modem_command(PrivAT2data *privdata, time_t timeout, 
  147.                            int greaterflag, int* output);
  148. /*
  149.  * Sets the serial port speed on the device
  150.  */
  151. void at2_set_speed(PrivAT2data *privdata, int bps);
  152. /*
  153.  * This is the main tread "sitting" on the device.
  154.  * Its task is to initialize the modem then wait for messages 
  155.  * to arrive or to be sent
  156.  */
  157. void at2_device_thread(void *arg);
  158. int at2_shutdown_cb(SMSCConn *conn, int finish_sending);
  159. long at2_queued_cb(SMSCConn *conn);
  160. void at2_start_cb(SMSCConn *conn);
  161. int at2_add_msg_cb(SMSCConn *conn, Msg *sms);
  162. /*
  163.  * Starts the whole thing up
  164.  */
  165. int smsc_at2_create(SMSCConn *conn, CfgGroup *cfg);
  166. /*
  167.  * Extracts the first PDU in the string
  168.  */
  169. int at2_pdu_extract(PrivAT2data *privdata, Octstr **pdu, Octstr *buffer);
  170. /*
  171.  * Get the numeric value of the text hex
  172.  */
  173. int at2_hexchar(int hexc);
  174. /*
  175.  * Decode a raw PDU into a Msg
  176.  */
  177. Msg *at2_pdu_decode(Octstr *data, PrivAT2data *privdata);
  178. /*
  179.  * Decode a DELIVER PDU
  180.  */
  181. Msg *at2_pdu_decode_deliver_sm(Octstr *data, PrivAT2data *privdata);
  182. /*
  183.  * Decode a SUBMIT-REPORT PDU
  184.  */
  185. Msg *at2_pdu_decode_report_sm(Octstr *data, PrivAT2data *privdata);
  186. /*
  187.  * Converts the text representation of hexa to binary
  188.  */
  189. Octstr *at2_convertpdu(Octstr *pdutext);
  190. /*
  191.  * Decode 7bit uncompressed user data
  192.  */
  193. void at2_decode7bituncompressed(Octstr *input, int len, Octstr *decoded, 
  194.                                 int offset);
  195. /*
  196.  * Sends messages from the queue
  197.  */
  198. void at2_send_messages(PrivAT2data *privdata);
  199. /*
  200.  * Sends a single message. 
  201.  * After having it sent, the msg is no longe belonging to us
  202.  */
  203. void at2_send_one_message(PrivAT2data *privdata, Msg *msg);
  204. /*
  205.  * Encode a Msg into a PDU
  206.  */
  207. Octstr* at2_pdu_encode(Msg *msg, PrivAT2data *privdata);
  208. /*
  209.  * Encode 7bit uncompressed user data into an Octstr, prefixing with <offset> 0 bits
  210.  */
  211. Octstr* at2_encode7bituncompressed(Octstr *input, int offset);
  212. /*
  213.  * Encode 8bit uncompressed user data into an Octstr
  214.  */
  215. Octstr* at2_encode8bituncompressed(Octstr *input);
  216. /*
  217.  * Code a half-byte to its text hexa representation
  218.  */
  219. int at2_numtext(int num);
  220. /*
  221.  * Try to detect modem speeds
  222.  */
  223. int at2_detect_speed(PrivAT2data *privdata);
  224. /*
  225.  * Test modem speed
  226.  */
  227. int at2_test_speed(PrivAT2data *privdata, long speed);
  228. /*
  229.  * Try to detect modem type
  230.  */
  231. int at2_detect_modem_type(PrivAT2data *privdata);
  232. /*
  233.  * Read all defined modems from the included modem definition file
  234.  */
  235. ModemDef *at2_read_modems(PrivAT2data *privdata, Octstr *file, Octstr *id, int idnumber);
  236. /*
  237.  * Destroy the ModemDef structure components
  238.  */
  239. void at2_destroy_modem(ModemDef *modem);
  240. /*
  241.  * Checks whether any messages are buffered in message storage and extract them.
  242.  */
  243. void at2_read_sms_memory(PrivAT2data *privdata);
  244. /*
  245.  * Memory capacity and usage check
  246.  */
  247. int at2_check_sms_memory(PrivAT2data* privdata);
  248. /*
  249.  * This silly thing here will just translate a "swapped nibble" 
  250.  * pseodo Hex encoding (from PDU) into something that people can 
  251.  * actually understand.
  252.  * Implementation completly ripped off Dennis Malmstrom timestamp 
  253.  * patches against 1.0.3. Thanks Dennis! 
  254.  */
  255. int swap_nibbles(char byte);
  256. /*
  257.  * creates a buffer with a valid PDU address field as per [GSM 03.40]
  258.  * from an MSISDN number
  259.  */
  260. Octstr* at2_format_address_field(Octstr* msisdn);
  261. #endif /* SMSC_AT2_H */