- 前言
- 一、基礎(chǔ)說明
- 1.1 CAT1 與 4G
- 1.2 EC800M 模塊
- 1.3 HTTP
- 二、開始使用
- 三、 HTTP 流程
- 3.1 客戶端
- 3.2 服務(wù)器端
- 結(jié)語
前言
最近用到了 CAT1 模塊 EC800 ,項(xiàng)目需求是使用 CAT1 模塊通過 HTTP 協(xié)議上報(bào)數(shù)據(jù)給服務(wù)器。
以前的項(xiàng)目對于 MQTT 協(xié)議使用比較多,對于 HTTP 其實(shí)并沒有太過深入的了解, 寫本文的目的就是 記錄一下 EC800 HTTP 協(xié)議的使用流程,給大家提供一個(gè)例子,在對 HTTP 協(xié)議沒有深入理解的情況下,如何能夠快速的使得產(chǎn)品正常的設(shè)計(jì)出來。ヾ(?°?°?)?? !
因?yàn)樯婕暗揭苿?dòng)通信網(wǎng)絡(luò)相關(guān)問題,對于一些專業(yè)性的基本知識,本文會中會引用前人的一些博文說明,文中的引用都會給出原文連接。
我是矜辰所致,全網(wǎng)同名,盡量用心寫好每一系列文章,不浮夸,不將就,認(rèn)真對待學(xué)知識的我們,矜辰所致,金石為開!
一、基礎(chǔ)說明
接到項(xiàng)目需求,第一時(shí)間就得對一些基本的背景知識做一定的了解,比如 什么是 CAT1? 模塊的基本應(yīng)用資料,HTTP 的相關(guān)知識等等。
1.1 CAT1 與 4G
Cat.1 的全稱是 LTE UE-Category1,在2009年,Cat.1-5 是 3GPP 專門劃分出來,面向于未來物聯(lián)網(wǎng)應(yīng)用市場的類別,Cat.1 的最終目標(biāo)是服務(wù)于物聯(lián)網(wǎng)并實(shí)現(xiàn)低功耗和低成本 LTE 連接。
LTE 英文 “Long-Term Evolution” ,中文名稱為長期演進(jìn)技術(shù)。它是一種用于移動(dòng)通信的無線網(wǎng)絡(luò)標(biāo)準(zhǔn),也是4G(第四代)移動(dòng)通信技術(shù)的主要標(biāo)準(zhǔn)之一。 UE 英文 “User Equipment” 指的是用戶終端,它是LTE網(wǎng)絡(luò)下用戶終端設(shè)備的無線性能的分類。3GPP用Cat.1~20來衡量用戶終端設(shè)備的無線性能,也就是劃分終端速率等級。
Cat.1 是屬于4G系列,可以完全重用現(xiàn)有的4G資源。Cat.1是配置為最低版本參數(shù)的用戶終端級別,可讓業(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)勢。與傳統(tǒng)的 Cat.4 模塊相比,它具有成本低,功耗低的優(yōu)點(diǎn)。
1.2 EC800M 模塊
EC800M-CN 是移遠(yuǎn)通信專為 M2M 和 IoT 領(lǐng)域而設(shè)計(jì)的超小尺寸LTE Cat 1無線通信模塊,支持最大下行速率10 Mbps和最大上行速率 5 Mbps。
對于模塊來說,移遠(yuǎn)會提供你完成的一套說明資料,硬件設(shè)計(jì),軟件設(shè)計(jì),使用流程應(yīng)有盡有,如果你本身對這一領(lǐng)域有所了解,那使用起來基本不費(fèi)什么事情,完全不需要去額外的尋找資料。
1.3 HTTP
如果你了解 HTTP ,以及 4G 網(wǎng)絡(luò)的一些基礎(chǔ),那你直接照著上面 模塊的手冊資料直接 AT 指令直接用起來就行了。
如果你沒有了解過,確實(shí)需要花店時(shí)間去了解,這里推薦一篇文章:
HTTP超詳細(xì)教程
對于我們應(yīng)用而言,有幾個(gè)地方我們是一定要了解的,第一個(gè) HTTP 協(xié)議格式,比如 HTTP 的協(xié)議格式(圖片引用至上面推薦文章):
HTTP 請求格式:
HTTP 響應(yīng)格式:
HTTP 協(xié)議格式:
GET 方法用來獲取服務(wù)器上面的數(shù)據(jù),對于我們的項(xiàng)目,我們其實(shí)只需要用到 HTTP 的 POST 方法,POST請求需要傳遞的數(shù)據(jù)一般通過 body 傳遞。
比如一個(gè)給服務(wù)器輸入用戶名密碼的 POST 請求例子(圖片引用至上面推薦文章):
對于我們使用 CAT1 模塊來說,我們最終要做的就是在程序中組一個(gè)類似上面內(nèi)容的數(shù)據(jù)包,發(fā)送出去就行了。
當(dāng)然實(shí)際上一般在物聯(lián)網(wǎng)場合,傳感器上報(bào)數(shù)據(jù)需要組的包比上面會簡單得多。
二、開始使用
基礎(chǔ)知識了解過后,接下來就是開始測試使用了。
2.1 硬件設(shè)計(jì)部分
硬件部分基本上照著 官方文檔來就行了,沒有一點(diǎn)難度,真的沒什么好說的,省略,詳細(xì)請參考 《Quectel_EC800M-CN_硬件設(shè)計(jì)手冊_V1.1.pdf》(不同型號的芯片有不同的對應(yīng)手冊,根據(jù)手冊來就行了)。
象征性的上一張?jiān)韴D:
2.2 模塊上電流程
雖然模塊的官方會提供文檔說明 HTTP 命令的使用流程,如下圖:
但是我們一般不會一上電就直接這么使用,簡單來說就是首先你得確保模塊通訊正常并且正常附著網(wǎng)絡(luò),那么我們正常的使用中都會有一個(gè) 模塊初始化流程(雖然模塊一切正常的情況下,會自動(dòng)聯(lián)網(wǎng))。
我們需要經(jīng)過一些上電后的 AT 指令交互,確保模塊聯(lián)網(wǎng)正常,然后才能開始按照上面手冊的流程走下去。
步驟 | 指令 | 說明 |
---|---|---|
1 | AT | 串口通訊基本測試 |
OK | 返回“OK”表示與模塊通訊正常 | |
2 | AT+CPIN? | 檢查 SIM 卡是否插入 |
+CPIN: READY OK | 返回“READY”表明讀卡成功 | |
3 | AT+CSQ | 查詢信號質(zhì)量 |
+CSQ: 23,99 OK | 參數(shù)1:信號質(zhì)量(0~ 31),一般打魚8 小于31就行 參數(shù)2:忽略 | |
4 | AT+CEREG? | 查詢網(wǎng)絡(luò)注冊狀態(tài) |
+CEREG: 0,1 OK | 參數(shù)2:1表示注冊成功 | |
5 | AT+CGATT? | 查詢網(wǎng)絡(luò)附著狀態(tài) |
+CGATT: 1 OK | 1表示成功,0表示失敗 |
上面的這些可作為模塊上電的檢查手段,完成上面的步驟,才可以開始進(jìn)行后面的操作。 在程序中,我們可以把這些操作當(dāng)做 模塊的初始化。
上面的指令結(jié)尾都需要回車換行,在程序中定義字符串的時(shí)候末尾記得要加上
測試代碼如下:
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ò)注冊 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 上下文
我們在看文檔的時(shí)候,會有一個(gè) PDP 上下文的概念,這里我們需要對這個(gè)概念說明一下。
PDP,Packet Data Protocol,分組數(shù)據(jù)規(guī)程,移動(dòng)通信用戶在發(fā)送和接收分組數(shù)據(jù)時(shí)應(yīng)用的協(xié)議,應(yīng)用于 GPRS以及 WCDMA 等分組網(wǎng)絡(luò)。 . PDP context 即 PDP 上下文,保存用戶面進(jìn)行隧道轉(zhuǎn)發(fā)的所有信息,包括 RNC / GGSN 的用戶面 IP 地址、隧道標(biāo)識和 QoS 等。
實(shí)際上如果對網(wǎng)絡(luò)不了解的看完了上面的基本概念,應(yīng)該還是不理解,所以我這里用白話文簡單解釋一下:
就是說我們需要用 PDP(Packet Data Protocol )傳輸數(shù)據(jù),那么就必須給他建立一個(gè)背景,就是所謂的上下文,你得告訴 SGSN 和 GGSN (什么是 SGSN 和 GGSN ,往下面看,就類似于中轉(zhuǎn)站,網(wǎng)關(guān)類) 一些基本信息 :本地標(biāo)識(cid),你想要的 pdp_type(這里就是IP),你的接入點(diǎn)信息。
接入點(diǎn)不同的運(yùn)行商是不同的: 聯(lián)通:UNINET 移動(dòng):CMNET 電信:CTNET
我們不把 PDP 上下文用專業(yè)的術(shù)語去理解,簡單的說,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í)候提到過 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ǎng)絡(luò)中的路由節(jié)點(diǎn)。它可以進(jìn)行分組路由和轉(zhuǎn)發(fā),移動(dòng)性管理(附著,去附著和位置管理),邏輯鏈路管理,鑒權(quán)以及計(jì)費(fèi)功能。SGSN的位置寄存器保存著位置信息,比如當(dāng)前的小區(qū)。 SGSN的主要功能包括: 1 完成和GGSN的通信,通過GTP協(xié)議將用戶數(shù)據(jù)傳遞給GGSN,并將GGSN返回的數(shù)據(jù)傳遞給用戶 2 當(dāng)用戶地理位置發(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把來自的SGSN的GPRS數(shù)據(jù)包轉(zhuǎn)化為適當(dāng)?shù)姆纸M數(shù)據(jù)協(xié)議格式,比如IP,然后再把它們發(fā)送到相應(yīng)的分組數(shù)據(jù)網(wǎng)絡(luò),比如廣域有線網(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ǎng)絡(luò)內(nèi)部地址(PDP地址)轉(zhuǎn)換為一個(gè)分組數(shù)據(jù)網(wǎng)絡(luò)協(xié)議地址(IP地址),而SGSN只能實(shí)現(xiàn)PDP地址映射,即根據(jù)一個(gè)地址,映射到相同種類的另一個(gè)地址??梢?,我們常說的3、4G網(wǎng)絡(luò)的IP地址,其實(shí)就是對應(yīng)GGSN的出口IP地址。
到這里,一些開始使用需要了解的基礎(chǔ)問題都已經(jīng)說明了,那么下面其實(shí)就可以直接開啟 HTTP 的使用了。
三、 HTTP 流程
上面準(zhǔn)備工作做完了,我們接下來往下面進(jìn)行。
3.1 客戶端
客戶端實(shí)際上就是我們的板子,在上面我們已經(jīng)給出了 EC800M 上電初始化的流程。
在完成上述的初始化以后,我們就可以按照官方手冊進(jìn)行下去了,本部分我們主要使用圖示和實(shí)際測試代碼給出說明。
我們來回顧一下上面的流程(這里我們用官方文檔中的示例圖說明):
上面的流程是官方給出的一個(gè)簡單的樣例,大體上,按照順序來就行了。
其中需要注意的就是 ,有一個(gè)參數(shù)設(shè)置樣例中并沒有,就是數(shù)據(jù)類型,數(shù)據(jù)類型其實(shí)是大家需要 POST 的服務(wù)器有關(guān)的,這個(gè)需要自己了解服務(wù)器端需要怎樣的數(shù)據(jù)類型:
比如本次測試,我使用了了 "AT+QHTTPCFG="contenttype",1rn"
就是設(shè)置為 "text/plain"
類型。
上面還是用了 AT+QIACT=1
激活 PDP上下文,但是圖中也提到了是默認(rèn)激活的,我發(fā)現(xiàn)如果是激活狀態(tài),使用這個(gè)指令會返回 ERROR (有待確定)。
其他的倒是沒有什么問題,這里直接上一下代碼。
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è)置
接下來就是設(shè)置 URL ,URL 從哪里來,就是服務(wù)器會提供,比如 ONENET 平臺對于 HTTP 的說明如下:
這里我們 POST 設(shè)置的 URL ,就是上面的 Address+URL,對應(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 請求
上面的 URL 設(shè)置完成,我們就可以隨時(shí)發(fā)送 POST 請求了,比如我們是一個(gè)傳感器設(shè)備,周期性的采集傳感器數(shù)據(jù),到了自己設(shè)定的時(shí)間,就直接 POST 就行了,下面是 POST 請求的實(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
是需要我們自己組包的,一般來說使用 JSON 格式的比較多,比如測試過程中,我的程序如下:
最后上面流程中調(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é)問題的說明需要補(bǔ)充)
1、關(guān)于字體
首先要注意的就是 字體,要和服務(wù)器的字體匹配;
通過"AT+QHTTPCFG="contenttype",1rn"
設(shè)置字體,這點(diǎn)上面已經(jīng)提到過;
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é),這里大家寫程序時(shí)候需要考慮到串口緩存大小。
不啟用這個(gè),則讀取的 HTTP 響應(yīng)消息如下:
此時(shí)返回不到200字節(jié)
3、關(guān)于 cat1 模塊返回?cái)?shù)據(jù)的處理
本文使用的是 STM32F103 芯片,在對于 AT 指令串口處理的時(shí)候需要注意,一般來說,對于普通的 AT 指令,我們可以直接使用 IDLE 中斷進(jìn)行判斷是否接收完成,程序處理如下:
但是對于 AT+QHTTPPOST
和 AT+QHTTPREAD
來說,他們返回的不是一幀數(shù)據(jù),而是分段的數(shù)據(jù),如果使用 上面的處理就會出問題,所以我們需要對于這兩個(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í)際上對于 AT 指令的模塊來說,因?yàn)樗粫欢〞r(shí)的發(fā)送消息,所以實(shí)際上所有 AT 指令發(fā)送后的返回結(jié)果,都可以不用 IDLE 中斷處理,發(fā)送完 AT 命令以后,直接延時(shí)等待一定的時(shí)間讀取串口數(shù)據(jù)即可。
3.2 服務(wù)器端
服務(wù)器端大家可以選擇現(xiàn)在常用的一些云平臺, 阿里云,ONENET,華為云等等由 物聯(lián)網(wǎng)模型支持的,服務(wù)器端只需要自己進(jìn)行一些基本的產(chǎn)品創(chuàng)建,配置,然后根據(jù)平臺提供的開發(fā)文檔,進(jìn)行上面的流程即可,比如:
本次測試使用公司自己的服務(wù)器,有軟件部門的同事專門負(fù)責(zé),所以省去了服務(wù)器端的配置流程。
結(jié)語
原本寫本文的目的只是想記錄一下 EC800M HTTP 的使用步驟,但是因?yàn)樯婕暗降囊恍┩ㄓ嵉幕局R自己也都去復(fù)習(xí)了解了一邊,所以最終內(nèi)容還是比預(yù)計(jì)的要多。除了把模塊 HTTP 測試流程給大家講了一邊,還額外提了一些 網(wǎng)絡(luò)通訊相關(guān)的內(nèi)容,自己也有不少的收獲。
文中提供的代碼是自己的測試代碼,至于后期實(shí)際項(xiàng)目使用,大家還需要根據(jù)自己的需求進(jìn)行完善。
-
模塊
+關(guān)注
關(guān)注
7文章
2695瀏覽量
47431 -
LTE
+關(guān)注
關(guān)注
15文章
1358瀏覽量
177858 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9123瀏覽量
85322 -
HTTP
+關(guān)注
關(guān)注
0文章
504瀏覽量
31194 -
Cat1
+關(guān)注
關(guān)注
0文章
42瀏覽量
3472
發(fā)布評論請先 登錄
相關(guān)推薦
評論