- A2DP
- การเตรียม Raspberry Pi สำหรับการตั้งค่า Headless
- ข้อกำหนดเบื้องต้นที่ต้องติดตั้งใน Raspberry Pi
- การจับคู่อุปกรณ์ Bluetooth กับ Raspberry Pi
- ทำให้กระบวนการจับคู่บลูทู ธ โดยอัตโนมัติด้วยสคริปต์ Python
- ทริกเกอร์สคริปต์การจับคู่บลูทู ธ ด้วยปุ่ม
- แผนภูมิวงจรรวม
- ตั้งค่างาน Cron เพื่อเริ่มโปรแกรม Bluetooth Speaker Python ใน Boot
Raspberry Pi เป็นคอมพิวเตอร์ขนาดเท่าฝ่ามือที่มีบลูทู ธ Wi-Fi พอร์ตอีเธอร์เน็ตพอร์ตกล้องและอื่น ๆ ในตัวซึ่งทำให้เป็นไมโครคอนโทรลเลอร์ที่เหมาะสมที่สุดสำหรับแอปพลิเคชันฝังตัวที่ใช้ IoT นอกจากนี้ยังใช้ในการสร้างเซิร์ฟเวอร์หลายชนิดเช่นเซิร์ฟเวอร์การพิมพ์เซิร์ฟเวอร์สื่อเซิร์ฟเวอร์เว็บเป็นต้นวันนี้เราจะมาเรียนรู้ว่า Raspberry Pi สามารถแปลงลำโพงธรรมดาที่มีแจ็ค 3.5 มม. เป็นลำโพงบลูทู ธ ไร้สายได้อย่างไร
ในโพสต์นี้เราจะสร้างลำโพง Bluetooth ที่ใช้ Raspberry Piโดยหลอมรวมพลังของ A2DP, Linux และตัวแปลงสัญญาณเสียงเพื่อสตรีมแพ็กเก็ตข้อมูลจากแหล่งเสียงไปยังอ่างเสียงแบบไร้สาย ในการทำเช่นนั้นเราจะแฮ็คระบบ Linux เล็กน้อยและเขียนโค้ดใน bash และ python และเราจะดำเนินธุรกิจ
A2DP
A2DP เป็นตัวย่อของเสียงขั้นสูงรายละเอียดการจัดจำหน่ายนี่คือโปรโตคอลที่มีอยู่ในอุปกรณ์ที่ใช้ Bluetooth เกือบทั้งหมด เป็นการปูทางสำหรับการส่งข้อมูลเสียงจากอุปกรณ์เครื่องหนึ่งไปยังอีกเครื่องหนึ่งหากทั้งสองเชื่อมต่อกันผ่านบลูทู ธ A2dp ใช้อัลกอริธึมการบีบอัดแบบไม่สูญเสียในการบีบอัดแพ็กเก็ตเสียงก่อนที่จะส่งเพื่อลดเวลาแฝง แต่การสูญเสียเนื่องจากการบีบอัดนี้แทบจะไม่สามารถรับรู้ได้จากหูของมนุษย์
การเตรียม Raspberry Pi สำหรับการตั้งค่า Headless
สำหรับการแปลง Raspberry Pi เป็นลำโพงไร้สายก่อนอื่นให้ติดตั้ง OS (Raspbian Stretch) ลงในการ์ด Raspberry PI SD หากคุณยังใหม่กับ Raspberry Pi ให้ทำตามบทความนี้เพื่อเริ่มต้นกับ Raspberry Pi
พวกเราส่วนใหญ่เป็นเจ้าของ Raspberry Pi และแล็ปท็อป แต่ไม่มีจอภาพ แต่ในการที่จะ SSH ลงใน Raspberry Pi เราต้องการให้สิ่งเดียวกันเชื่อมต่อในเครือข่ายเดียวกันกับที่คอมพิวเตอร์ของเราเชื่อมต่อ เราต้องการจอภาพที่เชื่อมต่อกับ Pi ซึ่งเราสามารถเลือก Wi-Fi และเชื่อมต่อได้หรือไม่?
จริงๆแล้วเราไม่ได้ Raspberry Pi สามารถเชื่อมต่อกับ Wi-Fi ได้โดยเพิ่มรายการในไฟล์ชื่อ wpa_supplicant.conf
ในการดำเนินการดังกล่าวให้เชื่อมต่อการ์ด SD กับคอมพิวเตอร์และเปิดไฟล์ rootfs / etc / wpa_supplicant / wpa_supplicant.conf และเพิ่มรายการต่อไปนี้ให้เหมือนเดิม อย่าลืมเปิดไฟล์ด้วยสิทธิ์ของผู้ดูแลระบบ (root)
เครือข่าย = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
รายการควรมีลักษณะคล้ายกันนี้
รายการข้างต้นควรทำให้เราเชื่อมต่อกับ Wi-Fi แต่นั่นไม่เพียงพอที่จะสร้างและรักษาการเชื่อมต่อ SSH ระหว่าง Raspberry Pi และคอมพิวเตอร์ โดยค่าเริ่มต้น SSH ถูกปิดใช้งานใน Raspberry Pi ดังนั้นหากต้องการเปิดใช้งานให้สร้างไฟล์ว่างชื่อsshในไดเร็กทอรีสำหรับบูต
ตอนนี้ Raspberry Pi เปิดใช้งานทางเทคนิคเพื่อเข้าถึงจากระยะไกล เชื่อมต่อ raspberry pi เข้ากับแหล่งจ่ายไฟ ตอนนี้ pi จะเชื่อมต่อกับ Wi-Fi โดยอัตโนมัติ แต่จำเป็นต้องมีที่อยู่ IP เพื่อที่จะ SSH เข้าไป มีหลายวิธีในการค้นหาเหมือนกัน ฉันใช้คำสั่งnmap
nmap -sn / 24
คำสั่งนี้จะให้ที่อยู่ IP ของอุปกรณ์ทั้งหมดที่เชื่อมต่อในเครือข่ายของเรา ตัวอย่างเช่น,
หนึ่งในนั้นคือราสเบอร์รี่ปี่ ตอนนี้เรารู้ที่อยู่ IP ของ pi แล้วให้เราเชื่อมต่อกับมัน
ssh pi @ pi_ip_address
นอกจากนี้ยังมีวิธีอื่น ๆ ในการเริ่มต้นด้วย Raspberry Pi โดยไม่ต้องหัวให้ตรวจสอบลิงก์เพื่อเรียนรู้สิ่งเดียวกัน
ข้อกำหนดเบื้องต้นที่ต้องติดตั้งใน Raspberry Pi
BlueZ
BlueZ เป็นแอปพลิเคชั่นเริ่มต้นที่มาพร้อมกับ Raspbian distro ใช้เพื่อเข้าถึงการควบคุมบลูทู ธ ของระบบ นอกจากนี้ยังสามารถติดตั้งได้ในกรณีที่คุณไม่มีใน pi ด้วยเหตุผลเดียวที่คุณอาจรู้
คำสั่งด้านล่างรับแอปพลิเคชั่นอินเทอร์เฟซ Bluetooth ที่ติดตั้งใน pi ของเรา
apt-get ติดตั้ง bluez
PulseAudio
Pulse Audio เป็นแอพพลิเคชั่นที่แปลงไบต์ของข้อมูลคอมพิวเตอร์เป็นการรับรู้ของมนุษย์ เรียกอีกอย่างว่าเป็นเครื่องเล่นเพลง โปรโตคอล A2DP มีอยู่ในปลั๊กอินแอปพลิเคชัน PulseAudio ดังนั้นให้เราติดตั้งแอพพลิเคชั่นที่เกี่ยวข้องกับเสียงพัลส์โดยใช้คำสั่งด้านล่าง:
apt-get ติดตั้ง pulseaudio- *.
การจับคู่อุปกรณ์ Bluetooth กับ Raspberry Pi
เปิดแอปพลิเคชัน BlueZ โดยใช้คำสั่ง
bluetoothctl
ตัวแทนบลูทู ธเป็นโบรกเกอร์ที่การเจรจาระหว่างสองบลูทู ธ ที่เปิดใช้งานอุปกรณ์และเริ่มต้นการเชื่อมต่อระหว่างพวกเขา ตัวแทนบลูทู ธ มีหลายประเภท ตัวที่เราจะใช้คือ NoInputNoOutput agent เพราะมันช่วยให้เราเชื่อมต่อได้โดยไม่ต้องมีการแทรกแซงของผู้ใช้ ดังนั้นให้เราเตรียมใช้งานเอเจนต์โดยรันคำสั่งต่อไปนี้
ตัวแทน NoInputNoOutput
คุณควรได้รับข้อความ " ลงทะเบียนตัวแทน " เป็นคำตอบ ตอนนี้เรามีตัวแทนของเราที่ลงทะเบียนให้เราทำให้มันเป็นหนึ่งเริ่มต้น
default-agent
ซึ่งการตอบกลับควรเป็น "คำขอตัวแทนเริ่มต้นสำเร็จ"
ตอนนี้ให้เราทำให้อุปกรณ์ของเราสามารถค้นพบได้
ค้นพบได้ใน
ซึ่งคำตอบควรเป็น "การเปลี่ยนแปลงที่ค้นพบได้เมื่อสำเร็จ"
ตอนนี้ลองเชื่อมต่อโทรศัพท์มือถือหรือคอมพิวเตอร์ของคุณกับ Raspberry Pi
แอปพลิเคชันจะแจ้งให้เราอนุญาตบริการและเราไม่จำเป็นต้องดำเนินการดังกล่าว แต่เราจะเชื่อถืออุปกรณ์และเชื่อมต่อแทน การไว้วางใจอุปกรณ์เป็นสิ่งสำคัญมากเพราะเมื่ออุปกรณ์ที่เชื่อถือได้พยายามเชื่อมต่อกับ pi อุปกรณ์นั้นจะอนุญาตให้ใช้สิ่งเดียวกันโดยไม่มีการแทรกแซงของผู้ใช้ใด ๆ
เชื่อใจ เชื่อมต่อ
หลังจากดำเนินการทั้งหมดนี้เทอร์มินัลของคุณควรมีลักษณะคล้ายกับเครื่องนี้
เย้! เรามีโทรศัพท์ของเราที่เชื่อมต่อกับ Raspberry Pi ผ่านบลูทู ธ แต่เพียงพอหรือไม่ เห็นได้ชัดว่าไม่เราต้องการให้แพ็กเก็ตข้อมูลเสียงของเราโอนจากโทรศัพท์ไปยัง pi จากนั้นจาก pi ไปยังลำโพงที่เชื่อมต่อกับพอร์ตเสียงของ pi
ให้เราตรวจสอบให้แน่ใจว่าเรามีโทรศัพท์ของเราอยู่ในแหล่งข้อมูลเสียงของแอปพลิเคชัน PulseAudio โดยเรียกใช้คำสั่งด้านล่าง:
รายการ pactl สั้น ๆ
มันจะแสดงรายการโมดูลเสียงที่โหลดอ่างเสียงและแหล่งเสียงทั้งหมด
ดูค่าเทียบกับหมายเลขซีเรียล 30 Bluez_sourceหมายถึงแหล่งที่มาของเสียงผ่านแอปพลิเคชัน BlueZ ซึ่งเป็นบลูทู ธ ตรวจสอบที่อยู่ Mac ของอุปกรณ์ซึ่งอยู่ระหว่าง bluez_source และ a2dp_source และที่อยู่ที่คุณมีในแอปพลิเคชัน BlueZ ในกรณีของฉันคือbluez_source.3C_28_6D_FD_65_3D.a2dp_sourceซึ่งเหมือนกับแอปพลิเคชัน BlueZ ตอนนี้ถ้าคุณเล่นเพลงจากอุปกรณ์ที่เชื่อมต่อกับ pi ควรกำหนดเส้นทางไปยังลำโพงที่เชื่อมต่อกับพอร์ตเสียงของ raspberry pi
ยูเรก้า! เราได้สร้างลำโพงบลูทู ธสำเร็จแล้ว เราได้กำหนดเส้นทางของเสียง แต่นั่นไม่ใช่ทั้งหมด เราไม่สามารถทำทุกขั้นตอนข้างต้นด้วยตนเองเพื่อให้เราได้โดยอัตโนมัติโดยใช้ คาดหวังสคริปต์ และอินเตอร์เฟซปี่กับสวิทช์ซึ่งเมื่อกดคู่ Pi กับอุปกรณ์
เย็น? ให้เราลงมือทำธุรกิจ
ทำให้กระบวนการจับคู่บลูทู ธ โดยอัตโนมัติด้วยสคริปต์ Python
คาดหวังสคริปต์เป็นเหมือนสคริปต์ทุบตี แต่เป็นแบบอัตโนมัติ ค้นหาคำที่กำหนดในเทอร์มินัลและเมื่อมาถึงคำสั่งนั้นจะส่งคำสั่งตามสคริปต์ ให้เราดำเนินการจับคู่โดยอัตโนมัติ สร้างไฟล์ชื่อ pair_bluetooth_device.expect
ตั้งค่าการหมดเวลา 30 วางไข่ bluetoothctl คาดว่า "#" ส่ง "ตัวแทนปิด \ r" คาดหวัง "? gistered" ส่ง "\ r" คาดหวัง "#" ส่ง "ตัวแทน NoInputNoOutput \ r" คาดว่า "ตัวแทนที่ลงทะเบียน" ส่ง "\ r" คาดหวัง "# "send" default-agent \ r "คาดว่า" คำขอตัวแทนเริ่มต้นประสบความสำเร็จ "ส่ง" \ r "คาดว่า" # "ส่ง" ค้นพบเมื่อ \ r "คาดว่า" Authorize "ส่ง" yes \ r "ส่ง" exit \ r "
คัดลอกรหัสและวางรหัสเดียวกันในไฟล์ มันทำโดยอัตโนมัติการกระทำที่เราทำในขณะที่จับคู่มือถือกับราสเบอร์รี่ pi มันก็ช่วยให้อุปกรณ์เชื่อมต่อ แต่ไม่ไว้วางใจได้ ในการเชื่อถืออุปกรณ์เราจำเป็นต้องมีที่อยู่ mac ของมัน ดังนั้นเราจะพิมพ์ผลลัพธ์ของสคริปต์ที่คาดหวังนี้ไปยังไฟล์บันทึกซึ่งสามารถจับที่อยู่ mac ได้
grep -Pom 1 "(? <= Device). * (? = เชื่อมต่อแล้ว)"
คำสั่งด้านบนจะพิมพ์ค่าระหว่างสตริง“ Device” และ“ Connected” ในกรณีของเรา (Device 3C: 28: 6D: FD: 65: 3D Connected: no) เป็นที่อยู่ mac ของอุปกรณ์
ให้เราเขียน สคริปต์คาดหวัง ที่จะใช้ที่อยู่ mac เป็นอาร์กิวเมนต์แรกและเชื่อถือและเชื่อมต่อกับอุปกรณ์นั้น
สร้างไฟล์ชื่อ trust_and_connect.expect
ตั้งค่าหมดเวลา 30 วางไข่ bluetoothctl คาดว่า "#" ส่ง "ตัวแทนปิด \ r" คาดหวัง "? egistered" ส่ง "\ r" คาดหวัง "#" ส่ง "ตัวแทนใน \ r" คาดว่า "ตัวแทนที่ลงทะเบียน" ส่ง "\ r" คาดว่า "# " send" default-agent \ r " คาดว่า" คำขอตัวแทนเริ่มต้นสำเร็จ " ส่ง" \ r " คาดหวัง" # " ส่ง" trust \ r " คาดว่า" เปลี่ยน " ส่ง" connect \ r " คาดว่า" Connection ประสบความสำเร็จ " ส่ง" exit \ r "
คัดลอกโค้ดด้านบนลงในไฟล์นั้น เป็นส่วนที่ไว้วางใจและเชื่อมต่อโดยอัตโนมัติ
ตอนนี้ให้เราใส่ทั้งหมดนี้ในไฟล์สคริปต์ Pythonเพื่อให้กระบวนการจับคู่ทั้งหมดเป็นไปโดยอัตโนมัติ
ให้เราสร้างไฟล์ pair_and_trust_bluetooth_device.sh
cd $ (dirname $ 0) echo "กำลังจับคู่… " คาดหวังว่า pair_bluetooth_device.expect> expect_script.log chmod 777 expect_script.log sleep 2 echo "Trusting and connected .. " device_mac_address = $ (cat expect_script.log - grep -Pom 1 " (? <= Device). * (? = Connected) ") echo mac address คือ $ device_mac_address if]; จากนั้น คาดว่า trust_and_connect.expect $ device_mac_address else echo "No device connected" fi rm expect_script.log
ดังนั้นสคริปต์ทุบตี
- เรียกใช้สคริปต์ที่คาดหวัง (ซึ่งเอาต์พุตจะถูกพิมพ์ไปยังไฟล์ชื่อ expect_script.log) ซึ่ง
- เริ่มต้นเอเจนต์ NoInputNoOutput
- ทำให้เป็นตัวแทนเริ่มต้น
- เปิดการค้นพบ pi
- รอให้ใครบางคนเชื่อมต่อและออกเมื่อมีคนทำหรือหมดเวลา
- นอนเป็นเวลา 2 วินาที
- หยิบไฟล์ expect_script.log สำหรับที่อยู่ mac ของอุปกรณ์
- เชื่อถือและเชื่อมต่ออุปกรณ์หาก mac_address เป็นโมฆะ
- ลบไฟล์ที่เหลือ expect_script.log
ทริกเกอร์สคริปต์การจับคู่บลูทู ธ ด้วยปุ่ม
ตอนนี้เรามีสคริปต์เพื่อทำให้กระบวนการจับคู่แต่สคริปต์นี้จะต้องทำงานอย่างสะดวกสบายเมื่อใดก็ตามที่ผู้ใช้ต้องการ ดังนั้นให้เชื่อมสคริปต์นี้ด้วยปุ่มทางกายภาพเพื่อให้สคริปต์นี้ถูกเรียกทุกครั้งเมื่อกดปุ่ม การขัดจังหวะเป็นส่วนสำคัญอย่างหนึ่งของการเขียนโปรแกรมแบบฝัง สำหรับการเริ่มต้นการขัดจังหวะเมื่อรับรู้จะทำให้รูทีนปกติของโปรแกรมและรัน ISR ที่กำหนดไว้ล่วงหน้าซึ่งเรียกว่า Interrupt Service Routine
ให้เราเชื่อมต่อปุ่มกดกับ gpio pin 11 และกำหนด ISRให้เหมือนกัน ภายใน ISR เราจะเรียกสคริปต์
ให้เราสร้างไฟล์ python ชื่อ Bluetooth-speaker-main.py และเพิ่มโค้ดด้านล่างลงไป ฉันได้เพิ่มความคิดเห็นในโปรแกรมดังนั้นในกรณีที่คุณใช้รหัสนี้แสดงว่าคุณยังมีอยู่
#import จำเป็นต้อง นำเข้า แพ็กเกจนำเข้ากระบวนการย่อยนำเข้า RPi.GPIO เป็น gpio เวลา นำเข้าการนำ เข้าบันทึกการนำเข้าระบบ ปฏิบัติการ pair_pin = 11 #fetch ไดเร็กทอรีไฟล์ที่สคริปต์ python รัน fileDirectory = os.path.dirname (os.path.realpath (__ file__)) # ตั้งค่าตำแหน่งไฟล์บันทึกให้เหมือนกับตำแหน่งสคริปต์ python logFile = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (filename = logFile, filemode = 'w', format = '% (name) s -% (levelname) s -% (ข้อความ) s ', ระดับ = logging.INFO) def pairNewDevice (ช่อง): #ISR สำหรับการ พิมพ์ พิน 11 ("กำลังรอจับคู่") logging.info ("กำลังรอจับคู่") output = subprocess.call () gpio.setmode (gpio.คณะกรรมการ) gpio.setup (pair_pin, gpio.IN, pull_up_down = gpio.PUD_UP) ลอง: # ตั้งค่า pair_pin เป็นพินขัดจังหวะที่ตรวจจับขอบที่ตกลงมาและเมื่อมันเป็นเช่นนั้นให้เรียกฟังก์ชัน pairNewDevice gpio.add_event_detect (pair_pin, gpio.FALLING, callback = pairNewDevice, bouncetime = 1000) พิมพ์ ("โปรแกรมบลูทู ธ เริ่มทำงานแล้ว") logging.info ("โปรแกรมบลูทู ธ เริ่มทำงานแล้ว") ในขณะที่ True: time.sleep (5) ยกเว้น KeyboardInterrupt: gpio.cleanup ()
แผนภูมิวงจรรวม
ด้านล่างนี้คือวงจรการเชื่อมต่อปุ่มที่มี GPIO11 ของราสเบอร์รี่ Pi ที่จะเรียกขั้นตอนการจับคู่บลูทู ธ สำหรับการถ่ายโอนเสียงผ่านบลูทู ธ
ตั้งค่างาน Cron เพื่อเริ่มโปรแกรม Bluetooth Speaker Python ใน Boot
ในที่สุดให้เราตั้งค่างาน cron ซึ่งจะเริ่มโปรแกรม python นี้ทุกครั้งที่ pi บูทขึ้น
crontab -e
เลือกโปรแกรมแก้ไขที่คุณชื่นชอบและเพิ่มบรรทัดด้านล่างที่ท้ายไฟล์
@reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py
นี้จะเรียกโปรแกรมหลามของเราทุกครั้งที่รองเท้าปี่ขึ้น
และนี่คือมัน นกอินทรีร่อนลงแล้ว คุณได้สร้างลำโพง Bluetooth Raspberry Piแบบไร้หัว
รีสตาร์ท Pi จับคู่โทรศัพท์และสตรีมเสียง:)
สคริปต์ทั้งหมดสำหรับ Raspberry Pi Bluetooth Speaker นี้สามารถดาวน์โหลดได้จากบัญชี GitHub ตรวจสอบวิดีโอด้านล่างด้วย