移遠 EC20 模組(4G通訊模組)AT指令測試 TCP 通訊過程

bobuddy發表於2020-09-29

移遠EC20 4G 模組

述

LTE Standard EC20 R2.1是移遠通訊推出的 LTE Cat 4 無線通訊模組,採用 LTE 3GPP Rel.11 技術,支援最大下行速率 150Mbps 和最大上行速率 50Mbps,使用LCC封裝,主要特點有:

  • 供電電壓: 3.3V~4.3V,典型值 3.8V
  • 支援的網路協議棧眾多
    • TCP/UDP/PPP/FTP/HTTP/NTP/PING
    • QMI/NITZ/CMUX/HTTPS/SMTP/MMS/FTPS/SMTPS/SSL/FILE
  • 驅動支援眾多:
    • USB 虛擬串列埠驅動
    • RIL 驅動、NDIS 驅動、ECM 驅動、Gobinet 驅動、Linux qmi wwan 驅動:
  • GNSS支援:GPS/GLONASS/BeiDou/Galileo/QZSS

1. 環境準備

1.1. 硬體準備

EC20通訊模組+USB轉串列埠+一條USB線:


模組引腳圖如下:

1.2. 軟體準備

  • QCOM串列埠助手
  • EC20通訊模組測試AT命令指令碼(EC20.ini)
  • Windows USB 驅動

使用AT指令測試移遠EC20模組有兩種方法:

① 第一種是使用USB轉串列埠連線模組:

在這裡插入圖片描述

② 第二種是直接使用USB線連線到模組,使用虛擬AT串列埠測試。

本文使用第二種方法,將模組直接通過USB線連線到電腦之後,安裝官方提供的驅動,驅動安裝成功後在裝置管理器中即可看到虛擬AT串列埠:


使用QCOM工具開啟該串列埠,波特率115200-8-N-1:

1.3. 文件準備

此文件來自於移遠官方!閱讀本教程時,關於AT指令的詳細說明請參考該文件!

2. 模組訊號查詢與網路查詢AT指令

AT

指令:AT

功能:測試AT指令功能是否正常

示例:

AT

OK

AT+CPIN?

指令:AT+CPIN?

功能:查詢SIM卡是否正常,返回ready則表示SIM卡正常

示例,如果SIM卡插入成功,則返回結果為:

AT+CPIN?

+CPIN: READY

OK

如果未插入SIM卡,則返回結果為:

AT+CPIN?

+CME ERROR: 10

AT+CSQ

指令:AT+CSQ

功能:查詢模組的訊號強度,第一個值為0-31則正常,99為不正常

示例:

AT+CSQ

+CSQ: 17,0

OK

此處有問題,模組實際返回+CSQ:22,99

AT+CREG?

指令:AT+CREG?

功能:查詢模組是否註冊上GSM網絡,+CREG:0,1 表示已註冊上本地網,+CREG:0,5表示註冊上漫遊網。

示例:

AT+CREG?

+CREG: 0,1

OK

AT+CGREG?

指令:AT+CERGE?

功能:查詢模組是否註冊上GPRS網路,+CGREG:0,1 表示已註冊上本地網,+CGREG:0,5表示註冊上漫遊網。

示例:

AT+CGREG?

+CGREG: 0,1

OK

3. 啟用移動場景

必須在查詢GPRS網路已正常註冊網路的情況下進行本節實驗!

AT+QICSGP=1,1,“CMNET”

指令:AT+QICSGP=1,1,“CMNET”

功能:設定GPRS的APN,移動CMNET,聯通UNINET

示例:

AT+QICSGP=1,1,"CMNET"

OK

AT+QIDEACT=1

指令:AT+QIDEACT=1
功能:在啟用GPRS場景之前先關閉GPRS場景,確保連線正確

示例:

AT+QIDEACT=1
OK

AT+QIACT=1

指令:AT+QIACT=1

功能:啟用移動場景

示例:

AT+QIACT=1

OK

4. 基於 TCP 協議連線遠端伺服器通訊例項

4.1. 搭建遠端TCP伺服器

首先我們需要搭建一個TCP伺服器,有兩種方式:

  • 在伺服器上使用Python、Java、C#等語言自行編寫伺服器程式;
  • 在本地PC上使用網路除錯助手開啟TCP伺服器;

因為EC20模組直接註冊的是公網ip地址,所以這裡我們使用第一種方式,在Linux伺服器上執行一個Python編寫的tcp測試伺服器:

本地PC使用的是區域網,公網不可以直接根據ip地址訪問到本PC,需要進行內網穿透,不推薦使用。

這裡的Python程式如下:

# tcpserver.py

from socket import *

host = ''
port = 8902

# 建立server socket
server_socket = socket(AF_INET,SOCK_STREAM)

# 繫結socket監聽地址
server_addr = (host,port)
server_socket.bind(server_addr)

# 開始監聽,最大允許連線數5
server_socket.listen(5)

# 處理連線請求
try:
    while True:
        print('waiting for connect...')
        #阻塞等待客戶端的連線 
        client_socket, client_addr = server_socket.accept()
        # 連線成功後,列印客戶端資訊
        print('a client connnect from:', client_addr)

        while(True):
            # 向客戶端傳送資料
            client_socket.send('Hello, client!'.encode())

            # 接收客戶端的資料
            data = client_socket.recv(1024)
            print('recv data is ', data.decode())

            # 接收到quit則關閉socket
            if "quit" in data.decode():
                break
        
        # 關閉socket
        client_socket.close()
        server_socket.close()
        print("socket closed.")
        break
except:
    client_socket.close()
    server_socket.close()
    print("socket closed.")

執行:

python3 tcp-server.py

效果如下:

4.2. 模組連線伺服器

使用AT命令連線TCP伺服器,其中第一個引數是協議型別,“TCP”則表示使用TCP協議,第二個引數是TCP伺服器ip地址,也可以使用域名,最一個引數是TCP伺服器開啟監聽的埠:

AT+QIOPEN=<contextID>,<connectID>,<service_type>,<IP_address>/<domain_name>,<remote_port>[,<local_port>[,<access_mode>]]

最後一個引數access_mode是接收模式配置,0-緩衝區接收方式,1-直接接收方式

示例:

AT+QIOPEN=1,0,"TCP","117.50.111.72",8902,0,0

OK

+QIOPEN: 0,0

連線之後,在伺服器端也可以看到:

4.2. 模組接收訊息

模組連線到伺服器後,伺服器會自動傳送訊息,模組還沒有配置,所以直接列印出了:

+QIURC: "recv",0

使用命令讀取資料:

AT+QIRD=0,1500

+QIRD: 14
Hello, client!

OK

直接模式接收效果如下:

+QIURC: "recv",0,14
Hello, client!

4.3. 模組主動傳送訊息

使用如下的命令即可向TCP伺服器傳送訊息,首先設定要傳送資料的位元組數,等待模組返回>後,輸入要傳送的資料即可,如果傳送的資料超過了設定的n個位元組,則只傳送前n個位元組,後面的資料被認為是無效資料,不會傳送:

AT+QISEND=0

>hello<0x1a>

示例:

AT+QISEND=0

> hello

SEND OK

傳送成功看伺服器上執行的TCP伺服器是否收到:

4.4. 關閉TCP連線

通訊完畢之後,可以使用下面的命令關閉TCP連線:

AT+QICLOSE=<connectID>[,<timeout>]

示例:

AT+QICLOSE=0

OK

5. 域名解析

指令:

AT+QIDNSGIP=<contextID>,<hostname>

功能:域名解析

示例:

AT+QIDNSGIP=1,"www.mculover666.cn"

OK

+QIURC: "dnsgip",0,1,600

+QIURC: "dnsgip","122.51.89.94"

相關文章