# ESP32 + BlueZ Full E2E Bluetooth Test Suite (v4 - Extended Coverage) You have two MCP servers available: - **esp32** (prefix: `mcp__esp32__`) — controls an ESP32 dev board via serial/UART - **bluez** (prefix: `mcp__bluez__`) — controls the Linux BlueZ Bluetooth stack Run ALL tests IN ORDER. For each test, report PASS or FAIL with actual response data. If a test fails, note the error and continue with remaining tests. **Important**: The Linux adapter is `hci1` (not hci0). Use `hci1` for all BlueZ calls. --- ## Phase 1: ESP32 Connection & System (Tests 1-4) 1. **Connect**: Call `esp32_connect` — should return connected=true AND ready=true 2. **Ping**: Call `esp32_ping` — expect `{"pong": true}` 3. **Get Info**: Call `esp32_get_info` — note the chip model, FW version, and BT MAC address (you'll need the MAC later) 4. **Get Status**: Call `esp32_status` — confirm bt_enabled=false, ble_enabled=false ## Phase 2: BlueZ Adapter Deep Dive (Tests 5-8) 5. **List Adapters**: Call `bt_list_adapters` — find the powered adapter, note its name (probably hci1) 6. **Adapter Info**: Call `bt_adapter_info` with the adapter name — report full details including the adapter's MAC address 7. **Set Pairable**: Call `bt_adapter_pairable` with adapter, on=true — enable pairing acceptance 8. **Set Discoverable**: Call `bt_adapter_discoverable` with adapter, on=true, timeout=300 — make Linux visible ## Phase 3: Classic BT + SSP Pairing (Tests 9-24) IMPORTANT: Enable Classic BT FIRST, then configure IO capabilities. 9. **Enable Classic**: Call `esp32_classic_enable` 10. **Configure ESP32**: Call `esp32_configure` with name="SSP-Test-Device", io_cap="display_yesno" 11. **Set SSP Mode**: Call `esp32_set_ssp_mode` with mode="numeric_comparison", auto_accept=true 12. **Check Status**: Call `esp32_status` — confirm bt_enabled=true 13. **Set ESP32 Discoverable**: Call `esp32_classic_set_discoverable` with discoverable=true, timeout=120 14. **Scan from Linux**: Call `bt_scan` with adapter="hci1", mode="classic", timeout=10 — find the ESP32 by its MAC Now initiate pairing: 15. **Check Pairing Status Before**: Call `bt_pairing_status` — should show no pending requests 16. **Start Pairing**: Call `bt_pair` with adapter="hci1", address=, pairing_mode="auto" 17. **Check ESP32 Pair Events**: Call `esp32_get_events` — look for pair_request and pair_complete events 18. **Verify Paired on Linux**: Call `bt_device_info` with adapter="hci1", address= — check paired=true Post-pairing device management: 19. **List Known Devices**: Call `bt_list_devices` with adapter="hci1", filter="paired" — ESP32 should be in the list 20. **Trust Device**: Call `bt_trust` with adapter="hci1", address=, trusted=true 21. **Set Alias**: Call `bt_device_set_alias` with adapter="hci1", address=, alias="My ESP32 Test Device" 22. **Block Device**: Call `bt_block` with adapter="hci1", address=, blocked=true — block the device 23. **Unblock Device**: Call `bt_block` with adapter="hci1", address=, blocked=false — unblock it 24. **Unpair**: Call `bt_unpair` with adapter="hci1", address= — clean up pairing ## Phase 4: Classic Cleanup + Event System (Tests 25-29) 25. **Disable Classic**: Call `esp32_classic_disable` 26. **Get All Events**: Call `esp32_get_events` — report ALL events captured so far 27. **Clear Events**: Call `esp32_clear_events` 28. **Verify Cleared**: Call `esp32_get_events` — should return empty list 29. **Check Status**: Call `esp32_status` — confirm bt_enabled=false ## Phase 5: BLE GATT Setup (Tests 30-38) Set up ESP32 as a BLE peripheral with multiple characteristics: 30. **Enable BLE**: Call `esp32_ble_enable` 31. **Add Service**: Call `esp32_gatt_add_service` with uuid="0000181a-0000-1000-8000-00805f9b34fb" (Environmental Sensing), primary=true — save the service_handle 32. **Add Read+Notify Char**: Call `esp32_gatt_add_characteristic` with the service_handle, uuid="00002a6e-0000-1000-8000-00805f9b34fb" (Temperature), properties=["read","notify"] — save as temp_handle 33. **Add Read+Write Char**: Call `esp32_gatt_add_characteristic` with the service_handle, uuid="00002a6f-0000-1000-8000-00805f9b34fb" (Humidity), properties=["read","write"] — save as humidity_handle 34. **Set Temperature**: Call `esp32_gatt_set_value` with char_handle=temp_handle, value="e803" (25.0°C) 35. **Set Humidity**: Call `esp32_gatt_set_value` with char_handle=humidity_handle, value="3200" (50%) 36. **Set Adv Data**: Call `esp32_ble_set_adv_data` with name="BLE-Sensor-Test", service_uuids=["0000181a-0000-1000-8000-00805f9b34fb"] 37. **Start Advertising**: Call `esp32_ble_advertise` with enable=true 38. **Clear Events**: Call `esp32_clear_events` — clear event history before BLE tests ## Phase 6: HCI Capture + BLE Discovery (Tests 39-47) Start HCI packet capture BEFORE connecting, then analyze it afterwards: 39. **Start HCI Capture**: Call `bt_capture_start` with adapter="hci1", output_file="/tmp/ble-gatt-capture.btsnoop" 40. **List Active Captures**: Call `bt_capture_list_active` — verify capture is running 41. **BLE Scan**: Call `bt_ble_scan` with adapter="hci1", timeout=10 — find the ESP32, verify name="BLE-Sensor-Test" 42. **Connect BLE**: Call `bt_connect` with adapter="hci1", address= Wait 3 seconds for service discovery to complete, then: 43. **List Services**: Call `bt_ble_services` with adapter="hci1", address= — should see Environmental Sensing (181a) 44. **List Characteristics**: Call `bt_ble_characteristics` with adapter="hci1", address= — should see Temperature (2a6e) and Humidity (2a6f) 45. **Read Temperature**: Call `bt_ble_read` with adapter="hci1", address=, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb" — should return hex "e803" 46. **Check Read Event on ESP32**: Call `esp32_get_events` — look for a gatt_read event 47. **Stop HCI Capture**: Call `bt_capture_stop` with capture_id from test 39 ## Phase 7: Analyze HCI Capture (Tests 48-50) 48. **Parse Capture**: Call `bt_capture_parse` with filepath="/tmp/ble-gatt-capture.btsnoop", max_packets=50 — report packet count and types 49. **Analyze Capture**: Call `bt_capture_analyze` with filepath="/tmp/ble-gatt-capture.btsnoop" — report statistics 50. **Read Raw Packets**: Call `bt_capture_read_raw` with filepath="/tmp/ble-gatt-capture.btsnoop", count=20 — show decoded packets ## Phase 8: BLE GATT Write + Notifications (Tests 51-58) 51. **Write Humidity**: Call `bt_ble_write` with adapter="hci1", address=, char_uuid="00002a6f-0000-1000-8000-00805f9b34fb", value="4b00", value_type="hex" 52. **Check Write Event**: Call `esp32_get_events` — look for a gatt_write event with the written value 53. **Subscribe Notifications**: Call `bt_ble_notify` with adapter="hci1", address=, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb", enable=true 54. **Check Subscribe Event**: Call `esp32_get_events` — look for a gatt_subscribe event 55. **Push Notification**: First call `esp32_gatt_set_value` with char_handle=temp_handle, value="f401" (50.0°C), then call `esp32_gatt_notify` with char_handle=temp_handle 56. **Read Updated Value**: Call `bt_ble_read` with adapter="hci1", address=, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb" — should now return "f401" 57. **Unsubscribe**: Call `bt_ble_notify` with adapter="hci1", address=, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb", enable=false 58. **Disconnect BLE**: Call `bt_disconnect` with adapter="hci1", address= ## Phase 9: BLE Cleanup (Tests 59-63) 59. **Stop Advertising**: Call `esp32_ble_advertise` with enable=false 60. **Clear GATT**: Call `esp32_gatt_clear` 61. **Disable BLE**: Call `esp32_ble_disable` 62. **Final Status**: Call `esp32_status` — bt_enabled=false, ble_enabled=false 63. **Clear ESP32 Events**: Call `esp32_clear_events` ## Phase 10: Adapter Self-Management (Tests 64-68) These tests verify adapter configuration tools. Done at the end to not interfere with earlier tests. 64. **Get Original Alias**: Call `bt_adapter_info` with adapter="hci1" — note the current alias 65. **Set New Alias**: Call `bt_adapter_set_alias` with adapter="hci1", alias="E2E-Test-Adapter" — change the name 66. **Verify Alias Changed**: Call `bt_adapter_info` with adapter="hci1" — confirm alias is "E2E-Test-Adapter" 67. **Restore Original Alias**: Call `bt_adapter_set_alias` with adapter="hci1", alias= 68. **Disable Discoverable**: Call `bt_adapter_discoverable` with adapter="hci1", on=false — clean up ## Phase 11: Final Cleanup (Tests 69-71) 69. **Reset ESP32**: Call `esp32_reset` 70. **Disconnect Serial**: Call `esp32_disconnect` 71. **Final Adapter Check**: Call `bt_adapter_info` with adapter="hci1" — verify adapter is still powered and healthy --- ## Summary After all tests, print a DETAILED summary table: | # | Test | Result | Notes | |---|------|--------|-------| | 1 | Connect | PASS/FAIL | ... | | ... | ... | ... | ... | Report: - Total PASS/FAIL counts - Whether pairing succeeded (phase 3) - What ESP32 events were captured (phases 4, 6, 8) - Whether GATT read returned expected value (test 45) - Whether GATT write succeeded (test 51) - Whether the updated value was readable after notification (test 56) - HCI capture statistics (tests 48-50): packet count, types captured, any errors