【MQTT接收数据写入数据库】

MQTT接收数据写入数据库

1.搭建MQTT服务器

参考上一篇文章

2.安装数据库mysql

sudo apt update
sudo apt install mysql-server

创建一个数据库和数据表存储mqtt消息

首先,登录到MySQL服务器:

mysql -u root -p

输入你的root用户密码。默认root

3.创建mqtt数据表

  1. 创建数据库:
CREATE DATABASE mqtt_data;
  1. 选择创建的数据库:
USE mqtt_data;
  1. 创建数据表:

这里我们假设你从MQTT接收到的数据是一个简单的字符串。我们将创建一个包含两个字段的表,一个字段是自增的ID,另一个字段用于存储字符串数据。

CREATE TABLE mqtt_messages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    message_data VARCHAR(255) NOT NULL,
    received_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

完成以上步骤后,你现在有一个名为mqtt_data的数据库和一个名为mqtt_messages的数据表。

4.编写python脚本来从MQTT接收数据并保存到数据库

模板文件

import paho.mqtt.client as mqtt
import mysql.connector

# MySQL数据库配置
db_config = {
    'host': 'localhost',
    'user': 'root',
    'password': 'your_root_password',  # 替换为你的root密码
    'database': 'mqtt_data'
}

# 连接到数据库
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()

# MQTT配置
MQTT_BROKER = 'localhost'  # 或其他MQTT服务器地址
MQTT_PORT = 1883
MQTT_TOPIC = 'your_topic'  # 更改为你的MQTT主题

# 当接收到MQTT消息时的回调函数
def on_message(client, userdata, message):
    data = message.payload.decode('utf-8')
    print("Received message:", data)
    
    # 插入数据到数据库
    try:
        cursor.execute("INSERT INTO mqtt_messages (message_data) VALUES (%s)", (data,))
        conn.commit()
    except Exception as e:
        print("Error saving data to database:", e)

client = mqtt.Client()
client.connect(MQTT_BROKER, MQTT_PORT)
client.subscribe(MQTT_TOPIC)
client.on_message = on_message
client.loop_forever()

MQTT_BROKER = ‘localhost’ # 或其他MQTT服务器地址代表本地的服务器

运行上述Python脚本后,每当有新的消息发布到你所订阅的MQTT主题时,on_message回调函数就会被调用,消息数据会被保存到你在MySQL中创建的mqtt_messages表中。

注意:别忘了替换your_root_password为你MySQL的root用户的实际密码,以及更改your_topic为你希望从MQTT broker订阅的实际主题。

更改后我的文件如下

import paho.mqtt.client as mqtt
import mysql.connector

# MySQL数据库配置
db_config = {
    'host': 'localhost',
    'user': 'root',
    'password': 'root',  # 替换为你的root密码
    'database': 'mqtt_data'
}

# 连接到数据库
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()

# MQTT配置
MQTT_BROKER = 'localhost'  # 或其他MQTT服务器地址
MQTT_PORT = 1883
MQTT_TOPIC = 'hdjhdj/newbie'  # 更改为你的MQTT主题

# 当接收到MQTT消息时的回调函数
def on_message(client, userdata, message):
    data = message.payload.decode('utf-8')
    print("Received message:", data)
    
    # 插入数据到数据库
    try:
        cursor.execute("INSERT INTO mqtt_messages (message_data) VALUES (%s)", (data,))
        conn.commit()
    except Exception as e:
        print("Error saving data to database:", e)

client = mqtt.Client()
client.connect(MQTT_BROKER, MQTT_PORT)
client.subscribe(MQTT_TOPIC)
client.on_message = on_message
client.loop_forever()

image-20230906001420106

5.运行py脚本

出现如下错误

image-20230906001630585

解决办法如下

错误信息是:

mysql.connector.errors.ProgrammingError: 1698 (28000): Access denied for user 'root'@'localhost'

这意味着Python脚本在尝试连接到MySQL数据库时遇到了权限问题。具体来说,root用户在localhost上没有登录MySQL的权限。这可能是由于以下原因:

  1. 密码错误:确保db_config中的密码与你为MySQL root用户设置的密码匹配。
  2. 权限问题:在默认的MySQL安装中,root用户可能没有通过密码从本地登录的权限。这意味着,即使密码是正确的,你仍然可能会收到“Access denied”错误。

解决错误如下:

使用其他用户 :考虑创建一个新的MySQL用户,并给予其适当的权限,然后在Python脚本中使用这个用户进行连接。

例如,为了创建一个名为mqttuser,密码为mqttpassword的用户,并给予其对mqtt_data数据库的所有权限,你可以执行以下SQL命令:

CREATE USER 'mqttuser'@'localhost' IDENTIFIED BY 'mqttpassword';
GRANT ALL PRIVILEGES ON mqtt_data.* TO 'mqttuser'@'localhost';
FLUSH PRIVILEGES;

然后,在使用新的用户名和密码。

打开mysql执行以上命令

image-20230906002156217

更改py脚本中用户名和密码

import paho.mqtt.client as mqtt
import mysql.connector

# MySQL数据库配置
db_config = {
    'host': 'localhost',
    'user': 'mqttuser',
    'password': 'mqttpassword',  # 替换为你的root密码
    'database': 'mqtt_data'
}

# 连接到数据库
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()

# MQTT配置
MQTT_BROKER = 'localhost'  # 或其他MQTT服务器地址
MQTT_PORT = 1883
MQTT_TOPIC = 'hdjhdj/newbie'  # 更改为你的MQTT主题

# 当接收到MQTT消息时的回调函数
def on_message(client, userdata, message):
    data = message.payload.decode('utf-8')
    print("Received message:", data)
    
    # 插入数据到数据库
    try:
        cursor.execute("INSERT INTO mqtt_messages (message_data) VALUES (%s)", (data,))
        conn.commit()
    except Exception as e:
        print("Error saving data to database:", e)

client = mqtt.Client()
client.connect(MQTT_BROKER, MQTT_PORT)
client.subscribe(MQTT_TOPIC)
client.on_message = on_message
client.loop_forever()

再次执行该脚本

 python3 mqtt_to_db.py

image-20230906002429422

这里没有任何数据出现 则代表订阅主题成功,连接数据库成功

6.验证MQTT

这里我的主题是 hdjhdj/newbie

使用服务器对该主题发布消息验证是否成功,我们可以看到一个客户端已经连接

image-20230906002755250

发布消息

image-20230906003115040

image-20230906003250995

7.查询数据库存储消息

手动检查数据库内容:

登录到MySQL:

mysql -u mqttuser -p

输入你的密码,然后选择数据库并查看mqtt_messages表的内容:

USE mqtt_data;
SELECT * FROM mqtt_messages;

这将显示表中的所有行。应该能看到你通过MQTT发送的消息。

image-20230906003735225

至此完成

  • 4
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: MQTT协议常常用于物联网的数据传输,这些数据可能需要存储在数据库中以便分析和处理。将MQTT数据存入数据库需要经过以下步骤: 1.连接MQTT broker:首先需要连接到MQTT broker来接收数据。可以使用第三方库如paho-mqtt来编写Subscriber代码并订阅所需主题。Subscriber代码接收到的数据通常以JSON格式返回。 2.解析数据:使用Python内置库json来解析数据以便进一步处理。 3.连接数据库:使用Python的SQLAlchemy模块,连接到目标关系型数据库,并创建要存储数据的表格。 4.写入数据:通过Python脚本将数据添加到表格中。可以使用SQLAlchemy来生成SQL语句对表格进行添加。 5.关闭数据库:关闭数据库连接。 总结:将MQTT数据存入数据库需要通过连接MQTT broker,解析数据,连接数据库写入数据和关闭数据库等步骤来完成。Python语言中可以使用MySQL,Oracle,PostgreSQL,SQLite或MariaDB等关系型数据库,常常使用paho-mqtt,json和SQLAlchemy等第三方库来编写代码实现数据存入数据库。 ### 回答2: MQTT协议是一种轻量级的消息传输协议,常用于物联网设备之间的通信。在实际的应用中,我们往往需要将设备发送的MQTT数据存入数据库中,进行后续的数据处理和分析。本文将介绍如何将MQTT数据存入数据库中。 一、数据接收 首先,我们需要建立一个MQTT客户端,用于接收设备发送的消息。在建立MQTT客户端时,需要指定消息的主题(Topic),设备将数据发布到指定的主题上,我们才能接收到。下面是一个MQTT客户端的示例代码: ```python import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.subscribe("topic") def on_message(client, userdata, msg): print(msg.topic+" "+msg.payload.decode()) client = mqtt.Client() client.username_pw_set("username", "password") # 设置用户名和密码 client.on_connect = on_connect client.on_message = on_message client.connect("broker.hivemq.com", 1883, 60) # 连接到MQTT服务器 client.loop_forever() ``` 上述代码建立了一个MQTT客户端,监听主题为“topic”的消息,并将消息打印出来。 二、数据存储 接下来,我们需要将接收到的MQTT数据存入数据库中。基于Python语言,我们可以使用MySQLdb、psycopg2等库与MySQL、PostgreSQL等数据库进行交互。这里以MySQL数据库为例,介绍如何将MQTT数据存入MySQL数据库中。 1.建立数据库连接 首先,我们需要建立与MySQL数据库的连接。需要指定数据库的名称、用户名、密码、主机、端口等信息。下面是一个建立MySQL数据库连接的示例代码: ```python import MySQLdb db = MySQLdb.connect(host="localhost", port=3306, user="username", passwd="password", db="dbname") cursor = db.cursor() ``` 2.创建数据表 在MySQL数据库中,我们需要先创建一个数据表,用于存储MQTT数据。下面是一个创建数据表的示例代码: ```python sql = """ CREATE TABLE mqtt_data ( id INT(11) NOT NULL AUTO_INCREMENT, topic VARCHAR(100) NOT NULL, payload TEXT NOT NULL, timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; """ cursor.execute(sql) db.commit() ``` 上述代码创建了一个名为“mqtt_data”的数据表,包含主键ID、主题、消息载荷、时间戳等字段。 3.插入数据 接下来,我们需要将接收到的MQTT数据插入到数据表中。下面是一个插入MQTT数据的示例代码: ```python def on_message(client, userdata, msg): print(msg.topic+" "+msg.payload.decode()) cursor.execute("INSERT INTO mqtt_data (topic, payload) VALUES (%s, %s)", (msg.topic, msg.payload.decode())) db.commit() ``` 上述代码将接收到的MQTT数据插入到数据表“mqtt_data”中。 三、总结 本文介绍了如何将MQTT数据存入MySQL数据库中。具体步骤包括建立MQTT客户端、接收MQTT数据、建立数据库连接、创建数据表、插入数据等。通过将MQTT数据存入数据库中,可以进行后续的数据处理和分析,更好地利用物联网设备的数据。 ### 回答3: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种消息传输协议,它允许设备和应用程序之间进行实时通信和数据共享。对于需要实时监控和响应的场景,使用MQTT协议是一种方便高效的选择。在使用MQTT协议进行数据传输的同时,我们也需要将相关数据存入数据库中,方便后续分析和应用。 一般来说,将MQTT数据存入数据库可以分为以下几个步骤: 1. 确定数据库类型:根据实际需求,可以选择不同类型的数据库,比如MySQL、MongoDB、InfluxDB等。 2. 搭建数据库环境:根据所选择的数据库类型,搭建相应的数据库环境。 3. 设定数据库连接:建立与数据库的连接,使用相应的库或框架,比如pymysql、pymongo等。 4. 定义数据结构:根据MQTT发布的数据,定义相应的数据结构,并定义对应的数据库表或集合。 5. 将MQTT数据解析后存入数据库:获取MQTT协议传输的数据,对数据进行解析并存入数据库中。一般来说,我们可以使用Python等编程语言,或使用MQTT相关的库实现数据解析和存储。 举一个例子:存储温度传感器数据 1. 确认数据库类型:我们选择使用InfluxDB。 2. 搭建数据库环境:在InfluxDB中创建一个database(例如:weather)。 3. 设定数据库连接:使用pandas库中的influxdb库建立与InfluxDB的连接。 4. 定义数据结构:定义数据库中的表weatherdata,包含字段time(时间)、location(位置)、temperature(温度)。 5. 将MQTT数据解析后存入数据库:使用MQTT库订阅温度传感器数据,解析数据,将解析后的数据存入数据库中。 在完整的程序中,我们需要编写订阅MQTT数据的代码,编写解析MQTT数据的代码,并将解析后的数据存入数据库中。最后,我们可以使用类似Grafana的可视化工具实现对存储在数据库中的MQTT数据进行可视化显示。 总之,将MQTT数据存入数据库需要根据实际场景和需求选择合适的数据库类型和相关工具,同时需要编写相应的代码实现数据解析和存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值