一、项目简介
XIBI(随便取的)是一个简单的聊天工具,通过MQTT协议实现消息的发布和订阅。你可以通过它和连接到同一个MQTT服务器的其他小伙伴聊天。当然,你也可以把它当作一个学习MQTT协议的练手项目。
主要功能:
-
连接MQTT服务器:输入昵称,点击连接按钮,就可以加入聊天室。
-
发送消息:在输入框里输入你想说的话,按下回车键或者点击发送按钮,消息就会发送到所有连接到服务器的客户端。
-
接收消息:当其他用户发送消息时,你会实时收到并显示在聊天框中。
-
语音播报:收到新消息时,系统会用语音提醒你,让你不错过任何一条“撩人”的消息。
二、代码解析
1. 导入必要的库
-
paho.mqtt.client:用于MQTT通信。
-
tkinter:用于创建图形用户界面(GUI)。
-
pyttsx3:用于文本转语音,提醒你有新消息。
import paho.mqtt.client as mqtt
import tkinter as tk
from tkinter import scrolledtext
import random
import json
import datetime # 导入 datetime 模块以获取当前时间
import pyttsx3 # 文本转语音库
2. 初始化文本转语音引擎
这里设置了语音的语速和音量,你可以根据自己的喜好调整。
engine = pyttsx3.init()
engine.setProperty("rate", 1000) # 语速
engine.setProperty("volume", 1.0) # 音量 (0.0 到 1.0)
3. MQTT配置
这里配置了MQTT服务器的地址、端口、主题(最好发布和订阅一样,后续只需要通过id来避免自己的消息就好)以及设备的名称和密钥。你可以根据自己的MQTT服务器进行修改。
BROKER = "auyppwt.iot.gz.baidubce.com" # 接入点地址
PORT = 1883 # 端口
TOPIC_PUB = "自己设计的主题" # 发布主题
TOPIC_SUB = "自己设计的主题" # 订阅主题
DEVICE_NAME = "百度云物联网平台获得" # 设备名称
DEVICE_SECRET = "百度云物联网平台获得" # 设备密钥
4. 生成随机昵称
为了防止你忘记输入昵称,贴心地为你生成了一个随机的昵称,比如“Xibi123456”。这个其实是client_id,为了避免出现两个客户端重复的情况,但是也可以修改为自己喜欢的,当然和自己的小伙伴聊天应该是不会重复的。
def generate_random_name():
return str(random.randint(100, 9999999))
5. 获取当前时间
每条消息都会带上时间戳,方便你查看消息的发送时间。
def get_current_time():
now = datetime.datetime.now()
return now.strftime("[%H:%M:%S]")
6. MQTT连接回调
这个没什么好说的就是当成功连接到MQTT服务器时,系统会提示你“成功连接Xibi!请开始聊天吧”。如果连接失败,会显示错误代码。
def on_connect(client, userdata, flags, rc, properties=None):
if rc == 0:
insert_output_box("成功连接Xibi!\n请开始聊天吧\n", "system")
client.subscribe(TOPIC_SUB, qos=1)
else:
insert_output_box(f"连接失败,错误代码:{rc}\n", "error")
7. MQTT消息接收回调
当收到消息时,系统会解析消息内容并显示在聊天框中。如果是你自己发送的消息,系统会自动忽略。这个就是因为发布和订阅的是一个主题,所以如果id一样就不会显示内容。后续实现一对一聊天也可以通过id来判断。
def on_message(client, userdata, msg):
try:
payload = json.loads(msg.payload.decode('utf-8'))
id = payload.get("id", "未知设备")
content = payload.get("str", "")
if id == client_id_entry.get():
return
insert_output_bo