單芯片解決方案,開啟全新體驗——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 NetBIOS示例
本篇文章我們將詳細介紹如何在W55MH32芯片上面實現NetBIOS功能,并通過實戰例程,為大家講解如何通過名稱進行PING測試。
該例程用到的其他網絡協議,例如DHCP請參考相關章節。有關W55MH32的初始化過程,請參考Network Install章節,這里將不再贅述。
1 NetBIOS簡介
NetBIOS(Network Basic Input/Output System,網絡基本輸入輸出系統)主要用于數十臺計算機的小型局域網資源共享。NetBIOS是一種應用程序編程接口(API),應用于局域網程序中,為程序提供請求低級服務的統一的命令集,作用是給局域網提供網絡服務以及其他特殊功能。自誕生起,NetBIOS成為許多其他網絡應用程序的基礎。很多局域網都是在 NetBIOS的基礎上工作的。在 NetBIOS局域網環境下,計算機通過名字被系統識別。網絡中每臺計算機都有用不同方法編的永久性名稱。NetBIOS名稱用來在網絡上鑒別資源。程序可以用這些名稱開始和結束會話。每個程序都有獨特的NetBIOS名稱。每臺支持應用的網絡設備也有用戶定義或通過內部方法獲得的 NetBIOS站名。NetBIOS名稱能包含至多16位阿拉伯數字。在整個資源路由網絡里,字符組合是唯一的。在一臺使用 NetBIOS的網絡設備在網絡上能完全工作起來之前,網絡設備必須先登記 NetBIOS名稱。
2 NetBIOS特點
唯一命名規則:NetBIOS為網絡中的每個節點分配一個唯一的名稱,長度為16個字符。這一名稱在網絡中作為節點的標識,方便用戶和應用程序識別和訪問特定的資源。
動態注冊與解析:節點在接入網絡時,會動態地將其NetBIOS名稱注冊到網絡中。當一個節點需要與另一個節點通信時,它會通過名稱解析機制將NetBIOS名稱轉換為對應的以太網地址(MAC地址)。這種動態的注冊和解析過程使得網絡配置更加靈活,節點可以隨時加入或離開網絡,而無需復雜的手動配置。
面向連接(TCP)和無連接(UDP)通信均支持:它支持廣播和組播,支持三個分開的服務:名字、會話和數據報。
較好的兼容性好:該協議具有較好的兼容性,能夠與其他網絡協議(如TCP/IP)共存。在現代網絡環境中,雖然TCP/IP協議占據主導地位,但NetBIOS仍然可以在某些特定的應用場景中發揮作用,并且可以與基于TCP/IP的應用程序進行交互。
3 NetBIOS應用場景
W55MH32使用NetBIOS可以進行以下幾種應用:
設備名稱解析:在嵌入式系統中,許多設備(如物聯網設備、智能家居設備等)可能沒有配置復雜的DNS系統。通過NetBIOS名稱服務,設備可以使用簡單的名稱而不是復雜的IP地址進行通信。
網絡瀏覽服務:通過NetBIOS廣播或點對點查詢,嵌入式設備能夠在網絡資源管理器中顯示自身信息,使用戶能夠快速訪問設備。
4 NetBIOS的基本工作流程
NetBIOS主要提供以下三種服務:
NetBIOS名稱服務(Name Service):負責NetBIOS名稱注冊和解析(對應NBNS)。
NetBIOS數據報服務(Datagram Service):支持無連接的通信(UDP)。
NetBIOS會話服務(SessionService):支持面向連接的通信(TCP)。
NBNS是NetBIOS的一部分,專門負責實現NetBIOS名稱服務(Name Service)的功能。它的作用是將NetBIOS名稱解析為對應的IP地址。
PC端ping NetBIOS名稱的基本工作流程如下:
第一步:當PC端PING的是一個NetBIOS名稱時,首先會查詢自身的 NetBIOS遠程緩存名稱表中是否存在記錄,存在則將NetBIOS名稱替代為IP地址,不存在則PC端發出 NetBIOS廣播請求。
第二步:當設備端接收到NetBIOS請求后,會檢查該請求中的名稱是否與自身的名稱相符。若相符,設備端會向請求端回復自身的IP地址。
第三步:PC端在收到設備端的響應后,會將該響應中包含的 IP地址和NetBIOS名稱建立映射關系存儲到 NetBIOS遠程緩存名稱表中。
第四步:PC端根據NetBIOS遠程緩存名稱表中的映射關系,將NetBIOS名稱替換成IP進行PING操作。
5 NetBIOS報文解析
NetBIOS(Network Basic Input/Output System)報文用于局域網內計算機的設備發現與名稱解析。它工作在會話層,通過UDP 137端口進行名稱服務,用于主機名與IP地址的映射;UDP 138端口用于數據報服務,支持無連接消息傳輸;TCP 139端口用于會話服務,支持面向連接的通信。
NetBIOS報文格式如下:
字節偏移 | 字段名稱 | 長度 (字節) | 描述 |
0 | Transaction ID | 2 | 事務 ID,用于匹配請求和響應 |
2 | Flags | 2 | 標志位,表示報文類型和屬。 |
4 | Questions | 2 | 查詢的名稱數量 |
6 | Answer RRs | 2 | 回答記錄數,表示響應的記錄數量 |
8 | Authority RRs | 2 | 授權記錄數 |
10 | Additional RRs | 2 | 額外記錄數 |
12 | Question Name | 可變長度 | 查詢的 NetBIOS名稱,16字節編碼 |
可變 | Question Type | 2 | 查詢類型(如 0x20表示名稱查詢) |
可變+2 | Question Class | 2 | 查詢類(如 IN = 0x01表示互聯網類) |
字段解釋
1.Transaction ID (事務 ID):
用于標識請求與響應的唯一事務 ID,便于匹配查詢和應答報文。
2.Flags (標志位):
指示報文類型(請求/響應)。
包含廣播標志、操作碼及其他控制信息。
3.Questions (查詢數量):
表示當前查詢的名稱數量,通常為 1。
4.Answer RRs (回答記錄數):
表示響應中返回的資源記錄數。
5.Authority RRs (授權記錄數):
表示提供的授權名稱服務器記錄數。
6.Additional RRs (額外記錄數):
提供額外的附加信息,如 IP地址或其他補充數據。
7.Question Name (查詢名稱):
查詢的 NetBIOS名稱,經過特殊編碼,占用 16字節,末尾以 0x00結束。
8.Question Type (查詢類型):
指定查詢的類型,如 0x20表示 NetBIOS名稱查詢。
9.Question Class (查詢類):
指定查詢的類,0x01表示 IN(互聯網類查詢)。
報文示例
|報文解析| NetBIOS Name Service Transaction ID: 0xa753 (唯一標識此查詢,用于匹配請求與響應) Flags: 0x0110, Opcode: Name query, Recursion desired, Broadcast (表示這是一個廣播查詢請求) Questions: 1 (字段說明僅查詢一個設備名稱) Answer RRs: 0 (在響應報文中,該字段會顯示解析到的記錄數) Authority RRs: 0 (在響應報文中,用于指示哪些服務器可以授權回答該查詢) Additional RRs: 0 (在某些NetBIOS響應中可能用于攜帶更多解析信息) |報文原文| a7 54 01 10 00 01 00 00 00 00 00 00
6實現過程
接下來,我們看看如何在W55MH32上實現NetBIOS功能。
注意:測試實例需要PC端和W55MH32處于同一網段。
在主循環調用do_netbios()函數,如下所示:
while (1) { do_netbios(SOCKET_ID); }
do_netbios()函數需要傳入一個參數,該參數是socket號,do_netbios()函數如下:
/** *@brief Execute the NetBIOS name resolver *@param socket number *@return no */ void do_netbios(uint8_t sn) { unsigned char state; unsigned int len; state = getSn_SR(sn); switch (state) { case SOCK_UDP: if ((len = getSn_RX_RSR(sn)) > 0) { unsigned char rem_ip_addr[4]; uint16_t rem_udp_port; char netbios_name[NETBIOS_NAME_LEN + 1]; NETBIOS_HDR *netbios_hdr; NETBIOS_NAME_HDR *netbios_name_hdr; len = recvfrom(sn, (unsigned char *)&netbios_rx_buf, len, rem_ip_addr, &rem_udp_port); 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); netbios_hdr = (NETBIOS_HDR *)netbios_rx_buf; netbios_name_hdr = (NETBIOS_NAME_HDR *)(netbios_hdr + 1); // If the packet is a NetBIOS query packet 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))) { printf("netbios name query questionrn"); // Decode the NetBIOS package netbios_name_decoding((char *)(netbios_name_hdr->encname), netbios_name, sizeof(netbios_name)); printf("name is %srn", netbios_name); // If the query is made against the native Netbios if (strcmp(netbios_name, NETBIOS_W55MH32_NAME) == 0) { uint8_t ip_addr[4]; NETBIOS_RESP *resp = (NETBIOS_RESP *)netbios_tx_buf; // Handle the header of the NetBIOS response packet resp->resp_hdr.trans_id = netbios_hdr->trans_id; resp->resp_hdr.flags = htons(NETB_HFLAG_RESPONSE | NETB_HFLAG_OPCODE_NAME_QUERY | NETB_HFLAG_AUTHORATIVE | NETB_HFLAG_RECURS_DESIRED); resp->resp_hdr.questions = 0; resp->resp_hdr.answerRRs = htons(1); resp->resp_hdr.authorityRRs = 0; resp->resp_hdr.additionalRRs = 0; // Process the header data of the NetBIOS response packet memcpy(resp->resp_name.encname, netbios_name_hdr->encname, sizeof(netbios_name_hdr->encname)); resp->resp_name.nametype = netbios_name_hdr->nametype; resp->resp_name.type = netbios_name_hdr->type; resp->resp_name.cls = netbios_name_hdr->cls; resp->resp_name.ttl = htonl(NETBIOS_NAME_TTL); resp->resp_name.datalen = htons(sizeof(resp->resp_name.flags) + sizeof(resp->resp_name.addr)); resp->resp_name.flags = htons(NETB_NFLAG_NODETYPE_BNODE); getSIPR(ip_addr); memcpy(resp->resp_name.addr, ip_addr, 4); // Send a response packet sendto(sn, (unsigned char *)resp, sizeof(NETBIOS_RESP), rem_ip_addr, rem_udp_port); printf("send responsern"); } } } break; case SOCK_CLOSED: close(sn); socket(sn, Sn_MR_UDP, NETBIOS_PORT, 0); break; default: break; } }
進入do_netbios()函數會執行一個UDP協議的狀態機,當收到消息后,首先會判斷是否為NetBIOS報文,如果為NetBIOS報文則會進入netbios_name_decoding()函數解析NetBIOS名稱,當名稱與W55MH32的NetBIOS名稱一致時,則返回響應報文。
netbios_name_decoding()函數如下:
static int netbios_name_decoding(char *name_enc, char *name_dec, int name_dec_len) { char *pname; char cname; char cnbname; int index = 0; // Decode the name of the former NetBIOS pname = name_enc; for (;;) { /* Every two characters of the first level-encoded name * turn into one character in the decoded name. */ cname = *pname; if (cname == '') break; // no more characters if (cname == '.') break; // scope ID follows if (cname < 'A' || cname > 'Z') { // Not legal. return -1; } cname -= 'A'; cnbname = cname < 4; pname++; cname = *pname; if (cname == '' || cname == '.') { /* No more characters in the name - but we're in * the middle of a pair. Not legal. */ return -1; } if (cname < 'A' || cname > 'Z') { // Not legal. return -1; } cname -= 'A'; cnbname |= cname; pname++; // Do we have room to store the character? if (index < NETBIOS_NAME_LEN) { // Yes - store the character. name_dec[index++] = (cnbname != ' ' ? cnbname : ''); } } return 0; }
7運行結果
燒錄例程運行后,首先進行了PHY鏈路檢測,然后是通過DHCP獲取網絡地址并打印網絡地址信息,最后程序開始持續接收和響應 NetBIOS請求。如下圖所示:
8總結
本文講解了如何在 W55MH32芯片上實現 NetBIOS功能,通過實戰例程展示了利用 NetBIOS進行名稱 PING測試的具體過程,包括 NetBIOS功能的調用、請求處理、名稱解析和響應發送等關鍵步驟。文章詳細介紹了 NetBIOS的概念、特點、應用場景、基本工作流程和報文解析,幫助讀者理解其在小型局域網資源共享和設備通信中的重要作用。
下一篇文章將聚焦 UPnP,解析其核心原理及在網絡設備互聯互通中的應用,同時講解如何在相關設備上實現 UPnP功能,敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應用中的嵌入式互聯網設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
以太網
+關注
關注
41文章
5684瀏覽量
176251 -
物聯網
+關注
關注
2931文章
46306瀏覽量
393450 -
NETBIOS
+關注
關注
0文章
8瀏覽量
9498
發布評論請先 登錄
明德揚視頻分享點撥FPGA課程---第十二章??學習自檢方法
第二章 W55MH32 DHCP示例

第五章 W55MH32 UDP示例

第九章 W55MH32 HTTP Server示例

第十章 W55MH32 SNTP示例

第十一章 W55MH32 SMTP示例

第十四章 W55MH32 TFTP示例

第十五章 W55MH32 SNMP示例

第十六章 W55MH32 PING示例

第十七章 W55MH32 ARP示例

第十八章 W55MH32 FTP_Server示例

第二十二章 W55MH32 MQTT&Aliyun示例

第三十章 W55MH32 HTTP_Server&NetBIOS示例

評論