- 前言
- 一、基礎(chǔ)說(shuō)明
- 1.1 CAT1 與 4G
- 1.2 EC800M 模塊
- 1.3 HTTP
- 二、開(kāi)始使用
- 2.1 硬件設(shè)計(jì)部分
- 2.2 模塊上電流程
- 2.3 PDP 上下文
- 三、 HTTP 流程
- 3.1 客戶(hù)端
- 3.2 服務(wù)器端
- 結(jié)語(yǔ)
前言
最近用到了 CAT1 模塊 EC800 ,項(xiàng)目需求是使用 CAT1 模塊通過(guò) HTTP 協(xié)議上報(bào)數(shù)據(jù)給服務(wù)器。
以前的項(xiàng)目對(duì)于 MQTT 協(xié)議使用比較多,對(duì)于 HTTP 其實(shí)并沒(méi)有太過(guò)深入的了解, 寫(xiě)本文的目的就是 記錄一下 EC800 HTTP 協(xié)議的使用流程,給大家提供一個(gè)例子,在對(duì) HTTP 協(xié)議沒(méi)有深入理解的情況下,如何能夠快速的使得產(chǎn)品正常的設(shè)計(jì)出來(lái)。ヾ(?°?°?)?? !
因?yàn)樯婕暗揭苿?dòng)通信網(wǎng)絡(luò)相關(guān)問(wèn)題,對(duì)于一些專(zhuān)業(yè)性的基本知識(shí),本文會(huì)中會(huì)引用前人的一些博文說(shuō)明,文中的引用都會(huì)給出原文連接。
我是矜辰所致,全網(wǎng)同名,盡量用心寫(xiě)好每一系列文章,不浮夸,不將就,認(rèn)真對(duì)待學(xué)知識(shí)的我們,矜辰所致,金石為開(kāi)!
一、基礎(chǔ)說(shuō)明
接到項(xiàng)目需求,第一時(shí)間就得對(duì)一些基本的背景知識(shí)做一定的了解,比如 什么是 CAT1? 模塊的基本應(yīng)用資料,HTTP 的相關(guān)知識(shí)等等。
1.1 CAT1 與 4G
Cat.1 的全稱(chēng)是 LTE UE-Category1,在2009年,Cat.1-5 是 3GPP 專(zhuān)門(mén)劃分出來(lái),面向于未來(lái)物聯(lián)網(wǎng)應(yīng)用市場(chǎng)的類(lèi)別,Cat.1 的最終目標(biāo)是服務(wù)于物聯(lián)網(wǎng)并實(shí)現(xiàn)低功耗和低成本 LTE 連接。
LTE 英文 “Long-Term Evolution” ,中文名稱(chēng)為長(zhǎng)期演進(jìn)技術(shù)。它是一種用于移動(dòng)通信的無(wú)線(xiàn)網(wǎng)絡(luò)標(biāo)準(zhǔn),也是4G(第四代)移動(dòng)通信技術(shù)的主要標(biāo)準(zhǔn)之一。 UE 英文 “User Equipment” 指的是用戶(hù)終端,它是LTE網(wǎng)絡(luò)下用戶(hù)終端設(shè)備的無(wú)線(xiàn)性能的分類(lèi)。3GPP用Cat.1~20來(lái)衡量用戶(hù)終端設(shè)備的無(wú)線(xiàn)性能,也就是劃分終端速率等級(jí)。
Cat.1 是屬于4G系列,可以完全重用現(xiàn)有的4G資源。Cat.1是配置為最低版本參數(shù)的用戶(hù)終端級(jí)別,可讓業(yè)界以低成本設(shè)計(jì)低端4G終端。
隨著現(xiàn)在物聯(lián)網(wǎng)的發(fā)展,Cat.1 在物聯(lián)網(wǎng)領(lǐng)域越發(fā)重要,與NB-IoT和2G模塊相比,Cat.1在網(wǎng)絡(luò)覆蓋范圍,速度和延遲方面具有優(yōu)勢(shì)。與傳統(tǒng)的 Cat.4 模塊相比,它具有成本低,功耗低的優(yōu)點(diǎn)。
1.2 EC800M 模塊
EC800M-CN 是移遠(yuǎn)通信專(zhuān)為 M2M 和 IoT 領(lǐng)域而設(shè)計(jì)的超小尺寸LTE Cat 1無(wú)線(xiàn)通信模塊,支持最大下行速率10 Mbps和最大上行速率 5 Mbps。
對(duì)于模塊來(lái)說(shuō),移遠(yuǎn)會(huì)提供你完成的一套說(shuō)明資料,硬件設(shè)計(jì),軟件設(shè)計(jì),使用流程應(yīng)有盡有,如果你本身對(duì)這一領(lǐng)域有所了解,那使用起來(lái)基本不費(fèi)什么事情,完全不需要去額外的尋找資料。
1.3 HTTP
如果你了解 HTTP ,以及 4G 網(wǎng)絡(luò)的一些基礎(chǔ),那你直接照著上面 模塊的手冊(cè)資料直接 AT 指令直接用起來(lái)就行了。
如果你沒(méi)有了解過(guò),確實(shí)需要花店時(shí)間去了解,這里推薦一篇文章:
HTTP超詳細(xì)教程
對(duì)于我們應(yīng)用而言,有幾個(gè)地方我們是一定要了解的,第一個(gè) HTTP 協(xié)議格式,比如 HTTP 的協(xié)議格式(圖片引用至上面推薦文章):
HTTP 請(qǐng)求格式:
HTTP 響應(yīng)格式:
HTTP 協(xié)議格式:
GET 方法用來(lái)獲取服務(wù)器上面的數(shù)據(jù),對(duì)于我們的項(xiàng)目,我們其實(shí)只需要用到 HTTP 的 POST 方法,POST請(qǐng)求需要傳遞的數(shù)據(jù)一般通過(guò) body 傳遞。
比如一個(gè)給服務(wù)器輸入用戶(hù)名密碼的 POST 請(qǐng)求例子(圖片引用至上面推薦文章):
對(duì)于我們使用 CAT1 模塊來(lái)說(shuō),我們最終要做的就是在程序中組一個(gè)類(lèi)似上面內(nèi)容的數(shù)據(jù)包,發(fā)送出去就行了。
當(dāng)然實(shí)際上一般在物聯(lián)網(wǎng)場(chǎng)合,傳感器上報(bào)數(shù)據(jù)需要組的包比上面會(huì)簡(jiǎn)單得多。
二、開(kāi)始使用
基礎(chǔ)知識(shí)了解過(guò)后,接下來(lái)就是開(kāi)始測(cè)試使用了。
2.1 硬件設(shè)計(jì)部分
硬件部分基本上照著 官方文檔來(lái)就行了,沒(méi)有一點(diǎn)難度,真的沒(méi)什么好說(shuō)的,省略,詳細(xì)請(qǐng)參考 《Quectel_EC800M-CN_硬件設(shè)計(jì)手冊(cè)_V1.1.pdf》(不同型號(hào)的芯片有不同的對(duì)應(yīng)手冊(cè),根據(jù)手冊(cè)來(lái)就行了)。
象征性的上一張?jiān)韴D:
2.2 模塊上電流程
雖然模塊的官方會(huì)提供文檔說(shuō)明 HTTP 命令的使用流程,如下圖:
但是我們一般不會(huì)一上電就直接這么使用,簡(jiǎn)單來(lái)說(shuō)就是首先你得確保模塊通訊正常并且正常附著網(wǎng)絡(luò),那么我們正常的使用中都會(huì)有一個(gè) 模塊初始化流程(雖然模塊一切正常的情況下,會(huì)自動(dòng)聯(lián)網(wǎng))。
我們需要經(jīng)過(guò)一些上電后的 AT 指令交互,確保模塊聯(lián)網(wǎng)正常,然后才能開(kāi)始按照上面手冊(cè)的流程走下去。
步驟 | 指令 | 說(shuō)明 |
---|---|---|
1 | AT | 串口通訊基本測(cè)試 |
OK | 返回“OK”表示與模塊通訊正常 | |
2 | AT+CPIN? | 檢查 SIM 卡是否插入 |
+CPIN: READY OK | 返回“READY”表明讀卡成功 | |
3 | AT+CSQ | 查詢(xún)信號(hào)質(zhì)量 |
+CSQ: 23,99 OK | 參數(shù)1:信號(hào)質(zhì)量(0~ 31),一般打魚(yú)8 小于31就行 參數(shù)2:忽略 | |
4 | AT+CEREG? | 查詢(xún)網(wǎng)絡(luò)注冊(cè)狀態(tài) |
+CEREG: 0,1 OK | 參數(shù)2:1表示注冊(cè)成功 | |
5 | AT+CGATT? | 查詢(xún)網(wǎng)絡(luò)附著狀態(tài) |
+CGATT: 1 OK | 1表示成功,0表示失敗 |
上面的這些可作為模塊上電的檢查手段,完成上面的步驟,才可以開(kāi)始進(jìn)行后面的操作。 在程序中,我們可以把這些操作當(dāng)做 模塊的初始化。
上面的指令結(jié)尾都需要回車(chē)換行,在程序中定義字符串的時(shí)候末尾記得要加上
測(cè)試代碼如下:
void ec800_init()
{
u16 cat1_timeout = 0;
while(Iot_SendCmd(AT,"OK", 200)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
printf(" uart falsern");
return;
}
}
cat1_timeout = 0;
printf("uart okrn");
while(Iot_SendCmd(CPIN,"READY", 200)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("simcard okrn");
while(Iot_SendCmd(RSSI,"+CSQ", 200)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
while(Iot_SendCmd(CEREG,"0,1", 200)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
printf("網(wǎng)絡(luò)注冊(cè) okrn");
cat1_timeout = 0;
while(Iot_SendCmd(CGATT,"+CGATT: 1", 200)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
printf(" 網(wǎng)絡(luò)附著 okrn");
}
2.3 PDP 上下文
我們?cè)诳次臋n的時(shí)候,會(huì)有一個(gè) PDP 上下文的概念,這里我們需要對(duì)這個(gè)概念說(shuō)明一下。
PDP,Packet Data Protocol,分組數(shù)據(jù)規(guī)程,移動(dòng)通信用戶(hù)在發(fā)送和接收分組數(shù)據(jù)時(shí)應(yīng)用的協(xié)議,應(yīng)用于 GPRS以及 WCDMA 等分組網(wǎng)絡(luò)。 . PDP context 即 PDP 上下文,保存用戶(hù)面進(jìn)行隧道轉(zhuǎn)發(fā)的所有信息,包括 RNC / GGSN 的用戶(hù)面 IP 地址、隧道標(biāo)識(shí)和 QoS 等。
實(shí)際上如果對(duì)網(wǎng)絡(luò)不了解的看完了上面的基本概念,應(yīng)該還是不理解,所以我這里用白話(huà)文簡(jiǎn)單解釋一下:
就是說(shuō)我們需要用 PDP(Packet Data Protocol )傳輸數(shù)據(jù),那么就必須給他建立一個(gè)背景,就是所謂的上下文,你得告訴 SGSN 和 GGSN (什么是 SGSN 和 GGSN ,往下面看,就類(lèi)似于中轉(zhuǎn)站,網(wǎng)關(guān)類(lèi)) 一些基本信息 :本地標(biāo)識(shí)(cid),你想要的 pdp_type(這里就是IP),你的接入點(diǎn)信息。
接入點(diǎn)不同的運(yùn)行商是不同的: 聯(lián)通:UNINET 移動(dòng):CMNET 電信:CTNET
我們不把 PDP 上下文用專(zhuān)業(yè)的術(shù)語(yǔ)去理解,簡(jiǎn)單的說(shuō),PDP 上下文就是在你準(zhǔn)備連接 Internet 傳輸數(shù)據(jù)之前,必須要做的一些基本配置,給你發(fā)個(gè)通訊卡,后面你就可以傳輸數(shù)據(jù)了,激活一個(gè) PDP 上下文意味著發(fā)起一個(gè)分組數(shù)據(jù)業(yè)務(wù)呼叫。
2.3.1 什么是 SGSN 和 GGSN ?
在上面介紹 PDP 的時(shí)候提到過(guò) SGSN 和 GGSN ,關(guān)于這一塊,我也是參考前人的博文:
移動(dòng)數(shù)據(jù)通信網(wǎng)絡(luò)工作原理(SGSN&GGSN)
圖片引用至上面推薦博文:
內(nèi)容引用至上面推薦博文:
SGSNSGSN主要用于為在其地理范圍內(nèi)的移動(dòng)站傳遞數(shù)據(jù)包,相當(dāng)于無(wú)線(xiàn)網(wǎng)絡(luò)中的路由節(jié)點(diǎn)。它可以進(jìn)行分組路由和轉(zhuǎn)發(fā),移動(dòng)性管理(附著,去附著和位置管理),邏輯鏈路管理,鑒權(quán)以及計(jì)費(fèi)功能。SGSN的位置寄存器保存著位置信息,比如當(dāng)前的小區(qū)。 SGSN的主要功能包括: 1 完成和GGSN的通信,通過(guò)GTP協(xié)議將用戶(hù)數(shù)據(jù)傳遞給GGSN,并將GGSN返回的數(shù)據(jù)傳遞給用戶(hù) 2 當(dāng)用戶(hù)地理位置發(fā)生變化,執(zhí)行移動(dòng)性管理。GGSNGSGN作為整個(gè)GPRS/UMTS網(wǎng)絡(luò)的網(wǎng)關(guān),位于GPRS網(wǎng)絡(luò)和外部分組交換網(wǎng)絡(luò)(Internet)之間。網(wǎng)關(guān)的作用能將一種協(xié)議格式的數(shù)據(jù)轉(zhuǎn)換為另一種格式的數(shù)據(jù)。 GGSN把來(lái)自的SGSN的GPRS數(shù)據(jù)包轉(zhuǎn)化為適當(dāng)?shù)姆纸M數(shù)據(jù)協(xié)議格式,比如IP,然后再把它們發(fā)送到相應(yīng)的分組數(shù)據(jù)網(wǎng)絡(luò),比如廣域有線(xiàn)網(wǎng)。反之亦然。SGSN和GGSN的區(qū)別所以,GGSN和SGSN的主要區(qū)別就在于,GGSN作為網(wǎng)關(guān),是在不同的通信網(wǎng)中轉(zhuǎn)換協(xié)議,而SGSN作為路由,只是在使用相同協(xié)議的網(wǎng)絡(luò)中發(fā)送、接受以及延遲它的數(shù)據(jù)包。 另外,GGSN能夠?qū)崿F(xiàn)地址的轉(zhuǎn)換,比如把無(wú)線(xiàn)網(wǎng)絡(luò)內(nèi)部地址(PDP地址)轉(zhuǎn)換為一個(gè)分組數(shù)據(jù)網(wǎng)絡(luò)協(xié)議地址(IP地址),而SGSN只能實(shí)現(xiàn)PDP地址映射,即根據(jù)一個(gè)地址,映射到相同種類(lèi)的另一個(gè)地址。可見(jiàn),我們常說(shuō)的3、4G網(wǎng)絡(luò)的IP地址,其實(shí)就是對(duì)應(yīng)GGSN的出口IP地址。
到這里,一些開(kāi)始使用需要了解的基礎(chǔ)問(wèn)題都已經(jīng)說(shuō)明了,那么下面其實(shí)就可以直接開(kāi)啟 HTTP 的使用了。
三、 HTTP 流程
上面準(zhǔn)備工作做完了,我們接下來(lái)往下面進(jìn)行。
3.1 客戶(hù)端
客戶(hù)端實(shí)際上就是我們的板子,在上面我們已經(jīng)給出了 EC800M 上電初始化的流程。
在完成上述的初始化以后,我們就可以按照官方手冊(cè)進(jìn)行下去了,本部分我們主要使用圖示和實(shí)際測(cè)試代碼給出說(shuō)明。
我們來(lái)回顧一下上面的流程(這里我們用官方文檔中的示例圖說(shuō)明):
上面的流程是官方給出的一個(gè)簡(jiǎn)單的樣例,大體上,按照順序來(lái)就行了。
其中需要注意的就是 ,有一個(gè)參數(shù)設(shè)置樣例中并沒(méi)有,就是數(shù)據(jù)類(lèi)型,數(shù)據(jù)類(lèi)型其實(shí)是大家需要 POST 的服務(wù)器有關(guān)的,這個(gè)需要自己了解服務(wù)器端需要怎樣的數(shù)據(jù)類(lèi)型:
比如本次測(cè)試,我使用了了 "AT+QHTTPCFG="contenttype",1rn"
就是設(shè)置為 "text/plain"
類(lèi)型。
上面還是用了 AT+QIACT=1
激活 PDP上下文,但是圖中也提到了是默認(rèn)激活的,我發(fā)現(xiàn)如果是激活狀態(tài),使用這個(gè)指令會(huì)返回 ERROR (有待確定)。
其他的倒是沒(méi)有什么問(wèn)題,這里直接上一下代碼。
3.1.1 PDP 上下文配置
void ec800_pdp_prepare(){
u16 cat1_timeout = 0;
while(Iot_SendCmd("AT+QHTTPCFG="contextid",1rn","OK", 200)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("設(shè)置 QHTTPCFG okrn");
while(Iot_SendCmd("AT+QIACT?rn","OK", 3000)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("PDP_CHECK one okrn");
while(Iot_SendCmd("AT+QHTTPCFG="contenttype",1rn","OK", 3000)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("CFG okrn");
// while(Iot_SendCmd("AT+QHTTPCFG="rspout/auto",1rn","OK", 3000)){
// HAL_Delay(1);
// cat1_timeout ++;
// if(cat1_timeout >= 2000){
// return;
// }
// }
// cat1_timeout = 0;
// printf("auto header okrn");
/*
"AT+QICSGP=1,1,"CMNET","","",1rn"
APN 聯(lián)通:UNINET 移動(dòng):CMNET 電信:CTNET
*/
while(Iot_SendCmd("AT+QICSGP=1,1,"CMNET","","",1rn","OK", 3000)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("PDP_CONFIG okrn");
while(Iot_SendCmd("AT+QIACT?rn","+QIACT", 3000)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("PDP_CHECK two okrn");
// while(Iot_SendCmd("AT+QIACT=1rn","OK", 500)){
// HAL_Delay(1);
// cat1_timeout ++;
// if(cat1_timeout >= 2000){
// return;
// }
// }
// cat1_timeout = 0;
// printf("PDP_激活 okrn");
}
3.1.2 URL 設(shè)置
接下來(lái)就是設(shè)置 URL ,URL 從哪里來(lái),就是服務(wù)器會(huì)提供,比如 ONENET 平臺(tái)對(duì)于 HTTP 的說(shuō)明如下:
這里我們 POST 設(shè)置的 URL ,就是上面的 Address+URL,對(duì)應(yīng)在下面的程序中,就是char *url
這個(gè)參數(shù):
void http_set_url(char *url)
{
u16 cat1_timeout = 0;
char message[32];
snprintf(message, sizeof(message), "AT+QHTTPURL=%d,%drn", strlen(url), 5);
while(Iot_SendCmd(message,"CONNECT", 1000)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("ready to send urlrn");
while(Iot_SendCmd(url,"OK", 5000)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("url set OKrn");
}
到目前為止,我們程序中整體調(diào)用流程如下圖所示:
3.1.3 POST 請(qǐng)求
上面的 URL 設(shè)置完成,我們就可以隨時(shí)發(fā)送 POST 請(qǐng)求了,比如我們是一個(gè)傳感器設(shè)備,周期性的采集傳感器數(shù)據(jù),到了自己設(shè)定的時(shí)間,就直接 POST 就行了,下面是 POST 請(qǐng)求的實(shí)現(xiàn)函數(shù):
void http_post_message(const char *message) {
int length = strlen(message);
char at_post[32];
u16 cat1_timeout = 0;
snprintf(at_post, sizeof(at_post), "AT+QHTTPPOST=%d,%d,%drn", length, 5, 10);
while(Iot_SendCmd(at_post,"CONNECT", 500)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("ready to send post message!rn %srn", message);
while(Iot_SendCmd(message,"OK", 5000)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("http post OKrn");
//"AT+QHTTPREAD=1rn"
while(Iot_SendCmd("AT+QHTTPREAD=5rn","+QHTTPREAD", 1000)){
HAL_Delay(1);
cat1_timeout ++;
if(cat1_timeout >= 2000){
return;
}
}
cat1_timeout = 0;
printf("HTTPREAD OKrn");
}
當(dāng)然上面的參數(shù)const char *message
是需要我們自己組包的,一般來(lái)說(shuō)使用 JSON 格式的比較多,比如測(cè)試過(guò)程中,我的程序如下:
最后上面流程中調(diào)用的Iot_SendCmd
函數(shù)也上一下:
int Iot_SendCmd(const char* cmd, char* reply, int wait)
{
u8 i=0;
char* rss_str;
int rssi,res;
CLEAR_EC800_Buffer(EC800_RX_Data);
Uart3_sendBuffer((u8*)cmd,strlen(cmd));
while(EC800ReceiveState != true)
{
HAL_Delay(1);
i++;
if(i >= wait){
printf("cat1 check outrn");
return 0xFF;
}
}
EC800ReceiveState = false;
if (!strcmp(reply,"+CSQ"))
{
rss_str = strstr((char*)EC800_RX_BUF, "+CSQ:");
if (!rss_str) {
return 1;
}
sscanf(rss_str, "+CSQ:%d,%d", &rssi, &res);
if (rssi != 99) {
printf("RSSI is %drn",rssi);
CLEAR_EC800_Buffer(EC800_RX_Data);
return 0;
}
}
else if (strstr((char*)EC800_RX_BUF, reply)){
printf("rn%srn", EC800_RX_BUF);
CLEAR_EC800_Buffer(EC800_RX_Data);
return 0;
}
return 1;
}
3.1.4 注意事項(xiàng)
(此處待更新,后續(xù)一些細(xì)節(jié)問(wèn)題的說(shuō)明需要補(bǔ)充)
1、關(guān)于字體
首先要注意的就是 字體,要和服務(wù)器的字體匹配;
通過(guò)"AT+QHTTPCFG="contenttype",1rn"
設(shè)置字體,這點(diǎn)上面已經(jīng)提到過(guò);
2、關(guān)于 HTTP 響應(yīng)
指令AT+QHTTPCFG="responseheader",1
是啟用輸出 HTTP 響應(yīng)頭信息:
如果啟用了以后,使用AT+QHTTPREAD
讀取的 HTTP 響應(yīng)消息如下:
此時(shí)返回比較多,響應(yīng)都有 600多個(gè)字節(jié),接近 700 字節(jié),這里大家寫(xiě)程序時(shí)候需要考慮到串口緩存大小。
不啟用這個(gè),則讀取的 HTTP 響應(yīng)消息如下:
此時(shí)返回不到200字節(jié)
3、關(guān)于 cat1 模塊返回?cái)?shù)據(jù)的處理
本文使用的是 STM32F103 芯片,在對(duì)于 AT 指令串口處理的時(shí)候需要注意,一般來(lái)說(shuō),對(duì)于普通的 AT 指令,我們可以直接使用 IDLE 中斷進(jìn)行判斷是否接收完成,程序處理如下:
但是對(duì)于 AT+QHTTPPOST
和 AT+QHTTPREAD
來(lái)說(shuō),他們返回的不是一幀數(shù)據(jù),而是分段的數(shù)據(jù),如果使用 上面的處理就會(huì)出問(wèn)題,所以我們需要對(duì)于這兩個(gè)指令進(jìn)行單獨(dú)的處理:
/*省略*/
Uart3_sendBuffer((u8*)cmd,strlen(cmd));
/*
此處串口回的不止是一幀數(shù)據(jù),所以使用 IDLE 中斷不合適
*/
if ((!strcmp(reply,"+QHTTPREAD:"))||(!strcmp(reply,"+QHTTPPOST:"))){
//讀取和發(fā)送的處理,直接等一段時(shí)間
HAL_Delay(1000);// 500 600 800 1000 一直加大
}
/*
另外的設(shè)置指令大多都是等待一個(gè) OK 返回,屬于一幀數(shù)據(jù)
所以可以用 IDLE 中斷
*/
else{
while(EC800ReceiveState != true)
{
HAL_Delay(1);
i++;
if(i >= wait){
printf("cat1 check outrn");
return 0xFF;
}
}
}
EC800ReceiveState = false;
當(dāng)然,實(shí)際上對(duì)于 AT 指令的模塊來(lái)說(shuō),因?yàn)樗粫?huì)不定時(shí)的發(fā)送消息,所以實(shí)際上所有 AT 指令發(fā)送后的返回結(jié)果,都可以不用 IDLE 中斷處理,發(fā)送完 AT 命令以后,直接延時(shí)等待一定的時(shí)間讀取串口數(shù)據(jù)即可。
3.2 服務(wù)器端
服務(wù)器端大家可以選擇現(xiàn)在常用的一些云平臺(tái), 阿里云,ONENET,華為云等等由 物聯(lián)網(wǎng)模型支持的,服務(wù)器端只需要自己進(jìn)行一些基本的產(chǎn)品創(chuàng)建,配置,然后根據(jù)平臺(tái)提供的開(kāi)發(fā)文檔,進(jìn)行上面的流程即可,比如:
本次測(cè)試使用公司自己的服務(wù)器,有軟件部門(mén)的同事專(zhuān)門(mén)負(fù)責(zé),所以省去了服務(wù)器端的配置流程。
結(jié)語(yǔ)
原本寫(xiě)本文的目的只是想記錄一下 EC800M HTTP 的使用步驟,但是因?yàn)樯婕暗降囊恍┩ㄓ嵉幕局R(shí)自己也都去復(fù)習(xí)了解了一邊,所以最終內(nèi)容還是比預(yù)計(jì)的要多。除了把模塊 HTTP 測(cè)試流程給大家講了一邊,還額外提了一些 網(wǎng)絡(luò)通訊相關(guān)的內(nèi)容,自己也有不少的收獲。
文中提供的代碼是自己的測(cè)試代碼,至于后期實(shí)際項(xiàng)目使用,大家還需要根據(jù)自己的需求進(jìn)行完善。
-
模塊
+關(guān)注
關(guān)注
7文章
2788瀏覽量
50365 -
LTE
+關(guān)注
關(guān)注
15文章
1367瀏覽量
179150 -
服務(wù)器
+關(guān)注
關(guān)注
13文章
9793瀏覽量
87956 -
HTTP
+關(guān)注
關(guān)注
0文章
525瀏覽量
33500 -
Cat1
+關(guān)注
關(guān)注
0文章
42瀏覽量
3788
發(fā)布評(píng)論請(qǐng)先 登錄

無(wú)線(xiàn)模塊的生產(chǎn)測(cè)試流程!急求!感謝!
汽車(chē)CAN/LIN總線(xiàn)測(cè)試流程和測(cè)試工具解析
飛針測(cè)試儀電子模塊測(cè)試問(wèn)題及解決方法
pcba測(cè)試流程
如何發(fā)起 HTTP 請(qǐng)求流程

一文知道模塊電源量產(chǎn)的基本測(cè)試流程
如何測(cè)試HTTP請(qǐng)求示例

電機(jī)驅(qū)動(dòng)模塊測(cè)試方法:測(cè)試設(shè)備、測(cè)試項(xiàng)目

合宙Air780EP模塊AT開(kāi)發(fā)-HTTP應(yīng)用指南

評(píng)論