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 &

posted on 2022-03-29 17:14  开心种树  阅读(1565)  评论(0编辑  收藏  举报