基於SIM300制作的通信模組在工程中使用的非常多,下面總結一下其在網絡通信方面的AT指令集應用方法
1、預備步驟:測試GPRS模組和業務是否好用
AT //測試網絡連接是否完後
AT+ccid //檢測是否裝有SIM卡
AT+cgmr //檢測軟件版本,5.0 以上的才有GPRS 功能支持
AT+COPS? //運營商檢測:
響應 +COPS:0
OK 未找到網絡響應 +COPS:0,0,”UNICOM” //聯通OK響應 +COPS:0,0,”CHINA MOBILE” //移動OK
AT+csq//檢測信號質量,確定是否可以登陸上網絡;若返回10--31,0之間的信號數字則繼續,
//如果信號是99,99,則應該考慮不停的的讓模塊去搜尋網絡。
2、網絡初始化工作
AT+CGCLASS="B"
A->WCDMA: 出廠默認設置
B->GSM/GPRS: AT命令不支持設置此模式?
CG->GPRS Only: AT+CREG?返回未注冊,但能pppd撥號
CC->GSM Only: AT+CREG?查看注冊上,但pppd不能撥號上網
AT+CGDCONT=1,"IP",”CMNET" //首先定義PDP移動場景
AT+CGATT=1 //激活PDP,返回OK則繼續
AT+CIPCSGP=1,"CMNET" //設置模塊連接方式為GPRS連接,接入點為“CMNET”
AT+CDNSORIP=0 //0:通過IP訪問
//1:通過域名訪問
AT+CDNSCFG="211.136.17.107" //初始化本地dns,本例為中國移動
3、建立連接
AT+CIPSTART="TCP/UDP",221.216.163.44,2020
TCP/UDP指明是TCP連接還是UDP連接
221.216.163.44是SEVER端的IP地址 2020為端口
連接成功後模塊返回:
OK
CONNECT OK
4、發送信息
AT+CIPSEN
發送完此命令後出現一個 ">" 符號,這樣就可以在超級終端裡輸入要發送的信息,輸入完畢後按下"ctl+z"發送,即將所要發送的數據發送到指定IP的服務器上AT+CIPSHUT //關閉移動場景
6、應用舉例:
使用TCP向遠端SERVER傳輸數據
服務器端是一台連接到互聯網上的PC機,pc機上可以運行一個接收軟件,這種只適合測試模塊是使用,其實最後開發時還要自己開發一個socket接收程序,注意該PC機的IP地址必須是公網IP,否則客戶端找不到。
1)水木清華BBS訪問:
AT+CIPSTART="TCP","166.111.8.238","23"//清華大學telnet服務器
2)自建一個tcp服務器:
在一個具有公網IP的電腦上運行以下服務器程序:
- //=============================================================
- // 文件名稱:tcp_echo_srv.c
- // 功能描述:TCP Echo Server
- // 維護記錄:2011-8-15 V1.0
- //=============================================================
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h> // bzero
- #include <unistd.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h> // inet_ntop
- //=============================================================
- // 語法格式: void main(void)
- // 實現功能: 主函數,建立一個TCP Echo Server
- // 入口參數: 無
- // 出口參數: 無
- //=============================================================
- i<span style="color:#3333ff;">nt main(int argc, char *argv[])
- {
- char recvbuf[2048]; // 接收緩沖區
- int sockfd; // 套接字
- struct sockaddr_in servAddr; // 服務器地址結構體
- unsigned short port = 8000; // 監聽端口
- if(argc > 1) // 由參數接收端口
- {
- port = atoi(argv[1]);
- }
- printf("TCP Server Started at port %d!\n", port);
- //setp 1: 創建TCP套接字
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
- if(sockfd < 0)
- {
- perror("Invalid socket");
- exit(1);
- }
- //setp 2: 將socket套接字與端口號、本機IP地址綁定
- bzero(&servAddr, sizeof(servAddr)); // 初始化服務器地址
- servAddr.sin_family = AF_INET; // 采用IPV4協議
- servAddr.sin_port = htons(port); // 邦定端口號
- servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //綁定本機IP地址
- printf("Binding server to port %d\n", port);
- printf("servAddr.sin_addr.s_addr=%d\n",servAddr.sin_addr.s_addr);
- if(bind(sockfd, (struct sockaddr*)&servAddr, sizeof(struct sockaddr)) != 0)
- {
- close(sockfd);
- perror("binding err!");
- exit(1);
- }
- //setp 3 將套接字設置為監聽模式
- if(listen(sockfd, 1) != 0)
- {
- close(sockfd);
- perror("listen err!");
- exit(1);
- }
- printf("waiting client...\n");
- while(1)
- {
- char cliIP[INET_ADDRSTRLEN]; // 用於保存客戶端IP地址
- size_t recvLen;
- struct sockaddr_in cliAddr; // 用於保存客戶端地址
- size_t cliAddrLen = sizeof(cliAddr);
- // 必須初始化!!!
- //setp 4:阻塞等待客戶端的連接
- int connfd = accept(sockfd, (struct sockaddr*)&cliAddr, &cliAddrLen);
- // 獲得一個已經建立的連接
- if(connfd < 0)
- {
- close(sockfd);
- perror("accept err!");
- exit(1);
- }
- inet_ntop(AF_INET, &cliAddr.sin_addr.s_addr, cliIP, INET_ADDRSTRLEN);
- printf("client ip = %s\n", cliIP);
- //setp 5:讀取客戶端發送的數據並回送給客戶端
- while((recvLen = read(connfd, recvbuf, 2048)) > 0)
- {
- write(connfd, recvbuf, recvLen);
- }
- close(connfd);
- printf("client closed!\n");
- }
- close(sockfd);
- return 0;
- }
使用以下方式連接:
AT+CIPSTART="TCP","124.*.*.139","8000"
使用以下命令發送數據:
AT+CIPSEND
服務器會把發送的數據回給你