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 &
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?