70
static int check_modem_result(char *buffer, char **ebuf, char **sbuf, const char *expect, char *error, int max_error_len)
72
const char *__function_name = "check_modem_result";
74
int i, len, ret = SUCCEED;
76
zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name);
83
for (i = 0; i < len && (*sbuf)[i] != '\n' && (*sbuf)[i] != '\r'; i++)
84
; /* find first '\r' & '\n' */
89
ret = (NULL == strstr(*sbuf, expect)) ? FAIL : SUCCEED;
95
memmove(buffer, *sbuf, *ebuf - *sbuf + 1); /* +1 for '\0' */
96
*ebuf -= *sbuf - buffer;
99
} while (*sbuf < *ebuf && ret == FAIL);
101
if (ret == FAIL && error)
103
zbx_snprintf(error, max_error_len, "Expected [%s] received [%s]",
108
zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret));
70
113
int read_gsm(int fd, const char *expect, char *error, int max_error_len, int timeout_sec)
115
const char *__function_name = "read_gsm";
72
116
static char buffer[0xff];
73
117
static char *ebuf = buffer;
74
118
static char *sbuf = buffer;
78
120
struct timeval tv;
83
if( timeout_sec == 0 )
121
int i, nbytes, ret = SUCCEED;
123
zabbix_log(LOG_LEVEL_DEBUG, "In %s() [%s] [%s] [%s] [%s]", __function_name, expect, ebuf != buffer ? buffer : "NULL", ebuf != buffer ? ebuf : "NULL", ebuf != buffer ? sbuf : "NULL");
125
/* if (timeout_sec == 0)
85
127
goto check_result;
129
if ('\0' != *expect && ebuf != buffer &&
130
SUCCEED == check_modem_result(buffer, &ebuf, &sbuf, expect, error, max_error_len))
88
133
tv.tv_sec = timeout_sec;
97
142
if ( EINTR == errno ) continue;
99
144
zabbix_log(LOG_LEVEL_DEBUG, "Error select() for GSM modem. [%s]", strerror(errno));
100
if ( error ) zbx_snprintf(error,max_error_len, "Error select() for GSM modem. [%s]", strerror(errno));
146
zbx_snprintf(error,max_error_len, "Error select() for GSM modem. [%s]", strerror(errno));
104
150
else if ( i == 0 ) /*( 1 != i )*/
118
164
/* read characters into our string buffer */
119
165
while ((nbytes = read(fd, ebuf, buffer + sizeof(buffer) - 1 - ebuf)) > 0)
123
167
/* nul terminate the string and see if we got an OK response */
127
171
zabbix_log(LOG_LEVEL_DEBUG, "Read from GSM modem [%s]", sbuf);
130
if( '\0' == *expect ) /* empty */
173
if ('\0' == *expect) /* empty */
132
175
sbuf = ebuf = buffer;
140
for( i = 0; i < len && (sbuf[i] != '\n' && sbuf[i] != '\r'); i++ )
141
; /* find first '\r' & '\n' */
148
ret = ( strstr(sbuf, expect) == NULL ) ? FAIL : SUCCEED;
152
if ( sbuf != buffer )
154
memmove(buffer, sbuf, ebuf - sbuf + 1); /* +1 for '\0' */
155
ebuf -= sbuf - buffer;
158
} while( (sbuf < ebuf) && (ret == FAIL) );
160
if ( ret == FAIL && error )
162
zbx_snprintf(error, max_error_len, "Expected [%s] received [%s]",
180
ret = check_modem_result(buffer, &ebuf, &sbuf, expect, error, max_error_len);
182
zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret));
176
193
int send_sms(char *device,char *number,char *message, char *error, int max_error_len)
195
const char *__function_name = "send_sms";
178
196
#define ZBX_AT_ESC "\x1B"
179
197
#define ZBX_AT_CTRL_Z "\x1A"
181
199
zbx_sms_scenario scenario[] = {
182
200
/* 0 */ {ZBX_AT_ESC , NULL , 0 }, /* Send <ESC> */
183
/* 1 */ {"AT+CMEE=2\r" , "OK" , 5 }, /* verbose error values */
201
/* 1 */ {"AT+CMEE=2\r" , ""/*"OK"*/ , 5 }, /* verbose error values */
184
202
/* 1 */ {"ATE0\r" , "OK" , 5 }, /* Turn off echo */
185
203
/* 2 */ {"AT\r" , "OK" , 5 }, /* Init modem */
186
204
/* 3 */ {"AT+CMGF=1\r" , "OK" , 5 }, /* Switch to text mode */
205
zabbix_log( LOG_LEVEL_DEBUG, "In send_sms()");
223
zabbix_log( LOG_LEVEL_DEBUG, "In %s()", __function_name);
207
225
if ( -1 == (f = open(device, O_RDWR | O_NOCTTY | O_NDELAY)) )
256
274
tcsetattr(f, TCSANOW, &old_options);
259
zabbix_log( LOG_LEVEL_DEBUG, "End of send_sms() [%s]",
260
ret == SUCCEED ? "SUCCEED" : "FAIL" );
277
zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret));