移遠 M26 GSM模組(2G通信模組)AT指令測試 TCP 通信過程

移遠M26通信模組


M26 是一款超小的四頻 (850/900/1800/1900MHz)LCC 封裝 GSM/GPRS 模塊,尺寸僅爲15.8mm×17.7mm×2.3mm,主要特點有:

  • 供電電壓3.3V~4.6V,待機電流低至1.3mA
  • 支持音頻功能、藍牙功能
  • 支持移遠遠程升級技術 QuecFOTATM 升級
  • 內嵌網絡服務協議棧,支持多個 Socket 及 IP 地址
  • 支持的協議:TCP/UDP/PPP/FTP/HTTP/SMTP/CMUX/SSL

1. 環境準備

1.1. 硬件準備

  • 小熊派開發板

BearPi-IoT

  • M26通信模組

M26通信模組

小熊派開發板右上角的開關撥到AT-PC一端,則模組直接與PC相連,方便調試。

1.2. 軟件準備

  • QCOM串口助手
  • M26通信模組測試AT命令腳本(M26.ini)

下載地址:https://github.com/Mculover666/QCOM_Tools_Scripts

下載之後在QCOM中導入M26測試腳本的方法如下:



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

功能:查詢模組的信號強度

響應:第一個值rssi爲信號值,0-31則正常,第二個值ber爲誤碼率,99爲不可測。

+CSQ: <rssi>,<ber>

示例:

AT+CSQ

+CSQ: 17,0

OK

AT+CREG?

指令:AT+CREG?

功能:查詢模組是否註冊上GSM網絡

響應:第一個參數n爲0表示禁用網絡註冊非請求結果碼,第二個參數stat爲1表示已註冊上本地網,爲5表示註冊上漫遊網,其餘值表示註冊不成功。

+CREG:<n>,<stat>

示例:

AT+CREG?

+CREG: 0,1

OK

AT+CGREG?

指令:AT+CERGE?

功能:查詢模組是否註冊上GPRS網絡

響應:第一個參數n爲0表示禁用網絡註冊非請求結果碼,第二個參數stat爲1表示已註冊上本地網,爲5表示註冊上漫遊網,其餘值表示註冊不成功。

+CGREG:<n>,<stat>

示例:

AT+CGREG?

+CGREG: 0,1

OK

3. 激活移動場景,獲取ip地址

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

AT+QIFGCNT=0

指令:AT+QIFGCNT=0

功能:配置當前場景

示例:

AT+QIFGCNT=0

OK

AT+QICSGP=1, “CMNET”

指令:

AT+QICSGP=<mode>, <apn>

功能:

  • 參數mode設置連接模式,0表示CSD連接模式,1表示GPRS連接模式;
  • 參數apn設置GPRS的APN(移動CMNET、聯通UNINET);

示例:

AT+QICSGP=1, "CMNET"

OK

AT+QIDEACT

指令:AT+QIDEACT

功能:在激活GPRS場景之前先關閉GPRS場景,確保連接正確

示例:

AT+QIDEACT

DEACT OK

AT+QIMUX=1

指令:

AT+QIMUX=<mode>

功能:

  • mode爲1表示啓用多路鏈接模式;
  • mode爲0表示不啓用多路鏈接模式;

示例:

AT+QIMUX=1

OK

AT+QIMODE=0

指令:

AT+QIMODE=<mode>

功能:設置數據傳輸模式,mode爲0表示非透傳模式,mode爲1表示透傳模式

示例:

AT+QIMODE=0

OK

AT+QIREGAPP

指令:AT+QIREGAPP

功能:啓動任務設置接入點APN

示例:

AT+QIREGAPP

OK

AT+QIACT

指令:AT+QIACT

功能:激活移動場景

示例:

AT+QIACT

OK

AT+QILOCIP

指令:AT+QILOCIP

功能:查看模組獲取的IP地址

示例:

AT+QILOCIP

100.125.208.23

4. 基於 TCP 協議連接遠程服務器通信實例

4.1. 搭建遠程TCP服務器

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

  • 在服務器上使用Python、Java、C#等語言自行編寫服務器程序;
  • 在本地PC上使用網絡調試助手開啓TCP服務器;

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

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

這裏的Python程序如下:

# tcp-server.py

from socket import *

host = ''
port = 8000

# 創建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

效果如下:

Tcp服務器程序

4.2. 模組連接服務器

M26作爲 TCP 客戶端的時候,連接TCP服務器的指令需要分以下兩種情況對待。

① 如果是單鏈路模式(之前設置AT+QIMUX=0),則指令如下:

AT+QIOPEN=<mode>,<IPaddress>/<domain name>,<port>

② 如果是多鏈路模式(之前設置AT+QIMUX=1),則指令如下:

AT+QIOPEN=<index>,<mode>,<IPaddress>/<domain name>,<port>

其中每個參數的意義如下:

  • index:0-5,多鏈路模式下有效,表示sokcet連接序號,M26 支持 6 個 SOCKET 同時存在;
  • mode:字符串類型,“TCP”或者“UDP”,表示socket連接模式;
  • Ipaddress:字符串類型,表示服務器ip地址;
  • domain name:字符串類型,表示服務器域名地址;
  • port:整數類型,表示服務器端口號;

兩條指令的響應:

① 如果格式正確,返回:

OK

如果格式錯誤,返回:

ERROR

② 如果連接成功,返回:

[<index>,] CONNECT OK

如果連接失敗,返回:

[<index>,] CONNECT FAIL

如果該編號的socket已經存在,返回:

ALREAY CONNECT

示例:

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

OK

0, CONNECT OK

連接之後,在服務器端也可以看到:

在這裏插入圖片描述

4.2. 模組接收消息

M26模組接收消息有兩種模式,一種是接收到後直接打印,另一種是接收到緩存區中,使用AT指令讀取,另外,還可以控制接收數據時的IP頭是否顯示。

4.2.1. 接收後直接打印模式

① 接收後直接打印,不顯示IP頭(默認模式):

+RECEIVE: 0, 14
Hello, client!

② 接收後直接打印,顯示IP頭,需要配置:

AT+QIHEAD=1

OK

接收效果如下:

+RECEIVE: 0, 14
IPD14:Hello, client!

4.2.2. 接收後保存到緩存區中

這種模式需要使用AT指令進行配置。

指令:

AT+QINDI=<m>

功能:配置是否緩存接收到的數據

參數說明:

  • m = 0:默認模式,接收後直接輸出到串口;
  • m = 1:緩存模式1,接收到數據將會向串口上報提示(此時可以通過 AT+QIRD 讀取緩存的數據),格式爲:
+QIRDI: <id>,<sc>,<sid>
  • m = 2:緩存模式 2;接收到數據將會向串口上報提示,格式爲:
+QIRDI: <id>,<sc>,<sid>,<num>,<len>,<tlen>

每個 Socket 將建立一個緩存,接收的數據將被保存在緩存中,直到通過 AT+QIRD 讀取緩存的數據,緩存數據不應超過400KB。

示例:

AT+QINDI=1

OK

配置之後,模組接收到數據後就只會上報,如下:

+QIRDI: 0,1,0

使用AT指令讀取數據:

AT+QIRD=0,1,0,128

+QIRD: 117.50.111.72:8902,TCP,14
Hello, client!
OK

4.3. 模組主動發送消息

使用如下的命令即可向TCP服務器發送消息,首先設置要發送數據的字節數,等待模組返回>後,輸入要發送的數據即可,如果發送的數據超過了設置的n個字節,則只發送前n個字節,後面的數據被認爲是無效數據,不會發送:

AT+QISEND

>hello<0x1a>

示例:

Hello, client!AT+QISEND

> hello

SEND OK

發送成功看服務器上運行的TCP服務器是否收到:

4.4. 關閉TCP連接

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

AT+QICLOSE

示例:

AT+QICLOSE

CLOSE OK

5. 域名解析

指令:

AT+QIDNSGIP=<domain name

功能:域名解析

響應:

① 如果AT格式正確,返回

OK

如果AT格式錯誤,返回:

ERROR

② 如果解析成功,返回:

<IP address>

如果解析失敗,返回:

ERROR: <err>
STATE: <state>

示例:

AT+QIDNSGIP="www.mculover666.cn"

OK

122.51.89.94

接收更多精彩文章及資源推送,歡迎訂閱我的微信公衆號:『mculover666』。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章