-
WinCE 读取Mac地址实践测试
2014-02-13 17:02:18由于错误的理解WinCE 读取Mac地址就是在注册表中所以怎么读都读不到数据,在此记录测试过程。1、通过注册表中读取Mac地址 ; 2、通过SendARP获取MAC地址。由于错误的理解WinCE 读取Mac地址就是在注册表中所以怎么读都读不到数据,在此记录测试过程。
1、通过注册表中读取Mac地址
using System; using System.Linq; using System.Collections.Generic; using System.Text; using SmartDeviceProjectWtms; using Microsoft.Win32; using System.Windows.Forms; namespace SmartDeviceProjectWtms { class MacReader { public enum HKEY { HKEY_LOCAL_MACHINE = 0, HKEY_CLASSES_ROOT = 1, HKEY_CURRENT_USER = 2, HKEY_USERS = 3 }; private RegistryKey[] reg = new RegistryKey[4]; public MacReader() { reg[(int)HKEY.HKEY_LOCAL_MACHINE] = Registry.LocalMachine; reg[(int)HKEY.HKEY_CLASSES_ROOT] = Registry.ClassesRoot; reg[(int)HKEY.HKEY_CURRENT_USER] = Registry.CurrentUser; reg[(int)HKEY.HKEY_USERS] = Registry.Users; } //读指定变量值 public string ReadValue(HKEY Root, string SubKey, string ValueName) { RegistryKey subKey = reg[(int)Root]; if (ValueName.Length == 0) return "[ERROR]"; try { if (SubKey.Length > 0) { string[] strSubKey = SubKey.Split('\\'); foreach (string strKeyName in strSubKey) { subKey = subKey.OpenSubKey(strKeyName); } } string strKey = subKey.GetValue(ValueName).ToString(); subKey.Close(); return strKey; } catch(Exception ex) { MessageBox.Show(ex.Message); return "[ERROR]"; } } //获取mac地址 public static string GetMacAddr() { MacReader reg = new MacReader(); string mac = reg.ReadValue(MacReader.HKEY.HKEY_LOCAL_MACHINE, @"Comm\DM9CE1\Parms", "NetWorkAddress").ToUpper(); if (mac.Length == 12) { mac = mac.Substring(0, 2) + "-" + mac.Substring(2, 2) + "-" + mac.Substring(4, 2) + "-" + mac.Substring(6, 2) + "-" + mac.Substring(8, 2) + "-" + mac.Substring(10, 2); } return mac; } } }
注:智能设备中按照@“Comm\DM9CE1\Parms”地址读取不到所谓的mac值,无论使用“NetWorkAddress”或是“NetWorkAddress0”,应该是找不到路径所致。
2、通过SendARP获取MAC地址
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Collections; using System.Diagnostics; using System.Runtime.InteropServices; using System.IO; using System.Security.Cryptography; using System.Net; namespace SmartDeviceProjectWtms { class SysInfoReader { private static string[] strEncrypt = new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "AE", "AF", "AG", "AH", "AI", "AJ", "AK", "AL", "AM", "AN", "AO", "AP" }; private static Int32 METHOD_BUFFERED = 0; private static Int32 FILE_ANY_ACCESS = 0; private static Int32 FILE_DEVICE_HAL = 0x00000101; private const Int32 ERROR_NOT_SUPPORTED = 0x32; private const Int32 ERROR_INSUFFICIENT_BUFFER = 0x7A; private static Int32 IOCTL_HAL_GET_DEVICEID = ((FILE_DEVICE_HAL) << 16) | ((FILE_ANY_ACCESS) << 14) | ((21) << 2) | (METHOD_BUFFERED); [DllImport("coredll.dll", SetLastError = true)] private static extern bool KernelIoControl(Int32 dwIoControlCode, IntPtr lpInBuf, Int32 nInBufSize, byte[] lpOutBuf, Int32 nOutBufSize, ref Int32 lpBytesReturned); [DllImport("Iphlpapi.dll", EntryPoint = "SendARP")] public static extern uint SendARP(uint DestIP, uint SrcIP, byte[] pMacAddr, ref uint PhyAddrLen); /// 获取MAC地址 public string GetMac() { uint ip = 0; string mac = string.Empty; //取本机IP列表 IPAddress[] ips = Dns.GetHostEntry(Dns.GetHostName()).AddressList; //取本机IP byte[] ipp = ips[1].GetAddressBytes(); ip = (uint)((ipp[0]) | (ipp[1] << 8) | (ipp[2] << 16) | (ipp[3] << 24)); //取MAC byte[] MacAddr = new byte[6]; uint PhyAddrLen = 6; uint hr = SendARP(ip, 0, MacAddr, ref PhyAddrLen); if (MacAddr[0] != 0 || MacAddr[1] != 0 || MacAddr[2] != 0 || MacAddr[3] != 0 || MacAddr[4] != 0 || MacAddr[5] != 0) { mac = MacAddr[0].ToString("X2") + ":" + MacAddr[1].ToString("X2") + ":" + MacAddr[2].ToString("X2") + ":" + MacAddr[3].ToString("X2") + ":" + MacAddr[4].ToString("X2") + ":" + MacAddr[5].ToString("X2"); } return mac; } ///获取本机IP public string GetIpAddress() { string strHostName = Dns.GetHostName(); //得到本机的主机名 IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);//Dns.GetHostByName(strHostName); //取得本机IP ,此方法已过时 string strAddr = ipEntry.AddressList[1].ToString(); return strAddr; } } }
此法则成功获取到了mac地址。
-
u-boot里怎么设置mac地址,mac地址从EEPROM里读取
2017-12-12 17:46:16 -
分析网卡通过i2c总线从e2prom中读取mac地址过程
2017-07-25 19:38:06每个网卡都有一个独一无二的mac地址,一般这个地址就存放在一个e2prom中,这里就是分析一个网卡初始化过程中,怎么从这个e2prom中读取mac地址。 首先这里的e2prom和cpu的i2c控制器相连接,也就是说最后访问这个...平台:loongson3A系列CPU+loongson2H桥片的开发板.
每个网卡都有一个独一无二的mac地址,一般这个地址就存放在一个e2prom中,这里就是分析一个网卡初始化过程中,怎么从这个e2prom中读取mac地址。
首先这里的e2prom和cpu的i2c控制器相连接,也就是说最后访问这个设备时,使用的是i2c总线的驱动。
i2c总线的时序这里就不介绍了,大家可以看一个i2c设备的手册,其中时序部分讲解的就很详细了。
源码在龙芯开源社区:http://www.loongnix.org/cgit。网卡的源码:drivers/net/ethernet/stmicro/stmmac
stmmac_open->stmmac_check_ether_addr->stmmac_eep_get_mac_addr->i2c_transfer
这里是网卡初始化过程中函数调用关系,在最后去取mac地址时调用到函数i2c_transfer,这就是i2c驱动中的代码,下面看这个函数的调用关系:i2c驱动源码:drivers/i2c/busses/i2c-ls2h.c
i2c_transfer-->__i2c_transfer-->adap->algo->master_xfer-->ls2h_i2c_xfer-->ls2h_i2c_doxfer-->ls2h_i2c_start-->ls2h_i2c_read
这里说明一下,adap->algo->master_xfer是一个函数指针,这是在i2c驱动的probe函数初始化的。ls2h_i2c_probe { ... adap->algo = &ls2h_i2c_algo; ... } static const struct i2c_algorithm ls2h_i2c_algo = { .master_xfer = ls2h_i2c_xfer, .functionality = ls2h_i2c_func, };
最后一部分函数的调用
ls2h_i2c_doxfer-->ls2h_i2c_start-->ls2h_i2c_read
其实就是模拟i2c时序来和设备进行通信,最后读取出来设备中存储的mac地址。 -
Linux Intel网卡IGB驱动修改mac地址
2018-12-20 17:58:03实然心血来潮,想研究一下Intel网卡mac地址是怎么设置的。本文使用IGB驱动,适合于i211等网卡。 MAC地址对于网络来说十分重要,观察过几个网络驱动,发现在Linux内核中,MAC来龙去脉无非以下几个: 1、通过某种...实然心血来潮,想研究一下Intel网卡mac地址是怎么设置的。本文使用IGB驱动,适合于i211等网卡。
MAC地址对于网络来说十分重要,观察过几个网络驱动,发现在Linux内核中,MAC来龙去脉无非以下几个:
1、通过某种方式读取到mac地址,如果没有,则会有随机的mac地址,比如从eeprom中读取一个预先定义的MAC号;
2、赋值到netdev的dev_addr——这个值是驱动中使用的地址;
3、注册网络驱动,多个网卡则要进行多次注册;
4、如果在用户空间更改mac地址,则使用net_device_ops对应的函数,在该实现函数中要更新netdev的dev_addr,还有可能要修改具体芯片的eeprom。
一、IGB驱动IGB的初始化在igb_main.c文件igb_init_module()函数:
static int __init igb_init_module(void)
{
int ret;
pr_info("%s - version %s\n",
igb_driver_string, igb_driver_version);
pr_info("%s\n", igb_copyright);
#ifdef CONFIG_IGB_DCA
dca_register_notify(&dca_notifier);
#endif
ret = pci_register_driver(&igb_driver);
return ret;
}调用pci_register_driver注册pci驱动,最终会调用到同文件的igb_probe函数,在probe函数中进行各种初始化工作,包括读取NVM的mac地址,注册网络设备。
注意,如果主板有多个网卡,由于它们的PCI地址不同,会多次调用到igb_probe函数。
读取MAC地址并进行赋值代码片段如下:/* copy the MAC address out of the NVM */
// 读取eeprom的mac地址,实际调用的函数为igb_read_mac_addr_82575()。
if (hw->mac.ops.read_mac_addr(hw))
dev_err(&pdev->dev, "NVM Read Error\n");
// 拷贝到netdev的dev_addr,这个是内核中使用的变量
memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);
// 判断MAC是否合法
if (!is_valid_ether_addr(netdev->dev_addr)) {
dev_err(&pdev->dev, "Invalid MAC Address\n");
err = -EIO;
goto err_eeprom;
}二、添加自定义的MAC地址
下面在igb_probe中写入自定义的MAC地址,示例代码片段如下:
// new add by Late Lee
unsigned char mac[] = {0x6c, 0x61, 0x74, 0x75, 0x6c, 0x65};
// 根据pci地址做MAC区别,防止使用同一MAC
if (pdev->bus->number == 1)
{
printk(KERN_ERR "net device num1.\n");
mac[5] = 0x65;
}
else if (pdev->bus->number == 2)
{
printk(KERN_ERR "net device num2.\n");
mac[5] = 0x66;
}
// 设置到nvm
// 存疑:手册好像提到invm有次数限制,但看得不是很明白,故存疑
// igb_rar_set_qsel(adapter, mac, 0, adapter->vfs_allocated_count);
// end adding
/* copy the MAC address out of the NVM */
if (hw->mac.ops.read_mac_addr(hw))
dev_err(&pdev->dev, "NVM Read Error\n");
// add by Late Lee
printk(KERN_ERR "read mac addr: %pM but will update it!!\n", hw->mac.addr);
// 拷贝到hw结构体,其它函数需要使用
memcpy(hw->mac.addr, mac, 6);
// end adding
memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len);思路如下:
1、首先根据PCI地址变换不同的MAC号,否则多个网卡都有相同的MAC号。
2、将自定义的mac地址拷贝到hw结构体的mac.addr中,注意,这个值会在igb_configure_rx函数(最后还是调用igb_rar_set_qsel)中调用到,因此要同步更新。如果只更新netdev的dev_addr是无法使用网络通信的。
效果如下:root@latelee:~# ifconfig
eth0 Link encap:Ethernet HWaddr 6c:61:74:75:6c:65
...
eth1 Link encap:Ethernet HWaddr 6c:61:74:75:6c:66
...注:
1、网络操作函数集net_device_ops有设置MAC号接口:ndo_set_mac_address,对于igb驱动调用igb_set_mac,最后会调用igb_rar_set_qsel写入了iNVM中。
2、i211手册,table 8-6,0x5404 + 8 *n、0x5400 + 8*n分别是高、低地址,共32位字节。从代码上看,除了读取mac地址外,还有其它用途。
三、其它下面是igb_probe函数栈调用:
[ 3.295643] [<c16f6e6a>] dump_stack+0x41/0x57
[ 3.300176] [<c144e5cf>] igb_probe+0xedf/0x1100
[ 3.304881] [<c12c4957>] local_pci_probe+0x17/0x50
[ 3.309848] [<c12c48f3>] ? pci_match_device+0xc3/0xe0
[ 3.315148] [<c12c4b88>] pci_device_probe+0x58/0x80
[ 3.320202] [<c13fc56f>] driver_probe_device+0x6f/0x200
[ 3.325601] [<c12c48f3>] ? pci_match_device+0xc3/0xe0
[ 3.330825] [<c13fc779>] __driver_attach+0x79/0x80
[ 3.335789] [<c13fb0d8>] bus_for_each_dev+0x68/0x90
[ 3.340841] [<c13fc3f9>] driver_attach+0x19/0x20
[ 3.345630] [<c13fc700>] ? driver_probe_device+0x200/0x200
[ 3.351288] [<c13fbfef>] bus_add_driver+0x14f/0x1d0
[ 3.356342] [<c19c7631>] ? mdio_bus_init+0x38/0x38
[ 3.361308] [<c19c7631>] ? mdio_bus_init+0x38/0x38
[ 3.366272] [<c13fcae4>] driver_register+0x54/0xe0
[ 3.371242] [<c16f6d19>] ? printk+0x38/0x3a
[ 3.375598] [<c12c4c4e>] __pci_register_driver+0x2e/0x40
[ 3.381084] [<c19c768d>] igb_init_module+0x5c/0x7a
[ 3.386051] [<c10003b2>] do_one_initcall+0x72/0x190
[ 3.391105] [<c19c7631>] ? mdio_bus_init+0x38/0x38
[ 3.396081] [<c10596ab>] ? parse_args+0x1ab/0x370
[ 3.400966] [<c1072d50>] ? __wake_up+0x40/0x50
[ 3.405584] [<c198c648>] kernel_init_freeable+0x124/0x1c9
[ 3.411163] [<c198c6ed>] ? kernel_init_freeable+0x1c9/0x1c9
[ 3.416924] [<c16f54db>] kernel_init+0xb/0xe0
[ 3.421455] [<c16faac1>] ret_from_kernel_thread+0x21/0x30
[ 3.427029] [<c16f54d0>] ? rest_init+0x70/0x70
---------------------
原文:https://blog.csdn.net/subfate/article/details/52440498
-
asc怎么用 linux zip_linux怎么查看ip地址和网卡MAC地址?这个独特的命令你用过吗?...
2020-12-25 16:09:07前言不同的Linux发行版显示网卡配置信息时有不同的格式,如果我们通过shell脚本读取这些网卡信息时,可能需要较长时间编写这些脚本以满足需求.比如使用以下命令获取ip地址ifconfig | grep 'inet addr:'| grep -v '... -
命令查看网卡带宽_linux怎么查看ip地址和网卡MAC地址?独特的ifdata命令你用过吗?...
2021-01-12 04:49:37前言不同的Linux发行版显示网卡配置信息时有不同的格式,如果我们通过shell脚本读取这些网卡信息时,可能需要较长时间编写这些脚本以满足需求.比如使用以下命令获取ip地址ifconfig | grep 'inet addr:'| grep -v '... -
如何用VB获得机器的MAC地址
2004-05-02 20:58:00我有一个asp做的网站,现在想...嵌入网页后,通过asp调用读取客户端网卡mac地址,请各位前辈多多帮忙,告诉怎么做,我是一个初学者,有急用,谢谢!!!Option Explicit Public Const NCBASTAT As Long = &H33 Public C -
怎么用C语言读取WireShark捕获的数据包文件
2013-09-25 03:08:41怎么用C语言读取WireShark捕获的数据包文件,要求能分析出以太网头部,Ip头部,TCP头部,并提取出数据部分,下面是我写的一段代码,但是读的不对,希望高手指点 //.pcap文件 //#ifndef xiaohouzi //#define ... -
局域网读取文件_局域网ip地址如何显示?一个软件搞定
2021-01-14 00:03:44上次弱电行业网提到关于局域网ip地址如何显示的问题,提供了两种方法,都是通过代码实现的,...我们来简单的回顾上之前提供的两种方法:方法一、arp -a命令arp -a ,当你需要显示当前ip地址对应的mac地址时使用在命... -
openwrt 怎么进入串口_OpenWrt路由器读取串口数据,建立tcp服务
2020-12-19 22:03:49需求一:参数设置:路由器标识采用MAC地址,其他标识等多个参数是否开启串口数据转发服务,可以设置多个转发IP端口(支持内网IP和外网IP)是否开启内网IP转发服务,可以设置多个转发IP端口(支持内网IP和外网IP)可以... -
linux查看地址_linux怎么查看ip地址和网卡MAC地址?这个独特的命令你用过吗?
2021-01-30 09:38:59前言不同的Linux发行版显示网卡配置信息时有不同的格式,如果我们通过shell脚本读取这些网卡信息时,可能需要较长时间编写这些脚本以满足需求.比如使用以下命令获取ip地址ifconfig | grep 'inet addr:'| grep -v '... -
Mac上解决Chrome浏览器跨域问题
2020-06-24 19:00:01今天在用jQuery读取本地的json文件的时候发现出现跨域问题,百度了一下,发现可能是Chrome的安全策略导致的,需要在后台设置一下。 跨域问题报错 怎么解决 第一步:我们需要先建立一个文件夹 第二步:打开终端,... -
MFC读取文件、处理数据优化问题,处理数据时速度太慢????????
2016-08-11 03:11:52//MAC地址处理代码 CStdioFile file; int i; CString str1,strd; file.Open("F:\\h1.txt",CFile::modeRead); //h1.txt是串口接收到的MAC地址数据包文件 for(i=0;file.ReadString(str1);i++) { str1.... -
h3c交换机 查看二层交换机端口ip_你知道怎么区分一层/二层/三层交换机?
2020-12-08 15:26:32具体的工作流程如下:(1) 当交换机从某个端口收到一个数据包,它先读取包头中的源MAC地址,这样它就知道源MAC地址的机器是连在哪个端口上的;(2) 再去读 取包头中的目的MAC地址,并在地址表中查找相应的端口... -
java socket 读取为空_JAVA服务端 Socket接收iOS发送的报文为空字符串?
2021-02-28 18:41:21原问题问题是这样呢我和iOS两个人在本地调试的时候,我直接运行java项目,然后让他直接连接我的IP地址、相应端口号,这时候能够正常的接收到iOS客户端发送的数据,一切正常。诡异的事情来了。。。将这个代码打包成.... -
怎么实现跨浏览器共享数据(cookie,storage都不能跨浏览器)
2019-09-19 15:01:041. java服务端获取公网MAC地址(局域网可以,公网获取不到) 2. js获取本地mac地址(非IE获取不到) 3. js读写本地文件() 4. 跨浏览器共享cookie(经测试cookie,storage都不能跨) 5. 网页镶嵌swf,用flash shared ... -
“专家坐诊”第54期问答汇总
2020-04-09 15:52:52Q:{INVENTORY.MACADDRESS.A}宏使用不了?...A:https://blog.csdn.net/zhangxueleishamo/article/details/94400572 建议通过传入的IP地址,从数据的资产表中读取mac地址 Q:我试试,谢谢 Q:你好老师 这... -
MFC中for循环查找字符串并输出问题,
2016-08-09 08:31:20strd+="数据包开始,包含"+str1.Mid(2,str1.Find('%')-2)+"个MAC地址:"; strd+="\r\n"; } else if(str1.Find('@')>=0) { strd+="数据包结束!"; strd+="\r\n"; } else { CStdioFile ... -
多种网络协议
2011-02-28 11:35:531:冲突域:同一网段的计算机同时竞争同一条带宽是就会造成冲突域 2:广播域:接受同样广播消息的节点集合...答:交换机把所读取到的数据帧的源地址和记录帧添加到所转发的数据库或MAC地址表中,地址是动态学习的、... -
整理andlik wifi开关控制 、整理andlink 设备上行状态信息查询
2020-11-29 21:28:35通过阅读此,可以了解到怎么获取上联设备的mac地址、上联网口接口(根据网络工作判断)、如果是无线中继怎么获取上联的ssid和密码、wifi工作信道、读取速率、读取噪声和信噪比、读取信号强度等等。 ... -
【转】VC 之获取硬盘序列号
2013-04-07 13:27:00上一回,一帆风给大家讲了讲如何读取计算机的MAC地址,这次聊聊怎么获取硬盘序列号。硬盘物理序列号是硬盘的出厂序列号,它是全球都是唯一的,不会随着系统的安装、硬盘的格式化等操作而改变,跟mac地址一样都具有... -
C语言多线程的应用--局域网中多台计算机对同一文件读写
2016-05-26 09:58:00项目背景:生产制造型公司有多台生产测试设备同时运行,测试中产品错误代码记录在本地,现在需要将多台设备测试过程中出现的产品错误代码保存在...代码功能:将本机MAC地址保存在.txt文件中供读取,因为设备是按MAC地址 -
协议簇:Ethernet Address Resolution Protocol (ARP) 解析
2020-02-22 16:39:48对于源地址很容易理解,该地址可以直接从硬件上读取. 但是对于一个网络节点,他怎么知道一个 Frame 的目的物理地址呢? 本文我们将学习 ARP 协议来解答这个问题. ARP 协议主要用来完成将网络层协议的地址(比如,IP ... -
Dotnet B/S 架构学习笔记_02(2008-10-06)
2008-10-06 23:07:00今天在以前公司同事李副总的大力支持和协助下,终于把B/S框架跑了起来。再次谢谢李副总,谢谢李副总的父母,谢谢党培养了这么... 今天知道了怎么通过JavaScript脚本在客户端进行读取客户机的mac地址。 在客户端读取m -
安卓蓝牙,BluetoothAdapter.getRemoteDevice()报错
2016-08-17 09:09:53//当点击了设备列表后返回所指向设备的MAC地址,根据此MAC进行主动连接 if (resultCode == Activity.RESULT_OK) { String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); ... -
2.3.5 以下对MAC地址描述正确的是? 2.3.6 以下属于数据链路层功能的是? 2.3.7 IEEE802.3u标准是指? 2.3.8 如果要将两计算机通过双绞线直接连接,正确的线序是? 2.3.9 在V.35和V.24规程中,控制信号RTS表示?...
-
Google Android开发入门与实战(09年度畅销榜TOP50)--详细书签版
2013-02-08 12:00:478.5.2 使用ContentProvider读取系统数据 156 8.5.3 使用ContentProvider操作数据日记本实例 159 8.6 再学一招——网络存储 171 8.7 本章小结 173 第9章 我来“广播”你的“意图”——Intent和Broadcast面对面 ... -
Python读取文件以及读取大文件 gensim之Word2vec使用 心得:多动手,别只看 机器学习及深度学习篇 机器学习网站及教程 机器学习入门教程与实例-SofaSofa scikit-learn: Python 中的机器学习 — scikit-learn...
-
新版Android开发教程.rar
2010-12-14 15:49:11o Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows o Not Not Not Not compatible with Gnu Compiler for Java (gcj) Note: Note: Note: Note: If JDK is already installed on your ...