Raspberry Pi硬件ID


22

是否可以为每个基于Raspberry Pi的设备存储硬件ID?

假设我有10个基于Raspberry Pi平台的自定义设备,用于分布式任务。在某种程度上,出于某种原因,我想删除其中之一。之后,我如何重新确定董事会?

Pi是否有芯片来存储每个板的唯一ID(如序列号)?如果没有,我是否可以添加一个(只读的)内存(即使不上电也可以存储一个简单的值),以便可以随时通过GPIO与之通信?

有哪些选择?


请不要问任何问题,然后根据答案确定您确实要问的问题,或有其他问题。这浪费了您寻求帮助的人的时间。因此,我已将您的编辑回滚。如果您还有其他问题,请问其他问题。
goldilocks

@goldilocks:你是正确的。我应该把这个问题一分为二。
Alexandru Irimiea

那“零”呢?这里没有MAC地址...还有其他唯一ID吗?
fcm

Answers:


23

是的,每个板都有序列号。此处描述了检索方法: 如何获得序列号?


这不是一个完整的答案,因为它仅适用于linux,根本不提及Windows。知道如何在Windows上这样做也很有趣。
Andrew Savinykh

@Savinykh ... Linux Mac OS。Awk,grep和cut是两种操作系统上都可以使用的工具,但是我同意Windows被忽略了,因为它缺少这些方便的命令行工具。
ripat '16

9
您无法在Pi上运行Mac OS,所以这无关紧要。我相信您只能在Pi上运行无头Win10 IOT版本。实际上,有99%的Pi用户使用Linux。
pjc50 '16

@ripat,虽然可以在树莓派上运行Mac OS吗?我以某种方式怀疑它。
Andrew Savinykh

6

这是一个更易于使用的方法:通过IPv6 NDP自动配置的MAC地址。这是适用于任何网络接口的通用方法。

每个NIC(包括Pi上使用的USB NIC)都有一个48位MAC地址,例如14:cf:92:20:26:3c

每个48位MAC地址通过屏蔽第三个字节(92to 90)的最后两位并将字节插入feff第三个和第四个字节之间,具有唯一的一对一映射到EUI-64地址。上述48位MAC可以被映射到EUI-64: 14cf:90fe:ff20:263c

IPv6地址自动配置过程使用NDP协议在128位地址中发现64位网络地址。此过程将为同一网络中的所有设备提供相同的64位前缀。前面提到的EUI-64用于填充64位站地址,从而生成128位全局唯一的IPv6地址。因此,如果您具有IPv6网络前缀2001:470:d:472::/64,则上述的网卡在该网络中使用时,将被保证具有IPv6全局可路由地址2001:470:d:472:14cf:90fe:ff20:263c。只要将您的管理工具配置为使用IPv6,只需将此地址插入其中,就可以了。


我认为这是回答这个问题的更好方法。MAC是唯一的。您可以根据需要对其进行哈希处理,但是在任何平台上都可以依靠MAC地址。
哈夫纳

@Havnar更好的是,它可以将MAC地址直接转换为全局可路由的IPv6地址,该地址可用于直接向Pi发送数据包(任何应用层协议,只要它能在大多数IPv6上工作即可)此处)
Maxthon Chan

我不知道实际上有很多人在家中或在生产中实际使用ipv6。
哈夫纳

@Havnar我已经在家庭网络中部署了IPv6隧道,以至于我家庭中的所有设备(路由器本身除外)都可以在不启用IPv4的情况下运行。
Maxthon Chan

5

与其他答案一样,Pi具有唯一的ID,该ID与MAC有关。

在实践中,使网络具有唯一性更为方便hostname。我使用以下脚本基于来设置名称CPUID

#!/bin/bash
# script to set Pi hostname based on MAC (or Serial number)
# 2017-08-18
# This script should be run as root (or with sudo) to change names
# If run by a user it will report changes, but will NOT implement them
# Works for PiB (all models), Pi2, Pi3, PiZeroW with on board networking
# PiA models will set a unique Name based on Serial number

PDIR="$(dirname "$0")"  # directory containing script
CURRENT_HOSTNAME=$(cat /etc/hostname)
# Find MAC of eth0, or if not exist wlan0
if [ -e /sys/class/net/eth0 ]; then
    MAC=$(cat /sys/class/net/eth0/address)
elif [ -e /sys/class/net/enx* ]; then
    MAC=$(cat /sys/class/net/enx*/address)
else
    MAC=$(cat /sys/class/net/wlan0/address)
fi

# NOTE the last 6 bytes of MAC and CPUID are identical
CPUID=$(awk '/Serial/ {print $3}' /proc/cpuinfo | sed 's/^0*//')
echo "Current Name" $CURRENT_HOSTNAME
echo "MAC" $MAC
# If you want to specify hostnames create a file PiNames.txt with MAC hostname list e.g.
# b8:27:eb:01:02:03 MyPi
# If not found a unique Name based on Serial number will be set
NEW_HOSTNAME=$(awk /$MAC/' {print $2}' $PDIR"/PiNames.txt")
echo "Name found" $NEW_HOSTNAME
if [ $NEW_HOSTNAME == "" ]; then
    NEW_HOSTNAME="pi"$CPUID
fi

if [ $NEW_HOSTNAME = $CURRENT_HOSTNAME ]; then
    echo "Name already set"
else
    echo "Setting Name" $NEW_HOSTNAME
    echo $NEW_HOSTNAME > /etc/hostname
    sed -i "/127.0.1.1/s/$CURRENT_HOSTNAME/$NEW_HOSTNAME/" /etc/hosts
fi

但是,当然,如果没有以太网连接,则“ 0”和“ 0”将没有MAC地址!可以使用WiFi适配器,但是在Pis之间移动适配器意味着唯一的ID将跟随适配器!
SlySven

@SlySven我没有零(并且还没有想到任何有效的原因),但是我应该修改脚本以忽略丢失的MAC。我认为不会有/sys/class/net/eth0/address
Milliways

识别具有唯一ID的任何Pi的另一种方法是获取不依赖于接口的dbus机器ID,以了解cat /var/lib/dbus/machine-id 更多信息
ripat

...忘记将我在上面的评论中的“阅读更多”链接归功于其作者:systemd之父Lennart Poettering。
ripat

2

如果它没有ID(看起来像Ralph的答案一样),则可以选择I2C序列号芯片。它们非常易于连接(串行接口)并提供唯一的序列号。

一些例子:

  • Maxim的I²C/ SMBus硅序列号,例如DS2401,DS28CM00
  • Microchip独特的ID芯片产品,例如24AA02UID,24AA025UID
  • 自编程I²CEEPROM

也可以只使用带插槽的I2C EEPROM芯片,并在其中编程一个唯一的ID。批量购买时,AT24C32相当便宜。
Maxthon Chan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.