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

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


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