4g 和 AT 指令


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 &


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM