ID оборудования Raspberry Pi

22

Есть ли возможность хранить аппаратный идентификатор для каждого устройства на базе Raspberry Pi?

Допустим, у меня есть 10 пользовательских устройств на платформе Raspberry Pi, которые используются для распределенных задач. В какой-то момент, по какой-то причине, я хочу стереть все с одного из них. Как я могу повторно идентифицировать доску после этого?

Есть ли у Pi чип, в котором хранится уникальный идентификатор, например, серийный номер для каждой платы? Если нет, могу ли я добавить (только для чтения) память (которая может хранить простое значение, даже если он не включен), чтобы иметь возможность общаться с ним через GPIO в любое время?

Какие есть альтернативы?

Александру Иримея
источник
Пожалуйста, не задавайте вопрос, затем на основании ответа решите, что вы действительно хотели задать или задать другой вопрос. Это тратит время людей, которых вы просите о помощи. По этой причине я откатил ваше редактирование обратно. Если у вас есть другой вопрос, задайте другой вопрос.
Златовласка
@goldilocks: Вы правы. Я должен был разделить этот вопрос на две части.
Александру Иримея
А как насчет «нуля»? здесь нет MAC-адреса ... любой другой уникальный идентификатор?
fcm

Ответы:

23

Да, у каждой доски есть серийный номер. Методы для получения этого описаны здесь: Как я могу получить серийный номер?

Ральф
источник
Это не полный ответ, так как он касается только Linux и вообще не упоминает о Windows. Было бы интересно узнать, как это сделать на окнах тоже.
Андрей Савиных
@ Савиных ... Linux и Mac OS. Awk, grep и cut - инструменты, доступные в обеих ОС, но я согласен, что Windows не используется, поскольку в ней отсутствуют эти удобные инструменты командной строки.
Рипат
9
Вы не можете запустить Mac OS на Pi, так что это не актуально. Вы можете запустить только версию Win10 IOT Win10 на Pi, я верю. Реально 99% пользователей Pi используют Linux.
pjc50
@ripat, вы можете запустить Mac OS на Raspberry Pi? Я как-то сомневаюсь в этом.
Андрей Савиных,
6

Здесь проще в использовании: MAC-адрес через автоматическую настройку IPv6 NDP. Это универсальный метод, который применим к любому сетевому интерфейсу.

Каждый сетевой адаптер, включая USB, используемый на Pi, имеет, например, 48-битный MAC-адрес 14:cf:92:20:26:3c.

Каждый 48-битный MAC-адрес имеет уникальное взаимно-однозначное сопоставление с адресом EUI-64, маскируя последние два бита в третьем байте ( 92to 90) и вставляя байты feffмежду третьим и четвертым байтом. Выше 48-битные МАС могут быть отображены в EUI-64: 14cf:90fe:ff20:263c.

Процесс автоматической настройки адреса IPv6 использует протокол NDP для обнаружения 64-разрядного сетевого адреса в 128-разрядном адресе. Этот процесс даст всем вашим устройствам в одной сети одинаковый 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 имеет уникальный идентификатор, который связан с 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
Milliways
источник
Хотя, конечно, As и Zeros без подключения к Ethernet не будут иметь MAC для использования! Адаптер WiFi будет, но перемещение адаптера между Pis будет означать, что уникальный идентификатор будет следовать за адаптером!
SlySven
@SlySven У меня нет нуля (и я пока не могу придумать какой-либо веской причины), но я должен изменить свой скрипт, чтобы игнорировать отсутствующий MAC. Я предполагаю, что не будет/sys/class/net/eth0/address
Milliways
Другой способ идентифицировать любой Pi с уникальным идентификатором - получить его идентификатор машины dbus, который не зависит от интерфейса. cat /var/lib/dbus/machine-id Читать далее
ripat
... забыл приписать ссылку "читать дальше" в моем комментарии выше его автору: Леннарту Поеттерингу, отцу systemd.
Рипат
2

Если у него не будет идентификатора (который, как может показаться, см . Ответ Ральфа ), альтернативой может быть чип серийного номера I2C. Они действительно просты в подключении (последовательный интерфейс) и предоставляют уникальный серийный номер.

Некоторые примеры:

  • Серийный номер Maxim I²C / SMBus Silicon, например, DS2401, DS28CM00
  • Микрочипы с уникальным идентификатором, например, 24AA02UID, 24AA025UID
  • самопрограммируемая I2C EEPROM
Ганима
источник
Можно также использовать микросхему E2PEP с сокетом I2C и запрограммировать в нее уникальный идентификатор. AT24C32 довольно дешево, когда покупается оптом.
Maxthon Chan