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

Хотя, конечно, 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.