รหัสฮาร์ดแวร์ Raspberry Pi


22

มีความเป็นไปได้ในการจัดเก็บ ID ฮาร์ดแวร์สำหรับอุปกรณ์ที่ใช้ Raspberry Pi หรือไม่?

สมมติว่าฉันมี 10 อุปกรณ์ที่กำหนดเองตามแพลตฟอร์ม Raspberry Pi ที่ใช้สำหรับงานกระจาย ณ จุดหนึ่งด้วยเหตุผลบางอย่างฉันต้องการลบทุกอย่างจากหนึ่งในนั้น ฉันจะระบุกระดานหลังจากนั้นได้อย่างไร

Pi มีชิปที่เก็บ ID เฉพาะเช่นหมายเลขสำหรับทุกบอร์ดหรือไม่ ถ้าไม่ฉันสามารถเพิ่มหน่วยความจำ (อ่านอย่างเดียว) (ที่สามารถจัดเก็บค่าอย่างง่ายแม้ไม่ได้ใช้พลังงาน) เพื่อให้สามารถสื่อสารกับมันผ่าน GPIO ได้ตลอดเวลา?

ทางเลือกคืออะไร?


โปรดอย่าถามคำถามจากนั้นบนพื้นฐานของคำตอบตัดสินใจว่าคุณต้องการถามจริงๆหรือมีคำถามอื่น นี่เป็นการเสียเวลาของคนที่คุณขอความช่วยเหลือ ด้วยเหตุนี้ฉันจึงย้อนการแก้ไขของคุณกลับมา หากคุณมีคำถามอื่นให้ถามคำถามอื่น
goldilocks

@goldilocks: คุณถูกต้อง ฉันควรแยกคำถามนี้เป็นสองข้อ
Alexandru Irimiea

แล้วเรื่อง 'ZERO' ล่ะ? ไม่มีที่อยู่ MAC ที่นี่ ... รหัสที่ไม่ซ้ำอื่น ๆ
fcm

คำตอบ:


23

ใช่แต่ละบอร์ดมีหมายเลขประจำเครื่อง วิธีการในการดึงข้อมูลได้อธิบายไว้ที่นี่: ฉันจะรับหมายเลขซีเรียลได้อย่างไร


นี่ไม่ใช่คำตอบที่สมบูรณ์เพราะมันเกี่ยวข้องกับ linux เท่านั้นและไม่ได้กล่าวถึงหน้าต่างเลย มันจะน่าสนใจที่จะรู้วิธีนี้บนหน้าต่างด้วย
Andrew Savinykh

@Savinykh ... linux และ Mac OS Awk, grep และ cut เป็นเครื่องมือที่มีอยู่ในทั้งสองระบบปฏิบัติการ แต่ฉันยอมรับว่า Windows ไม่ได้ใช้งานเพราะมันขาดเครื่องมือบรรทัดคำสั่งที่ใช้งานง่ายเหล่านี้
ripat

9
คุณไม่สามารถเรียกใช้ Mac OS บน Pi ดังนั้นจึงไม่เกี่ยวข้อง คุณสามารถเรียกใช้ Win10 IOT edition แบบไร้หัวบน Pi I เชื่อ 99% ของผู้ใช้ Pi ใช้ Linux
pjc50

@ripat คุณสามารถรัน Mac OS บน raspberry pi ได้ไหม? ฉันสงสัยอย่างใด
Andrew Savinykh

6

นี่คือการใช้ที่ง่ายกว่า: ที่อยู่ MAC ผ่านการกำหนดค่าอัตโนมัติ IPv6 NDP นี่เป็นวิธีการทั่วไปที่ใช้กับส่วนต่อประสานเครือข่ายใด ๆ

ทุก NIC รวมทั้ง USB ที่ใช้ใน Pi, มี 48 บิตที่อยู่ MAC 14:cf:92:20:26:3cยกตัวอย่างเช่น

ที่อยู่ MAC 48 บิตทุกตัวมีการแมปแบบหนึ่งต่อหนึ่งที่ไม่ซ้ำกับที่อยู่ EUI-64 โดยปิดสองบิตสุดท้ายในไบต์ที่สาม ( 92ถึง90) และแทรกไบต์feffระหว่างไบต์ที่สามและสี่ ดังกล่าวข้างต้น 48 บิต MAC สามารถแมปไป 14cf:90fe:ff20:263cEUI-64:

กระบวนการกำหนดค่าอัตโนมัติของที่อยู่ IPv6 ใช้โปรโตคอล NDP เพื่อค้นหาที่อยู่เครือข่าย 64 บิตในที่อยู่ 128- บิต กระบวนการนี้จะให้อุปกรณ์ทั้งหมดของคุณภายในเครือข่ายเดียวกันมีคำนำหน้า 64 บิตเหมือนกัน EUI-64 ดังกล่าวถูกใช้เพื่อเติมที่อยู่สถานี 64- บิตทำให้เกิดที่อยู่ IPv6 ที่ไม่ซ้ำกันทั่วโลก 128 บิต ดังนั้นถ้าคุณมีคำนำหน้าเครือข่าย IPv6 2001:470:d:472::/64, 2001:470:d:472:14cf:90fe:ff20:263cการ์ดเครือข่ายดังกล่าวเมื่อใช้ในเครือข่ายนี้จะได้รับการรับประกันว่าจะมีที่อยู่ ตราบใดที่เครื่องมือการจัดการของคุณได้รับการกำหนดค่าให้ใช้ IPv6 เพียงแค่เสียบที่อยู่นี้ลงไปและควรจะไปได้เลย


นี่เป็นวิธีที่ดีกว่าในการตอบคำถามนี้ในความคิดของฉัน MAC เป็นเอกลักษณ์ คุณสามารถแฮชนิดหน่อยถ้าคุณต้องการ แต่เพียงพึ่งที่อยู่ MAC สามารถทำได้ในทุกแพลตฟอร์ม
Havnar

@Havnar ดีกว่านี้แปลที่อยู่ MAC โดยตรงไปยังที่อยู่ IPv6 ที่กำหนดเส้นทางได้ทั่วโลกที่สามารถใช้ในการส่งแพ็คเก็ตไปยัง Pi โดยตรง ที่นี่)
Maxthon Chan

ฉันไม่รู้ว่ามีหลายคนที่ใช้ ipv6 ที่บ้านหรือในการผลิตจริง ๆ
Havnar

@Havnar ฉันปรับใช้อุโมงค์ IPv6 ในเครือข่ายในบ้านของฉันจนถึงจุดที่อุปกรณ์ทั้งหมดในบ้านยกเว้นตัวเราเตอร์เองสามารถทำงานได้หากไม่เปิดใช้งาน IPv4
Maxthon Chan

5

เช่นเดียวกับคำตอบอื่น ๆ Pi มี 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

แม้ว่าแน่นอนว่า As และ Zeros โดยไม่ต้องเชื่อมต่ออีเธอร์เน็ตจะไม่มี MAC จากการใช้! อแด็ปเตอร์ WiFi จะใช้ แต่การย้ายอแด็ปเตอร์ระหว่าง Pis จะหมายความว่า ID ที่ไม่ซ้ำกันจะตามหลังอะแดปเตอร์!
SlySven

@SlySven ฉันยังไม่มี Zero (และยังไม่สามารถคิดเหตุผลที่ถูกต้องได้) แต่ฉันควรแก้ไขสคริปต์เพื่อไม่สนใจ MAC ที่ขาดหายไป ฉันคิดว่าจะไม่มี/sys/class/net/eth0/address
Milliways

วิธีการระบุใด ๆ Pi กับ ID ที่ไม่ซ้ำกันก็คือการได้รับ dbus ของเครื่อง-ID ที่ไม่ได้เชื่อมต่อขึ้นอยู่กับcat /var/lib/dbus/machine-id การอ่านมากขึ้น
ripat

... ลืมให้เครดิตลิงก์ "อ่านเพิ่มเติม" ในความคิดเห็นของฉันด้านบนเพื่อผู้เขียน: Lennart Poettering พ่อของ systemd
ripat

2

หากไม่มี ID (ซึ่งจะมีให้ดูที่คำตอบของ Ralph ) ทางเลือกอาจเป็นชิปอนุกรม I2C สิ่งเหล่านี้ง่ายต่อการเชื่อมต่อ (อินเตอร์เฟสแบบอนุกรม) และระบุหมายเลขที่ไม่ซ้ำกัน

ตัวอย่างบางส่วน:

  • หมายเลขซีเรียลI²C / SMBus ซิลิคอนของ Maxim เช่น DS2401, DS28CM00
  • ผลิตภัณฑ์ชิป ID เฉพาะของ Microchip เช่น 24AA02UID, 24AA025UID
  • I²C EEPROM ที่ตั้งโปรแกรมเอง

อาจใช้เพียงชิปเซ็ต I2C EEPROM แบบซ็อกเก็ตและตั้งรหัสเฉพาะลงในนั้น AT24C32 ค่อนข้างถูกเมื่อซื้อเป็นกลุ่ม
Maxthon Chan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.