單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網(wǎng)單片機
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨立的32KB以太網(wǎng)收發(fā)緩存,可供8個獨立硬件socket使用。如此配置,真正實現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場景設(shè)計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復(fù)用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

第十二章 W55MH32 NetBIOS示例
本篇文章我們將詳細(xì)介紹如何在W55MH32芯片上面實現(xiàn)NetBIOS功能,并通過實戰(zhàn)例程,為大家講解如何通過名稱進行PING測試。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP請參考相關(guān)章節(jié)。有關(guān)W55MH32的初始化過程,請參考Network Install章節(jié),這里將不再贅述。
1 NetBIOS簡介
NetBIOS(Network Basic Input/Output System,網(wǎng)絡(luò)基本輸入輸出系統(tǒng))主要用于數(shù)十臺計算機的小型局域網(wǎng)資源共享。NetBIOS是一種應(yīng)用程序編程接口(API),應(yīng)用于局域網(wǎng)程序中,為程序提供請求低級服務(wù)的統(tǒng)一的命令集,作用是給局域網(wǎng)提供網(wǎng)絡(luò)服務(wù)以及其他特殊功能。自誕生起,NetBIOS成為許多其他網(wǎng)絡(luò)應(yīng)用程序的基礎(chǔ)。很多局域網(wǎng)都是在 NetBIOS的基礎(chǔ)上工作的。在 NetBIOS局域網(wǎng)環(huán)境下,計算機通過名字被系統(tǒng)識別。網(wǎng)絡(luò)中每臺計算機都有用不同方法編的永久性名稱。NetBIOS名稱用來在網(wǎng)絡(luò)上鑒別資源。程序可以用這些名稱開始和結(jié)束會話。每個程序都有獨特的NetBIOS名稱。每臺支持應(yīng)用的網(wǎng)絡(luò)設(shè)備也有用戶定義或通過內(nèi)部方法獲得的 NetBIOS站名。NetBIOS名稱能包含至多16位阿拉伯?dāng)?shù)字。在整個資源路由網(wǎng)絡(luò)里,字符組合是唯一的。在一臺使用 NetBIOS的網(wǎng)絡(luò)設(shè)備在網(wǎng)絡(luò)上能完全工作起來之前,網(wǎng)絡(luò)設(shè)備必須先登記 NetBIOS名稱。
2 NetBIOS特點
唯一命名規(guī)則:NetBIOS為網(wǎng)絡(luò)中的每個節(jié)點分配一個唯一的名稱,長度為16個字符。這一名稱在網(wǎng)絡(luò)中作為節(jié)點的標(biāo)識,方便用戶和應(yīng)用程序識別和訪問特定的資源。
動態(tài)注冊與解析:節(jié)點在接入網(wǎng)絡(luò)時,會動態(tài)地將其NetBIOS名稱注冊到網(wǎng)絡(luò)中。當(dāng)一個節(jié)點需要與另一個節(jié)點通信時,它會通過名稱解析機制將NetBIOS名稱轉(zhuǎn)換為對應(yīng)的以太網(wǎng)地址(MAC地址)。這種動態(tài)的注冊和解析過程使得網(wǎng)絡(luò)配置更加靈活,節(jié)點可以隨時加入或離開網(wǎng)絡(luò),而無需復(fù)雜的手動配置。
面向連接(TCP)和無連接(UDP)通信均支持:它支持廣播和組播,支持三個分開的服務(wù):名字、會話和數(shù)據(jù)報。
較好的兼容性好:該協(xié)議具有較好的兼容性,能夠與其他網(wǎng)絡(luò)協(xié)議(如TCP/IP)共存。在現(xiàn)代網(wǎng)絡(luò)環(huán)境中,雖然TCP/IP協(xié)議占據(jù)主導(dǎo)地位,但NetBIOS仍然可以在某些特定的應(yīng)用場景中發(fā)揮作用,并且可以與基于TCP/IP的應(yīng)用程序進行交互。
3 NetBIOS應(yīng)用場景
W55MH32使用NetBIOS可以進行以下幾種應(yīng)用:
設(shè)備名稱解析:在嵌入式系統(tǒng)中,許多設(shè)備(如物聯(lián)網(wǎng)設(shè)備、智能家居設(shè)備等)可能沒有配置復(fù)雜的DNS系統(tǒng)。通過NetBIOS名稱服務(wù),設(shè)備可以使用簡單的名稱而不是復(fù)雜的IP地址進行通信。
網(wǎng)絡(luò)瀏覽服務(wù):通過NetBIOS廣播或點對點查詢,嵌入式設(shè)備能夠在網(wǎng)絡(luò)資源管理器中顯示自身信息,使用戶能夠快速訪問設(shè)備。
4 NetBIOS的基本工作流程
NetBIOS主要提供以下三種服務(wù):
NetBIOS名稱服務(wù)(Name Service):負(fù)責(zé)NetBIOS名稱注冊和解析(對應(yīng)NBNS)。
NetBIOS數(shù)據(jù)報服務(wù)(Datagram Service):支持無連接的通信(UDP)。
NetBIOS會話服務(wù)(SessionService):支持面向連接的通信(TCP)。
NBNS是NetBIOS的一部分,專門負(fù)責(zé)實現(xiàn)NetBIOS名稱服務(wù)(Name Service)的功能。它的作用是將NetBIOS名稱解析為對應(yīng)的IP地址。
PC端ping NetBIOS名稱的基本工作流程如下:
第一步:當(dāng)PC端PING的是一個NetBIOS名稱時,首先會查詢自身的 NetBIOS遠(yuǎn)程緩存名稱表中是否存在記錄,存在則將NetBIOS名稱替代為IP地址,不存在則PC端發(fā)出 NetBIOS廣播請求。
第二步:當(dāng)設(shè)備端接收到NetBIOS請求后,會檢查該請求中的名稱是否與自身的名稱相符。若相符,設(shè)備端會向請求端回復(fù)自身的IP地址。
第三步:PC端在收到設(shè)備端的響應(yīng)后,會將該響應(yīng)中包含的 IP地址和NetBIOS名稱建立映射關(guān)系存儲到 NetBIOS遠(yuǎn)程緩存名稱表中。
第四步:PC端根據(jù)NetBIOS遠(yuǎn)程緩存名稱表中的映射關(guān)系,將NetBIOS名稱替換成IP進行PING操作。
5 NetBIOS報文解析
NetBIOS(Network Basic Input/Output System)報文用于局域網(wǎng)內(nèi)計算機的設(shè)備發(fā)現(xiàn)與名稱解析。它工作在會話層,通過UDP 137端口進行名稱服務(wù),用于主機名與IP地址的映射;UDP 138端口用于數(shù)據(jù)報服務(wù),支持無連接消息傳輸;TCP 139端口用于會話服務(wù),支持面向連接的通信。
NetBIOS報文格式如下:
| 字節(jié)偏移 | 字段名稱 | 長度 (字節(jié)) | 描述 |
| 0 | Transaction ID | 2 | 事務(wù) ID,用于匹配請求和響應(yīng) |
| 2 | Flags | 2 | 標(biāo)志位,表示報文類型和屬。 |
| 4 | Questions | 2 | 查詢的名稱數(shù)量 |
| 6 | Answer RRs | 2 | 回答記錄數(shù),表示響應(yīng)的記錄數(shù)量 |
| 8 | Authority RRs | 2 | 授權(quán)記錄數(shù) |
| 10 | Additional RRs | 2 | 額外記錄數(shù) |
| 12 | Question Name | 可變長度 | 查詢的 NetBIOS名稱,16字節(jié)編碼 |
| 可變 | Question Type | 2 | 查詢類型(如 0x20表示名稱查詢) |
| 可變+2 | Question Class | 2 | 查詢類(如 IN = 0x01表示互聯(lián)網(wǎng)類) |
字段解釋
1.Transaction ID (事務(wù) ID):
用于標(biāo)識請求與響應(yīng)的唯一事務(wù) ID,便于匹配查詢和應(yīng)答報文。
2.Flags (標(biāo)志位):
指示報文類型(請求/響應(yīng))。
包含廣播標(biāo)志、操作碼及其他控制信息。
3.Questions (查詢數(shù)量):
表示當(dāng)前查詢的名稱數(shù)量,通常為 1。
4.Answer RRs (回答記錄數(shù)):
表示響應(yīng)中返回的資源記錄數(shù)。
5.Authority RRs (授權(quán)記錄數(shù)):
表示提供的授權(quán)名稱服務(wù)器記錄數(shù)。
6.Additional RRs (額外記錄數(shù)):
提供額外的附加信息,如 IP地址或其他補充數(shù)據(jù)。
7.Question Name (查詢名稱):
查詢的 NetBIOS名稱,經(jīng)過特殊編碼,占用 16字節(jié),末尾以 0x00結(jié)束。
8.Question Type (查詢類型):
指定查詢的類型,如 0x20表示 NetBIOS名稱查詢。
9.Question Class (查詢類):
指定查詢的類,0x01表示 IN(互聯(lián)網(wǎng)類查詢)。
報文示例
|報文解析|
NetBIOS Name Service
Transaction ID: 0xa753 (唯一標(biāo)識此查詢,用于匹配請求與響應(yīng))
Flags: 0x0110, Opcode: Name query, Recursion desired, Broadcast (表示這是一個廣播查詢請求)
Questions: 1 (字段說明僅查詢一個設(shè)備名稱)
Answer RRs: 0 (在響應(yīng)報文中,該字段會顯示解析到的記錄數(shù))
Authority RRs: 0 (在響應(yīng)報文中,用于指示哪些服務(wù)器可以授權(quán)回答該查詢)
Additional RRs: 0 (在某些NetBIOS響應(yīng)中可能用于攜帶更多解析信息)
|報文原文|
a7 54 01 10 00 01 00 00 00 00 00 00
6實現(xiàn)過程
接下來,我們看看如何在W55MH32上實現(xiàn)NetBIOS功能。
注意:測試實例需要PC端和W55MH32處于同一網(wǎng)段。
在主循環(huán)調(diào)用do_netbios()函數(shù),如下所示:
while (1)
{
do_netbios(SOCKET_ID);
}
do_netbios()函數(shù)需要傳入一個參數(shù),該參數(shù)是socket號,do_netbios()函數(shù)如下:
/** *@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()函數(shù)會執(zhí)行一個UDP協(xié)議的狀態(tài)機,當(dāng)收到消息后,首先會判斷是否為NetBIOS報文,如果為NetBIOS報文則會進入netbios_name_decoding()函數(shù)解析NetBIOS名稱,當(dāng)名稱與W55MH32的NetBIOS名稱一致時,則返回響應(yīng)報文。
netbios_name_decoding()函數(shù)如下:
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運行結(jié)果
燒錄例程運行后,首先進行了PHY鏈路檢測,然后是通過DHCP獲取網(wǎng)絡(luò)地址并打印網(wǎng)絡(luò)地址信息,最后程序開始持續(xù)接收和響應(yīng) NetBIOS請求。如下圖所示:


8總結(jié)
本文講解了如何在 W55MH32芯片上實現(xiàn) NetBIOS功能,通過實戰(zhàn)例程展示了利用 NetBIOS進行名稱 PING測試的具體過程,包括 NetBIOS功能的調(diào)用、請求處理、名稱解析和響應(yīng)發(fā)送等關(guān)鍵步驟。文章詳細(xì)介紹了 NetBIOS的概念、特點、應(yīng)用場景、基本工作流程和報文解析,幫助讀者理解其在小型局域網(wǎng)資源共享和設(shè)備通信中的重要作用。
下一篇文章將聚焦 UPnP,解析其核心原理及在網(wǎng)絡(luò)設(shè)備互聯(lián)互通中的應(yīng)用,同時講解如何在相關(guān)設(shè)備上實現(xiàn) UPnP功能,敬請期待!
WIZnet是一家無晶圓廠半導(dǎo)體公司,成立于 1998年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術(shù),基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
以太網(wǎng)
+關(guān)注
關(guān)注
41文章
6137瀏覽量
181458 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2948文章
48072瀏覽量
417776 -
NETBIOS
+關(guān)注
關(guān)注
0文章
8瀏覽量
9617
發(fā)布評論請先 登錄
明德?lián)P視頻分享點撥FPGA課程---第十二章??學(xué)習(xí)自檢方法
第十二章 SysTick——系統(tǒng)定時器
第二章 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示例
第十二章 W55MH32 NetBIOS示例
評論