Kết nối TCP SIM5320 MQTT đóng đột ngột sau thời gian


7

Tôi đã làm việc trên một giao thức MQTT bằng SIM5320. Tôi quen thuộc với tài liệu lệnh AT và có một triển khai làm việc với Arduino.

Đầu tiên, tôi mở một ổ cắm mạng bằng AT + NETOPEN, sau đó mở kết nối TCP với AT + CIPOPEN = 0, "TCP", "địa chỉ ip", cổng. Sau đó tôi truyền dữ liệu cho giao thức MQTT bằng AT + CIPSEND, thực thi thành công. Nếu tôi gửi dữ liệu đến mô-đun SIM thông qua MQTT, nó cũng được nhận và tin nhắn được phát hiện.

Với MQTT, có một khoảng Keep-Alive xác định thời gian máy chủ sẽ giữ kết nối mở giữa các lần giao tiếp, về cơ bản là máy khách có thể nhàn rỗi bao lâu trước khi bị ngắt kết nối khỏi máy chủ. Tuy nhiên, tôi đã đặt giá trị này tối đa là 18 giờ, lâu hơn nhiều so với ngắt kết nối ~ 15 phút.

Vấn đề của tôi phát sinh sau ~ 15 phút, khi tôi cố gắng gửi lệnh đến máy chủ và không có phản hồi nào được đưa ra. SIM chưa phát hành "+ IPCLOSE: 0,4", thường xảy ra khi máy chủ buộc ngắt kết nối máy khách hoặc bất kỳ loại chỉ báo nào khác.

Ngoài ra, tôi vẫn có thể gửi dữ liệu và có vẻ như kết nối CIP vẫn mở, như được chỉ ra bởi "AT + CIPOPEN?". Khi tôi thử và đóng kết nối với "AT + CIPCLOSE = 0", tôi nhận được "+ CIPCLOSE: 0,4" và "ERROR". Không có đề cập đến ý nghĩa của "+ CIPCLOSE: 0,4" trong tài liệu, tuy nhiên dường như nó không đóng kết nối, vì nó không thể được mở hoặc sử dụng.

Tôi thực sự rất muốn biết những gì đang xảy ra trong 15 phút này, giữa việc thiết lập kết nối và gửi dữ liệu, để cố gắng gửi lại dữ liệu. Không có cảnh báo hoặc bất kỳ dấu hiệu cho thấy bất cứ điều gì sai, vì vậy tôi rất bối rối.

Ban đầu tôi đã hỏi câu hỏi này về trao đổi ngăn xếp Kỹ thuật điện, nhưng cũng được khuyên nên hỏi nó ở đây.

Tôi đã đính kèm mã tôi đã viết ở đây cho bất kỳ ai muốn xem và không có thư viện nào bạn cần để chạy nó.


2
Nhìn vào MQTT Keep Alive Interval Giải thích có vẻ như nguyên nhân rất có thể là do kết nối vận chuyển bị mất tại một số điểm trong ngăn xếp truyền thông. Gửi dữ liệu sẽ giữ cho giao tiếp MQTT tăng lên và nhà môi giới sẽ gửi ping xuống nếu nó không gửi bất cứ điều gì khác. Vì vậy, modem có thể đi vào giấc ngủ nếu không có hoạt động? Một câu hỏi sẽ là liệu bạn có thể gửi tin nhắn ping cứ sau 10 phút khi không có lưu lượng khác không và điều đó xảy ra như thế nào.
Richard Chambers

1
Nếu tôi gửi yêu cầu ping trước khi kết nối giảm, thì kết nối vẫn hoạt động. Tuy nhiên, việc gửi yêu cầu ping cứ sau 10 phút lại gặp nhiều vấn đề hơn là gửi chúng sau mỗi 18 giờ. Nếu có thể, tôi chỉ muốn gửi yêu cầu mỗi giờ hoặc lâu hơn.
Boris Deletic

2
Bạn đang sử dụng ngôn ngữ và thư viện MQTT nào cho khách hàng của mình? Vui lòng cập nhật câu hỏi được đăng của bạn với thông tin này.
Richard Chambers

1
OP đang sử dụng mô-đun 3G gửi các gói TCP / IP dựa trên các lệnh AT được gửi đến mô-đun thông qua liên kết UART. Không có Linux liên quan ở đây cả. OP về cơ bản là viết ứng dụng khách MQTT của riêng mình.
hardillb

1
@hardillb ok mà làm rõ mọi chuyện một chút. Vì vậy, nếu OP đang viết ứng dụng khách MQTT của riêng mình từ đầu thì có vẻ như công việc phải tuân theo đặc tả MQTT bao gồm các lệnh MQTT Keep Alive cần thiết.
Richard Chambers

Câu trả lời:


7

Thời gian chờ TCP / IP mặc định là 15 phút, bạn phải gửi một cái gì đó trong khoảng này để duy trì kết nối TCP bên dưới, ngay cả khi đó chỉ là một cặp đồng bộ / ack.

Việc giữ MQTT là để thực hiện khi nào kích hoạt các thông báo Di chúc và Di chúc cuối cùng.


1
Việc giữ MQTT là để làm khi nào quyết định đóng những gì có thể là kết nối chết hoặc kết nối trực tiếp với một tác nhân chết (khách hàng hoặc nhà môi giới). Điều này lần lượt kích hoạt Di chúc và Di chúc cuối cùng. Keepalive không phải là để kích hoạt Di chúc và Di chúc cuối cùng mà là để quyết định xem một kết nối có bị chết hay không, và là một phần của việc đóng kết nối để kích hoạt Di chúc và Di chúc cuối cùng.
Richard Chambers

1
Bạn có thể cung cấp thêm chi tiết về thời gian chờ TCP / IP mà bạn đang đề cập không? Tôi giả sử bạn đang nói về thời gian chờ truyền chưa được kiểm tra mà dường như không áp dụng cho câu hỏi được đăng nhưng không chắc chắn. Và theo man7.org/linux/man-pages/man7/tcp.7.htmltcp_keepalive_time()giá trị mặc định là 7200 giây sau đó giữ cho các cuộc sống được gửi nếu SO_KEEPALIVEtùy chọn ổ cắm được đặt Nếu không kết nối bị ngắt.
Richard Chambers

1
Điều này dường như là nguyên nhân của vấn đề, bạn có thể vui lòng thêm một trích dẫn và đề xuất một phương pháp khả thi để tăng khoảng thời gian này cho SIM5320 không?
Boris Deletic

Chúng tôi đang thấy một cái gì đó rất giống với thiết lập MQTT của chúng tôi - TCP dường như ngắt kết nối nhưng khách hàng / nhà môi giới MQTT không biết. Khi chúng tôi xuất bản sau ~ 30 phút không hoạt động, PUBACK không được nhận từ nhà môi giới, nhưng theo như nhà môi giới lo ngại thì việc ngắt kết nối cũng không xảy ra.
Steve Magness
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.