导语:
我拿着之前的设计方案悠哉悠哉去做Python课程设计的答辩,然后被老师教育了一番→_→
- 数据转换小毛病: 获取传值和存入数据库没啥太大毛病(这里注意int进制格式转换时要求参数非负数;如果用
struct
,则不会影响) - 设计过于简单: Python原意就是简化编程语言,获取传值和保存数据库就是两句代码可以解决的问题!如何把这两句代码完善丰富和做出花样就是本事了!老师给了两句话:
如果只有2句代码怎么报项目资金,一大段代码才好报账!
我好像明白了什么? - 关于界面问题: 老师提到应做出
查询界面
,按关键词搜索供用户使用!我争辩:获取实时传值传回数据库是我们的工作,不需要界面。老师说:客户角度
考虑,客户不会使用控制台和MySQL! - C/S客户端查询: 先梳理一下本次实验所用到的设备: 1 温湿度传感器、2 我的PC端附带本地Mysql进行全部数据存储(假设这是一个巨大的私密数据库:充当Server服务器,可以对全部数据进行操作)、3 任意电脑的客户端(用户:将访问我的PC,输入关键词,获取查询结果并显示,这里:用户不能直接对数据进行操作!相当于一层加密~)这里是相当难理解了?,后文详解
目录
- 一、总流程框图及各部分作用表
- 二、总项目结构
- 三、具体代码实现
- 1. 基于Mysql数据库的创建
- 2. 获取传值并存入数据库
- 3. 查询
一、总流程框图及各部分作用表
设备 | 作用 | |
1 | 温湿度传感器 | 采集信息并返回到总服务器归档 |
2 | Server总服务器 | 获取传值、存入数据库(拥有读写最高权限) |
3 | Client客户端 | 关键词查询 |
4 | 可视化服务器 | 连接Client和Server的桥梁(对数据库直接访问权限的加密保护) |
二、总项目结构
Tips:这里不在 _init _下写入代码是因为,调用整个包时, _init _中的内容会自动运行。
三、具体代码实现
1. 基于Mysql数据库的创建
2. 获取传值并存入数据库
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import socket
import codecs
import time
import datetime
import pymysql
#=========连接数据库=============
con = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='wy123456',
db='python_windu',
charset='utf8'
)
cur = con.cursor() # 定义一个游标,通过游标来操作数据库
print("1、正在连接:")
#==================获取传值=======================
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print(sk)
print("2、正在获取传值:")
address = ('10.1.156.82', 8001)
sk.connect(address)
while True:
inp = "030300000002c5e9" # 请求码
time.sleep(3)
sk.send(codecs.decode(inp, 'hex'))
data = sk.recv(1024)
print("3、接受到的数据:")
print(data)
#==十六进制转int
sd = codecs.encode(data[3:5], 'hex') # 16进制读取data第3到第5个数的值
sd = int(sd, base=16) / 100 # 16进制转10进制保留两位小数,int类型
wd = codecs.encode(data[5:7], 'hex')
wd = int(wd, base=16) / 100
print("4、处理后的数据:")
print("湿度:%s,温度:%s" % (sd, wd))
now_time = datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S") # strftime格式化时间函数
print("5、成功保存到数据库中!")
#==插入到数据库中
cur.executemany("INSERT pytest VALUE(%s,%s,%s)", [
(now_time, str(wd), str(sd))]) # int转str
con.commit()
print("6、显示数据库内容:")
print("----------------------------------------")
#===读取数据库打印表格
sql = """ SELECT * FROM pytest """
results = cur.fetchall()
file = r"wendu.txt"
fp = open(file, "w")
fp.write(" 温湿度传感器表1\n")
fp.write("-----------------------------------\n")
fp.write("时间" + "\t\t\t\t" + "温度" + "\t" + "湿度" + "\n")
sum = 0 # 统计已录入数据次数
try:
# 执行SQL语句
cur.execute(sql)
# 获取所有记录列表
results = cur.fetchall()
print(" 温湿度传感器表 ")
print("-----------------------------\n")
print("时间 温度 湿度\n")
for it in results:
fp.write(it[0] + "\t\t")
fp.write(it[1] + "\t")
fp.write(it[2] + "\n")
for i in range(len(it)):
print(it[i], end=' ')
sum += 1
print("\n")
print("-----------------------------\n")
print(" 统计:(" + str(sum) + ")条记录\n")
fp.write("------------------------------------\n")
fp.write("总计:%d条记录\n" % sum)
fp.close()
except:
print("未查询到数据")
sk.close()
在同目录下创建一个txt:用于备份全部数据库的内容,防删库跑路!
存入结果:
3. 查询
流程图:
项目结构:
Client端
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# 用户端
import socket
#ip_addr = input('请输入对方IP地址:').strip()
client = socket.socket()
client.connect(("192.168.43.241", 9999))
def menu():
print("\n 用户界面 ")
print("----------------------")
print(" 1、查询全部数据 ")
print(" 2、关键词查询 ")
print(" 3、退出 ")
print("----------------------")
while True:
menu()
print("请输入(1~3)")
msg = input('>>:').strip()
if len(msg) == 0:
continue
client.send(msg.encode('utf-8'))
data_sure = client.recv(1024)
print(data_sure.decode())
client.close()
Server端
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# 服务器端
import socket
import codecs
import time
import datetime
import pymysql
data = 0
con = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='wy123456',
db='python_windu',
charset='utf8'
)
cur = con.cursor() # 定义一个游标,通过游标来操作数据库
sum = 0
sql_msg = []
def fun1(): # 遍历数据库
#sql_msg.append(" 温湿度总数据表 ")
# sql_msg.append("-----------------------------\n")
#sql_msg.append("时间 温度 湿度")
try:
# 执行SQL语句
sql = """ SELECT * FROM pytest """
cur.execute(sql)
results = cur.fetchall()
sql_msg.append(results)
'''for it in results:
for i in range(len(it)):
sql_msg.append(it[i], end=' ')
sql_msg.append("\n")
sum += 1
sql_msg.append(" 统计:(" + str(sum) + ")条记录\n")'''
cur.close()
con.close()
except:
sql_msg.append("未查询到数据")
pass
def fun2(): # 输入关键词查询
sql_msg.append("请输入关键词(温度):")
print("客户端操作:2查询")
#key = input(">>>")
key = data
sql_wendu = "SELECT * FROM pytest where wendu like '%" + str(key) + "%' "
#sql_shidu = "SELECT * FROM pytest where shidu like '%" + str(key) + "%' "
#sql_time = "SELECT * FROM pytest where time like '%" + str(key) + "%' "
try:
cur.execute(sql_wendu)
results1 = cur.fetchall()
sql_msg.append(results1)
'''sql_msg.append("查询结果:")
sql_msg.append("-----------------------------\n")
sql_msg.append("时间 温度 湿度\n")
for it in results1:
for i in range(len(it)):
sql_msg.append(it[i], end=' ')
sql_msg.append("\n")
'''
cur.close()
con.close()
except:
sql_msg.append("关键词有误,请重新输入!")
def fun3(): # 退出程序
print("客户退出程序!")
exit(0)
# 自己定义的用来实现switch-case的方法
def function(x):
swicher = { # 定义一个map,相当于定义case:func()
'1': fun1,
'2': fun2,
'3': fun3,
'4': lambda: print('default function')
}
func = swicher.get(x, '4') # 从map中取出方法
return func() # 执行
def menu():
print("\n 用户界面 ")
print("----------------------")
print(" 1、查询全部数据 ")
print(" 2、关键词查询 ")
print(" 3、退出 ")
print("----------------------")
while True:
# menu()
#cmd = input('请输入(1~3) : ')
# function(cmd)
server = socket.socket()
server.bind(('192.168.43.241', 9999))
server.listen(5)
print('等待客户连接...')
conn, addr = server.accept()
try:
data = conn.recv(10240) # 接收数据
print('IP为:' + addr[0] + '向您发来消息:', data.decode())
function(data.decode())
conn.send(str(sql_msg).encode('utf-8'))
except ConnectionResetError as e:
print('客户端:%s 已经断开!' % addr[0])
break
conn.close()
server.close()
运行结果:
测试本地查询:
通过TCP通信传值查询: 采用TCP远程访问本机IP进行通信,接收用户查询的关键词;再由本机从数据库读取,sql_msg.append返回给用户
本次不足:
未加界面(图一:实时查询显示、图二:相似完整系统界面及配置)