00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00026 #include <unistd.h>
00027 #include <termios.h>
00028 #include <fcntl.h>
00029 #include <string.h>
00030
00031 #include "connectionMgrLog.h"
00032 #include "modemUtils.h"
00033
00034 #define DEVICE_NAME "/dev/modem"
00035 #define BAUD_RATE B115200
00036
00037 int get_modem_signal_strength()
00038 {
00039 CN_LOGPRINTF("entry");
00040
00041 int fd = open(DEVICE_NAME, O_RDWR | O_NOCTTY);
00042
00043 if (fd < 0)
00044 {
00045 CN_ERRORPRINTF("Can't open %s", DEVICE_NAME);
00046 return 0;
00047 }
00048
00049 struct termios new_opt, old_opt;
00050
00051
00052 tcgetattr(fd, &old_opt);
00053
00054
00055 new_opt.c_cflag = BAUD_RATE | CS8 | CLOCAL | CREAD;
00056 new_opt.c_iflag = IGNPAR;
00057 new_opt.c_oflag = 0;
00058 new_opt.c_lflag = 0;
00059
00060
00061 new_opt.c_cc[VMIN] = 1;
00062 new_opt.c_cc[VTIME] = 0;
00063
00064
00065 tcflush(fd, TCIFLUSH);
00066 tcsetattr(fd, TCSANOW, &new_opt);
00067
00068 char buf[BUF_LEN] = "AT+CSQ?\r";
00069 int len = strlen(buf);
00070 if (len != write(fd, buf, len))
00071 {
00072 CN_ERRORPRINTF("Can't write data to %s", DEVICE_NAME);
00073 return 0;
00074 }
00075
00076 len = read(fd, buf, BUF_LEN);
00077
00078 if (strstr(buf, "\r\nOK\r\n") == 0)
00079 {
00080
00081 CN_ERRORPRINTF("Modem returned error for command AT+CSQ?");
00082 return 0;
00083 }
00084
00085 int rssi = 0, fer = 0;
00086 sscanf(buf, "\r\n+CSQ: %d, %d\r\n", &rssi, &fer);
00087
00088
00089 tcsetattr(fd, TCSANOW, &old_opt);
00090 close(fd);
00091 return rssi;
00092 }
00093