單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網單片機
W55MH32是WIZnet重磅推出的高性能以太網單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數據處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協議棧、內置MAC以及PHY,擁有獨立的32KB以太網收發緩存,可供8個獨立硬件socket使用。如此配置,真正實現了All-in-One解決方案,為開發者提供極大便利。
在封裝規格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業控制中多樣化的連接需求,無論是與各類傳感器、執行器的通信,還是對復雜工業協議的支持,都能游刃有余,成為復雜工控領域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32L這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第三十章 W55MH32 HTTP_Server&NetBIOS示例
本篇文章我們將詳細介紹如何在W55MH32芯片上面實現HTTP_Server與NetBIOS功能,并通過實戰例程,為大家講解如何通過NetBIOS來訪問HTTP服務器的網頁內容。
該例程用到的其他網絡協議,例如DHCP,請參考相關章節。有關W55MH32的初始化過程,也請參考相關章節,這里將不再贅述。
1 HTTP_Server&NetBIOS簡介
通過 NetBIOS實現 HTTP_Server是將傳統的 HTTP服務與 NetBIOS名稱解析功能結合,允許基于局域網中的 NetBIOS名稱進行 HTTP請求和響應。通常,NetBIOS被用于局域網中的設備發現與名稱解析,因此,HTTP服務器可以通過 NetBIOS名稱而非 IP地址來進行訪問,簡化了網絡環境中設備的配置和通信。
2 HTTP_Server&NetBIOS特點
名稱解析:利用 NetBIOS名稱解析功能,客戶端可以通過計算機名稱而非 IP地址訪問 HTTP服務器,簡化了網絡配置,尤其適用于沒有 DNS服務器的環境。
局域網優化:適合局域網內部使用,能在沒有互聯網連接的情況下提供 HTTP服務,方便設備之間的通信和資源共享。
無需復雜配置:通過 NetBIOS提供自動的設備發現和名稱解析,減少了對 IP地址配置的依賴,使得設備間互聯更加便捷。
兼容性:適用于舊版系統或老舊硬件設備,尤其是在 Windows系統中,NetBIOS和 HTTP服務器可以平滑集成。
提高網絡效率:通過 NetBIOS提供的輕量級通信機制,HTTP服務在局域網環境中能夠提供快速且穩定的數據傳輸。
3 HTTP_Server&NetBIOS的基本工作流程
1.初始化:HTTP服務器啟動,使用 NetBIOS over TCP/IP(NBT)協議在局域網內廣播自己的名稱。
2.名稱解析:客戶端通過 NetBIOS名稱解析服務(NBNS)獲取服務器的 IP地址。
3.客戶端請求:客戶端通過 TCP連接向 HTTP服務器發送 HTTP請求。
4.請求處理:服務器處理請求,生成相應的 HTTP響應并準備返回。
5.響應返回:服務器通過 TCP連接將響應數據(如網頁或文件)發送回客戶端。
6.會話關閉:請求完成后,服務器和客戶端關閉連接或保持連接等待下次請求。
7.結束與清理:服務器釋放資源,準備處理下一個請求。
HTTP的請求-響應模型通常由以下幾個步驟組成
建立連接:客戶端與服務器之間基于TCP/IP協議建立連接。
發送請求:客戶端向服務器發送請求,請求中包含要訪問的資源的 URL、請求方法(GET、POST、PUT、DELETE等)、請求頭(例如,Accept、User-Agent)以及可選的請求體(對于 POST 或 PUT請求)。
處理請求:服務器接收到請求后,根據請求中的信息找到相應的資源,執行對應的處理操作。這可能涉及從數據庫中檢索數據、生成動態內容或者簡單地返回靜態文件。
發送響應:服務器將處理后的結果封裝在響應中,并將其發送回客戶端。響應包含狀態碼(用于指示請求的成功或失敗)、響應頭(例如,Content-Type、Content-Length)以及可選的響應體(例如,HTML頁面、圖像數據)。
關閉連接:在完成請求-響應周期后,客戶端和服務器之間的連接將被關閉,除非使用了持久連接(如 HTTP/1.1中的 keep-alive)。
4 HTTP請求方法
在HTTP協議中,GET和POST是兩種常用的請求方法,用于客戶端向服務器發送數據和獲取資源。
GET方法
GET方法通常用于從服務器獲取資源。它有以下特點:
參數傳遞:請求參數通過URL中的查詢字符串傳遞,形如?key1=value1&key2=value2。
數據大小限制:由于參數附加在URL后,長度可能受URL長度限制(取決于瀏覽器和服務器設置)。
安全性:數據在URL中明文顯示,不適合傳遞敏感信息。
請求格式:
GET HTTP/
Request-URI:表示目標資源的路徑,可能包含參數。
Version:HTTP協議版本。
Headers:包含元信息,例如客戶端的屬性、支持的格式等。
Blank Line:空行。
POST方法
POST方法通常用于向服務器提交數據。它有以下特點:
參數傳遞:數據放在請求體中,而不是URL中。
數據大小限制:POST請求的體積沒有明顯限制,可以傳遞大量數據。
安全性:數據在請求體中傳輸,相對來說更安全。
請求格式:
POST HTTP/
字段解釋:
Request-URI:目標資源的路徑,通常是API的端點。
Headers:元信息,例如內容類型和長度。
Blank Line:空行,區分頭和主體。
Body:數據的主體,包含客戶端發送到服務器的長度。
5 HTTP協議響應內容
HTTP協議響應內容包含狀態行、響應頭以及響應體三個部分。
狀態行
HTTP狀態行包含HTTP協議版本、狀態碼以及狀態描述。
狀態碼由三個十進制數字組成,第一個十進制數字定義了狀態碼的類型。
狀態碼分為五類:
1xx(信息性狀態碼):表示接收的請求正在處理。
2xx(成功狀態碼):表示請求正常處理完畢。
3xx(重定向狀態碼):需要后續操作才能完成這一請求。
4xx(客戶端錯誤狀態碼):表示請求包含語法錯誤或無法完成。
5xx(服務器錯誤狀態碼):服務器在處理請求的過程中發生了錯誤。
示例:
HTTP/1.1200 OK
響應頭
響應頭則會包含內容類型、長度、編碼等信息。
常見的響應頭字段有:
Content-Type:響應內容的MIME類型,例如 text/html、application/json。
Content-Length:響應內容的字節長度。
Server:服務器信息。
Set-Cookie:設置客戶端的Cookie。
示例:
Content-Type: text/html; charset=UTF-8 Content-Length:3495 Server:Apache/2.4.41(Ubuntu)
響應體
響應體包含實際的數據內容,具體形式取決于響應的類型和請求內容。例如:HTML頁面內容,JSON數據,文件的二進制數據等。
如果是狀態碼為204 No Content或 304 Not Modified的響應,則通常沒有正文。
注意:響應體和響應頭之間會添加一個空行來分隔內容。
6 Web頁面的基本構成
HTML(超文本標記語言)
、、。
作用:定義網頁的結構和內容。
內容:
結構標簽:如
內容標簽:如
、
、、。
表單標簽:如 、、。
CSS(層疊樣式表)
作用:控制網頁的樣式和布局。
內容:
字體設置:如 font-family、font-size。
顏色設置:如 color、background-color。
布局設計:如 margin、padding、display、flex。
響應式設計:如媒體查詢(@media)。
JavaScript(腳本語言)
作用:增加網頁的交互性和動態功能。
應用:
表單驗證。
動畫效果。
與服務器交互(如通過 AJAX請求)。
處理用戶事件(如點擊、懸停)。
Meta信息
中。
作用:提供頁面的元數據,通常包含在
內容:
網頁標題:
字符集:。
SEO信息:如 。
設備適配:如 。
示例:
!DOCTYPE html?> Simple Page/title?> body{ font-family:Arial, sans-serif; text-align: center; padding:20px;} button{ padding:10px20px; cursor: pointer;} /style?> /head?>Hello, Web!/h1?> Click the button for a surprise./p?>
7 Web頁面交互
Web頁面實現HTTP請求的方式:
HTTP請求頁面
描述:客戶端通過 HTTP協議向服務器發送請求,服務器處理后返回響應。
特點:
最基礎的交互方式。
包括常見的 HTTP方法:GET、POST、PUT、DELETE等。
示例:
GET請求:瀏覽器訪問網頁,獲取靜態資源(HTML、CSS、JavaScript等)。
POST請求:提交表單數據。
表單提交
描述:通過 HTML表單向服務器提交數據。
特點:
表單數據會被編碼后隨請求發送。
可使用 GET或 POST方法。
示例:
Submit/button?> /form?>
AJAX(Asynchronous JavaScript and XML)
描述:使用 JavaScript在后臺與服務器通信,更新部分頁面內容而無需刷新整個頁面。
特點:
提高用戶體驗,減少頁面加載時間。
現代開發中多用 JSON代替 XML。
示例:
fetch('/api/data',{ method:'GET' }) .then(response=> response.json()) .then(data=> console.log(data));
Web服務器響應處理
直接響應
定義:服務器直接處理請求,返回靜態資源或簡單的動態內容,而不調用外部腳本或程序。
特點
高效:直接處理請求,無需額外調用外部程序,適合靜態內容。
適用場景:
靜態資源(HTML、CSS、JavaScript、圖像等)的分發。
輕量級動態內容生成。
工作流程
客戶端發送 HTTP請求。
服務器解析請求 URL,查找相應的資源(如文件路徑)。
直接讀取資源內容并返回給客戶端,附加適當的 HTTP響應頭。
CGI響應
定義:服務器通過 CGI(Common Gateway Interface)調用外部程序或腳本,處理客戶端請求并生成動態響應內容。
特點
靈活性:可以動態生成內容,支持復雜邏輯。
適用場景:
動態內容生成(如用戶登錄、數據查詢)。
與數據庫交互或其他后臺服務的復雜邏輯處理。
工作流程
客戶端發送 HTTP請求。
服務器解析請求并將請求數據(如 URL參數或表單數據)傳遞給 CGI程序。
CGI程序處理請求,生成響應內容并返回給服務器。
服務器將 CGI程序生成的內容包裝為 HTTP響應發送給客戶端。
8 HTTP_Server&NetBIOS應用場景
接下來,我們了解下在W55MH32上,可以使用HTTP_Server&NetBIOS完成哪些操作及應用呢?
1.簡化設備互聯:通過 NetBIOS名稱解析,嵌入式設備無需依賴 DNS即可在局域網內互相發現和訪問 HTTP服務,簡化網絡配置。
2.自動化配置與管理:NetBIOS使得設備可以通過名稱自動發現并配置,提高設備部署和維護效率,尤其適用于大規模嵌入式設備部署。
3.無需 DNS的網絡環境:適用于沒有 DNS的小型局域網或開發環境,減少了 IP地址管理的復雜性,提供便捷的設備通信方式。
4.調試與維護工具:NetBIOS和 HTTP Server的結合使得開發人員能夠快速調試嵌入式設備,監控系統性能并進行故障排查。
5.嵌入式Web服務:提供基于HTTP的控制接口或狀態監控,方便遠程管理和調試,適合嵌入式設備的配置和管理。
9實現過程
接下來,我們在W55MH32上實現HTTP_Server&NetBIOS功能。
注意:測試實例需要PC端和W55MH32處于同一網段。
在主循環中,程序并行處理 HTTP與 NetBIOS相關事務。有以下步驟:
1. while(1) 2. { 3. httpServer_run(SOCKET_ID); 4. do_netbios(SOCKET_ID); 5. } 6.
步驟一:HTTP服務器處理
httpServer_run()函數負責 HTTP服務器功能,根據socket狀態進行監聽、接收請求、處理并響應,如針對不同的 GET請求返回對應網頁內容,處理 POST請求時更新配置并設置重啟標志。
httpServer_run()函數如下:
1. void httpServer_run(uint8_t seqnum) 2. { 3. uint8_t s;// socket number 4. uint16_t len; 5. uint32_t gettime=0; 6. 7. #ifdef _HTTPSERVER_DEBUG_ 8. uint8_t destip[4]={ 9. 0, 10. }; 11. uint16_t destport=0; 12. #endif 13. 14. http_request =(st_http_request*)pHTTP_RX;// Structure of HTTP Request 15. parsed_http_request=(st_http_request*)pHTTP_TX; 16. 17. // Get the H/W socket number 18. s= getHTTPSocketNum(seqnum); 19. 20. /* HTTP Service Start */ 21. switch(getSn_SR(s)) 22. { 23. case SOCK_ESTABLISHED: 24. // Interrupt clear 25. if(getSn_IR(s)&Sn_IR_CON) 26. { 27. setSn_IR(s,Sn_IR_CON); 28. } 29. 30. // HTTP Process states 31. switch(HTTPSock_Status[seqnum].sock_status) 32. { 33. case STATE_HTTP_IDLE: 34. if((len= getSn_RX_RSR(s))>0) 35. { 36. if(len> DATA_BUF_SIZE) len= DATA_BUF_SIZE; 37. len = recv(s,(uint8_t*)http_request, len); 38. *(((uint8_t*)http_request)+ len)=''; 39. 40. parse_http_request(parsed_http_request,(uint8_t*)http_request); 41. #ifdef _HTTPSERVER_DEBUG_ 42. getSn_DIPR(s, destip); 43. destport= getSn_DPORT(s); 44. printf("rn"); 45. printf("> HTTPSocket[%d] : HTTP Request received ", s); 46. printf("from %d.%d.%d.%d : %drn", destip[0], destip[1], destip[2], destip[3], destport); 47. #endif 48. #ifdef _HTTPSERVER_DEBUG_ 49. printf("> HTTPSocket[%d] : [State] STATE_HTTP_REQ_DONErn", s); 50. #endif 51. // HTTP 'response' handler; includes send_http_response_header / body function 52. http_process_handler(s, parsed_http_request); 53. 54. gettime= get_httpServer_timecount(); 55. // Check the TX socket buffer for End of HTTP response sends 56. while(getSn_TX_FSR(s)!=(getSn_TxMAX(s))) 57. { 58. if((get_httpServer_timecount()- gettime)>3) 59. { 60. #ifdef _HTTPSERVER_DEBUG_ 61. printf("> HTTPSocket[%d] : [State] STATE_HTTP_REQ_DONE: TX Buffer clear timeoutrn", s); 62. #endif 63. break; 64. } 65. } 66. 67. if(HTTPSock_Status[seqnum].file_len>0) 68. HTTPSock_Status[seqnum].sock_status= STATE_HTTP_RES_INPROC; 69. else 70. HTTPSock_Status[seqnum].sock_status= STATE_HTTP_RES_DONE;// Send the 'HTTP response' end 71. } 72. break; 73. 74. case STATE_HTTP_RES_INPROC: 75. /* Repeat: Send the remain parts of HTTP responses */ 76. #ifdef _HTTPSERVER_DEBUG_ 77. printf("> HTTPSocket[%d] : [State] STATE_HTTP_RES_INPROCrn", s); 78. #endif 79. // Repeatedly send remaining data to client 80. send_http_response_body(s,0, http_response,0,0); 81. 82. if(HTTPSock_Status[seqnum].file_len==0)HTTPSock_Status[seqnum].sock_status= STATE_HTTP_RES_DONE; 83. break; 84. 85. case STATE_HTTP_RES_DONE: 86. #ifdef _HTTPSERVER_DEBUG_ 87. printf("> HTTPSocket[%d] : [State] STATE_HTTP_RES_DONErn", s); 88. #endif 89. // Socket file info structure re-initialize 90. HTTPSock_Status[seqnum].file_len =0; 91. HTTPSock_Status[seqnum].file_offset=0; 92. HTTPSock_Status[seqnum].file_start =0; 93. HTTPSock_Status[seqnum].sock_status= STATE_HTTP_IDLE; 94. 95. //#ifdef _USE_SDCARD_ 96. // f_close(&fs); 97. //#endif 98. #ifdef _USE_WATCHDOG_ 99. HTTPServer_WDT_Reset(); 100. #endif 101. http_disconnect(s); 102. break; 103. 104. default: 105. break; 106. } 107. break; 108. 109. case SOCK_CLOSE_WAIT: 110. #ifdef _HTTPSERVER_DEBUG_ 111. printf("> HTTPSocket[%d] : ClOSE_WAITrn", s);// if a peer requests to close the current connection 112. #endif 113. disconnect(s); 114. break; 115. 116. case SOCK_CLOSED: 117. #ifdef _HTTPSERVER_DEBUG_ 118. printf("> HTTPSocket[%d] : CLOSEDrn", s); 119. #endif 120. if(socket(s,Sn_MR_TCP, HTTP_SERVER_PORT,0x00)== s)/* Reinitialize the socket */ 121. { 122. #ifdef _HTTPSERVER_DEBUG_ 123. printf("> HTTPSocket[%d] : OPENrn", s); 124. #endif 125. } 126. break; 127. 128. case SOCK_INIT: 129. listen(s); 130. break; 131. 132. case SOCK_LISTEN: 133. break; 134. 135. default: 136. break; 137. 138. }// end of switch 139. 140. #ifdef _USE_WATCHDOG_ 141. HTTPServer_WDT_Reset(); 142. #endif 143. } 144.
該函數用于處理 HTTP服務器的運行邏輯。函數接受一個參數 seqnum,表示當前處理的套接字的序列號。進入該函數后,程序會執行一個狀態機,根據Socket的狀態來執行不同的操作。
當Socket處于SOCK_CLOSED時為關閉狀態,程序會打開并重新初始化套接字;
為SOCK_ESTABLISHED時表示已建立連接,首先會清除中斷標志,然后根據套接字的狀態進行不同的處理,在空閑狀態時,接收并解析數據,處理 HTTP請求后發送響應,并根據文件長度更新狀態;在響應處理中狀態時,發送剩余的響應數據,文件傳輸完成時切換到響應完成狀態;響應完成后重置文件信息并關閉套接字,返回空閑狀態;
SOCK_CLOSE_WAIT則為關閉等待狀態,此時調用 disconnect()函數關閉套接字;
SOCK_INIT表示處于初始化狀態,調用 listen()函數監聽連接;
SOCK_LISTEN為處于監聽狀態,不進行任何操作。
步驟二:NetBIOS服務處理
do_netbios()函數實現 NetBIOS名稱解析,當處于 SOCK_UDP 狀態且接收到數據包,若為對本機 NetBIOS名稱的查詢,便構造并發送響應包,在 SOCK_CLOSED狀態時則重新打開socket。通過這樣的循環機制,程序持續提供 HTTP服務與 NetBIOS名稱解析服務。
do_netbios()函數如下:
1. void do_netbios(uint8_t sn) 2. { 3. unsignedchar state; 4. unsignedint len; 5. state= getSn_SR(sn); 6. switch(state) 7. { 8. case SOCK_UDP: 9. if((len= getSn_RX_RSR(sn))>0) 10. { 11. unsignedchar rem_ip_addr[4]; 12. uint16_t rem_udp_port; 13. char netbios_name[NETBIOS_NAME_LEN+1]; 14. NETBIOS_HDR *netbios_hdr; 15. NETBIOS_NAME_HDR*netbios_name_hdr; 16. len= recvfrom(sn,(unsignedchar*)&netbios_rx_buf, len, rem_ip_addr,&rem_udp_port); 17. printf("rem_ip_addr=%d.%d.%d.%d:%drn", rem_ip_addr[0], rem_ip_addr[1], rem_ip_addr[2], rem_ip_addr[3], rem_udp_port); 18. netbios_hdr =(NETBIOS_HDR*)netbios_rx_buf; 19. netbios_name_hdr=(NETBIOS_NAME_HDR*)(netbios_hdr+1); 20. // If the packet is a NetBIOS query packet 21. if(((netbios_hdr->flags& ntohs(NETB_HFLAG_OPCODE))== ntohs(NETB_HFLAG_OPCODE_NAME_QUERY))&&((netbios_hdr->flags& ntohs(NETB_HFLAG_RESPONSE))==0)&&(netbios_hdr->questions== ntohs(1))) 22. { 23. printf("netbios name query questionrn"); 24. // Decode the NetBIOS package 25. netbios_name_decoding((char*)(netbios_name_hdr->encname), netbios_name,sizeof(netbios_name)); 26. printf("name is %srn", netbios_name); 27. // If the query is made against the native Netbios 28. if(strcmp(netbios_name, NETBIOS_W55MH32_NAME)==0) 29. { 30. uint8_t ip_addr[4]; 31. NETBIOS_RESP*resp=(NETBIOS_RESP*)netbios_tx_buf; 32. // Handle the header of the NetBIOS response packet 33. resp->resp_hdr.trans_id = netbios_hdr->trans_id; 34. resp->resp_hdr.flags = htons(NETB_HFLAG_RESPONSE| NETB_HFLAG_OPCODE_NAME_QUERY| NETB_HFLAG_AUTHORATIVE | NETB_HFLAG_RECURS_DESIRED); 35. resp->resp_hdr.questions =0; 36. resp->resp_hdr.answerRRs = htons(1); 37. resp->resp_hdr.authorityRRs =0; 38. resp->resp_hdr.additionalRRs=0; 39. // Process the header data of the NetBIOS response packet 40. memcpy(resp->resp_name.encname, netbios_name_hdr->encname,sizeof(netbios_name_hdr->encname)); 41. resp->resp_name.nametype= netbios_name_hdr->nametype; 42. resp->resp_name.type = netbios_name_hdr->type; 43. resp->resp_name.cls = netbios_name_hdr->cls; 44. resp->resp_name.ttl = htonl(NETBIOS_NAME_TTL); 45. resp->resp_name.datalen = htons(sizeof(resp->resp_name.flags)+sizeof(resp->resp_name.addr)); 46. resp->resp_name.flags = htons(NETB_NFLAG_NODETYPE_BNODE); 47. getSIPR(ip_addr); 48. memcpy(resp->resp_name.addr, ip_addr,4); 49. // Send a response packet 50. sendto(sn,(unsignedchar*)resp,sizeof(NETBIOS_RESP), rem_ip_addr, rem_udp_port); 51. printf("send responsern"); 52. } 53. } 54. } 55. break; 56. 57. case SOCK_CLOSED: 58. close(sn); 59. socket(sn,Sn_MR_UDP, NETBIOS_PORT,0); 60. break; 61. 62. default: 63. break; 64. } 65. } 66.
do_netbios()函數主要執行 NetBIOS相關操作。程序首先會執行一個狀態機,根據套接字狀態執行不同操作:在關閉狀態(SOCK_CLOSED)時,關閉并重新創建套接字監聽NetBIOS端口;在UDP狀態時(SOCK_UDP),接收數據并解析 NetBIOS查詢包,匹配本地名稱時發送響應包;其他狀態下不操作。
10運行結果
燒錄例程運行后,首先進行了PHY鏈路檢測,然后是通過DHCP獲取網絡地址并打印網絡地址信息,通過NetBIOS名稱解析打印提示解析名稱,接著我們打開瀏覽器,輸入W55MH32/進行即可訪問網頁信息:
11總結
本文講解了如何在 W55MH32芯片上實現 HTTP_Server與 NetBIOS功能,并通過 NetBIOS訪問 HTTP服務器網頁內容,通過實戰例程展示了在主循環中并行處理 HTTP與 NetBIOS相關事務的過程。感謝觀看!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
芯片
+關注
關注
460文章
52566瀏覽量
441848 -
NETBIOS
+關注
關注
0文章
8瀏覽量
9498
發布評論請先 登錄
第十章 W55MH32中斷應用概覽

第二章 W55MH32 DHCP示例

第三章 W55MH32 TCP Client示例

第五章 W55MH32 UDP示例

第六章 W55MH32 UDP?Multicast示例

第九章 W55MH32 HTTP Server示例

第十章 W55MH32 SNTP示例

第十二章 W55MH32 NetBIOS示例

第十四章 W55MH32 TFTP示例

第十五章 W55MH32 SNMP示例

第十六章 W55MH32 PING示例

第十八章 W55MH32 FTP_Server示例

第二十二章 W55MH32 MQTT&amp;Aliyun示例

第二十六章 W55MH32?上位機搜索和配置示例

第二十九章 W55MH32 Modbus_TCP_Server示例

評論