Một vi điều khiển có mô-đun Wi-Fi UART không cần tự triển khai VPN để tới được một dịch vụ nằm phía sau. Mô-đun đã chạy sẵn ngăn xếp TCP/IP và cung cấp socket qua cổng nối tiếp, và một cổng mạng trong cùng LAN có thể chuyển lưu lượng đó qua đường hầm. Thiết kế chỉ hoạt động khi bạn trả lời được bốn câu hỏi theo thứ tự, nên hãy coi đây là danh sách kiểm tra: địa chỉ, socket, tuyến, ranh giới. Dừng lại ở cổng đầu tiên thất bại, vì các cổng sau không thể bù đắp cho nó.

Giao một việc cho mỗi lớp

Liên kết UART mang lệnh AT và tải trọng giữa vi điều khiển và mô-đun. Mô-đun tham gia mạng Wi-Fi và sở hữu kết nối IP, bao gồm địa chỉ nguồn của nó. Cổng mạng sở hữu đường hầm, thông tin đăng nhập và chính sách chuyển tiếp. Chính việc tách các nhiệm vụ đó giúp thiết kế có thể gỡ lỗi ở từng giai đoạn.

Việc tách bạch cũng thay đổi cách bạn viết chính sách của cổng mạng. Quy tắc nguồn phải nêu địa chỉ LAN của mô-đun, không phải một địa chỉ tưởng tượng cho vi điều khiển nằm sau liên kết nối tiếp. Vi điều khiển không có danh tính IP riêng trong thiết kế này, và giả vờ rằng nó có sẽ tạo ra một quy tắc không bao giờ khớp.

Cấp cho mô-đun một địa chỉ ổn định bằng bất kỳ cơ chế đặt trước nào mà mạng hỗ trợ, hoặc đặt các thiết bị vào phân đoạn riêng và để cổng mạng khớp theo giao diện. Một địa chỉ lấy từ nhóm thay đổi sau khi khởi động lại sẽ phá vỡ chính sách vốn đúng vào lúc bạn viết nó.

Cổng mạng có nêu được địa chỉ của mô-đun không?

Trước khi bất kỳ socket nào mở, hãy xác nhận mô-đun đã kết nối, có địa chỉ và cổng mạng nhìn thấy nó trên giao diện mong đợi. Đây là cổng thường thất bại trong im lặng nhất, vì mô-đun sẽ sẵn lòng báo cáo một nỗ lực kết nối chưa từng rời khỏi LAN.

AT+CWMODE=1
AT+CWJAP="lab-wifi","passphrase"
AT+CIPSTA?
AT+CIPMUX=0

Chế độ một kết nối giữ trình tự lệnh đơn giản, và đó là điểm khởi đầu đúng cho một cảm biến nói chuyện với một dịch vụ. Chế độ nhiều kết nối thay đổi cú pháp của mọi lệnh sau đó, nên hãy quyết định bạn đang ở chế độ nào trước khi sao chép ví dụ từ phiên bản phần sụn khác.

Mở socket từ mô-đun

Khi địa chỉ và chế độ đã rõ, mô-đun có thể mở kết nối TCP tới dịch vụ riêng. Địa chỉ bên dưới là ví dụ từ một dải tài liệu; hãy thay bằng địa chỉ của bạn và giữ nguyên hình thức.

AT+CIPSTART="TCP","10.90.0.20",9000
AT+CIPSEND=18
{"t":21.4,"rh":48}

Lệnh AT đó mở một socket TCP thường, và socket không phải đường hầm: không gì trong đó tạo ra VPN và không gì mã hóa tải trọng. Chế độ TLS của phần sụn là một tính năng riêng với lệnh riêng và cách xử lý chứng chỉ riêng, và một mô-đun UART tùy ý có thể không hỗ trợ cả hai. Hãy tra tài liệu tham chiếu lệnh AT TCP/IP của phần sụn bạn dùng thay vì cho rằng cú pháp trên áp dụng cho nó.

Độ dài tải trọng trong AT+CIPSEND phải khớp với những gì bạn thực sự gửi, nếu không mô-đun sẽ chờ các byte không bao giờ đến và kết nối trông như bị treo. Lỗi đó trông giống sự cố mạng và gần như luôn là sai lệch một đơn vị về độ dài.

Định tuyến kết nối qua cổng mạng

Cổng mạng cần tuyến tới đích riêng, quyền chuyển tiếp từ mạng thiết bị vào đường hầm và đường quay về chạm tới mô-đun. Nếu phía xa không định tuyến ngược về mạng con của thiết bị, thiết kế cần một quy tắc dịch có chủ đích, và quy tắc đó thay đổi danh tính nguồn mà dịch vụ nhìn thấy.

ip route get 10.90.0.20
sudo tcpdump -ni wg0 'host 10.90.0.20 and port 9000'
sudo conntrack -L | grep 9000

Hãy quan sát đường quay về trước. Một gói được chuyển tiếp đến được dịch vụ mà không bao giờ quay lại sẽ tạo ra thời gian chờ ở mô-đun mà không có lỗi nào trên cổng mạng, khiến người ta nhìn chằm chằm vào liên kết Wi-Fi hàng giờ. Bản ghi conntrack cho bạn biết cổng mạng có thấy phản hồi hay không.

Quyết định nơi đường hầm thực sự kết thúc

Đường hầm bắt đầu ở cổng mạng. Nó không mã hóa liên kết UART, và nó không biến phân đoạn LAN giữa mô-đun và cổng mạng thành một phần của đường hầm. Bất cứ thứ gì cần bảo vệ trên phân đoạn đó đều cần cơ chế riêng, và TCP thường trong ví dụ này không phải TLS.

Cũng phải quyết định điều gì xảy ra khi đường hầm sụp. Nếu việc phân phối bắt buộc chỉ qua VPN, chính sách chuyển tiếp không được cho phép cùng đích đó qua một đường khác, vì tuyến dự phòng sẽ âm thầm vô hiệu hóa yêu cầu. Hãy giới hạn hành vi kết nối lại để mô-đun bị ngắt không làm tràn liên kết nối tiếp hay dịch vụ từ xa bằng các lần thử lặp lại.

Ghi lại bốn câu trả lời cùng nhau: địa chỉ của mô-đun, đích của socket, tuyến của cổng mạng và nơi mã hóa bắt đầu. Người tiếp theo gỡ lỗi thiết bị này sẽ cần cả bốn, và không câu nào suy ra được chỉ từ phần sụn.

Bài viết liên quan