日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

AT指令之 TCP/IP 命令

發(fā)布時間:2023/12/13 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 AT指令之 TCP/IP 命令 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

BC26 還有一組專用于 TCP 通信的 AT 指令:《BC26_TCP/IP_AT_Commands_Manual_V1.1》,之前已經(jīng)有了 Socket 可以進(jìn)行 TCP 通信,現(xiàn)在又出一個 TCP/IP。或許就是 C# 中的 Socket 與 TCPClient 之間的關(guān)系吧,也有可能是早期出了一個簡單版本的可用于 TCP 編程的 Socket,之后又出一個功能更為強(qiáng)大的 TCP/IP,而為了兼容老程序,保留了 Socket 而已。總之,前面弄過的東西需要再來一遍。當(dāng)然 TCP/IP 指令一樣可以用于 UDP 通信,本文就不再講解 UDP 了。

概述(本節(jié)譯自原文檔)

Quectel BC26 模塊嵌入了 TCP/IP 協(xié)議棧,它使得主機(jī)可以直接通過 AT 指令訪問 Internet。這大大減少了對 PPP 和外部 TCP/IP 協(xié)議棧的依賴,從而將成本降到最低。

Quectel BC26 模塊提供了以下 socket 服務(wù):TCP 客戶端和 UDP 客戶端。

數(shù)據(jù)訪問模式

BC26 模塊支持以下兩種類型的數(shù)據(jù)訪問模式:

緩存訪問模式
直接推送模式

當(dāng)通過AT+QIOPEN打開一個 socket 服務(wù),可通過參數(shù)<access_mode>來指定數(shù)據(jù)訪問模式。在 socket 服務(wù)開始后,AT+QISWTMD可用于改變數(shù)據(jù)訪問模式。

在緩存訪問模式中,數(shù)據(jù)可通過AT+QISEND/AT+QISENDEX指令發(fā)送。當(dāng)接收到數(shù)據(jù)時,模塊將緩存數(shù)據(jù)并報告一個 URC,格式為:+QIURC:“recv”,<connectID>[,<current_recv_length>]。主機(jī)可使用AT+QIRD讀取數(shù)據(jù)。

注意:在緩存訪問模式中,如果緩存不為空,模塊將不會報告新的 URC,直到所有收到的數(shù)據(jù)被AT+QIRD從緩存中讀取。

在直接推送模式中,數(shù)據(jù)可通過AT+QISEND/AT+QISENDEX指令發(fā)送。接收到的數(shù)據(jù)將直接通過以下 URC 輸出:

+QIURC: “recv”,<connectID>,<current_recv_length><CR><LF><data>

命令介紹

首先介紹本文所使用到的命令。

AT+QIOPEN=<contextID>,<connectID>,<service_type>,<IP_address>,<remote_port><local_port>,<access_mode>

打開一個 Socket 服務(wù)。

<contextID>:上下文 ID,范圍 1-3,用來干啥的我也不懂,一般情況下設(shè)為 1 就行了。
<connectID>:Socket 服務(wù)編號,其實(shí)就是之前講過的,BC26 最多支持 5 個 Socket,編號 1-4。
<service_type>:協(xié)議類型,"TCP"或"UDP"。
<IP_address>:遠(yuǎn)程服務(wù)器十進(jìn)制點(diǎn)分隔 IP 地址。
<remote_port>:遠(yuǎn)程服務(wù)器端口。
<local_port>:可以指定本地通信端口,一般設(shè)為 0,表示讓程序自動分配。
<access_mode>:Socket 服務(wù)數(shù)據(jù)訪問模式,0 為緩存訪問模式;1 為直接推送模式。

AT+QISTATE=<query_type>,<connectID>

檢查 Socket 服務(wù)的連接狀態(tài)。

<query_type>:指是通過<contextID>(0)還是通過<connectID>(1)來查詢連接狀態(tài)。一般情況下都是用 1,即<connectID>進(jìn)行查詢。
<connectID>:選擇 5 個 socket 中的一個查詢,范圍 0-4。

AT+QISEND=<connectID>,<send_length>,<data>

向服務(wù)器發(fā)送數(shù)據(jù)。

<send_length>:發(fā)送數(shù)據(jù)的長度,以字節(jié)為單位
<data>:發(fā)送的數(shù)據(jù)

AT+QISEND=<connectID>

向服務(wù)器發(fā)送變長數(shù)據(jù)。發(fā)送此命令后,服務(wù)器會響應(yīng)一個>,此時輸入要發(fā)送的數(shù)據(jù),并按快捷鍵【Ctrl + Z】即可發(fā)送給服務(wù)器。

AT+QISENDEX=<connectID>,<send_length>,<hex_string>

十六進(jìn)制字符串格式發(fā)送數(shù)據(jù),如AT+QISENDEX=0,5,3031323334,是向 0 號 Socket 發(fā)送長度為 5 的字符串“01234”。

AT+QIRD=<connectID>,<read_length>

從接收緩存中讀取數(shù)據(jù)。

<read_length>:接收的長度,最大值為 512 字節(jié),一般設(shè)置為 512 更方便,它會自動按緩存中的數(shù)據(jù)長度接收。

AT+QICFG="showlength"[,<show_length_mode>]

設(shè)置在收到服務(wù)器信息時,顯示的 URC 中是否包含數(shù)據(jù)長度信息。

<show_length_mode>:設(shè)為 0 表示不顯示,設(shè)為 1 表示顯示。

AT+QICFG="viewmode"[,<view_mode>]

設(shè)置在讀取接收緩存中的數(shù)據(jù)時的顯示格式。

<view_mode>

0:格式為:數(shù)據(jù)長度,剩余長度,數(shù)據(jù)
1:格式為:數(shù)據(jù)長度,數(shù)據(jù)

AT+QICLOSE=<connectID>

關(guān)閉連接。

AT+QPING=<contextID>,<host>

Ping 一個遠(yuǎn)程服務(wù)器。

<host>:遠(yuǎn)程主機(jī)域名或 IP 地址

AT+QNTP=<contextID>,<server>

從遠(yuǎn)程服務(wù)器同步時間。

<server>:遠(yuǎn)程時間服務(wù)器域名或 IP 地址。

服務(wù)器端

本文使用的例子較多,經(jīng)常重新連接,不能再象上一個程序那樣,每一個連接就要重啟一次程序。這次程序改為可接收多個連接。

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using System.Text;

namespace TCPSocket
{
    class Program
    {
        static void Main(string[] args)
        {   //設(shè)置服務(wù)器 IP,如果是騰訊云,必須使用內(nèi)網(wǎng)地址,而不是公網(wǎng) IP。
            IPAddress ip = IPAddress.Parse("172.16.0.11");
            IPEndPoint point = new IPEndPoint(ip, 5000); //端口指定為 5000
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            s.Bind(point);
            //開一個單獨(dú)的線程去偵聽客戶端連接
            Task.Factory.StartNew(() => Listening(s), TaskCreationOptions.LongRunning);
            Console.ReadLine(); //按回車關(guān)閉程序
        }

        //偵聽線程方法
        static void Listening(Socket s)
        {
            s.Listen(5);
            Console.WriteLine("服務(wù)器開始偵聽...");
            while (true)
            {
                Socket subSocket = s.Accept(); //等待新連接
                Console.WriteLine("獲取一個來自{0}的連接", subSocket.RemoteEndPoint.ToString());
                //創(chuàng)建線程接收客戶端的消息
                Task.Factory.StartNew(() => ReceiveMessage(subSocket), TaskCreationOptions.LongRunning);
            }
        }

        //監(jiān)聽客戶端連接的線程方法
        static void ReceiveMessage(Socket subSocket)
        {
            byte[] buff = new byte[1024]; //創(chuàng)建一個接收緩沖區(qū)
            try
            {
                while (true)
                {
                    int count = subSocket.Receive(buff, buff.Length, SocketFlags.None);
                    //下面這個判斷是非常必要的,否則有可能導(dǎo)致不停地接收到長度為 0 的數(shù)據(jù),導(dǎo)致 CPU 占用率100%
                    if (count == 0)
                    {
                        subSocket.Close();
                        return;
                    }
                    //將接收到的數(shù)據(jù)轉(zhuǎn)化為 ASCII 字符
                    string recvStr = Encoding.ASCII.GetString(buff, 0, count);
                    Console.WriteLine($"接收到數(shù)據(jù):{recvStr}");
                    //將消息原樣返回
                    subSocket.Send(buff, count, SocketFlags.None);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                subSocket.Close();//客戶端關(guān)閉時會引發(fā)異常,此時關(guān)閉此連接
                Console.WriteLine($"客戶端{(lán)subSocket.RemoteEndPoint.ToString()}已退出連接。");
            }
        }
    }
}

啟動程序后,可以最小化去放心做實(shí)驗(yàn)了,重連多少次都不需要再回來看一眼。

緩存訪問模式

BC26 支持兩種數(shù)據(jù)訪問模式:緩存訪問模式和直接推送模式。我們首先介紹緩存訪問模式的操作。

數(shù)據(jù)的發(fā)送

發(fā)送數(shù)據(jù)使用AT+QISENDAT+QISENDEX兩個命令。

發(fā)送定長數(shù)據(jù)

//打開 socket 服務(wù),并指定為緩存訪問模式
>>>>>>>>>>  AT+QIOPEN=1,0,"TCP","193.112.19.116",5000,0,0

OK

+QIOPEN: 0,0 //URC:兩個參數(shù)分別表示 socket 編號和錯誤碼。

//查詢網(wǎng)絡(luò)狀態(tài)
>>>>>>>>>>  AT+QISTATE=1,0
//倒數(shù)第三個參數(shù) 2 表示已經(jīng)連接網(wǎng)絡(luò)
+QISTATE: 0,"TCP","193.112.19.116",5000,0,2,1,0

OK
//發(fā)送長度為10個字節(jié)的字符串“1234567890”
>>>>>>>>>>  AT+QISEND=0,10,1234567890

OK

SEND OK

+QIURC: "recv",0 //URC:表示 0 號 socket 接收到數(shù)據(jù)
//發(fā)送長度為5個字節(jié)的十六進(jìn)制格式的字符串“01234”
>>>>>>>>>>  AT+QISENDEX=0,5,3031323334 

OK

SEND OK

>>>>>>>>>>  AT+QICLOSE=0 //關(guān)閉 socket 服務(wù)

OK

CLOSE OK

此例使用兩種方法向服務(wù)器發(fā)送數(shù)據(jù),第一次是直接發(fā)送字符串,服務(wù)器返回?cái)?shù)據(jù),并報告 URC。第二次發(fā)送的是編碼形式的數(shù)據(jù),服務(wù)器返回?cái)?shù)據(jù)但沒有報告 URC,因?yàn)榈谝淮谓邮盏膬?nèi)容未接收,接收緩存未清空。

發(fā)送變長數(shù)據(jù)

發(fā)送變長數(shù)據(jù)需使用AT+QISEND=0命令,此時服務(wù)響應(yīng)一個>,表示等待用戶輸入,用戶在輸入數(shù)據(jù)后,在結(jié)尾添加 0x1A 即可向服務(wù)器發(fā)送無需標(biāo)明長度的數(shù)據(jù)。弄懂這個命令費(fèi)了一些周折。因?yàn)槲臋n寫的是輸入命令后,按下【Ctrl + Z】鍵,上帝啊!我想不出哪個串口工具可以使用【Ctrl + Z】來發(fā)送命令啊!所有編輯框里的【Ctrl + Z】都是用來 Undo 的。后來發(fā)現(xiàn)只要在數(shù)據(jù)的結(jié)尾加上 0x1A 發(fā)送即可,0x1A 即代表【Ctrl + Z】鍵。絕不能結(jié)尾加上回車(0x0D,0x0A),必須是以 0x1A 結(jié)束。

自己寫工具的好處就在于自由,想加啥都行,當(dāng)即加上此功能,版本改為 1.01。如下圖左邊【發(fā)送區(qū)設(shè)置】區(qū)域內(nèi)添加了一個“自動添加【Ctrl+Z】”項(xiàng),選擇此項(xiàng)后,再點(diǎn)綠色按鈕發(fā)送數(shù)據(jù),就會自動添加 0x1A 并發(fā)送。

按上圖所示設(shè)置接收區(qū)和發(fā)送區(qū)選項(xiàng),打開 TCP Client 腳本,所有命令需要使用右邊腳本面板中每條命令右邊的三角按鈕發(fā)送。僅在AT+QISEND=0命令之后的輸入發(fā)送數(shù)據(jù)時使用發(fā)送區(qū)進(jìn)行發(fā)送。在選擇“自動添加【Ctrl+Z】”項(xiàng)時,由于無法在命令后面添加回車,發(fā)送區(qū)不能發(fā)送命令。以下是完整命令腳本

>>>>>>>>>>  AT+QIOPEN=1,0,"TCP","193.112.19.116",5000,0,0

OK

+QIOPEN: 0,0

>>>>>>>>>>  AT+QISEND=0

>

>>>>>>>>>>  www.iotxfd.cn  //注意,這里的結(jié)尾是 0x1A

OK

SEND OK

+QIURC: "recv",0

>>>>>>>>>>  AT+QICLOSE=0

OK

CLOSE OK

在使用這種方式進(jìn)行發(fā)送時,還可以指定基最大發(fā)送長度,如AT+QISEND=0,10,表示只發(fā)送 10 個字節(jié)。下例演示了這種情況:

>>>>>>>>>>  AT+QIOPEN=1,0,"TCP","193.112.19.116",5000,0,0

OK

+QIOPEN: 0,0

>>>>>>>>>>  AT+QISEND=0,10

>

>>>>>>>>>>  www.iotxfd.cn  //注意,這里的結(jié)尾是 0x1A

www.iotxfd  //多出的字符串被截?cái)?OK

SEND OK

+QIURC: "recv",0

>>>>>>>>>>  AT+QICLOSE=0

OK

CLOSE OK

可以看到,由于指定了最大長度,多出來的字符串未被發(fā)送。

數(shù)據(jù)的接收

先來一個最簡單的接收示例:

>>>>>>>>>>  AT+QIOPEN=1,0,"TCP","193.112.19.116",5000,0,0 //創(chuàng)建 Socket 服務(wù)

OK

+QIOPEN: 0,0 //連接成功,使用的是 0 號 socket

>>>>>>>>>>  AT+QISEND=0,10,1234567890 //發(fā)送字符串“01234567890”

OK

SEND OK

+QIURC: "recv",0 //URC:0 號 socket 收到信息

>>>>>>>>>>  AT+QIRD=0,512 //接收 0 號 socket 的接收緩沖區(qū),長度 512

+QIRD: 10 //收到 10 個字節(jié)
1234567890 //數(shù)據(jù)為:1234567890

OK

>>>>>>>>>>  AT+QIRD=0,512 //再次接收

+QIRD: 0 //指示接收緩沖已空

OK

>>>>>>>>>>  AT+QICLOSE=0 //關(guān)閉 socket 服務(wù)

OK

CLOSE OK

這種接收方式應(yīng)當(dāng)是最常用的,每次按最大接收數(shù) 512 進(jìn)行接收,最終只按實(shí)際數(shù)據(jù)長度進(jìn)行接收,使用起來非常方便。你也可以指定接收的長度,如:

>>>>>>>>>>  AT+QIOPEN=1,0,"TCP","193.112.19.116",5000,0,0

OK

+QIOPEN: 0,0

>>>>>>>>>>  AT+QISEND=0,10,1234567890

OK

SEND OK

+QIURC: "recv",0 //URC:0 號 socket 收到信息

>>>>>>>>>>  AT+QIRD=0,6 //指定接收長度為 6 個字節(jié)

+QIRD: 6 //接收了 6 個字節(jié)
123456

OK

>>>>>>>>>>  AT+QIRD=0,6 //再次接收

+QIRD: 4 //接收了剩余的 4 個字節(jié)
7890

OK

>>>>>>>>>>  AT+QICLOSE=0

OK

CLOSE OK

可以使用AT+QICFG="showlength",1指令更改收到信息 URC 的顯示方式,讓其指示收到了多少個字節(jié)。過程如下圖所示:

可以使用AT+QICFG="viewmode",1更改接收信息的顯示方式:

>>>>>>>>>>  AT+QICFG="viewmode",0 //將接收信息顯示方式改為 0

OK

>>>>>>>>>>  AT+QIOPEN=1,0,"TCP","193.112.19.116",5000,0,0

OK

+QIOPEN: 0,0

>>>>>>>>>>  AT+QISEND=0,10,1234567890

OK

SEND OK

+QIURC: "recv",0,10

>>>>>>>>>>  AT+QIRD=0,4 //先接收 4 個字節(jié)

+QIRD: 4,6 //接收 4 個字節(jié),剩余 6 個字節(jié)
1234   //換行顯示

OK

>>>>>>>>>>  AT+QICFG="viewmode",1 //將接收信息顯示方式改為 1

OK

>>>>>>>>>>  AT+QIRD=0,4 //再次接收 4 個字節(jié)

+QIRD: 4,2,5678 //接收 4 個字節(jié),剩余 2 個字節(jié),數(shù)據(jù)直接在逗號后面顯示

OK

>>>>>>>>>>  AT+QIRD=0,4 //再次接收 4 個字節(jié)

+QIRD: 2,0,90  //只收到了 2 個字節(jié)

OK

>>>>>>>>>>  AT+QIRD=0,4

+QIRD: 0

OK

>>>>>>>>>>  AT+QICLOSE=0

OK

CLOSE OK

從上例可觀察到,在顯示接收數(shù)據(jù)時,viewmode=0,會換行顯示數(shù)據(jù)。viewmode=1 則直接在逗號后面顯示數(shù)據(jù)。

直接推送模式

使用直接推送模式會在 URC 中直接顯示接收到的數(shù)據(jù),如下圖所示:

很明顯,如果收到的數(shù)據(jù)量較小,使用直接推送模式會方便很多。

Ping 一個遠(yuǎn)端地址

我這里有兩塊開發(fā)板,一塊直接無法 Ping,另一塊可以 Ping,但速度很慢。

>>>>>>>>>>  AT+QPING=1,193.112.19.116

OK

+QPING: 569

+QPING: 0,"193.112.19.116",32,990,52

+QPING: 0,"193.112.19.116",32,2060,52

+QPING: 0,"193.112.19.116",32,1040,52

+QPING: 0,4,3,1,990,2060,1363

>>>>>>>>>>  AT+QPING=1,"www.baidu.com"

OK

+QPING: 0,"39.156.66.18",32,1560,52

+QPING: 569

+QPING: 0,"39.156.66.18",32,560,52

+QPING: 569

+QPING: 0,4,2,2,560,1560,1060

上述代碼中的 569 為錯誤碼,表示超時。

時間同步

時間同步也一樣,一塊開發(fā)板無法用,另一塊可以:

>>>>>>>>>>  AT+QNTP=1,"ntp5.aliyun.com"

OK

+QNTP: 0,"20/01/01,12:50:38+32"

新年第一天,泡制完 2020 年的第一篇文章。這個系列得停一段時間,想著還是得先把 RFID 寫完了再回來繼續(xù)。

總結(jié)

以上是生活随笔為你收集整理的AT指令之 TCP/IP 命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。