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
- Tạo đối tượng Client
- Tạo chức năng gọi lại on_connect[]
- Liên kết gọi lại với chức năng gọi lại [on_connect[]]
- Kết nối với nhà môi giới
- 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
- Tạo kết nối
- Xuất bản tin nhắn
Chúng tôi có thứ này
- Tạo kết nối
- Xác minh kết nối thành công hoặc thoát
- 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
- Dừng vòng lặp
- 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
0Khi 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
1Kế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
2Bạ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ể
- 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
- Bạn chưa đăng ký đúng chủ đề hoặc đăng ký không thành công
- 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ể
- 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
- Giới thiệu về ứng dụng khách Paho Python MQTT
- Giới thiệu về lớp khách hàng
- Kết nối với một nhà môi giới
- Xuất bản bằng ứng dụng khách Paho Python MQTT
- –Đăng ký sử dụng The Paho Python Client
- Nhận tin nhắn với ứng dụng khách Paho MQTT Python
- Hiểu vòng lặp
- Hiểu các cuộc gọi lại
- 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