11.3. วิทยุและชั้นลิงก์¶
สองชั้นล่างสุดของสแตก BLE นั้นเป็นอัตโนมัติเกือบทั้งหมดจากมุมมองของ Python -- ซิลิกอนวิทยุและชั้นที่ MicroPython ทำงานอยู่บนนั้นจัดการทุกอย่างตั้งแต่การเลือกช่องสัญญาณไปจนถึงการส่งซ้ำแพ็กเก็ตที่สูญหาย การเลือกสามรายการที่พวกเขาตัดสินใจยังคงปรากฏผ่านมาใน API ที่ผู้ใช้เห็น: พลังงาน ระยะ และปริมาณงานที่ผ่านได้
11.3.1. วิทยุ¶
BLE ใช้ย่านความถี่ 2.4 GHz Industrial-Scientific-Medical (ISM) เดียวกับ Wi-Fi เตาไมโครเวฟ และอุปกรณ์ไร้สายระยะสั้นอื่นๆ ส่วนใหญ่ ย่านความถี่นี้แบ่งออกเป็น 40 ช่องสัญญาณ ช่องละ 2 MHz
ช่อง สาม จากทั้งหมด 40 ช่องสงวนไว้สำหรับ การโฆษณา -- การกระจายสัญญาณสั้นๆ ที่ประกาศการมีอยู่ของอุปกรณ์แก่ผู้ฟังทุกคน ช่องเหล่านี้กระจายอยู่ทั่วย่านความถี่เพื่อให้ผู้ฟังสามารถกวาดทั้งสามช่องได้อย่างรวดเร็ว และเพื่อให้สัญญาณรบกวนในช่องใดช่องหนึ่งไม่น่าจะทำให้อุปกรณ์หลุดออกจากอากาศทั้งหมด
สามสิบเจ็ด ช่องเป็นช่องสัญญาณ ข้อมูล เมื่ออุปกรณ์สองตัวเชื่อมต่อกัน พวกเขาแลกเปลี่ยนแพ็กเก็ตบนช่องเหล่านี้ โดยกระโดดระหว่างกันตามลำดับสุ่มเทียมที่ทั้งสองฝั่งตกลงกันในเวลาเชื่อมต่อ Adaptive frequency hopping ช่วยให้ฝั่งใดฝั่งหนึ่งทำเครื่องหมายช่องว่าใช้งานไม่ได้ (สัญญาณรบกวน Wi-Fi หนัก ไมโครเวฟ เครือข่าย BLE ข้างเคียง) เพื่อให้ลำดับข้ามช่องนั้น
40 ช่อง BLE บนย่านความถี่ 2.4 GHz สามช่องสำหรับการโฆษณา ส่วนที่เหลือรับส่งข้อมูลบนการเชื่อมต่อที่เปิดอยู่¶
วิทยุส่งแพ็กเก็ตสั้นๆ -- ยาวสูงสุดสองสามมิลลิวินาที -- และพักระหว่างนั้น การพักนั้นคือสิ่งที่ทำให้เทคโนโลยีนี้ ใช้พลังงานต่ำ โดยทั่วไป BLE peripheral ใช้เวลาน้อยกว่าหนึ่งเปอร์เซ็นต์ของเวลาในการส่งสัญญาณจริงๆ ส่วนที่เหลือคือวิทยุที่ปิดอยู่ระหว่างเหตุการณ์ที่กำหนดไว้
11.3.2. ชั้นลิงก์¶
ชั้นลิงก์คือหน่วยที่เล็กที่สุดของ BLE ที่คุยกับคู่สนทนาบนอุปกรณ์อีกตัว มันจัดการงานสี่อย่าง
การจัดเฟรมแพ็กเก็ต แพ็กเก็ตแต่ละอันมีส่วนหัวสั้น (channel access address ความยาวแพ็กเก็ต บิตควบคุม) เพย์โหลด และ CRC ผู้รับตรวจสอบ CRC และทิ้งสิ่งที่เสียหาย
การกำหนดที่อยู่ อุปกรณ์ BLE ทุกตัวมี device address 48 บิตที่ระบุตัวตนบนวิทยุ บางตัวเป็น public -- ตัวระบุฮาร์ดแวร์ที่ผู้ผลิตกำหนด ติดตามได้ตลอดไป บางตัวเป็น random -- สร้างบนอุปกรณ์ หมุนเวียนเป็นระยะ และเข้ารหัสเป็นตัวเลือกเพื่อให้ผู้ดักฟังไม่สามารถเชื่อมโยงการส่งสองครั้งกับฮาร์ดแวร์เดิมได้ ที่อยู่ถูกกล่าวถึงอีกครั้งใน การโฆษณาและการสแกน
การกำหนดตารางการเชื่อมต่อ เมื่ออุปกรณ์สองตัวเชื่อมต่อกัน ชั้นลิงก์จะกำหนดเหตุการณ์วิทยุเป็นระยะบนลำดับการกระโดด -- ห่างกัน connection interval คงที่ -- และบรรจุข้อมูลที่รอในคิวจากชั้น GATT ด้านบนลงในแต่ละอัน ทั้งสองฝั่งกลับไปพักระหว่างเหตุการณ์ connection interval เป็นปุ่มที่แอปพลิเคชันสามารถร้องขอได้ (ดู การเชื่อมต่อ)
ความน่าเชื่อถือ แพ็กเก็ตแต่ละอันบนการเชื่อมต่อได้รับการยืนยันจากอีกฝั่ง ชั้นลิงก์ส่งซ้ำสิ่งที่ไม่ได้รับการตอบสนอง ดังนั้นชั้นด้านบนจึงเห็นสตรีมไบต์ที่เรียงลำดับและไม่สูญหาย ต่างจาก UDP -- ส่งแพ็กเก็ตแล้วหวังว่าจะดีที่สุด ในฝั่งเครือข่าย BLE ไม่มีโหมดไม่น่าเชื่อถือแยกต่างหากในการใช้งานปกติ -- ทุกแพ็กเก็ตบนการเชื่อมต่อที่เปิดอยู่จะถูกลองซ้ำจนกว่าจะมาถึงหรือลิงก์ถูกประกาศว่าสูญหาย
ชั้นลิงก์ยังเป็นที่ที่ การเข้ารหัส ทำงานเมื่อคู่อุปกรณ์ตกลงกันเรื่องคีย์ระหว่างการจับคู่ (ดู การจับคู่และการผูกพัน) แพ็กเก็ตทุกอันบนลิงก์ที่เข้ารหัสจะถูกถอดรหัสที่ผู้รับก่อนที่ชั้นด้านบนจะได้เห็น
11.3.4. สิ่งที่ Python เห็นจากทั้งหมดนี้¶
แทบไม่มีอะไร API bluetooth และ aioble ไม่เปิดเผยช่องสัญญาณ ลำดับการกระโดด CRC ของแพ็กเก็ต หรือตัวจับเวลาการส่งซ้ำ สิ่งเหล่านั้นทั้งหมดถูกจัดการภายใน BLE port และวิทยุ ส่วนที่ ปรากฏผ่านมา คือสิ่งที่การเจรจาในเวลาเชื่อมต่อเปิดเผย -- connection interval, MTU, ประเภทที่อยู่