如何在 ESP32 上的 MicroPython 中检索和格式化 wifi MAC 地址?

Dav*_* H. 5 micropython esp32

我在 ESP32 上运行以下 MicroPython 代码:

import network

wlan_sta = network.WLAN(network.STA_IF)
wlan_sta.active(True)

wlan_mac = wlan_sta.config('mac')
print("MAC Address:", wlan_mac)  # Show MAC for peering
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

MAC Address: b'0\xae\xa4z\xa7$'
Run Code Online (Sandbox Code Playgroud)

我想以更熟悉的六对十六进制数字的格式显示它,如下所示:

MAC Address: AABBCC112233
Run Code Online (Sandbox Code Playgroud)

在网上搜索解决方案后,我尝试过:

print("MAC Address:", str(wlan_mac))但它的显示与不使用 str() 时相同

print("MAC Address:", hex(wlan_mac))但它会导致 TypeError: can't conversion bytes to int

print("MAC Address:", wlan_mac.hex())但它说 AttributeError: 'bytes' 对象没有属性 'hex'

我也对从 检索到的字节有点怀疑wlan_sta.config('mac')。我本来希望看到一些看起来更像的东西,b'\xaa\xbb\xcc\x11\x22\x33'而不是b'0\xae\xa4z\xa7$'。z 和 $ 对于应该是十六进制的东西来说似乎非常不合适,并且对于应该是六对数字的东西来说似乎太短了。

所以我的问题有两个:

  1. 我是否使用了正确的方法来获取 MAC 地址?
  2. 如果正确,如何将其格式化为六对十六进制数字?

lar*_*sks 12

我也对从 wlan_sta.config('mac') 检索到的字节有点怀疑。我本来期望看起来更像 b'\xaa\xbb\xcc\x11\x22\x33' 而不是 b'0\xae\xa4z\xa7$'。z 和 $ 对于应该是十六进制的东西来说似乎非常不合适,并且对于应该是六对数字的东西来说似乎太短了。

你没有得到一个十六进制字符串,你得到的是一个字节字符串。因此,如果 MAC 地址包含值7A,则字节字符串将包含z(其 ASCII 值是 122(十六进制7A))。


我是否使用了正确的方法来获取 MAC 地址?

你是!

如果正确,如何将其格式化为六对十六进制数字?

如果要将 MAC 地址打印为十六进制字符串,可以使用以下 ubinascii.hexlify方法:

>>> import ubinascii
>>> import network
>>> wlan_sta = network.WLAN(network.STA_IF)
>>> wlan_sta.active(True)
>>> wlan_mac = wlan_sta.config('mac')
>>> print(ubinascii.hexlify(wlan_mac).decode())
30aea47aa724
Run Code Online (Sandbox Code Playgroud)

或者可能:

>>> print(ubinascii.hexlify(wlan_mac).decode().upper())
30AEA47AA724
Run Code Online (Sandbox Code Playgroud)

  • 还发现 `hexlify()` 采用分隔符参数,因此 `hex_mac = hexlify(wlan_mac, ':').decode().upper()` 可用于使用熟悉的冒号分隔符打印 MAC,如下所示: 30 :AE:A4:7A:A7:24 虽然不是我原来问题的一部分,但我想我会为后来找到这个答案并想知道如何做的人添加它。 (6认同)