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
- Linux/macOS:
二、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
相关产品推荐
相关产品推荐

