Kiểm tra ổ cắm Python nếu máy khách ngắt kết nối

Sau khi kết nối được thiết lập, khách hàng có thể gửi dữ liệu đến nhà môi giới và nhà môi giới có thể gửi dữ liệu cho khách hàng theo yêu cầu

Bạn có thể coi kết nối TCP/IP tương tự như kết nối điện thoại

Sau khi kết nối điện thoại được thiết lập, bạn có thể nói chuyện qua điện thoại cho đến khi một bên gác máy

Trong hướng dẫn này, chúng ta sẽ xem xét việc kết nối với nhà môi giới MQTT bằng ứng dụng khách paho python mqqt

Phương thức kết nối

Để thiết lập kết nối với nhà môi giới MQTT bằng ứng dụng khách Python, bạn sử dụng phương thức kết nối của đối tượng máy khách

Phương thức có thể được gọi với 4 tham số. Khai báo phương thức kết nối được hiển thị bên dưới với các tham số mặc định

kết nối [máy chủ, cổng = 1883, keepalive = 60, bind_address =””]

Tham số duy nhất bạn cần cung cấp là tên máy chủ

Đây có thể là địa chỉ IP hoặc tên miền của nhà môi giới

Ghi chú. bạn có thể cần thiết lập mật khẩu dòng cài đặt khác, di chúc cuối cùng và di chúc, v.v. trước khi kết nối. Xem Làm việc với đối tượng Client

Phương thức kết nối là một chức năng chặn có nghĩa là tập lệnh của bạn sẽ dừng trong khi kết nối đang được thiết lập

Nỗ lực kết nối có thành công không?

Khi khách hàng gửi yêu cầu kết nối tới nhà môi giới, yêu cầu đó sẽ nhận được xác nhận

Xác nhận của nhà môi giới sẽ tạo ra một cuộc gọi lại [on_connect]

Nếu bạn muốn chắc chắn rằng nỗ lực kết nối đã thành công thì bạn cần thiết lập một chức năng để xử lý cuộc gọi lại này trước khi bạn tạo kết nối

Hàm sẽ nhận 4 tham số và có thể được gọi là bất cứ thứ gì bạn muốn

Tôi đã gọi cho tôi on_connect[]

Dưới đây là một định nghĩa chức năng ví dụ

def on_connect[client, userdata, flags, rc]:
    if rc==0:
        print["connected OK Returned code=",rc]
    else:
        print["Bad connection Returned code=",rc]

Khách hàng là một đối tượng khách hàng

rc [mã trả về] được sử dụng để kiểm tra xem kết nối đã được thiết lập chưa. [xem bên dưới]

Ghi chú. Nó cũng phổ biến để đăng ký trong cuộc gọi lại on_connect

Mã trả về kết nối

  • 0. Kết nối thành công
  • 1. Kết nối bị từ chối - phiên bản giao thức không chính xác
  • 2. Kết nối bị từ chối - mã định danh khách hàng không hợp lệ
  • 3. Kết nối bị từ chối – máy chủ không khả dụng
  • 4. Kết nối bị từ chối – tên người dùng hoặc mật khẩu không hợp lệ
  • 5. Kết nối bị từ chối - không được phép
  • 6-255. Hiện chưa sử dụng

Cờ và dữ liệu người dùng thường không được sử dụng. Tài liệu đầy đủ ở đây

Đang xử lý Cuộc gọi lại On_connect

Để xử lý cuộc gọi lại, bạn sẽ cần chạy một vòng lặp. [xem hiểu vòng lặp mạng]

Do đó, kịch bản thường trông như thế này

  1. Tạo đối tượng Client
  2. Tạo chức năng gọi lại on_connect[]
  3. Liên kết gọi lại với chức năng gọi lại [on_connect[]]
  4. Kết nối với nhà môi giới
  5. Bắt đầu một vòng lặp

Vì chức năng gọi lại không đồng bộ nên bạn không biết khi nào nó sẽ được kích hoạt

Tuy nhiên, điều chắc chắn là có một khoảng thời gian trễ giữa kết nối được tạo và cuộc gọi lại được kích hoạt

Điều quan trọng là tập lệnh của bạn không tiếp tục cho đến khi kết nối được thiết lập

Đối với các tập lệnh demo nhanh, tôi sử dụng thời gian. sleep[] để đợi và thiết lập thời gian kết nối

Tuy nhiên, đối với các tập lệnh hoạt động, tôi xử lý cuộc gọi lại và sử dụng nó để gắn cờ kết nối thành công hoặc không thành công

Vì vậy, thay vì điều này

  1. Tạo kết nối
  2. Xuất bản tin nhắn

Chúng tôi có thứ này

  1. Tạo kết nối
  2. Xác minh kết nối thành công hoặc thoát
  3. Xuất bản tin nhắn và hoặc đăng ký

Đây là một số mã ví dụ sử dụng thời gian. sleep[] để đợi và cho thời gian thiết lập kết nối để hoàn tất

import paho.mqtt.client as mqtt    #import client library
def on_connect[client, userdata, flags, rc]:
   if rc==0
      print["connected ok"]
client = mqtt.Client[“python1”]             #create new instance 
client.on_connect=onconnect  #bind call back function
client.connect[broker_address]               #connect to broker
client.loop_start[]  #Start loop 
time.sleep[4] # Wait for connection setup to complete
Other code here
client.loop_stop[]    #Stop loop 

Tăng cường gọi lại

Để kiểm soát kết nối tốt hơn, tôi sử dụng cờ trong cuộc gọi lại on_connect

Cờ tôi tạo như một phần của đối tượng máy khách để nó có sẵn trong toàn bộ tập lệnh

client.connected_flag=False

Khi bắt đầu tập lệnh, tôi đặt cờ này [connected_flag] thành Sai và chuyển nó thành Đúng khi Kết nối thành công và quay lại Sai khi chúng tôi bị ngắt kết nối

def on_connect[client, userdata, flags, rc]:
    if rc==0:
        client.connected_flag=True #set flag
        print["connected OK Returned code=",rc]
        #client.subscribe[topic]
    else:
        print["Bad connection Returned code= ",rc]

Bây giờ chúng ta có thể sử dụng cờ này để tạo vòng lặp chờ

client.connect[broker_address]      #connect to broker
while not client.connected_flag: #wait in loop
     time.sleep[1]

Tập lệnh kết nối máy khách mẫu

Tập lệnh sau đây là tập lệnh kết nối máy khách cơ bản


#!python3
import paho.mqtt.client as mqtt  #import the client1
import time

def on_connect[client, userdata, flags, rc]:
    if rc==0:
        client.connected_flag=True #set flag
        print["connected OK"]
    else:
        print["Bad connection Returned code=",rc]

mqtt.Client.connected_flag=False#create flag in class
broker="192.168.1.184"
client = mqtt.Client["python1"]             #create new instance 
client.on_connect=on_connect  #bind call back function
client.loop_start[]
print["Connecting to broker ",broker]
client.connect[broker]      #connect to broker
while not client.connected_flag: #wait in loop
    print["In wait loop"]
    time.sleep[1]
print["in Main Loop"]
client.loop_stop[]    #Stop loop 
client.disconnect[] # disconnect

Nếu tôi chạy tập lệnh này thì đây là những gì tôi thấy

Ví dụ kết nối thất bại

Có nhiều điều kiện khác nhau là kết nối có thể không hoàn thành. họ đang

  • Cài đặt máy khách không chính xác e. g. mật khẩu xấu
  • Không có kết nối mạng
  • Tham số kết nối mạng xấu e. g. số cổng xấu

Điều quan trọng là chúng được phát hiện và xử lý bởi tập lệnh kết nối

Chúng tôi sẽ xem xét một vài trong số này và sửa đổi mã kết nối của chúng tôi để phát hiện chúng

Ghi chú. Đối với những ví dụ này, tôi sẽ sử dụng ứng dụng khách Paho MQTT và nhà môi giới Mosquitto

Lỗi kết nối tạo ngoại lệ

Cố gắng kết nối với một nhà môi giới bằng địa chỉ IP hoặc số cổng không hợp lệ sẽ tạo ra lỗi ổ cắm và đưa ra một ngoại lệ

Vì vậy, ảnh chụp màn hình đầu tiên hiển thị kết quả của việc sử dụng số cổng không hợp lệ

Điều này gây ra lỗi Winsock trong Windows

Trong Python, chúng ta có thể sử dụng khối Try để bắt cái này thay vì

client.connect[broker,port] #connect to broker

Chúng tôi sử dụng


try:
    client1.connect[broker,port] #connect to broker
except:
    print[“connection failed”]
    exit[1] #Should quit or raise flag to quit or retry

Khi nỗ lực kết nối không thành công, chúng ta sẽ thấy

Lỗi kết nối được phát hiện thông qua mã trả lại

Để xác định xem kết nối có thành công hay không, chúng ta cần kiểm tra mã trả về của lệnh gọi lại on_connect

Mã trả về 0 là thành công, trong khi các giá trị khác cho biết lỗi

Trong ví dụ bên dưới, chúng tôi sẽ cố gắng kết nối với một nhà môi giới mà không cung cấp xác thực bắt buộc

Lưu ý rằng kết nối không thành công và trả về mã trả về là 5 cho biết lỗi xác thực

Bạn cũng nên lưu ý rằng vì tôi đang sử dụng hàm loop_start[] nên máy khách sẽ cố gắng kết nối lại, nhưng điều này là vô nghĩa vì kết quả sẽ giống nhau

Vì vậy, mã của chúng tôi nên

  1. Dừng vòng lặp
  2. Dừng kịch bản

Chúng ta có thể dừng vòng lặp trong cuộc gọi lại on_connect. Tuy nhiên, để dừng tập lệnh chính, chúng tôi cần đặt cờ mà chúng tôi có thể sử dụng để thoát

Tôi thích sử dụng cờ và dừng vòng lặp như một phần của tập lệnh chính

Đây là giao diện gọi lại on_connect đã sửa đổi

________số 8

Đây là sửa đổi tập lệnh chính để thoát

mqtt.Client.bad_connection_flag=False #
import paho.mqtt.client as mqtt    #import client library
def on_connect[client, userdata, flags, rc]:
   if rc==0
      print["connected ok"]
client = mqtt.Client[“python1”]             #create new instance 
client.on_connect=onconnect  #bind call back function
client.connect[broker_address]               #connect to broker
client.loop_start[]  #Start loop 
time.sleep[4] # Wait for connection setup to complete
Other code here
client.loop_stop[]    #Stop loop 
0

Khi tôi chạy tập lệnh, đây là những gì tôi thấy

 


Sử dụng xác thực

Nếu nhà môi giới yêu cầu xác thực tên người dùng và mật khẩu [xem Xác thực tên người dùng và mật khẩu Mosquitto ] thì bạn cần đặt điều này trước khi kết nối

Điều này bạn làm bằng cách sử dụng hàm trợ giúp username_pw_set[]. e. g

import paho.mqtt.client as mqtt    #import client library
def on_connect[client, userdata, flags, rc]:
   if rc==0
      print["connected ok"]
client = mqtt.Client[“python1”]             #create new instance 
client.on_connect=onconnect  #bind call back function
client.connect[broker_address]               #connect to broker
client.loop_start[]  #Start loop 
time.sleep[4] # Wait for connection setup to complete
Other code here
client.loop_stop[]    #Stop loop 
1

Kết nối bằng Websockets

Thông thường, ứng dụng khách python sẽ kết nối bằng MQTT nhưng nó cũng có thể kết nối bằng MQTT qua ổ cắm web

Để yêu cầu khách hàng sử dụng ổ cắm web thay vì MQTT, hãy sử dụng lệnh

khách hàng = paho. Máy khách[“cname”,transport=’websockets’]

thay vì đơn giản

khách hàng = paho. Khách hàng[“cname”]

Bạn cũng sẽ cần thay đổi cổng. Websockets thường sử dụng cổng 9001

Xem MQTT qua Websockets để biết thêm chi tiết

Xử lý ngắt kết nối và kết nối lại

Máy khách có thể ngắt kết nối một cách dễ dàng, nếu nó không còn dữ liệu để gửi bằng cách gửi thông báo ngắt kết nối

Ứng dụng khách Paho cung cấp phương thức ngắt kết nối cho việc này

Nó cũng có thể bị ngắt kết nối do kết nối mạng kém

Nếu kết nối không thành công vì một số lý do thì bạn sẽ cần phải quyết định có nên thử kết nối lại hay không

Việc ngắt kết nối sẽ kích hoạt lệnh gọi lại on_disconnect mà bạn sẽ cần kiểm tra

Cuộc gọi lại này có 3 tham số

Client- Đối tượng client bị ngắt kết nối

Userdata- dữ liệu do người dùng xác định không thường xuyên được sử dụng

Return Code [rc]- Chỉ ra lý do ngắt kết nối. 0 là bình thường tất cả các giá trị khác biểu thị ngắt kết nối bất thường

Đây là mã on_disconnect[] tôi sử dụng

import paho.mqtt.client as mqtt    #import client library
def on_connect[client, userdata, flags, rc]:
   if rc==0
      print["connected ok"]
client = mqtt.Client[“python1”]             #create new instance 
client.on_connect=onconnect  #bind call back function
client.connect[broker_address]               #connect to broker
client.loop_start[]  #Start loop 
time.sleep[4] # Wait for connection setup to complete
Other code here
client.loop_stop[]    #Stop loop 
2

Bạn có thể thấy rằng tôi chỉ cần đăng nhập nó, sau đó đặt các cờ mà chương trình chính có thể sử dụng để phát hiện ngắt kết nối

Ghi chú. Bạn sẽ cần phải gọi hoặc chạy một vòng lặp để kích hoạt cuộc gọi lại

kết nối lại

Nói chung, bạn sẽ cần phải kết nối lại càng sớm càng tốt

Nếu bạn chạy vòng lặp mạng bằng cách sử dụng loop_start[] hoặc loop_forever[] thì các kết nối lại sẽ tự động được xử lý cho bạn

Một nỗ lực kết nối mới được thực hiện tự động trong nền cứ sau 3 đến 6 giây

Nếu bạn gọi hàm loop[] theo cách thủ công thì bạn sẽ cần tự xử lý các lần thử kết nối lại. Xem hiểu vòng lặp

Bạn có thể thực hiện việc này bằng cách sử dụng cờ kết nối được bật bởi lệnh gọi lại on_connect và on_disconnect

Tóm tắt kết nối máy khách

Có tính đến mã kết nối khách hàng ở trên của chúng tôi nên

  • Kết nối với nhà môi giới
  • Kiểm tra trạng thái kết nối và tiến hành nếu tốt
  • Nếu trạng thái kết nối không tốt, hãy thử lại và hoặc thoát
  • Xử lý ngắt kết nối và kết nối lại

Những vấn đề chung

1. Không thấy bất kỳ tin nhắn nào hoặc không thấy tất cả các tin nhắn dự kiến

nguyên nhân có thể

  1. Bạn chưa bắt đầu vòng lặp mạng hoặc chưa gọi hàm loop[]. Hoặc bạn chưa đăng ký hoặc chưa tạo chức năng gọi lại
  2. Bạn chưa đăng ký đúng chủ đề hoặc đăng ký không thành công
  3. Hạn chế truy cập được áp dụng

2. - Tin nhắn của tôi không xuất hiện theo thứ tự tôi mong đợi?

nguyên nhân có thể

  1. Các chức năng gọi lại là các chức năng không đồng bộ có thể được gọi bất cứ lúc nào. Sử dụng hàng đợi để lưu trữ tin nhắn và in ở một nơi

Video- Kết nối máy khách MQTT bằng Máy khách MQTT Python

Rất biết ơn nếu bạn cung cấp phản hồi vì nó sẽ giúp ích cho các video tiếp theo

Liên kết khóa học

  1. Giới thiệu về ứng dụng khách Paho Python MQTT
  2. Giới thiệu về lớp khách hàng
  3. Kết nối với một nhà môi giới
  4. Xuất bản bằng ứng dụng khách Paho Python MQTT
  5. –Đăng ký sử dụng The Paho Python Client
  6. Nhận tin nhắn với ứng dụng khách Paho MQTT Python
  7. Hiểu vòng lặp
  8. Hiểu các cuộc gọi lại
  9. Xử lý nhiều kết nối máy khách

Đừng quên Đăng ký các bài đăng mới nhất và nhận thông báo về các bài đăng và video mới trực tiếp vào hộp thư đến của bạn

Làm cách nào để biết khi nào một ổ cắm được đóng ở đầu bên kia?

Làm cách nào để biết khi nào ổ cắm được đóng ở đầu bên kia? . e. đọc các byte bằng 0 từ ổ cắm], trong trường hợp đó, chúng tôi biết rằng kết nối đã bị đóng. call read on the socket for a connection and check whether read returns 0 [i.e. reads zero bytes from the socket], in which case we know that the connection has been closed.

Python có tự động đóng ổ cắm không?

Python tiến thêm một bước nữa về tính năng tự động tắt và nói rằng khi một ổ cắm được thu gom rác, nó sẽ tự động đóng nếu cần.

Chủ Đề