0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

第十二章 W55MH32 NetBIOS示例

W55MH32 来源:W55MH32 作者:W55MH32 2025-07-24 09:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

单芯片解决方案,开启全新体验——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的无限可能。

wKgZO2iBiBmAe3DyAACpGc5mWX8613.png

第十二章 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请求。如下图所示:

wKgZO2iBkjuAWTEdAACWtBnZLgQ673.pngwKgZO2iBkjuAIn23AABYQ7T6nA8103.png

8总结

本文讲解了如何在 W55MH32芯片上实现 NetBIOS功能,通过实战例程展示了利用 NetBIOS进行名称 PING测试的具体过程,包括 NetBIOS功能的调用、请求处理、名称解析和响应发送等关键步骤。文章详细介绍了 NetBIOS的概念、特点、应用场景、基本工作流程和报文解析,帮助读者理解其在小型局域网资源共享和设备通信中的重要作用。

下一篇文章将聚焦 UPnP,解析其核心原理及在网络设备互联互通中的应用,同时讲解如何在相关设备上实现 UPnP功能,敬请期待!

WIZnet是一家无晶圆厂半导体公司,成立于 1998年。产品包括互联网处理器 iMCU™,它采用 TOE(TCP/IP卸载引擎)技术,基于独特的专利全硬连线 TCP/IP。iMCU™面向各种应用中的嵌入式互联网设备。

WIZnet在全球拥有 70多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。

香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 以太网
    +关注

    关注

    41

    文章

    5923

    浏览量

    179474
  • 物联网
    +关注

    关注

    2939

    文章

    47314

    浏览量

    407581
  • NETBIOS
    +关注

    关注

    0

    文章

    8

    浏览量

    9586
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    数据采集光盘实例第六第十二章

    数据采集光盘实例第六第十二章
    发表于 06-28 21:17

    明德扬视频分享点拨FPGA课程---第十二章  学习自检方法

    第十二章学习自检方法1. 波形对比方法http://yunpan.cn/cjZTiDA9pY56x访问密码 c359
    发表于 11-13 11:01

    第十二章 SysTick——系统定时器

    本章介绍了W55MH32的SysTick系统定时器,它是24位递减计数器,含4个寄存器,可配置定时、中断,用于产生时基 等。
    的头像 发表于 05-22 17:16 825次阅读
    <b class='flag-5'>第十二章</b> SysTick——系统定时器

    第二 W55MH32 DHCP示例

    本文介绍 DHCP 协议,包括其在 IP 网络自动分配参数的功能、便捷配置等特点、工作原理、报文格式和应用场景。通过 W55MH32 实战例程展示动态获取网络地址信息过程,含注册定时器中断、启用模式和获取信息等步骤,烧录后可完成检测与信息打印,PC 端能 PING 通设备。
    的头像 发表于 07-24 09:02 578次阅读
    第二<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> DHCP<b class='flag-5'>示例</b>

    第五 W55MH32 UDP示例

    本文介绍了在 W55MH32 芯片上实现 UDP 通信及数据回环测试的方法。阐述了 UDP 协议的概念、特点、应用场景、报文传输流程和报文结构,展示了实现过程,借助网络调试工具完成测试。
    的头像 发表于 07-24 09:13 641次阅读
    第五<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> UDP<b class='flag-5'>示例</b>

    第九 W55MH32 HTTP Server示例

    本文介绍了在 W55MH32 芯片上实现 HTTP Server 功能,并通过浏览器修改其网络地址信息的方法。阐述了 HTTP 协议的概念、特点、应用场景、工作流程、请求方法、响应内容,以及 Web 页面构成和交互方式。展示了在W55MH32上实现的过程。
    的头像 发表于 07-24 09:35 632次阅读
    第九<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> HTTP Server<b class='flag-5'>示例</b>

    第十章 W55MH32 SNTP示例

    本文讲解了如何在W55MH32芯片上实现SNTP授时功能,通过实例详细展示了从SNTP服务器同步时间的实现流程,包括时间请求、响应解析和本地时间校准等核心步骤。文章还对SNTP的应用场景进行了分析,帮助读者理解其在时间同步中的实际应用价值。
    的头像 发表于 07-24 09:43 835次阅读
    <b class='flag-5'>第十章</b> <b class='flag-5'>W55MH32</b> SNTP<b class='flag-5'>示例</b>

    第十一章 W55MH32 SMTP示例

    本文讲解了如何在 W55MH32 芯片上实现 SMTP 协议,通过实例详细展示了在该芯片上使用 SMTP 协议发送电子邮件的实现流程,包括 SMTP 发送内容初始化、使用 DNS 协议解析 SMTP
    的头像 发表于 07-24 09:49 997次阅读
    <b class='flag-5'>第十</b>一章 <b class='flag-5'>W55MH32</b> SMTP<b class='flag-5'>示例</b>

    第十四章 W55MH32 TFTP示例

    本文讲解了如何在 W55MH32 芯片上实现 TFTP 协议,通过实战例程详细展示了使用 TFTP 客户端模式从服务器获取文本文件的过程,涵盖 TFTP 初始化、发送读请求、运行协议并处理结果等核心
    的头像 发表于 07-24 10:37 621次阅读
    <b class='flag-5'>第十</b>四章 <b class='flag-5'>W55MH32</b> TFTP<b class='flag-5'>示例</b>

    第十五章 W55MH32 SNMP示例

    本文讲解了如何在 W55MH32 芯片上实现 SNMP 功能,通过实战例程展示了使用 MIB Browser 管理 W55MH32 的具体过程,涵盖在 MIB Browser 中创建分支、添加叶子
    的头像 发表于 07-24 10:43 689次阅读
    <b class='flag-5'>第十五章</b> <b class='flag-5'>W55MH32</b> SNMP<b class='flag-5'>示例</b>

    第十六章 W55MH32 PING示例

    本文讲解了如何在 W55MH32 芯片上通过 IPRAW 模式实现 ICMP 协议中的 PING 命令,以进行网络连通性测试,通过实战例程展示了从发送 PING 请求、接收并解析回复到统计结果的完整
    的头像 发表于 07-24 11:41 495次阅读
    <b class='flag-5'>第十</b>六章 <b class='flag-5'>W55MH32</b> PING<b class='flag-5'>示例</b>

    第十七章 W55MH32 ARP示例

    文讲解了如何在 W55MH32 芯片上通过 MAC RAW 模式实现 ARP 协议,将 IP 地址解析为 MAC 地址,通过实战例程展示了从发送 ARP 请求到接收并处理响应的完整过程。文章详细介绍
    的头像 发表于 07-24 11:49 636次阅读
    <b class='flag-5'>第十七章</b> <b class='flag-5'>W55MH32</b> ARP<b class='flag-5'>示例</b>

    第十八章 W55MH32 FTP_Server示例

    本文讲解了如何在 W55MH32 芯片上实现 FTP 协议的服务器模式,通过实战例程展示了使用 W55MH32 作为 FTP 服务器与 PC 端进行文件传输、目录操作等功能的过程,涵盖获取网络配置
    的头像 发表于 07-24 11:55 445次阅读
    <b class='flag-5'>第十</b>八章 <b class='flag-5'>W55MH32</b> FTP_Server<b class='flag-5'>示例</b>

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

    本文讲解了如何在 W55MH32 芯片上实现 MQTT 协议并连接阿里云平台,通过实战例程展示了从准备工作、连接配置到消息订阅、发布及接收处理的完整过程。文章详细介绍了 MQTT 协议的概念、特点
    的头像 发表于 07-24 14:17 690次阅读
    第二<b class='flag-5'>十二章</b> <b class='flag-5'>W55MH32</b> MQTT&amp;Aliyun<b class='flag-5'>示例</b>

    第三十 W55MH32 HTTP_Server&amp;NetBIOS示例

    本文讲解了如何在 W55MH32 芯片上实现 HTTP_Server 与 NetBIOS 功能,并通过 NetBIOS 访问 HTTP 服务器网页内容,通过实战例程展示了在主循环中并行处理 HTTP 与
    的头像 发表于 07-24 16:21 883次阅读
    第三十<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> HTTP_Server&amp;<b class='flag-5'>NetBIOS</b><b class='flag-5'>示例</b>