- 2024-08-31
-
发表了主题帖:
【Follow me第二季第2期】+ 开箱
收到了得捷寄过来的,板子很漂亮。而且底部还有亚克力保护,看着还是挺上档次的,接口也换成了type-c的。
- 2024-06-21
-
发表了主题帖:
【2023 DigiKey大赛参与奖】开箱帖:树莓派ZERO 2W,RP2040和STM32U083C-DK开发板
纠结了好久,最后选择了树莓派ZERO 2W和STM32U083C-DK开发板,还有一个凑单的RP2040。
- 2024-01-29
-
回复了主题帖:
stm32
你的问题好混乱啊,都没看懂说的是什么。问题里的看运气是什么意思?DMA是不是循环模式,或者是不是一个缓存区都不重要,重要的是你要怎么处理接收到的数据,用的是哪个函数。
- 2024-01-25
-
加入了学习《直播回放: TI MSPM0 应用详解, 家用电器和电机控制》,观看 TI MSPM0 应用详解, 家用电器和电机控制
-
回复了主题帖:
HAL_UART_Receive_IT(huart,pData,Size)中参数size是要求一定要接收size个BYTE吗
这个函数是不阻塞的。当收到size个数据后会调用接收完成的回调函数,没收到size个数据,就一直不调用接收完成的回调函数。
- 2024-01-17
-
回复了主题帖:
EEWorld 社区 2023年度人物颁奖
恭喜恭喜
- 2024-01-12
-
发表了主题帖:
【STM32MP135F-DK】10-项目演示和汇总
这次以一个小项目为目标,对STM32MP135F开发板进行了测评,在测评中实现了开发板的系统烧写、wifi联网、网络校时、SSH连接、使用python控制GPIO、MQTT服务器的搭建、MQTT客户端的编程、GTK桌面程序编程、发送邮件、数据库保存数据等功能。
下面的视频演示了使用上面的功能实现的一个网关,该网关部署MQTT服务,接收传感器设备上传的温度数据,并保存到数据库中,用户可以通过桌面程序查看各传感器上传的数据,当判断温度超过26度时,该网关会自动发送邮件进行报警。
邮件内容如下图所示
功能演示视频
[localvideo]f7394e265ae573e5ffb7ddf54a566a1e[/localvideo]
源代码
桌面应用 app.py
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
from control_database import MyDB
class ListBoxRowWithData(Gtk.ListBoxRow):
def __init__(self, data):
super().__init__()
self.data = data
self.add(Gtk.Label(label=data))
class ListBoxWindow(Gtk.Window):
def __init__(self):
super().__init__(title="sensor data")
self.set_border_width(10)
box_outer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
self.add(box_outer)
label = Gtk.Label("Sensors")
box_outer.pack_start(label,True,True,0)
box_data = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
box_outer.pack_start(box_data,True,True,0)
listbox_2 = Gtk.ListBox()
db = MyDB()
items = db.get_table_list()
for item in items:
listbox_2.add(ListBoxRowWithData(item[0]))
def on_row_activated(listbox_widget, row):
print(row.data)
db = MyDB()
datas = db.read_id_all_data(row.data)
items = []
for data in datas:
items.append("%02.2f %s"%(data[1],data[2]))
fresh_list3(items)
def fresh_list3(items):
children = listbox_3.get_children()
for child in children:
listbox_3.remove(child)
for item in items:
listbox_3.add(ListBoxRowWithData(item))
listbox_3.show_all()
listbox_2.connect("row-activated", on_row_activated)
box_data.pack_start(listbox_2, True, True, 0)
listbox_3 = Gtk.ListBox()
box_data.pack_start(listbox_3, True, True, 0)
listbox_2.show_all()
listbox_3.show_all()
win = ListBoxWindow()
win.set_default_size(480, 272)
win.move(0, 0)
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
数据库操作 control_database.py
import sqlite3
from sqlite3 import Error
import datetime
sensor_db = 'sensor_database.db'
class MyDB:
db = None
def sql_connection(self):
if self.db == None:
try:
self.db = sqlite3.connect(sensor_db)
except Error:
print(Error)
def sql_close(self):
self.db.close()
self.db = None
def put_data_to_db(self,id='',temperature=0):
cursorObj = self.db.cursor()
cmd = 'create table if not exists %s(id text, temperature real, time text)'%id
cursorObj.execute(cmd)
time = datetime.datetime.now()
time = time.strftime('%Y-%m-%d %H:%M:%S')
cmd = 'INSERT INTO %s VALUES (?,?,?)'%id
cursorObj.execute(cmd,(id,temperature,time))
self.db.commit()
def get_id_data_number(self,id):
cursorObj = self.db.cursor()
cmd = 'SELECT * FROM %s '%id
cursorObj.execute(cmd)
rows = cursorObj.fetchall()
number = len(rows)
print(f'sensor-{id} have {number} datas')
return number
def get_id_all_data_from_db(self,id):
cursorObj = self.db.cursor()
cmd = 'SELECT * FROM %s '%id
cursorObj.execute(cmd)
rows = cursorObj.fetchall()
return rows
def get_data_from_db(self,id,index):
number = self.get_id_data_number(id)
if index >= number:
return []
else:
cursorObj = self.db.cursor()
cmd = 'SELECT * FROM %s '%id
cursorObj.execute(cmd)
rows = cursorObj.fetchall()
return rows[index]
def write_data_to_db(self,id,temperature):
self.sql_connection()
self.put_data_to_db(id,temperature)
self.sql_close()
def read_data_from_db(self,id,index):
self.sql_connection()
self.get_data_from_db(id,index)
self.sql_close()
def read_id_data_number(self,id):
self.sql_connection()
number = self.get_id_data_number(id)
self.sql_close()
return number
def read_id_all_data(self,id):
self.sql_connection()
datas = self.get_id_all_data_from_db(id)
self.sql_close()
return datas
def get_table_list(self):
self.sql_connection()
cursorObj = self.db.cursor()
cursorObj.execute('SELECT name from sqlite_master where type= "table"')
table_list = cursorObj.fetchall()
self.sql_close()
return table_list
if __name__ == '__main__':
db = MyDB()
db.write_data_to_db('001',27)
value = db.read_data_from_db('001',1)
print(value)
mqtt客户端 save_sensor_data.py
import paho.mqtt.client as mqtt
import json
from control_database import MyDB
import send_email
sub_topic = 'sensor/temperature'
mqtt_server = "127.0.0.1"
def unpack_json_data(data):
raw_data = json.loads(data)
print("id:"+raw_data['id']+" "+"value:" + str(raw_data['value']))
return raw_data
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
def on_message(client, userdata, msg):
print("get sensor data")
data = unpack_json_data(msg.payload)
db = MyDB()
db.write_data_to_db(data['id'],data['value'])
if float(data['value']) > 26:
send_email.send(f"传感器:{data['id']}温度超限,当前温度{data['value']}")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(mqtt_server, 1883, 60)
client.subscribe(topic=sub_topic)
client.loop_forever()
发送邮件 send_email.py
import smtplib
from email.mime.text import MIMEText
mailhost = 'smtp.163.com'
mailuser = '15**********@163.com'
mailpass = 'T**********A'
sender = '15**********@163.com'
def send(message_content,recev='51*******93@qq.com'):
receivers = [recev]
message = MIMEText(message_content)
message['Subject'] = '温度报警数据'
message['From'] = sender
message['To'] = receivers[0]
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mailhost,25)
smtpObj.login(mailuser,mailpass)
smtpObj.sendmail(sender,receivers,message.as_string())
smtpObj.quit()
print("send sucess")
except smtplib.SMTPException as e:
print("error",e)
if __name__ == "__main__":
send("test smtp email")
相关帖子:
【STM32MP135F-DK】 1- 开箱测评 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32MP135F-DK】2-输入最新系统 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32MP135F-DK】3-通过wifi连接网络 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32MP135F-DK】4-自动校时和手动校时 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32MP135F-DK】5-使用python控制LED - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32MP135F-DK】6-使用GTK建立桌面应用程序 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32MP135F-DK】7-搭建MQTT服务器 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32MP135F-DK】8-发送邮件 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
【STM32MP135F-DK】9-使用sqlite保存数据 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn)
总结
ST的开发板资料很丰富,官方提供了wiki网站,能够很方便的帮助我们开始编程设计。而且官方提供的linux的资源也很丰富,比如可以直接使用python进行编程,而且在编程中用到的很多python包都能够在线安装,大大简化了开发的流程,节约了开发的时间。
- 2024-01-11
-
发表了主题帖:
【STM32MP135F-DK】9-使用sqlite保存数据
在设计中,经常会遇到数据的持久保存。简单设计的话就是保存到文件中。如果使用python的话,可以更容易的进行一些数据库操作来保存数据。
这里使用sqlite。sqlite不是默认安装的,因此需要从网上安装包
使用apt search sqlite搜索一下,发现有数据库的包
使用apt-get install python3-sqlite3 安装之后就可以使用了。
对数据库的操作还是要使用数据库的语言的。如果要执行数据库的语言,就需要sqlite.cursor对象了,通过这个对象执行数据库的语句。
在每次使用之前需要连接数据库,在使用完之后要关闭数据库。
参考代码如下:
import sqlite3
from sqlite3 import Error
import datetime
sensor_db = 'sensor_database.db'
class MyDB:
db = None
def sql_connection(self):
if self.db == None:
try:
self.db = sqlite3.connect(sensor_db)
except Error:
print(Error)
def sql_close(self):
self.db.close()
self.db = None
def put_data_to_db(self,id='',temperature=0):
cursorObj = self.db.cursor()
cmd = 'create table if not exists %s(id text, temperature real, time text)'%id
cursorObj.execute(cmd)
time = datetime.datetime.now()
time = time.strftime('%Y-%m-%d %H:%M:%S')
cmd = 'INSERT INTO %s VALUES (?,?,?)'%id
cursorObj.execute(cmd,(id,temperature,time))
self.db.commit()
def get_id_data_number(self,id):
cursorObj = self.db.cursor()
cmd = 'SELECT * FROM %s '%id
cursorObj.execute(cmd)
rows = cursorObj.fetchall()
number = len(rows)
print(f'sensor-{id} have {number} datas')
return number
def get_id_all_data_from_db(self,id):
cursorObj = self.db.cursor()
cmd = 'SELECT * FROM %s '%id
cursorObj.execute(cmd)
rows = cursorObj.fetchall()
return rows
def get_data_from_db(self,id,index):
number = self.get_id_data_number(id)
if index >= number:
return []
else:
cursorObj = self.db.cursor()
cmd = 'SELECT * FROM %s '%id
cursorObj.execute(cmd)
rows = cursorObj.fetchall()
return rows[index]
def write_data_to_db(self,id,temperature):
self.sql_connection()
self.put_data_to_db(id,temperature)
self.sql_close()
def read_data_from_db(self,id,index):
self.sql_connection()
value = self.get_data_from_db(id,index)
self.sql_close()
return value
def read_id_data_number(self,id):
self.sql_connection()
number = self.get_id_data_number(id)
self.sql_close()
return number
def read_id_all_data(self,id):
self.sql_connection()
datas = self.get_id_all_data_from_db(id)
self.sql_close()
return datas
def get_table_list(self):
self.sql_connection()
cursorObj = self.db.cursor()
cursorObj.execute('SELECT name from sqlite_master where type= "table"')
table_list = cursorObj.fetchall()
self.sql_close()
return table_list
if __name__ == '__main__':
db = MyDB()
db.write_data_to_db('t001',27)
value = db.read_data_from_db('t001',1)
print(value)
运行之后可以测试数据库的写入与读取操作,如下图所示,读出了数据库中的数据。
-
发表了主题帖:
【DigiKey创意大赛】环境温度监控网关
本帖最后由 manhuami2007 于 2024-1-11 12:12 编辑
环境温度监控网关
作者:manhuami2007
一、作品简介(100-200字)
本次设计的名称为“环境温度监控网关”,原本打算使用STM32MP157的开发板,但是网站上缺货,因此换成了树莓派4B。实现的主要功能为:网关上搭建MQTT服务器,接收传感器设备上传的温度数据,网关保存接收到的数据,并对温度进行判断,当检测到温度超过设定值时,向制定邮箱发送邮件,告知用户超限传感器的ID和当前温度。同时在网关上搭建WEB服务器,使得用户能够通过网页查看各传感器的历史数据,也可以通过网页设置报警温度和目标邮箱。
图1 树莓派4B
图2 自制ESP32温度传感器设备
二、系统框图(图文结合)
下图显示的是整个系统的层次结构,本次的设计就是要实现处于中间位置的网关。树莓派作为网关,处于传感器设备和用户之间。网关接收和保存传感器设备上传的温度数据并保存到数据库中。网关判断温度数据是否超限,如果超限则通过邮件发送到指定的邮箱中。同时在网关中搭建web服务器,web服务器会读取数据库的数据,显示到网页上。
图3 系统层次图
网关上搭建的服务如下图所示,包括mqtt的服务器和客户端、sqlite数据库、web服务器,以及发送邮件的功能。在本设计里主要使用python编程语言实现。mqtt客户端使用python的paho包开发,负责订阅mqtt相关主题的消息,并将数据解析后保存到数据库中。web服务器使用python的flask框架,web服务器也会访问数据库的数据,并通过网页显示相关的数据。
图4 树莓派部署服务框图
三、各部分功能说明(图文结合)
本系统主要包括:MQTT服务、数据保存、发送邮件和WEB服务器功能。
MQTT服务
MQTT服务包括MQTT服务器和客户端。
在树莓派上部署mosquitto服务,实现MQTT服务器的功能。传感器设备通过wifi向该服务器的主题”sensor/temperature”发送消息,消息格式是json格式,包含设备的ID和温度数据。数据示例如下图所示。
图5 mqtt消息示例
同时在树莓派上使用python的paho库编写MQTT的客户端,该客户端订阅”sensor/temperature”主题的消息,这样当传感器设备发送数据时,该客户端也能收到数据。收到数据之后,将json数据解析出来,获得设备的ID和温度数据,然后将数据放入sqlite数据库的相应的表中,然后读取设置的上限温度,判断当前温度是否超过了上限温度,如果超过上限温度则向用户发送邮件。流程图见下图:
图6 mqtt客户端流程图
发送邮件
该部分使用python的smtp库发送邮件,因此需要事先开通发件箱的smtp服务功能。发送的邮件内容为超限传感器的设备ID和当前温度。邮件见下图所示:
图7 邮件内容
数据保存
需要保存的数据包括两大类:传感器的温度数据和设置参数。
传感器的温度数据使用的是sqlite保存,不同传感器设备使用不同的表进行保存,根据mqtt消息里的ID参数区分不同的传感器设备。每张表包含3列的数据:ID、温度和时间。该部分使用python编程
图8 传感器列表
图9 表数据
设置参数主要是“上限报警温度”,这个则是通过python的dbm进行保存的。
web服务器
该功能使用python的flask框架实现,主要用到flask的路由功能和模板功能。包含4个页面:首页、设置页、传感器列表页、单个传感器数据页。各页面的跳转关系如下图所示:
图10 网页关系
首页如下图所示,可以跳转到设置页和传感器列表页。
图11 首页
设置页如下图所示,用于设置“上限报警温度”。该页面包含一个表单,在其中输入温度后,点击提交,将会向web服务器发送POST请求。服务器收到该请求后将设置的参数通过python的dbm保存下来。每次进入该界面的时候都会自动加载保存到dbm中的数据。点击返回按键则返回首页。
图12 设置页
传感器列表页显示所有的传感器,如下图所示。传感器通过无序列表呈现,每一项均为一个链接,点击后跳转到该ID设备的数据页面。
图13 传感器列表页
各传感器数据页如下图所示,以列表的方式呈现对应ID的传感器数据。
图14 传感器数据页
作品源码
作品源码已经上传下载中心,下载链接如下:
2023年DigiKey创意大赛-源代码及文件-嵌入式开发相关资料下载-EEWORLD下载中心
该源码使用python编程语言,实现功能主要包括:mqtt客户端、发送邮件、sqlite数据库操作、dbm数据保存、python+flask的web服务器等。
源码使用注意事项:
使用mqtt客户端时,需要先在树莓派上部署mosquitto服务,作为mqtt的服务器。同时按照服务器的IP地址修改文件”save_sensor_data.py”里的mqtt_server参数。
文件”send_email.py”中的发件邮箱的账户名和密码,以及收件邮箱的账号名都已去掉,请修改为自己的邮箱参数。
该代码中需要创建数据库文件和dbm文件,因此可能涉及到用户权限的问题,请使用sudo运行代码。
需要运行的文件有2个,分别是:”save_sensor_data.py”和“web.py"。同样可能涉及用户权限的问题,请使用sudo运行代码。
五、作品功能演示视频
视频链接:
DigiKey“智造万物,快乐不停”创意大赛-作品展示视频-DigiKey“智造万物,快乐不停”创意大赛-作品展示视频-EEWORLD大学堂
该视频演示了”环境温度监控网关“的主要功能,包括:mqtt消息的订阅接收、数据保存到sqlite数据库、温度判断、发送邮件、各网页的展示、温度参数的设置、传感器数据在页面的呈现。
六、项目总结
这次的编程语言主要使用的python编程语言,并且使用了很流行的树莓派。在树莓派上成功的部署了MQTT服务和WEB服务。实现了python的数据库操作、dbm数据保存、paho库的使用,也实现了flask框架的使用。对web开发的前后端都有了进一步的了解。这次的设计虽然主体功能都实现了,但是还有一些细节可以优化和补充的地方,比如搭建完整的WEB服务器环境,美化页面设计,mqtt上传的数据加密等。
分享帖汇总
【DigiKey“智造万物,快乐不停”创意大赛】 1-开箱贴 (大厂产品也会有连焊) - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
【DigiKey“智造万物,快乐不停”创意大赛】 2-烧写镜像 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
【DigiKey“智造万物,快乐不停”创意大赛】 3-搭建MQTT服务器 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
【DigiKey“智造万物,快乐不停”创意大赛】 4-发送邮件 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
【DigiKey“智造万物,快乐不停”创意大赛】5-使用python建立mqtt客户端 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
【DigiKey“智造万物,快乐不停”创意大赛】6-使用sqlite数据库保存数据 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
【DigiKey“智造万物,快乐不停”创意大赛】7-使用flask搭建简单web服务器 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
七、其它
通过这次活动,把物联网和web的内容都做了一遍,收获很多,学到了很多新的知识,感谢得捷和EEWORLD举办了这次活动。
-
加入了学习《DigiKey“智造万物,快乐不停”创意大赛-作品展示视频》,观看 DigiKey“智造万物,快乐不停”创意大赛-作品展示视频
- 2024-01-10
-
上传了资料:
2023年DigiKey创意大赛-源代码及文件
- 2024-01-09
-
回复了主题帖:
【STM32MP135F-DK】8-发送邮件
秦天qintian0303 发表于 2024-1-8 17:14
开SMTP功能,打开之后会给一个秘钥,这个秘钥是和邮箱对应的吗?
是对应的
- 2024-01-08
-
发表了主题帖:
【STM32MP135F-DK】8-发送邮件
本次尝试使用开发板发送邮件,这个功能还是比较实用的,因为邮件既能发送数据,也能通知客户一些消息。
在开发板上发送邮件主要用的是SMTP功能。python里集成了smtplib,可以利用这个库里的函数实现SMTP的功能。
首先,要准备一个支持SMTP服务的邮箱作为发件箱。我这里使用的是163的邮箱,需要打开163邮箱的SMTP功能,需要在163邮箱里进行设置,很方便的就能打开SMTP功能,打开之后会给一个秘钥,这个秘钥是使用smtp服务时的验证密码,注意这里不需要使用自己邮箱的密码,而是要使用smtp服务提供的秘钥。
接下来编写python的代码
import smtplib
from email.mime.text import MIMEText
mailhost = 'smtp.163.com'
mailuser = '1**********@163.com'
mailpass = 'T**************A'
sender = '1**********@163.com'
receivers = ['5********@qq.com']
message = MIMEText('from manhuami2007 stm32mp137!','plain','utf-8')
message['Subject'] = 'from manhuami2007'
message['From'] = sender
message['To'] = receivers[0]
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mailhost,25)
smtpObj.login(mailuser,mailpass)
smtpObj.sendmail(sender,receivers,message.as_string())
smtpObj.quit()
print("send sucess")
except smtplib.SMTPException as e:
print("error",e)
运行代码之后,作为收件箱的QQ邮箱就能收到一封邮件了。
这里用的就是smtplib里的函数,简单的分析一下代码:
mailhost为邮箱的服务器,因为是使用163的邮箱作为发件箱,因此用的是163的邮箱服务器 'smtp.163.com' ,默认使用的是25端口。
mailuser和mailpass是发件箱的邮箱号和秘钥,这个秘钥就是上面说的,开通SMTP服务时提供的秘钥。
receivers是收件箱,这个是个列表,因此可以添加多个收件箱。
接下来是邮件的内容message,通过编辑这个变量能够修改邮件的内容。
可以看出发送邮件的功能并不复杂。
- 2024-01-07
-
发表了主题帖:
【STM32MP135F-DK】7-搭建MQTT服务器
在这次测评中要用到MQTT的服务,需要在开发板上创建MQTT服务器,在开发板的终端里输入下面命令搜索mqtt相关的包:
apt-cache search mqtt
搜索结果如下,其中mosquitto是MQTT的服务。
mosquitto默认已经安装到开发板上了,不过mosquitto-clients没有安装,使用如下命令安装mosquitto-clients。
apt-get install mosquitto-clients
通过下面的命令查看mosquitto服务是否启动
systemctl status mosquitto
从图中可以看到服务已经启用了。
接下来测试一下mosquitto服务。MQTT服务是基于“订阅-发布”机制的,因此先订阅一个主题,这里使用后台运行的方式去订阅一个主题,这样就不需要打开一个新的终端了。订阅命令如下:
mosquitto_sub -h localhost -t "mqtt/manhuami" &
然后使用如下命令向主题”mqtt/manhuami”发布一个消息”hello manhuami”
mosquitto_pub -h localhost -t "mqtt/manhuami" -m "hello manhuami"
在发送之后,就能够在终端收到发送的消息。
也可以尝试局域网内的发送,比如在笔记本电脑上使用MQTTX软件向开发板上的MQTT服务发送消息。
在发送消息之前,需要先设置开发板上的mosquitto服务,使其能够被其它设备访问。使用vi打开文件
vi /etc/mosquitto/mosquitto.conf
在第234行修改为
在第532行,修改为
修改之后重启mosquitto服务
systemctl restart mosquitto
这时在电脑上使用mqttx软件就可以连接开发板,并发布消息了
在开发板上就能收到
使用python作为客户端
首先安装paho包
apt-get install python3-paho
编写代码
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("192.168.137.78", 1883, 60) #开发板的IP地址
client.subscribe(topic="mqtt/manhuami")
client.loop_forever()
这时就能够通过python代码订阅mqtt的消息了。
-
发表了主题帖:
【DigiKey“智造万物,快乐不停”创意大赛】7-使用flask搭建简单web服务器
python下有很多的web框架,搜索了一下,觉得flask可能比较简单,所以使用flask搭建一个简单的web服务器,实现数据库的数据显示。
FLASK安装
使用如下命令安装flask。
sudo apt-get install python3-flask
创建示例文件
先创建一个范例页面,看看是不是能够正常工作
创建一个总的文件夹,然后在文件夹下创建2个子文件夹和一个py文件,使用的命令如下
mkdir Helloworld
mkdir Helloworld/static
mkdir Helloworld/templates
touch server.py
创建如下的文件结构
然后再server.py中输入如下代码。
from flask import Flask
app = Flask(__name__)
@app.route ('/')
def hello_world():
return 'Hello world'
if __name__ == '__main__':
app.run(host='192.168.137.24',port=80,debug=True)
在终端中使用命令
sudo python3 server.py
运行上面的代码。之后在别的电脑上访问”192.168.137.24:80”就可以看到如下网页了
模板
如果想让页面上显示自定义的数据,就需要用到flask的模板功能。模板要用到render_template()函数,因此需要使用from flask import render_template语句引入相关函数。 模板功能就是将html里的一部分标签用特殊的语法代替。
比如变量用大括号包围
{{ name }}
判断语句
{% if name %}
<h1>Hello {{ name }}!</h1>{% else %}
<h1>Hello, World!</h1>{% endif %}
循环语句
{% for item in navigation %}
<li><a href="{{ item.href }}">{{ item.caption }}</a></li>
{% endfor %}
注释
{# ... #}
模板的功能挺多了,比如能够继承自其它的模板。具体的使用方法可以参考下面的网址
Template Designer Documentation — Jinja Documentation (3.1.x) (palletsprojects.com)
在本例中要做的是输出所有的传感器ID,并且能够通过超链接跳转到相应的ID页面。
因此需要用循环的方式对传感器ID进行显示,也需要用到模板
<h1>设备列表</h1>
<ul>
{% for id in id_list %}
<li><a href="/device/{{id}}">{{id}}</a></li>
{% endfor %}
</ul>
- 2024-01-01
-
回复了主题帖:
【DigiKey“智造万物,快乐不停”创意大赛】6-使用sqlite数据库保存数据
wangerxian 发表于 2023-12-31 20:45
要用数据库,还是得花点时间学习一下数据库的语法。
我这个应用比较简单,就用这些命令就够了
-
回复了主题帖:
【DigiKey“智造万物,快乐不停”创意大赛】6-使用sqlite数据库保存数据
吾妻思萌 发表于 2023-12-31 22:21
SQL的 select * from database1
我就会最基本的where and啥的
我也是在网上现学的
-
回复了主题帖:
【DigiKey“智造万物,快乐不停”创意大赛】5-使用python建立mqtt客户端
吾妻思萌 发表于 2023-12-31 22:17
那你需要固定IP吧,
后面要固定一下。我看有个mDNS,在局域网的一个微型DNS能够解决这个问题,有时间了要试一下
-
回复了主题帖:
【DigiKey“智造万物,快乐不停”创意大赛】5-使用python建立mqtt客户端
吾妻思萌 发表于 2023-12-31 22:18
嗷对了 1883端口后面的60是啥意思呀
keepalive的参数,保持网路连接的参数吧
- 2023-12-31
-
发表了主题帖:
【DigiKey“智造万物,快乐不停”创意大赛】6-使用sqlite数据库保存数据
在本例中会接收到下位机上传的温度数据,数据是上传到mqtt服务器的,通过订阅相关的消息,获得下位机的数据,不同的下位机使用不同的ID号,所以下位机上传的数据中包括ID号、温度,2个数据。需要将这些数据保存到数据库中。不同ID号的数据放在数据库的不同表中。
在前面的帖子中,已经能够通过python订阅到相关的mqtt消息了,现在需要使用python编写数据库的代码。而python内置了简单的数据库sqlite3,通过它可以快速的创建数据库。
连接/创建数据库
连接数据库,代码如下,这会在文件夹下创建一个db文件。
import sqlite3
from sqlite3 import Error
import datetime
db_name = "mydatabase.db"
def sql_connection():
try:
con = sqlite3.connect(db_name)
return con
except Error:
print(Error)
关闭数据库
def sql_close(con):
con.close()
向数据库中保存数据
数据是保存在表中的,这里打算是不同id上传的数据放在不同的表中。在创建新表之前要先检查是否已经有了这个表。
sqlite的语句中,可以使用占位符,但是表名好像不能用占位符,所以表名是通过格式化字符串放入到命令中的,而数据则是通过占位符添加进去的。代码如下,创建的表中包含3个数据:id、温度和时间。
def put_data_to_db(con,id,temperature):
cursorObj = con.cursor()
cmd = 'create table if not exists %s(id text, temperature real, time text)'%id
cursorObj.execute(cmd)
time = datetime.datetime.now()
time = time.strftime('%Y-%m-%d %H:%M:%S')
cmd = 'INSERT INTO %s VALUES (?,?,?)'%id
cursorObj.execute(cmd,(id,temperature,time))
con.commit()
def save_temperature(id, temperature):
con = sql_connection()
put_data_to_db(con,id,temperature)
sql_close(con)
获取表格中的数据
def get_data_number(con,id): #获取表格中数据的总数
cursorObj = con.cursor()
cmd = 'SELECT * FROM %s '%id
cursorObj.execute(cmd)
rows = cursorObj.fetchall()
number = len(rows)
return number
def get_id_temperature(con,id,index):#返回相应索引的数据,是个列表格式的
number = get_data_number(con,id)
if index > number:
return []
else:
cursorObj = con.cursor()
cmd = 'SELECT * FROM %s '%id
cursorObj.execute(cmd)
rows = cursorObj.fetchall()
return rows[-1*index]
获取全部的表格
def get_all_id(con): #返回的列表格式的
cursorObj = con.cursor()
cursorObj.execute('SELECT name from sqlite_master where type= "table"')
return cursorObj.fetchall()
测试代码
if __name__ == '__main__':
save_temperature('T0001', 27)
con = sql_connection()
get_data_number(con,'T0001')
get_id_temperature(con,'T0001',4)
a = get_all_id(con)
print(a)
sql_close(con)
通过上面的代码就能实现数据库数据的保存与读取了,接下来就是将mqtt订阅的数据通过json的解析,获得id和温度数据,然后保存的数据库中。