那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

藏箱子里Air724UG模組LuatOS開發的HTTP示例!

合宙LuatOS ? 來源:合宙LuatOS ? 作者:合宙LuatOS ? 2024-11-30 09:42 ? 次閱讀

今天我們來學習的是我珍藏已久的低功耗模組Air724UG的LuatOS開發HTTP示例,獻給大家。

一、HTTP 概述

此部分內容只是簡單的對HTTP作一個介紹,更詳細的說明或協議文檔,請查閱相關網站或文檔。

1.1 HTTP 請求方法

HTTP/1.1 協議中共定義了八種方法來以不同方式操作指定的資源。

a.GET

向指定的資源發出請求。使用 GET 方法應該只用在讀取數據。

b.HEAD

與 GET 方法一樣,都是向服務器發出指定資源的請求。只不過服務器將不傳回資源的本文部分。

c.POST

向指定資源提交數據,請求服務器進行處理,例如上傳文件。

d.PUT

向指定資源位置上傳其最新內容。

e.DELETE

請求服務器刪除 Request-URI 所標識的資源。

f.TRACE

回顯服務器收到的請求,主要用于測試或診斷。

g.OPTIONS

這個方法可使服務器傳回該資源所支持的所有 HTTP 請求方法。用’*'來代替資源名稱,向 Web 服務器發送 OPTIONS 請求,可以測試服務器功能是否正常運作。

h.CONNECT

HTTP/1.1 協議中預留給能夠將連接改為管道方式的代理服務器。通常用于 SSL 加密服務器的鏈接。

HTTP 服務器至少應該實現 GET 和 HEAD 方法,其他方法都是可選的。

1.2 HTTP 狀態碼

狀態代碼的第一個數字代表當前響應的類型:

1xx 消息——請求已被服務器接收,繼續處理

2xx 成功——請求已成功被服務器接收、理解、并接受

3xx 重定向——需要后續操作才能完成這一請求

4xx 請求錯誤——請求含有詞法錯誤或者無法被執行

5xx 服務器錯誤——服務器在處理某個正確請求時發生錯誤

RFC 2616 中已經推薦了描述狀態的短語,例如"200 OK",“404 Not Found”。

1.3 URL 鏈接地址

超文本傳輸協議(HTTP)的地址包含五個基本元素,分別是:

a.傳送協議, 層級 URL 標記符號(為[//],固定不變) 訪問資源需要的憑證信息服務器,一般情況下為域名,也可以使用 IP 地址。

b.端口號,以數字方式表示,HTTP 默認為”:80“,默認值可不給出。

c.路徑,字符“/”區別路徑中的每一個目錄名稱。

d.查詢,GET 模式的窗體參數,用“?”字符作為起點,每個參數用“&”隔開,再以“=”分開參數名稱與數據。

e.片段,以“#”字符為起點。

由于超文本傳輸協議允許服務器將瀏覽器重定向到另一個網頁地址,因此許多服務器允許用戶省略網頁地址中的部分內容,比如 www。

本文通過幾個具體的例子,演示 http 與 https 協議的具體實現。

二、功能演示概述

2.1 演示內容

本文通過作者自身的使用經歷與實踐,給大家演示 http 的常見操作與使用,包括:

a.get 方法的實現;

b.post 方法的實現;

c.文件的上傳操作;

d.文件的下載操作;

e.https 加密通訊;

f.處理 JSON 數據;

g.gzip 操作。

三、硬件環境準備

3.1 開發板準備

本文所涉及到的所有演示,都使用開發板 EVB_Air724UG_A14 完成

此核心板的詳細使用說明參考:
https://docs.openluat.com/air724ug/product/

此開發板的詳細使用說明參考:Air724UG 產品手冊中的 《EVB_Air724UG_AXX開發板使用說明》,寫這篇文章時最新版本的使用說明為:《EVB_Air724UG_A14開發板使用說明》;開發板使用過程中遇到任何問題,可以直接參考這份使用說明文檔。

中國大陸環境下,可以上網的 sim 卡,一般來說,使用移動,電信,聯通的物聯網卡或者手機卡都行;

3.2 開發板的接線方式

wKgZO2dIbEOABG_6ABGq0PfynUk973.png

首先將開發板放置好,接上 USB 并連接到電腦,同時,記得將天線也連接好,保證信號環境比較良好,比如可以看看手機信號來判斷一下所在環境的信號狀況。USB 的連接如上圖所示。

在上圖中,連接 USB 的插口旁邊有一個 USB 字樣,在進行腳本下載時,須連接此端口。旁邊另一個 USB 插口是 USB 轉 UART接口,可以通過串行口工具查看調試 TRACE 信息。在本文的測試環境中,使用 USB 打印 trace,即在 Luatools工具中,將軟件上的"usb 打印 trace"選中即可,不必再另外連接串行口監視打印 trace 的相關信息。

3.3 固件操作相關內容

a.Luatools,是下載固件與腳本必不可少的工具,并且使用其查看 TRACE 調試信息也非常方便。

https://docs.openluat.com/Luatools/

b.Luatools 工具的使用請參閱:

https://docs.openluat.com/blog/Luatools/

c.遠程固件升級請參閱:

https://docs.openluat.com/blog/fota_lesson/

d.USB 驅動安裝請參閱:

https://docs.openluat.com/blog/usb_drv/

四、軟件環境準備

4.1 Lua 腳本語言

本文以 Lua 腳本語言為基礎,因而需要有 Lua 腳本語言基礎,可以通過下列文檔了解:

Lua 腳本語言的語法,請參閱:

https://wiki.luatos.com/luaGuide/luaReference.html#lua-5-3

https://docs.openluat.com/blog/lua_lesson/

4.2 Lua 腳本語言的 http 接口 API

本文既然是說 http,除了在 http 概述內的簡單說明,還有必要對 Lua 腳本語言的 API 有一個了解。http 的 API 接口定義如下面的代碼。我之所以貼出下面這段定義代碼,三個方面的原因。

a.首先當然是注釋說明中有較明晰的 http 協議結構的定義;

b.其次對參數的解釋說明比演示文檔 testHttp.lua 文件內容更全面,更有利于讀者對各個參數形式有一個了解。比如,傳遞證書就有了較明晰的表達式形式,這樣也方便大家組織參數時,能做到心里有數;

c.最后是給出了不少調用示例,而這些示例在 testHttp.lua 文檔內沒有或者不全面,而此處的示例能起到一個很好的補充。

wKgZPGdIbF2AGQj-AARk0dm0f8A773.pngwKgZO2dIbG-ADY-GAAbKtAnuhpQ896.pngwKgZO2dIbH-Afs1sAAXXK5ZaefM029.pngwKgZPGdIbI2AFtdQAAfMHKGRwX4827.pngwKgZPGdIbJ2AUEQqAAb1GtIrVDc210.pngwKgZPGdIbKmAGS-7AARIDsxb2hU752.png

關于 http 接口的具體說明,讀者還可以查詢其它相關資料或參考其它文件檔。

4.3 輔助工具

為了有效的分析開發過程中可能遇到的問題,并能查看數據,準備一些輔助工具很有必要,將大大縮短大家解決問題的時間。本文編寫過程中,使用了幾款工具介紹給大家,本文在后面將使用用或提到這些工具,請大家先了解。

a.Progress Telerik Fiddler Classic,抓包工具。

https://downloads.getfiddler.com/fiddler-classic/FiddlerSetup.5.0.20244.10953-latest.exe

b.Postman,API 調試平臺工具,可以方便的驗證本文所提到的各種操作。

https://dl.pstmn.io/download/latest/win64

c.httpbin.org,一個很不錯的 API 調試網站,本文有關 http 的不少內容的演示,即使用本網站完成。

五、Luatools 的基本使用

5.1 準備演示代碼

本文使用 air724 模塊的演示代碼 testHttp 作為藍本,在此基礎上進行修訂刪改,來完成本文第二章中所提到的內容。該演示藍本有兩個文件,分別為 main.lua、testHttp.lua 兩個文件。大家如果了解可以跳過,如果不熟悉又不想去費勁下載資源,可以直接復制使用。testHttp.lua 隨著本文的測試進行,會有所修訂,本文最后會給出完整的包含所有修訂的文件。

5.2 使用 Luatools 工具

按照本文的第三章第 2 節所描述的方式連接好開發板后,確認無誤后,我們就可以啟動 Luatools 工具,如下圖所示。點擊界面中“項目管理與測試”按鈕,出現下圖所示的窗口,點擊“創建項目”,并輸入項目名稱,如本文建立的項目名稱為 http_doc。

項目建立完成后,點添加腳本或資源文件,按上節所說將藍本 main.lua 與 testHttp.lua 添加上去,如圖所示。

將"usb 打印 trace”使能,“添加默認 lib”選中。

wKgZO2dIbL6AM0a_AALvS3Phfm0161.png

完成上面的操作后,還要選擇底層 CORE。因為合宙模塊有各種資源,不同的底層 CORE 支持的內容不同,這些底層內核一般安裝在工具所在目錄的 ressoure 子目錄下。打開此目錄,會有不同的選擇,如圖。因為 724ug 模塊屬于 8910 平臺,所以我們要選擇 8910 的某一個內核,本文所說都是指對腳本語言 Lua 進行開發,因而我們選擇 8910_lua_lod 即可。點擊進入,有多個內核,我們選擇最基本的 LuatOS-Air_V4028_RDA8910.pac 即可,如果大家手上使用的內核進行了升級,會有一些區別,譬如版本號變化等,請留意即可。

wKgZPGdIbMqAJmKEAAdteK7Znho718.png

如果電腦上沒有上述固件,也可以通過下載的網址下載。

固件版本和上層腳本:https://docs.openluat.com/air724ug/luatos/firmware/

六、GET 請求演示

6.1 演示網站 httpbin.org

為了使本文的演示可直接使用并能得到結果,而不是隨便給個示范文本,有必要找一個可以進行測試的網站,本文使用上面工具準備里提到過的 httpbin.org 給出的 API 來進行測試。

首先打開 httpbin.org 網站,并找到 Dynamic data 這一欄,然后點開下拉菜單,如圖示。

wKgZPGdIbN6AKJGeAAVY3lTkHRo907.png

找到 Dynamic data 這一欄,打開,如下圖所示。

wKgZO2dIbOyAGRhlAAcqZZNEswM163.png

在上面看到第一項是 GET 方法,url 是/base64/{value},表示使用 GET 方法可以從此連接(url)得到經過 base64 編碼的內容,也即將 value 還原為實際內容,即解碼。我們來完成這個工作。

6.2 用 GET 方法實現 base64 解碼 API

我們可以使用 crypto.base64_encode 函數來對字符完成 base64 的編碼,在 testHttp.lua 中找到 http.request( "GET" , "www.lua.org",nil,nil,nil,nil,cbFnc)這一行語句,在語句前定義一個本地變量并賦值”用合宙 724ug 模塊完成 http 的 GET 方法“,即 local base64_str = "用合宙 724ug 模塊完成 http 的 GET 方法"。

按 API 的說明,將 url 路徑也即將 "www.lua.org" 替換為 "httpbin.org/base64/"..crypto.base64_encode ( base64_str , base64_str:len() )。

修訂完成后是如下這個樣子,保存文件后我們使用 Luatools 將腳本下載到開發板中,看看結果如何。

wKgZPGdIbPiAChEJAAFv1nA12Cs339.png

特別注意

如果是第一次下載,要選擇下載底層與腳本,因為你到手的開發板,里面到底是什么內核還不清楚,如果內核不對,也就運行不起來,這一點切記。在完成了底層下載后,如果腳本再有修訂,就不需要再下載底層了,只下載腳本即可。

下載完成后,會自動啟動,并在 Luatools工具中顯示 trace 信息。直接看結果吧,如圖所示。

wKgZO2dIbQOAblXBAAezKyR53Lw319.png

在上圖中,可以看到結果 true 200,表示正確完成,http 狀態碼是 200。

同時返回了解碼的字串”用合宙 724ug 模塊完成 http 的 GET 方法“。

至此,GET 的演示工作順利完成。

6.3 完整代碼的約定

為方便大家取用,本文最后將列出完整的 testHttp.lua 代碼。本文所作的全部修訂,都將保留在 testHttp.lua 文件中,使用注釋符如“--[[”與“]]”的來進行選取使用或不使用。

七、POST 請求演示

7.1 物聯網卡信息 API 接口

對 get 的演練,感覺還是挺容易的,一路下來也沒有什么障礙。不過 GET 我們使用的還不是真正的應用場合,因為服務器仍然還只是一個演示。我們在 POST 就使用一個真實的應用數據,算是一個真實的項目應用。

我們要演示,就得有服務器可以讓我們來實操,上面說了,我們要完成一個真實的項目。使用 724ug 模塊,就得有上網卡,物聯網卡是最優的選擇。這里有一個物聯網卡服務商提供的物聯網 SIM 卡信息的 API 接口,這個網站是

http://sim.taoyuan-tech.com。這是一個真實的網站,而且給客戶提供一個測試賬號,那么我們就使用這個測試賬號來進行 POST 方法的操作,以讀取 SIM 卡的日志

這里測試賬號的用戶名:18168967871,密碼:18168967871。登錄進去后,是下圖中所示的樣子。

wKgZPGdIbRaAIxlBAAFcksot3OM499.png

在上圖所示界面中,點擊獲取”APIkey 各 Secret“字樣的按鈕,可得到測試用戶的 API key 與 API Secret,注意保存這兩個數據備用。點擊”API 文檔“字樣的按鈕,可進入詳細的接口 API 說明文檔頁面,如圖。

wKgZO2dIbSGAAky5AAHCr9qYmVw368.png

看文檔目錄,約定等前面幾項內容是要關注的,好在簡短,切一張圖也就可以完全看到,列出于下圖。

wKgZO2dIbTWAF93yAAVuR4mfC7g701.png

我們在上圖中看到幾項注意事項。

a.所有請求參數,使用 json 形式發送。這表示只接收 json 形式的數據與內容;

b.需要返回狀態碼 200 才正確;

c.約定了所使用的單位,這樣可以方便的計算時間與費用;

d.對認證進行了說明,這很重要,要仔細閱讀并理解 。認證方式為 HTTP Basic Authorization,認證信息的形式是 appkey:appsecret。就是前面提到要注意保存的那兩個數據;

e.對可能的錯誤碼進行了說明;

f.給出了主機地址為 http://api.taoyuan-tech.com/api/open。

所有這些約定及注意事項都很重要,不要忽略,可能后面我們都會要用到。

這個 API 有好幾個接口,我們就選第一個來實現即可。就是下面圖中所列出的日志查詢。圖中表格所給出的字段,是我們需要提供的訪問參數及返回結果。

wKgZPGdIbUWAUdBVAAVGwFMYco0740.png

7.2 使用 postman 工具驗證

為了方便,我們可以先使用 postman 組織包內容,然后再移植到 testHttp.lua 文件內進行測試。查看“物聯網卡指定日期用量日志查詢 ”API 的說明,我們知道此接口的訪問的 url 為“/iotcard/usagelog”,所以完整的訪問路徑為 http://api.taoyuan-tech.com/api/open/iotcard/usagelog,將此路徑填入到 postman 中,選擇 POST 方法,選擇頭部信息 Auth Type 類型為 Basic Auth。這些內容都是 API 文檔約定與注意事項所確定的內容。然后點擊 Auth,將前文提到過的 Apikey 與 Apisecret 分別填入到用戶名與密碼輸入框內。如下圖所示。

wKgZPGdIbVCAFOnMAASD7FkgzBc225.png

接著再點擊 Body,輸入以下內容:

其中字段的含義在前圖所示的表格中都有說明,請大家注意查閱。而 89860403102080512138 為 SIM 卡號的 iccids 號,此 SIM 卡可在測試用戶賬號中的卡片信息中查到。如果卡片信息沒有此號碼,可以查閱卡片信息以獲取用戶數據庫中真實存在的卡片 iccids 號。從圖中的說明中我們還知道,傳入的參數可以是其它的三種識別號碼之一,如 imei 號。在四個 SIM 卡的關聯識別號中四選一,本文我們選擇 iccids,想測試其它參數形式的,可以自行更改修訂。比如修訂為 imsis,則輸入內容就變為:

如下圖所示。

wKgZO2dIbV6AStIrAANKGretStU978.png

輸入完成,點擊 Send 發送。即返回如下圖所示的響應。

wKgZPGdIbWiAeLFzAAK4KXwCWNs531.png

依據前圖所示的表格內容可知,2024-10-10 這一天所消耗的流量為 0M,即"data_usage":0。同時,查看狀態碼為 200,結果 OK。這些完成后,我們就可以根據組包的相關信息,對 testHttp.lua 進行修訂。

7.3 修訂文件內容

打開 testHttp.lua 文件,我們在 77 行與 84 行之間,發現了一段代碼,使用了 POST 方法,可以在此基礎上進行修訂,如下圖。首先將注釋去掉,再查看具體內容,我們發現有幾點存在疑問。

wKgZPGdIbXGAXKxHAAG_3jPt3KI302.png

a.從上文可知,API 使用的是 Auth Basic 的方式,而且上面組包時,使用的是 Apikey 與 Apisecret 兩個內容,這個與演示代碼的 ["Authorization]"="Basic jffdsfdsfdsfdsfjakljfdoiuweonlkdsjdsjapodaskdsf",好像相符,但又好像不相符,這里怎么去得到這個串呢;

b.前文提到,使用的 Content-type 是 application/json,與代碼中所使用的方式有所不同,因而此處需要修訂;

c.同時請求參數的內容肯定也需要修訂,只是如何組織這個參數呢。從 table 類型的各種組織方式看,也沒有 name:value 這樣的形式。

有問題就好,一個個解決也就好了。首先我們從第一個問題開始,這就要用到本文開頭所給出抓包工具了,我們看看實際的數據是什么樣子,不就知道了嗎?直接上圖,如下面圖中所示,可以看到實際的數據包都有哪些內容,當然,此抓包工具也可以查看 BODY,auth 等各項數據,可以切換各頁面看看都有哪些數據項,以加深理解。

wKgZO2dIbXyAKOTcAAd8U-Nqhj8414.pngwKgZPGdIbYeAOg7IAAWxAPrrDMw905.png

在上圖中,我們看到了一行文字內容:Authorization: Basic NkZhbXFsRmZTVmQ4OHNHejpLemt0SW8y ......這個正是我們所要的內容,因而將此項復制,填入代替。

第二個問題簡單,直接修訂為['Content-Type']="application/json"即可。

第三個問題,需要調用 json 的一個函數來解決,就是下面這個函數,即 json 編碼。

wKgZPGdIbZWARR9RAADCMO5fvhY476.png

其它的,['Connection']="keep-alive"要不要加上,看示例代碼中有些加了,有些沒有加。Http 是短連接,但又希望環境能得到保存,使下次再次發起 http 請求時,能快速得到反應,因而才有了這個['Connection']="keep-alive"的配置項,但在 Http 1.1 之后,這個就是默認的值,因而可以加上,也可以不加上,效果一樣。

經過上面的修訂后,代碼成為了下面這樣子。

wKgZO2dIbZ-ANV3JAAM4TU0-PEg960.png

好了,現在我們將腳本下載到開發板中,看看是什么結果。

wKgZO2dIbamAa9ArAAS_pmwvZrM519.png

不出意外,如上圖中所示,可以看到返回的狀態碼是 200,結果為 true,代碼執行正確無誤,同時,可以看到服務器返回的數據,與從 postman 得到的數據一致。

到這里,POST 的演示算是完成了,另外要補充說明的是,其實頭部結構里的 Auth Basic 有另一種取得方式,可以直接調用 crypto 模塊內的 base64 函數來完成。如下代碼所示。

wKgZPGdIbbWAZlUDAAPlNW3xyis258.png

具體要如何使用,看實際情況,因為有些網站的 API 提供的直接就是 BASE64 碼,此時用第一種顯然省事。本文最后完整源代碼使用生成方式。

八、文件上傳操作

8.1 準備工作

對于文件上傳,我們仍使用 GET 方法時所使用的測試服務器,即 httpbin.org,因為我們使用”post"方法上傳文件,所以 url 為 httpbin.org/post。需要說明一點的是,httpbin.org/post 是一個回環服務器,即當向其傳輸文件時,服務器會將傳輸內容作為響應返回,因而當我們看到響應并返回的內容后,就可以判斷操作是否正確。其實我有考慮使用更直接的方式,但幾天下來找不到合用的服務器來進行操作,只好以此作為本文的上傳文件演示了。

還是前面的方法,我們先使用 Postman 工具來組織數據包。

a.啟動 Postman 并將方法選擇為 POST;

b.在主機欄內輸入“httpbin.org/post”;

c.然后選擇 body,選擇 binary;

d.選擇文件,本處為 test.txt,內容為“uses post method to upload a file.”;如果沒有此文件,新建一個即可;

e.點擊發送;

f.稍后返回數據。

所有操作及數據如下圖所示。

wKgZPGdIbcmAOYquAAcycIZmXxg451.png

在圖中可以清楚地看到 200 OK 字樣,表示操作正確。同時,我們在圖中 6 號箭頭所指的文本中,可以發現一些有用的字串,分別是:

wKgZO2dIbdSAbTsOAAD-wahxjLA241.png

同時,我們也發現了:

"files":{}

"form":{}

為空,這個我們可以比對后面的多文件多參數上傳時的內容來進行理解。

8.2 文件修訂

如前面的方法,我們來修訂 testHttp.lua 文件的內容。

在 testHttp.lua 的 56 行開始,有一處注釋掉了的代碼,可以為我們所用。如下圖。

wKgZPGdIbeqAWEC3AAJUTTgissY368.png

首先,去掉注釋括號,將 url 替換成“httpbin.org/post”;

其次,將['Content-Type']的值替換成前面所說的內容,即"text/plain";

最后,將{[1]={['file']="/RecDir/rec001"}}修訂為{[1]={['file']="/luar/test.txt"}}并按保存。

修訂后的文本如列出如下。

wKgZO2dIbfWARqSgAAFQTYz5YMU565.png

8.3 固件下載及運行結果

啟動 Luatools 固件下載工具,并點擊項目管理測試按鈕,將文件 main.lua,testHttp.lua 分別添加進去,同時將文件 test.txt 也添加上去,如下圖所示。需要注意,大家建立項目的位置不同,圖中的文件路徑與項目路徑可能有些不同,與自己的實際內容相符即可。

wKgZO2dIbf-AXanqAAPBQLHMJOc050.png

在圖中點下載腳本,然后切換到 Luatools 的 trace 頁面,等待腳本代碼運行結果。

wKgZPGdIbgqADQNrAAjH3MF6gR0369.png

由圖中內容可見,腳本復現了 Postman 演示的內容,上文中我們所關注的內容也都從圖中得到印證,見圖中紅框中的內容,可以與 postman 的內容進行比較。

到這里文件上傳可以順利完成??赡苡腥艘獑柫?,文件是上傳了,可是我需要傳二進制文件怎么辦,或者我要傳圖片怎么處理。其實也很簡單,我們還是用 postman 來進行組包測試,如下圖。

wKgZO2dIbhaAbcRTAAlyavSr2Yg253.png

圖中我們將 test.txt 去掉,使用 test.bin 取代,將腳本的內容類型即 Content-Type 修訂為"application/octet-stream"即可,其它不變,其中 application/octet-stream 就表示數據內容是二進制流。點擊 SEND 后,可看到返回信息。修訂后的內容如下所示。

wKgZO2dIbiGAI9mzAAHf6yxjCD8587.png

使用 Luatools 下載后等待運行結果如圖所示。與 postman 的相關結果亦相符。當然,這里要特別提示幾點。

a.文件請注意大小,太大的文件可能會導致內存不足,因而太大的文件需要經過其它處理才可以。

b.相關資源文件請一并加到項目中,與腳本一起下載到模塊中。

c.對于二進制文件,對內容進行了 base64 編碼,因而文件上傳后,真正使用時,需要進行解碼。

wKgZPGdIbjCAW_eyAAlOXSZltAs137.png

8.4 文件上傳進階篇

也許有些用途一方面要上傳文件,一方面又要傳參數,此時又要如何處理呢。我們查看 testHttp.lua 文件,有一段代碼如下,也就是文件最后面約從 90 行開始的部分。我們可以利用此段代碼進行比較復雜的文件上傳操作,比如傳多個文件,多個參數。下面這段代碼即是 testHttp.lua 文件中相應的代碼段去掉注釋后的樣子。

wKgZO2dIbkOASKalAAQuJlWa_z4785.pngwKgZPGdIblWALDyNAAOB2p2u8NY765.pngwKgZPGdIbmOAZHVpAAIwsa_tIWs548.pngwKgZPGdIbm2AcxTFAAA8kH7KGO4203.png

在上面的代碼中,傳了兩個參數,即 imei 卡號與時間,傳了一個文件,即"logo_color.jpg"。我們需要修訂為我們所用。首先我們將 url 修訂為“httpbin.org/post”,同時我們將上傳文件修訂為 “/lua/text.txt”。除此外,我們還有一個地方要修訂,即添加一個文件類型,即 txt = "text/plain"。表示這是一個文本文件,大抵如果是一個 BIN 文件,需要添加一個 BIN="application/octet-stream"吧,依此類推。

依上面修訂后,testHttp.lua 成為下面這個樣子。這是進階篇完整的代碼,大家可以直接復制取用,為了節省篇章,此代碼為傳輸兩個文件,兩個參數的例子,不再一一講解一個文件,一個參數等其它搭配組合情況,請知悉。

wKgZO2dIbnqACu6QAASWuzO4Oe8926.pngwKgZO2dIboeALsAeAAOyEeJXdrk453.pngwKgZPGdIbpaAPUbaAAJBlkBl07w790.pngwKgZPGdIbqSADBqCAAEsbAOnsbI506.png

將上面代碼修訂后,與 main.lua,text.txt,text.bin 一起添加的項目文件內,如圖所示。沒有文本文件可以新建,二進制文件可以在電腦上找一個較小的,比如我就找了一個單片機的二進制固件 test.bin。文件不要過大,容易導致內存問題,這也是我們實際要考慮的問題,即在實際應用中,文件的處理還是要小心對待。

wKgZO2dIbq-AMHnlAAO49nwNnLI044.png

下載完成,我們查看運行結果,如圖。

wKgZPGdIbrqAICiTAAdr9MYtyJk972.png

我們在上圖中找到了 true 200 表示正確返回,然后我們找到了第一個文件 test.bin 的相關數據,因為窗口大小原因,沒有顯示第二個文件的內容,我們可以翻看到第二個文件的內容,如圖。

wKgZO2dIbsSAKcjeAAbndEj8Y0k740.png

我們在圖中找到了第二個文件的信息,文本文本并沒有進行 base64 加密處理。同時,兩個參數的內容也可以找到。

下面說說文件類型怎么定義的問題,因為我們看到文件類型的定義有點懵。如下面的代碼中,有 jpg="image/jpeg"這樣的,也有 png ="image/png" 這樣的,而我們自己添加的兩個文件類型,卻不知這個類型為什么要這么填。

wKgZO2dIbs6ATzuhAAEa7bUs7HU372.png

這個還是得說回 postman,fiddler 兩個工具,我們在 postman 中組織演示時,發送后,可以在 fiddler 中看到具體的數據形式,在 fiddler 中切換到 WebForms,如下圖。

wKgZPGdIbtiAffGIAAIjSTgQmN0772.png

在圖中,各文件的數據轉換為了兩個表格,將 Content-Type 的值,如圖中也就是 application/octet-stream、image/png 分別填入到對應的文件類型后即可。參照如此處理,大抵不會錯了。

九、文件下載

通過 http 文件下載,原則上相對簡單,但是由于服務器難找,平時的網站的文件又比較大,費了不少時間,好在終于找到了一個自認為比較好用的網站豆子外鏈:http://zuoye.free.fr/index.php,目前網站可用,可以用來進行文件下載的測試。進入網站,便會出現一個上傳文件界面,可以上傳一個自己的文件,然后使用 http 下載此文件進行驗證。當然,也可以使用文件廣場內已經上傳的文件。

wKgZPGdIdD2AOUnGAAFCMG9MuVw163.png

我們將文件外鏈地址復制下來,然后修訂 testHttp.lua 文件。將其它的測試演示語句全部注釋掉,然后在文件 testHttp.lua 中添加一行代碼,然后按保存,并通過 Luatools 下載到開發板。

wKgZO2dIdFGAWzapAADAwDhdfkc563.png

下面是運行結果。

wKgZPGdIdAuAe7n1AAfEPgbRobs940.png

我們可以看到 true 200 的字樣,表示網站正確返回,然后我們看到了文件名稱是 flag.png 及文件大小是 785,文件類型是圖片,然后也顯示了文件內容,即 body 部分,只是由于是圖片文件,這里不能顯示出來,但我們可以查看一下我剛上傳的文件屬性比較一下文件大小是否相符,如下圖。當然,二進制數據不能顯示,但我們可以修改回調函數并使用 base64 編碼來顯示數據,但此內容不在本文演示范圍,不作擴展顯示,有興趣的朋友可以自行試試。

wKgZO2dIc_6AOnqsAAQRP-ZPYfs476.png

十、HTTPS 加密通信

加密通信我們使用服務器"https://airtest.openluat.com 來進行測試,使用 GET 方法,訪問此服務器將會返回 hello 字樣。打開鏈接 https://doc.openluat.com/share_article/KwExQpfcbL9Fs,是服務器的使用說明與各功能接口的入口,如圖。

wKgZPGdIdGWAW9V9AAGXJAs6nLA415.png

點擊 https Server 進入相關說明,如圖。

wKgZO2dIdG6AZJioAAE5GMeEwkU057.png

可以看到服務器的說明及啟動方式等內容,最后有一個 cert.rar 的壓縮文件,點擊下載,里面有三個證書文件,解壓保存,并將這三個文件加入到 Luatools 項目文件內,如圖所示。

wKgZO2dIdHmACt7MAAPXq3XVQgM324.png

完成上面操作后,接下來修訂文件 testHttp.lua,添加下面的內容后按保存。然后轉到 Luatools 工具,點擊下載腳本。

wKgZO2dIdISAPp3UAAE82Mv_5d0301.png

等幾秒后,開發板重啟運行,結果如下。

wKgZPGdIdI6AasoiAAcTj8jAn04671.png

十一、處理 JSON 數據

json 數據處理,主要就是兩個函數,即 json.encode 與 json.decode。其實 json.encode 我們在 post 那一節中已經有使用,因而我們本節不再就 encode 函數的講解進行說明,本節我們使用直接從網站讀取的 json 數據,然后調用 json.decode 解碼。

本次我們仍使用 httpbin.org 網站來做這個事情,此網站有一個接口可以用于測試此功能,位于 Dynamic data 的 get 方法內,有一個 GET/stream/{n}的接口,根據{n}的數值,返回 n 組 json 數據,如下圖是 n=4 的情形。

wKgZPGdIdJmAfxwqAAas-otcSxQ662.png

我們將 body 部分 COPY 出來,列出如下:

wKgZO2dIdKeAH8uFAAmpjjr-GvY536.png

上面字符串,直接使用 json.decode()解析不了,原因是里面包含多條 json 字符串,因而需要進行分解,為此編寫了下面的代碼,以分離字符串。由上面的代碼,1 行的結尾與 2 行的開始是字串”}{“,而且作為 json 文本,這樣的字串也只在兩個 json 字串之間存在,因而我們使用這個作為子串查找,以準確找出各個 json 子串。同時我們將回調函數重新編寫一下,為了與原回調函數區別,本回調函數使用 cbFncJson 作為函數名。同時為了程序清晰,同時編寫了一個 json 字串解析輸出函數 json_out。代碼列出如下。注:下面的字符串處理函數僅適用于本文演示的具體數據,如使用到其它場合,請依據格式與內容進行適當修訂或補全。

wKgZO2dIdLeAPZKXAAORbo8fktY901.pngwKgZPGdIdMaAB81KAAOdjrCEmzE419.png

完成上面的代碼編寫后,在 testHttp.lua 中再添加一行代碼,以使用 GET 方法將數據取回。

wKgZO2dIdNCABiPJAAEXkGkKXLU362.png

保存文件,并將文件下載到開發板,我們來看看執行結果。為了方便,我們將解析字串復制過來,列出如下,刪除了一些多余的輸出,保留 json 的解析部分,以看得分明。

wKgZPGdIdN6AJ0eXAAhkFb_yriw419.pngwKgZO2dIdO6AfV6fAAhe1QTCUfw699.pngwKgZPGdIdP-AWfVkAAheBHSMAJU863.pngwKgZO2dIdRaAFbC_AAHewXCgMSk547.png

上面文本的輸出方式,首先輸出 json 字串,然后是 json 字串的解析,將各名稱對按一定的順序列出。

雖然上面的代碼是 json 的顯示,但其實綜合使用了 table,json,string 等多種數據類型的使用,因而這是一個綜合性比較強的一次演示,大家可以在此基礎上進行更進一步的測試演示,完成更復雜的內容。

十二、gzip 操作

本操作使用下面的代碼進行測試。因 724 尚沒有合用的解壓工具,因而也不作講解,只列出測試內容與測試結果,也不作解壓還原操作。

wKgZO2dIdSKAMY6qAAFE1kN8VvA268.png

wKgZO2dIdSyAKJKNAAmUZke4qnQ619.png

十三、最終的測試文件

最終的 testHttp.lua 文件,此文件包含本文所有示例演示內容,使用時,將對應的注釋去掉,不使用該功能時,將注釋恢復即可。

wKgZO2dIdTmABH7UAAO3LaAAnEM855.pngwKgZPGdIdUeAEy8QAAQyoKi84yA259.pngwKgZO2dIdVWAcSteAAOqrzU5j3s199.pngwKgZO2dIdWWAIY6CAARomeKg8E0331.pngwKgZO2dIdXuAQqRhAAR6Zmoh2nk073.pngwKgZPGdIdYeAEu_ZAAUyrwg4yg4769.pngwKgZO2dIdZiAJnhMAARgpVOdpcI293.pngwKgZPGdIdaaAXTPIAAUUPTFarlk536.pngwKgZO2dIdbOALD8QAAPfswv7iaU669.pngwKgZPGdIdcGAM1jXAAQ1yQZiG_E447.pngwKgZO2dIdc2AWlcXAARIE40EFNU652.pngwKgZO2dIdd2ACdMUAAJjD1JZL4k186.pngwKgZPGdIdemAYgHSAAFngXf3ONk429.png

十四、總結

本文力求從實際應用出發,對 Http 協議的大部分方法進行了演示測試,每一項操作都經過本人實際操作。本文中,涉及一些服務器的選用,也是經過多方的查找,各種比照之后,才決定選用的,具有一定的穩定性,就是說在一定的時間范圍內,相應資源都可用。最后,希望本文對各位讀者有用,并能解決大家一些實際問題。

十五、常見問題

15.1 腳本下載后沒有反應。

檢查有沒有下載底層核心,因為開發板出廠時,一般情況下是 AT 版本,此時如果不下載底層核心,lua 腳本就運行不起來。

15.2 接上 USB 線后,不能下載,也不閃燈

檢查 USB 線是否連接正確,724 開發板有兩個 USB 口,旁邊有 USB 字樣的,才是下載用的 USB 通訊口,另一個 USB 口是 USB 轉 TTL 的 UART 通訊端口,此端口不提供電源支持,因而當然不會有反應。

15.3 不小心變磚了怎么辦?

在 Luatools 軟件中,點擊下載固件,選擇底層核心文件,使能 USB BOOT 下載,按住開發板上的重啟按鈕,直到聽到嘀的一聲后開始下載,看到可松開按鍵提示后,松開按鍵。如下圖。

wKgZO2dIdf-ATDgXAAa9niZddCg914.png

15.4 一直連接不上網

檢查天線是否連接完好,檢查所在位置信號是否良好,檢查 SIM 卡是否鎖死,檢查 SIM 卡是否欠費等??墒褂米约旱氖謾C卡換上去進行比較檢查。如果手機卡能上網,則與硬件無關,此時可檢查 SIM 的相關內容。

分享完畢。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9301

    瀏覽量

    86058
  • HTTP
    +關注

    關注

    0

    文章

    511

    瀏覽量

    31518
  • 模組
    +關注

    關注

    6

    文章

    1515

    瀏覽量

    30602
  • LuatOS
    +關注

    關注

    0

    文章

    76

    瀏覽量

    2000
收藏 人收藏

    評論

    相關推薦

    分步實操 | Air724UG低功耗模組軟件中復刻高效FTP示例!

    本文要說的是低功耗4G模組Air724UG軟件中復刻高效FTP示例,我已整理成文供大家參考。
    的頭像 發表于 12-03 11:45 ?700次閱讀
    分步實操 | <b class='flag-5'>Air724UG</b>低功耗<b class='flag-5'>模組</b>軟件中復刻高效FTP<b class='flag-5'>示例</b>!

    air724ug開發

    air724ug開發板,最近購買了一塊4G開發板來玩玩,做個開發記錄開發板采用合宙Air724UG
    發表于 07-22 07:25

    STM32+Air724UG基本控制篇

    Air724UG,4G Cat.1全網通③基本外設:液晶OLED(IIC); RGB三色燈;溫濕度傳感器(DHT1...
    發表于 08-20 06:09

    來了!STM32移植LuatOS,潘多拉示例全新教程 精選資料推薦

    進擊的五月,繼上期《使用Air724UG制作簡易貪吃蛇》教程之后,@打盹的消防車 又為大家帶來基于STM32的潘多拉LuatOS移植全新教程:為什么使用潘多拉作為教程呢?STM32不能沒有通訊,那就
    發表于 08-24 06:10

    Air724UG模塊及其硬件接口規范

    1. 緒論本文檔定義了Air724UG模塊及其硬件接口規范,電氣特性和機械細節,通過此文檔的幫助,結合我們的應用手冊和用戶指導書,客戶可以快速應用Air724UG模塊于無線應用。2.綜述2.1
    發表于 11-11 06:44

    Air724UG是什么

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔文章目錄前言一、Air724UG是什么?二、AT是什么?三、服務器是什么?四、我們要做什么?五、我們該怎么做?0.準備工作1·連接模塊
    發表于 12-13 07:07

    AIR724UG模塊AT指令響應時間發送指令后一定要等回復嗎

    AIR724UG模塊AT指令響應時間發送指令后必須等待回復,然后才能進行下一個指令操作。
    發表于 03-02 06:20

    怎么解決通過air724ug獲取位置信息后通過mqtt發送到云端遇到的問題

    我想通過air724ug模塊獲取定位后,在通過mqtt發送到云端,但是查詢了位置信息之后mqtt就斷了 我是通過串口發送AT指令來獲取位置信息的 軟件包用的是at_device下的air720,mqtt用的是pahomqtt 兩個功能單獨使用都是可以成功實現功能的
    發表于 04-27 11:41

    Air724UGAir723UG模塊的硬件設計手冊免費下載

    本文檔定義了Air724UG_Air723UG模塊及其硬件接口規范,電氣特性和機械細節,通過此文檔的幫助,結合我們的應用手冊和用戶指導書,客戶可以快速應用Air724UG_Air723UG模塊于無線應用。
    發表于 11-16 08:00 ?44次下載
    <b class='flag-5'>Air724UG</b>和<b class='flag-5'>Air723UG</b>模塊的硬件設計手冊免費下載

    Air724UGAir723UG模塊硬件設計手冊免費下載

    本文檔定義了Air724UG_Air723UG模塊及其硬件接口規范,電氣特性和機械細節,通過此文檔的幫助,結合我們的應用手冊和用戶指導書,客戶可以快速應用Air724UG_Air723UG模塊于無線應用。
    發表于 03-31 08:00 ?2次下載

    緣起Air724UG,Cat.1網紅“貓”到物聯網行業應用經典之選

    提起Air724UG,總讓人想起2020年的春天。群雄競起,各大模組廠商紛紛涌入激蕩的4GCat.1市場。相比之下,合宙Cat.1產品上市不算早,卻以“發布即量產,用產品說話”的獨有風格宣告開啟物
    的頭像 發表于 08-31 09:55 ?2672次閱讀
    緣起<b class='flag-5'>Air724UG</b>,Cat.1網紅“貓”到物聯網行業應用經典之選

    Air724UG軟件:ADC功能的創意展示

    今天我將對Air724UG軟件的ADC功能做出詳細示例,大家可以先收藏,再慢慢細讀,絕對有收獲。
    的頭像 發表于 11-17 09:53 ?405次閱讀
    <b class='flag-5'>Air724UG</b>軟件:ADC功能的創意展示

    4G模組Air724UG軟件示例:UDP實戰演練!

    關于4G模組Air724UG軟件的UDP示例,今天我將對其實戰演練,整理成文示例展示:
    的頭像 發表于 11-26 12:10 ?259次閱讀
    4G<b class='flag-5'>模組</b><b class='flag-5'>Air724UG</b>軟件<b class='flag-5'>示例</b>:UDP實戰演練!

    4G模組Air724UG的軟件教程:KEYPAD示例!

    本回我要說的是低功耗4G模組Air724UG的KEYPAD示例,我已整理成文,特供大家參考。
    的頭像 發表于 11-30 09:44 ?338次閱讀
    4G<b class='flag-5'>模組</b><b class='flag-5'>Air724UG</b>的軟件教程:KEYPAD<b class='flag-5'>示例</b>!

    解讀Air724UG低功耗4G模組軟件的語音通話!

    本篇文章以Air724UG模組為例,解讀低功耗4G模組軟件的語音通話,呈現實用教程供大家參考。
    的頭像 發表于 12-09 09:39 ?381次閱讀
    解讀<b class='flag-5'>Air724UG</b>低功耗4G<b class='flag-5'>模組</b>軟件的語音通話!
    澳门顶级赌场娱乐城| 博彩公司| 百家乐官网历史路单| 利来国际网上娱乐| 百家乐官网楼梯缆| 在线百家乐3d| 大发888唯一官网| 澳门百家乐官网怎么才能赢钱| 24山龙合向向合水秘诀| 百家乐纯数字玩法| 大发888娱乐城下载英皇国际 | 百家乐发脾机| 乐天百家乐的玩法技巧和规则 | 金公主百家乐现金网| 大发888案件| 百家乐官网tie| 百家乐外套| 马尔康县| 属虎属鼠合伙做生意吗| 大发888娱乐城 手机版| 百家乐官网稳赚的方法| 百家乐破解之法| 帝王娱乐城开户| 百家乐官网游戏网上投注| 沙龙百家乐娱乐平台| 真钱百家乐| 百家乐三珠连跳打法| 日博bet365| 同花顺百家乐官网娱乐城| 大发888游戏平台黄埔网| 百家乐官网程序开户发| 大发888下载网站| 百家乐官网路珠多少钱| 博发百家乐游戏| 王牌国际| 百家乐稳定打法| 夏河县| 澳门百家乐投注法| 日博365| 视频百家乐试玩| 博乐百家乐官网游戏|