承接上一次 温湿度传感器 获取传值、存入数据库 ,这偏文章主要增加了 客户端查询显示的功能 !
上一次博客链接:https://blog.csdn.net/cungudafa/article/details/85690998
导语:
我拿着之前的设计方案悠哉悠哉去做Python课程设计的答辩,然后被老师教育了一番→_→
struct
,则不会影响)如果只有2句代码怎么报项目资金,一大段代码才好报账!
我好像明白了什么?查询界面
,按关键词搜索供用户使用!我争辩:获取实时传值传回数据库是我们的工作,不需要界面。老师说: 客户角度
考虑,客户不会使用控制台和MySQL!设备 | 作用 | |
---|---|---|
1 | 温湿度传感器 | 采集信息并返回到总服务器归档 |
2 | Server总服务器 | 获取传值、存入数据库(拥有读写最高权限) |
3 | Client客户端 | 关键词查询 |
4 | 可视化服务器 | 连接Client和Server的桥梁(对数据库直接访问权限的加密保护) |
Tips:这里不在 _init _下写入代码是因为,调用整个包时, _init _中的内容会自动运行。
mysql.py
#!/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()
#!/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端
Server.py
#!/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返回给用户