导语:
我拿着之前的设计方案悠哉悠哉去做Python课程设计的答辩,然后被老师教育了一番→_→

  1. 数据转换小毛病: 获取传值和存入数据库没啥太大毛病(这里注意int进制格式转换时要求参数非负数;如果用 struct ,则不会影响)
  2. 设计过于简单: Python原意就是简化编程语言,获取传值和保存数据库就是两句代码可以解决的问题!如何把这两句代码完善丰富和做出花样就是本事了!老师给了两句话: 如果只有2句代码怎么报项目资金,一大段代码才好报账! 我好像明白了什么?
  3. 关于界面问题: 老师提到应做出 查询界面 ,按关键词搜索供用户使用!我争辩:获取实时传值传回数据库是我们的工作,不需要界面。老师说: 客户角度 考虑,客户不会使用控制台和MySQL!
  4. C/S客户端查询: 先梳理一下本次实验所用到的设备: 1 温湿度传感器、2 我的PC端附带本地Mysql进行全部数据存储(假设这是一个巨大的私密数据库:充当Server服务器,可以对全部数据进行操作)、3 任意电脑的客户端(用户:将访问我的PC,输入关键词,获取查询结果并显示,这里:用户不能直接对数据进行操作!相当于一层加密~)这里是相当难理解了?,后文详解


目录

  • 一、总流程框图及各部分作用表
  • 二、总项目结构
  • 三、具体代码实现
  • 1. 基于Mysql数据库的创建
  • 2. 获取传值并存入数据库
  • 3. 查询



一、总流程框图及各部分作用表

python温湿度程序crc校验应该添加在哪个下面 python温度传感器_sql

设备

作用

1

温湿度传感器

采集信息并返回到总服务器归档

2

Server总服务器

获取传值、存入数据库(拥有读写最高权限)

3

Client客户端

关键词查询

4

可视化服务器

连接Client和Server的桥梁(对数据库直接访问权限的加密保护)

二、总项目结构

python温湿度程序crc校验应该添加在哪个下面 python温度传感器_sql_02

Tips:这里不在 _init _下写入代码是因为,调用整个包时, _init _中的内容会自动运行。

三、具体代码实现

1. 基于Mysql数据库的创建

python温湿度程序crc校验应该添加在哪个下面 python温度传感器_数据_03

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:用于备份全部数据库的内容,防删库跑路!

python温湿度程序crc校验应该添加在哪个下面 python温度传感器_数据库_04

存入结果:

python温湿度程序crc校验应该添加在哪个下面 python温度传感器_温湿度传感器_05

3. 查询

流程图:

python温湿度程序crc校验应该添加在哪个下面 python温度传感器_sql_06


项目结构:

python温湿度程序crc校验应该添加在哪个下面 python温度传感器_数据_07


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()

运行结果:

测试本地查询:

python温湿度程序crc校验应该添加在哪个下面 python温度传感器_温湿度传感器_08


python温湿度程序crc校验应该添加在哪个下面 python温度传感器_sql_09


通过TCP通信传值查询: 采用TCP远程访问本机IP进行通信,接收用户查询的关键词;再由本机从数据库读取,sql_msg.append返回给用户

python温湿度程序crc校验应该添加在哪个下面 python温度传感器_数据库_10


python温湿度程序crc校验应该添加在哪个下面 python温度传感器_数据库_11


本次不足:

未加界面(图一:实时查询显示、图二:相似完整系统界面及配置)

python温湿度程序crc校验应该添加在哪个下面 python温度传感器_温湿度传感器_12


python温湿度程序crc校验应该添加在哪个下面 python温度传感器_数据_13