From 3f40e922181afee54cfce41982f0937ef50e57ff Mon Sep 17 00:00:00 2001 From: agessaman Date: Mon, 13 Oct 2025 16:47:03 -0700 Subject: [PATCH] added pin pairing --- ble_pairing_helper.py | 86 +++++++++++++++++ install.sh | 211 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 292 insertions(+), 5 deletions(-) create mode 100644 ble_pairing_helper.py diff --git a/ble_pairing_helper.py b/ble_pairing_helper.py new file mode 100644 index 0000000..e4c7fda --- /dev/null +++ b/ble_pairing_helper.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +""" +BLE Pairing Helper for MeshCore Packet Capture Installer +Checks pairing status and handles PIN-based pairing +""" + +import asyncio +import sys +import json +from meshcore import MeshCore + +async def check_pairing_and_connect(address, name, pin=None): + """Check if device is paired and handle pairing if needed""" + try: + print(f"Checking pairing status for {name} ({address})...", file=sys.stderr, flush=True) + + # Try to connect without PIN first + try: + meshcore = await MeshCore.create_ble(address=address, debug=False) + print("Device is already paired and connected successfully", file=sys.stderr, flush=True) + await meshcore.disconnect() + print(json.dumps({"status": "paired", "message": "Device is already paired"}), flush=True) + return True + except Exception as e: + error_msg = str(e) + if "Not paired" in error_msg or "NotPermitted" in error_msg: + print("Device is not paired, pairing required", file=sys.stderr, flush=True) + print(json.dumps({"status": "not_paired", "message": "Device requires pairing"}), flush=True) + return False + else: + print(f"Connection error: {error_msg}", file=sys.stderr, flush=True) + print(json.dumps({"status": "error", "message": error_msg}), flush=True) + return False + + except Exception as e: + print(f"Unexpected error: {e}", file=sys.stderr, flush=True) + print(json.dumps({"status": "error", "message": str(e)}), flush=True) + return False + +async def attempt_pairing(address, name, pin): + """Attempt to pair with the device using the provided PIN""" + try: + print(f"Attempting to pair with {name} using PIN...", file=sys.stderr, flush=True) + + meshcore = await MeshCore.create_ble(address=address, pin=pin, debug=False) + print("Pairing successful!", file=sys.stderr, flush=True) + await meshcore.disconnect() + print(json.dumps({"status": "paired", "message": "Pairing successful"}), flush=True) + return True + + except Exception as e: + error_msg = str(e) + print(f"Pairing failed: {error_msg}", file=sys.stderr, flush=True) + print(json.dumps({"status": "pairing_failed", "message": error_msg}), flush=True) + return False + +def main(): + """Main function to handle BLE pairing""" + if len(sys.argv) < 3: + print(json.dumps({"status": "error", "message": "Usage: script.py
[pin]"})) + sys.exit(1) + + address = sys.argv[1] + name = sys.argv[2] + pin = sys.argv[3] if len(sys.argv) > 3 else None + + try: + if pin: + # Attempt pairing with PIN + success = asyncio.run(attempt_pairing(address, name, pin)) + else: + # Check pairing status + success = asyncio.run(check_pairing_and_connect(address, name)) + + if not success: + sys.exit(1) + + except KeyboardInterrupt: + print("Operation interrupted by user", file=sys.stderr, flush=True) + sys.exit(1) + except Exception as e: + print(f"Unexpected error: {e}", file=sys.stderr, flush=True) + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/install.sh b/install.sh index d8e2776..bdda67f 100755 --- a/install.sh +++ b/install.sh @@ -286,6 +286,189 @@ for i, device in enumerate(data, 1): fi } +# Check BLE pairing status and handle pairing if needed +handle_ble_pairing() { + local device_address="$1" + local device_name="$2" + + echo "" + print_info "Checking BLE pairing status for $device_name ($device_address)..." + + # Create a temporary script to check pairing status and handle pairing + local temp_script="/tmp/ble_pairing_helper.py" + cat > "$temp_script" << EOF +#!/usr/bin/env python3 +""" +BLE Pairing Helper for MeshCore Packet Capture Installer +Checks pairing status and handles PIN-based pairing +""" + +import asyncio +import sys +import json +from meshcore import MeshCore + +async def check_pairing_and_connect(address, name, pin=None): + """Check if device is paired and handle pairing if needed""" + try: + print(f"Checking pairing status for {name} ({address})...", file=sys.stderr, flush=True) + + # Try to connect without PIN first + try: + meshcore = await MeshCore.create_ble(address=address, debug=False) + print("Device is already paired and connected successfully", file=sys.stderr, flush=True) + await meshcore.disconnect() + print(json.dumps({"status": "paired", "message": "Device is already paired"}), flush=True) + return True + except Exception as e: + error_msg = str(e) + if "Not paired" in error_msg or "NotPermitted" in error_msg: + print("Device is not paired, pairing required", file=sys.stderr, flush=True) + print(json.dumps({"status": "not_paired", "message": "Device requires pairing"}), flush=True) + return False + else: + print(f"Connection error: {error_msg}", file=sys.stderr, flush=True) + print(json.dumps({"status": "error", "message": error_msg}), flush=True) + return False + + except Exception as e: + print(f"Unexpected error: {e}", file=sys.stderr, flush=True) + print(json.dumps({"status": "error", "message": str(e)}), flush=True) + return False + +async def attempt_pairing(address, name, pin): + """Attempt to pair with the device using the provided PIN""" + try: + print(f"Attempting to pair with {name} using PIN...", file=sys.stderr, flush=True) + + meshcore = await MeshCore.create_ble(address=address, pin=pin, debug=False) + print("Pairing successful!", file=sys.stderr, flush=True) + await meshcore.disconnect() + print(json.dumps({"status": "paired", "message": "Pairing successful"}), flush=True) + return True + + except Exception as e: + error_msg = str(e) + print(f"Pairing failed: {error_msg}", file=sys.stderr, flush=True) + print(json.dumps({"status": "pairing_failed", "message": error_msg}), flush=True) + return False + +def main(): + """Main function to handle BLE pairing""" + if len(sys.argv) < 3: + print(json.dumps({"status": "error", "message": "Usage: script.py
[pin]"})) + sys.exit(1) + + address = sys.argv[1] + name = sys.argv[2] + pin = sys.argv[3] if len(sys.argv) > 3 else None + + try: + if pin: + # Attempt pairing with PIN + success = asyncio.run(attempt_pairing(address, name, pin)) + else: + # Check pairing status + success = asyncio.run(check_pairing_and_connect(address, name)) + + if not success: + sys.exit(1) + + except KeyboardInterrupt: + print("Operation interrupted by user", file=sys.stderr, flush=True) + sys.exit(1) + except Exception as e: + print(f"Unexpected error: {e}", file=sys.stderr, flush=True) + sys.exit(1) + +if __name__ == "__main__": + main() +EOF + + # Check pairing status first + local pairing_output + if pairing_output=$(python3 "$temp_script" "$device_address" "$device_name" 2>/tmp/ble_pairing_error); then + local pairing_status=$(echo "$pairing_output" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data['status'])" 2>/dev/null) + + if [ "$pairing_status" = "paired" ]; then + print_success "Device is already paired and ready to use" + rm -f "$temp_script" /tmp/ble_pairing_error + return 0 + elif [ "$pairing_status" = "not_paired" ]; then + print_info "Device requires pairing. You'll need to enter the PIN displayed on your MeshCore device." + echo "" + + # Get PIN from user + local pin + while true; do + pin=$(prompt_input "Enter the 6-digit PIN displayed on your MeshCore device" "") + if [[ "$pin" =~ ^[0-9]{6}$ ]]; then + break + else + print_error "Please enter a 6-digit PIN (numbers only)" + fi + done + + # Attempt pairing with PIN + echo "" + print_info "Attempting to pair with device..." + if pairing_output=$(python3 "$temp_script" "$device_address" "$device_name" "$pin" 2>/tmp/ble_pairing_error); then + local pairing_result=$(echo "$pairing_output" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data['status'])" 2>/dev/null) + + if [ "$pairing_result" = "paired" ]; then + print_success "BLE pairing successful! Device is now ready to use." + rm -f "$temp_script" /tmp/ble_pairing_error + return 0 + else + print_error "BLE pairing failed" + if [ -f /tmp/ble_pairing_error ]; then + local error_msg=$(cat /tmp/ble_pairing_error) + if [ -n "$error_msg" ]; then + print_info "Error details: $error_msg" + fi + rm -f /tmp/ble_pairing_error + fi + rm -f "$temp_script" + return 1 + fi + else + print_error "Failed to attempt BLE pairing" + if [ -f /tmp/ble_pairing_error ]; then + local error_msg=$(cat /tmp/ble_pairing_error) + if [ -n "$error_msg" ]; then + print_info "Error details: $error_msg" + fi + rm -f /tmp/ble_pairing_error + fi + rm -f "$temp_script" + return 1 + fi + else + print_error "Failed to check pairing status" + if [ -f /tmp/ble_pairing_error ]; then + local error_msg=$(cat /tmp/ble_pairing_error) + if [ -n "$error_msg" ]; then + print_info "Error details: $error_msg" + fi + rm -f /tmp/ble_pairing_error + fi + rm -f "$temp_script" + return 1 + fi + else + print_error "Failed to check BLE pairing status" + if [ -f /tmp/ble_pairing_error ]; then + local error_msg=$(cat /tmp/ble_pairing_error) + if [ -n "$error_msg" ]; then + print_info "Error details: $error_msg" + fi + rm -f /tmp/ble_pairing_error + fi + rm -f "$temp_script" + return 1 + fi +} + # Select connection type and configure device select_connection_type() { echo "" @@ -317,8 +500,14 @@ select_connection_type() { if prompt_yes_no "Would you like to scan for nearby BLE devices?" "y"; then while true; do if scan_ble_devices; then - print_success "BLE device configured: $SELECTED_BLE_NAME ($SELECTED_BLE_DEVICE)" - break + # Device selected, now handle pairing + if handle_ble_pairing "$SELECTED_BLE_DEVICE" "$SELECTED_BLE_NAME"; then + print_success "BLE device configured and paired: $SELECTED_BLE_NAME ($SELECTED_BLE_DEVICE)" + break + else + print_error "BLE pairing failed. Please try selecting a different device or check your device." + continue + fi elif [ $? -eq 2 ]; then # Rescan requested, continue the loop continue @@ -328,8 +517,14 @@ select_connection_type() { SELECTED_BLE_DEVICE=$(prompt_input "Enter BLE device MAC address" "") SELECTED_BLE_NAME=$(prompt_input "Enter device name (optional)" "") if [ -n "$SELECTED_BLE_DEVICE" ]; then - print_success "BLE device configured: $SELECTED_BLE_NAME ($SELECTED_BLE_DEVICE)" - break + # Handle pairing for manually entered device + if handle_ble_pairing "$SELECTED_BLE_DEVICE" "$SELECTED_BLE_NAME"; then + print_success "BLE device configured and paired: $SELECTED_BLE_NAME ($SELECTED_BLE_DEVICE)" + break + else + print_error "BLE pairing failed. Please check your device and try again." + continue + fi else print_error "No BLE device configured" continue @@ -341,7 +536,13 @@ select_connection_type() { SELECTED_BLE_DEVICE=$(prompt_input "Enter BLE device MAC address" "") SELECTED_BLE_NAME=$(prompt_input "Enter device name (optional)" "") if [ -n "$SELECTED_BLE_DEVICE" ]; then - print_success "BLE device configured: $SELECTED_BLE_NAME ($SELECTED_BLE_DEVICE)" + # Handle pairing for manually entered device + if handle_ble_pairing "$SELECTED_BLE_DEVICE" "$SELECTED_BLE_NAME"; then + print_success "BLE device configured and paired: $SELECTED_BLE_NAME ($SELECTED_BLE_DEVICE)" + else + print_error "BLE pairing failed. Please check your device and try again." + continue + fi else print_error "No BLE device configured" continue