1. 基本概念
通過終端設備發送AT指令來控制移動台(Mobile Station,MS)的功能,與GSM 網絡業務進行交互。
通過 串口收發 AT 指令,控制設備,以完成 呼叫、短信、電話本、數據業務、傳真.
GSM模塊,是將GSM射頻芯片、基帶處理芯片、存儲器、功放器件等集成在一塊線路板上,具有獨立的操作系統、
ppp協議, pc用AT指令和 4g設備通信,和 基站建立連接,使用 ppp 協議用於 pc 和 基站的數據傳輸。 ppp 協議是鏈路層協議。

pc使用AT指令 通過 DCE 和 服務器通信,以建立 ppp鏈路。
2. 通過串口進行AT命令會話
確保驅動正常后,插入設備,生成設備 ttyUSB0 ttyUSB1 ttyUSB2 ttyUSB3.
ttyUSB2支持AT通信
ttyUSB3支持AT通信和ppp數據傳輸
C實現串口通信工具
#include <sys/select.h>
#include <errno.h>
#include <termios.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#define ARR_NB(arr) (sizeof(arr)/sizeof(*arr))
#define STR_LEN(str) (sizeof(str)-1)
#define WDEV(str) write(fd, str, STR_LEN(str))
static int read_timeout(int fd, char *buf, int len);
int
main(int argc, char **argv)
{
char buf[256], tmp[256];
int fd, cnt;
if (argc != 3) {
printf("usage : %s <dev> <query>\n", argv[0]);
return 0;
}
fd = open(argv[1], O_RDWR | O_NOCTTY | O_NONBLOCK);
struct termios termios;
if (tcgetattr(fd, &termios) < 0) {
perror("tcgetattr");
return -1;
}
/* 修改控制模式,保證程序不會占用串口 */
termios.c_cflag |= CLOCAL;
/* 啟動接收器,能夠從串口中讀取輸入數據 */
termios.c_cflag |= CREAD;
/* CSIZE字符大小掩碼,將與設置databits相關的標致位置零 */
termios.c_cflag &= ~CSIZE;
termios.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
termios.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
termios.c_oflag &= ~(OPOST);
cfsetispeed(&termios,B115200);
termios.c_cflag |= CS8;
termios.c_cflag &= ~PARENB;
termios.c_iflag &= ~INPCK;
termios.c_cflag &= ~CSTOPB;
termios.c_cc[VTIME] = 0; //最長等待時間
termios.c_cc[VMIN] = 0; //最小接收字符
if(tcflush(fd,TCIFLUSH))
{
printf("%s,Failed to clear the cache:%s\n",__func__,strerror(errno));
return -4;
}
if(tcsetattr(fd, TCSANOW, &termios) != 0)
{
printf("%s,tcsetattr failure:%s\n",__func__,strerror(errno));
return -5;
}
write(fd, argv[2], strlen(argv[2]));
write(fd, "\r", 1);
while ((cnt = read_timeout(fd, tmp, sizeof(tmp))) > 0) {
tmp[cnt] = 0;
strcat(buf, tmp);
}
printf("%s", buf);
close(fd);
return 0;
}
static int
read_timeout(int fd, char *buf, int len)
{
fd_set rfds;
struct timeval tv;
int ret;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
tv.tv_sec = 0;
tv.tv_usec = 30000;
ret = select(fd + 1, &rfds, NULL, NULL, &tv);
if (ret <= 0) {
return 0;
}
return read(fd, buf, len);
}
3.常用AT測試命令
檢測Module與串口是否連通,能否接收AT命令: AT
查看SIM卡是否到位: AT+CPIN?
測試信號: AT+CSQ
查看運營商: AT+COPS?
獲取模塊標識: AT+CGMM
獲取模塊廠商標識: AT+CGMI
查看SIM卡是否到位: AT+CPIN?
網絡注冊。獲得手機的注冊狀態: AT+CREG?
4. AT撥號
流程如下

-
撥號
TE --- AT(檢查module狀態) --> MT
TE --- AT+CPIN?(檢查SIM卡狀態) --> MT
TE --- AT+CREG?(檢查網絡狀態) --> MT
TE --- AT+CGREG?(檢查PS狀態) --> MT
TE --- AT+CGDCONT(設置APN) --> MT
TE --- ATD*99#(撥號) --> MT -
切換 data mode 到 command mode
TE --- +++ --> MT
注意,為了避免 數據丟失,發送 +++ 后,需要等待 1s后再傳數據。
CONNECT="'chat -s -v ABORT BUSY ABORT \"NO CARRIER\" ABORT \"NO DIALTONE\" ABORT ERROR ABORT \"NO ANSWER\" TIMEOUT 30 \
\"\" AT OK ATE0 OK ATI\;+CSUB\;+CSQ\;+CPIN?\;+COPS?\;+CGREG?\;\&D2 \
OK AT+CGDCONT=1,\\\"IP\\\",\\\"$QL_APN\\\",,0,0 OK ATD*99# CONNECT'"
pppd ${Dev} 115200 user "$QL_USER" password "$QL_PASSWORD" unit "$USBId" \
connect "'$CONNECT'" \
disconnect 'chat -s -v ABORT ERROR ABORT "NO DIALTONE" SAY "\nSending break to the modem\n" "" +++ "" +++ "" +++ SAY "\nGood bay\n"' \
noauth debug defaultroute noipdefault novj novjccomp noccp ipcp-accept-local ipcp-accept-remote ipcp-max-configure 30 local lock modem dump nodetach nocrtscts usepeerdns 1>/dev/null 2>&1 &
