最近在做一个课设。大体需求是用运动手环获取用户的心率,体温等数据,然后传输到微信小程序页面上进行呈现。个人负责系统的软件端编写,因为第一次接触MQTT协议,所以来做个简单的记录。
1. MQTT客户端安装
这里参考了1-4 MQTT服务端连接操作 – 太极创客的教程,我选择了款免费的MQTT客户端软件–MQTTfx。MQTTfx的官网地址是:http://mqttfx.org。安装过程不再赘述。
点开mqttfx.exe,进入MQTTfx界面。点击设置按钮。
Profile Name随便取。
Profile Type选择MQTT Broker。
Broker Address 这里我参考了公用MQTT服务器列表 – 太极创客,然也物联的官网地址是:http://www.ranye-iot.net
MQTT服务器地址:test.ranye-iot.net
TCP 端口:1883
TCP/TLS 端口:8883
网上很多教程都是要求手动搭建服务器的,但尝试后发现直接使用第三方服务器更为方便:)
所以Broker Address 填入test.ranye-iot.net即可。
Broker Port 1883。
填完之后点OK,然后回到主页点击Connect。
2. 数据传输的代码
import time
import paho.mqtt.client as mqtt
import msgpack
from binascii import *
import mysql.connector
def on_subscribe(mosq, obj, mid, granted_qos):
print("Subscribed: " + str(mid))
def on_message(mosq, obj, msg):
print(msg.topic+" "+msg.payload.decode("utf-8"))
db = mysql.connector.connect(
host="localhost",
port=3306, # 端口号
user="myweb", # 数据库用户
password="111111", # 数据库密码
database="fjtcs_xyz" # 要连接的数据库名称
)
cursor=db.cursor()
sql = "INSERT INTO ppp (temperature,wine,heartrate,bloodpressurehigh,bloodpressurelow) VALUES (%s,%s,%s,%s,%s);"
# 执行SQL语句
global temperature
global wine
global heartrate
global bloodpressurehigh
global bloodpressurelow
if msg.topic == "data-of-zcj": #订阅的频道的名称
print(type(msg.topic), type(msg.payload.decode("utf-8")))
# 一些数据处理,为了使存入的数据符合数据库里数据的格式
arr = str(msg.payload).split(",")
arr[0] = arr[0][2:]
arr[4] = arr[4][:2]
print(arr)
temperature = float(arr[0])
wine = float(arr[1])
heartrate = int(arr[2])
bloodpressurehigh = int(arr[3])
bloodpressurelow = int(arr[4])
cursor.execute(sql, [temperature,wine,heartrate,bloodpressurehigh,bloodpressurelow])
db.commit()#提交请求,不然不会插入数据
def on_connect(mosq, obj, flags, rc):
print("Connected with result code " + str(rc))
mqttc.subscribe("data-of-zcj", 0) #这里填的是频道的名称
print("Connected")
mqttc = mqtt.Client('MQTT-sever-of-zcj') #MQTT服务器的名称
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_message = on_message
mqttc.connect("test.ranye-iot.net", 1883, 60) #填入服务器地址
mqttc.publish("message-of-zcj", "MQTT star", qos=0, retain=False) # 发布消息(无关紧要,主要内容是接收消息)
mqttc.loop_forever()