📄 tap.c
字号:
/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */static void TAP_checksum(char *message){ int i, checksum; checksum = 0; for (i=0; i<sms_strlen(message); i++) { checksum += message[i]; } checksum = (checksum & 0x0FFF); /* Mask low 12Bits */ message[i] = (((checksum & 0x0F00) >> 8) | 0x30); message[i+1] = (((checksum & 0x00F0) >> 4) | 0x30); message[i+2] = (((checksum & 0x000F) ) | 0x30); message[i+3] = '\0';}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */static void TAP_hangup(void){ default_hangup((DRIVER_DEFAULT_ENV *)(&driver_env));}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */static int TAP_send_disconnect(void){ lprintf(LOG_STANDARD, "Disconnect...\n"); if (TAP_DISCONNECT) { twrite(FD, REQ7, sms_strlen(REQ7), WRITETIMEOUT); if (expstr(FD, buf, ACK8, MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0) { lprintf(LOG_STANDARD, "Disconnected from SMSC\n"); } else { lprintf(LOG_STANDARD, "Failed to disconnect from SMSC\n"); TAP_hangup(); return ETAP_NODISCONNECT; } } return 0;}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */static int TAP_login(void){ int i; lprintf(LOG_STANDARD, "Login...\n"); /* Resend the S_CR every 2 seconds */ /* until ID= received, only try */ /* 5 times then give up. */ sms_usleep(INITLOGINSLEEP); for (i=0; i < MAX_TRIES; i++) { twrite(FD, REQ1, sms_strlen(REQ1), WRITETIMEOUT); if (expstr(FD, buf, ACK1, MAX_RESPONSE_BUFSIZE, LOGINTIMEOUT) == 0) { lprintf(LOG_STANDARD, "SMSC Acknowledgment received\n"); break; } lprintf(LOG_STANDARD, "SMSC Retry for Acknowledgment\n"); sms_usleep(LOGINSLEEP); } if (i == MAX_TRIES) { lprintf(LOG_STANDARD, "Failed Acknowledgment %ld retries attempted\n", MAX_TRIES); TAP_hangup(); return ETAP_NOACK; } /* Send S_ESC <TAP_SELECT> S_CR and get back */ /* the acknowledgement S_ACK S_CR */ twrite(FD, REQ2a, sms_strlen(REQ2a), WRITETIMEOUT); twrite(FD, TAP_SELECT, sms_strlen(TAP_SELECT), WRITETIMEOUT); twrite(FD, REQ2b, sms_strlen(REQ2b), WRITETIMEOUT); if (expstr(FD, buf, ACK2, MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0) { lprintf(LOG_STANDARD, "Login successful\n"); } else { lprintf(LOG_STANDARD, "Login failed\n"); TAP_hangup(); return ETAP_NOLOGIN; } if (expstr(FD, buf, ACK3, MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0) { lprintf(LOG_STANDARD, "Ready to receive message\n"); } else { lprintf(LOG_STANDARD, "SMSC NOT Ready to receive message\n"); TAP_hangup(); return ETAP_NOREADY; } return 0;}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */static void TAP_buildmessage(char *tap_message, char *msisdn, char *message){ int i; char *ptr; /* ---------------------------- */ tap_message[0] = '\0'; sms_strcat(tap_message, REQ3); sms_strcat(tap_message, msisdn); sms_strcat(tap_message, REQ4); /* Convert message so that it contains */ /* only TAP valid characters */ /* any invalid characters will be */ /* mapped to a SPACE */ /* Add to tap_message */ ptr = tap_message; while(*ptr != '\0') { ptr++; } for (i=0; i<sms_strlen(message) +1; i++) { *ptr = TAP_charset[(int)message[i]]; ptr++; } *ptr = '\0'; sms_strcat(tap_message, REQ5); /* Generate TAP checksum. Consisting */ /* of 3 characters. Append this to end */ /* of tap_message. */ TAP_checksum(tap_message); sms_strcat(tap_message, REQ6);}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */static int TAP_sendmessage(char *msisdn, char *message){ char tap_message[MAX_MESSAGE + MAX_ENVELOPE]; TAP_buildmessage(tap_message, msisdn, message); twrite(FD, tap_message, sms_strlen(tap_message), WRITETIMEOUT); if (TAP_RESPONSE) { if (expstr(FD, buf, ACK4, MAX_RESPONSE_BUFSIZE, DELIVERTIMEOUT) == 0) { lprintf(LOG_STANDARD, "Received Message Response: %s\n", buf); } else { lprintf(LOG_STANDARD, "No Message Response\n"); TAP_hangup(); return ETAP_NOMESSAGE; } } if (expstr(FD, buf, ACK5, MAX_RESPONSE_BUFSIZE, TIMEOUT) == 0) { lprintf(LOG_STANDARD, "Successful message submission\n"); } else { if (strncmp(&buf[sms_strlen(buf) - sms_strlen(ACK6)], ACK6, sms_strlen(ACK6)) == 0) { lprintf(LOG_STANDARD, "Message submission failed - Transmission incomprehensible\n"); } else if (strncmp(&buf[sms_strlen(buf) - sms_strlen(ACK7)], ACK7, sms_strlen(ACK7)) == 0) { lprintf(LOG_STANDARD, "Message submission failed - Problem with message\n"); } else { lprintf(LOG_STANDARD, "Message submission failed - Reason Unknown\n"); } TAP_hangup(); return ETAP_NODELIVERY; } return 0;}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */DEVICE_ENTRY tap_device = { "TAP", resource_list, (DRIVER_DEFAULT_ENV *)(&driver_env), default_init, default_main, default_validate_numeric_id, default_dial, default_hangup, TAP_send_disconnect, default_multiple_counted_deliver, TAP_sendmessage, TAP_login};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -