You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#程序中获取局域网内Tasmota设备名称的方法问询

解决局域网内Tasmota设备信息获取问题

一、替代nbtstat的命令行工具

nbtstat依赖NetBIOS协议,但Tasmota设备默认可能未开启该服务,导致"node was not found"错误。可以试试这些替代工具:

  • ping -a <IP地址>:通过反向DNS查询获取主机名,部分Tasmota设备会预设tasmota-xxxx格式的主机名,可直接识别。
  • nmblookup <IP地址>:比nbtstat兼容性更好的NetBIOS查询工具,Windows通常自带,Linux/macOS需安装samba-client套件。
  • mDNS相关命令:Tasmota默认开启mDNS服务,设备名以tasmota-xxxx.local形式存在。
    • Linux/macOS:avahi-browse -a 或 dns-sd -B _http._tcp local
    • Windows:安装Bonjour服务后使用dns-sd -B _http._tcp local

二、C#实现方案

1. mDNS发现(推荐,适配Tasmota特性)

利用Tasmota默认开启的mDNS服务,直接发现设备并获取信息,无需依赖ARP或NetBIOS:

using MdnsClient;

var mdnsClient = new MdnsClient.MdnsClient();
// 扫描局域网内的HTTP服务(Tasmota默认暴露HTTP接口)
var services = await mdnsClient.BrowseAsync("_http._tcp.local");

foreach (var service in services)
{
    if (service.Name.StartsWith("tasmota", StringComparison.OrdinalIgnoreCase))
    {
        var serviceInfo = await mdnsClient.ResolveAsync(service);
        // 通过IP从ARP缓存获取MAC(复用你已有的ARP逻辑)
        var macAddress = GetMacFromArp(serviceInfo.HostEndPoint.Address);
        Console.WriteLine($"设备名称: {service.Name}, IP: {serviceInfo.HostEndPoint.Address}, MAC: {macAddress}");
    }
}

// 复用你已实现的ARP缓存解析方法
string GetMacFromArp(IPAddress ip)
{
    // 这里写你解析arp -a输出或读取系统ARP缓存的逻辑
    return "对应MAC地址";
}

可通过NuGet安装MdnsClient包快速实现。

2. ARP缓存+反向DNS查询

结合你已有的ARP获取逻辑,对每个IP做反向DNS解析筛选设备:

using System.Net;
using System.Net.NetworkInformation;

// 获取ARP缓存条目(可通过调用arp -a并解析输出实现)
var arpEntries = GetAllArpEntries();

foreach (var entry in arpEntries)
{
    try
    {
        var hostEntry = Dns.GetHostEntry(entry.IpAddress);
        if (hostEntry.HostName.StartsWith("tasmota", StringComparison.OrdinalIgnoreCase))
        {
            Console.WriteLine($"IP: {entry.IpAddress}, MAC: {entry.MacAddress}, 设备名称: {hostEntry.HostName}");
        }
    }
    catch (SocketException)
    {
        // 反向DNS解析失败,跳过该IP
        continue;
    }
}

// 自定义ARP条目类
public class ArpEntry
{
    public IPAddress IpAddress { get; set; }
    public string MacAddress { get; set; }
}

// 实现ARP缓存读取逻辑
List<ArpEntry> GetAllArpEntries()
{
    // 执行arp -a命令并解析输出,返回IP和MAC的对应列表
    return new List<ArpEntry>();
}

3. 调用Tasmota Web API(最精准)

Tasmota设备自带Web接口,访问/info可直接获取设备名称、MAC等核心信息:

using System.Net.Http;
using Newtonsoft.Json;

var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(1) };
// 扫描常见局域网网段(示例为192.168.1.x)
for (int i = 1; i <= 255; i++)
{
    var ip = $"192.168.1.{i}";
    try
    {
        var response = await httpClient.GetAsync($"http://{ip}/info");
        if (response.IsSuccessStatusCode)
        {
            var jsonContent = await response.Content.ReadAsStringAsync();
            var deviceInfo = JsonConvert.DeserializeObject<TasmotaDeviceInfo>(jsonContent);
            
            if (deviceInfo.Name.StartsWith("tasmota", StringComparison.OrdinalIgnoreCase))
            {
                Console.WriteLine($"IP: {ip}, MAC: {deviceInfo.Mac}, 设备名称: {deviceInfo.Name}");
            }
        }
    }
    catch
    {
        // 超时或无法连接,跳过该IP
        continue;
    }
}

// 对应Tasmota /info接口返回的实体类
public class TasmotaDeviceInfo
{
    [JsonProperty("Name")]
    public string Name { get; set; }
    
    [JsonProperty("Mac")]
    public string Mac { get; set; }
}

需通过NuGet安装Newtonsoft.Json包用于JSON解析。

4. SNMP查询(需Tasmota开启SNMP)

如果你的Tasmota设备已开启SNMP服务,可通过SNMP协议获取信息:

using SnmpSharpNet;

var targetIp = new IpAddress("192.168.1.xxx");
var community = new OctetString("public"); // Tasmota默认SNMP社区名
var snmpClient = new SimpleSnmp(targetIp, community);

if (!snmpClient.Valid)
{
    Console.WriteLine("SNMP客户端初始化失败");
    return;
}

// 查询设备名称(OID:.1.3.6.1.2.1.1.5.0)
var nameResult = snmpClient.Get(SnmpVersion.V2, new[] { new Oid(".1.3.6.1.2.1.1.5.0") });
if (nameResult != null && nameResult.Count > 0)
{
    var deviceName = nameResult[0].Value.ToString();
    if (deviceName.StartsWith("tasmota", StringComparison.OrdinalIgnoreCase))
    {
        // 查询MAC地址(OID:.1.3.6.1.2.1.2.2.1.6.1)
        var macResult = snmpClient.Get(SnmpVersion.V2, new[] { new Oid(".1.3.6.1.2.1.2.2.1.6.1") });
        var macAddress = macResult[0].Value.ToString();
        Console.WriteLine($"IP: {targetIp}, MAC: {macAddress}, 设备名称: {deviceName}");
    }
}

需通过NuGet安装SnmpSharpNet包,且需提前在Tasmota设备设置中开启SNMP。

内容的提问来源于stack exchange,提问作者Diane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:10:15