温湿度传感器的搭建(是我们老师搭建的平台,我们连接校网就可以读取了)
提示:
不用连接哆点,只要能连上WiFi(或者连上网线)就行;
毕竟我没有校网拖到现在才做啊!
源码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import socket
import codecs
import time
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print(sk)
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("接受到的数据:")
print(data)
sd = codecs.encode(data[3:5], 'hex')
sd = int(sd, base=16) / 100
wd = codecs.encode(data[5:7], 'hex')
wd = int(wd, base=16) / 100
print("处理后的数据:")
print("湿度:%s,温度:%s" % (sd, wd))
print(" ")
sk.close()
准备工作在我上一篇博客中说过了,链接点这儿:
【Python】_ 连接MySQL_(建表、查询、插入、删除)
1连接数据库
2获取传值并查看
3传入数据库并查看数据库全部内容
#!/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() # 定义一个游标,通过游标来操作数据库
#==================获取传值=======================
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print(sk)
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("=========================================")
print("接受到的数据:")
print(data)
#==十六进制转int
sd = codecs.encode(data[3:5], 'hex')
sd = int(sd, base=16) / 100
wd = codecs.encode(data[5:7], 'hex')
wd = int(wd, base=16) / 100
print("----------------------------------------")
print("处理后的数据:")
print("湿度:%s,温度:%s" % (sd, wd))
print(" ")
data = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") # strftime格式化时间函数
print("---------成功保存到数据库中!----------")
#==插入到数据库中
cur.executemany("INSERT pytest VALUE(%s,%s,%s)", [
(data, str(wd), str(sd))]) # int转str
con.commit()
print("--------显示数据库内容------------")
#===读取数据库
select = cur.execute('SELECT * FROM pytest')
all = cur.fetchall()
print(all)
sk.close()
运行结果:
(排版什么的,请自动忽略,暴力达到目的)
看看MySQL有界面版吧!还行~
修改了一下界面,还是惨不忍睹,可以尝试用wxpython画个界面!不过本实验主要为获取传值,毕竟工地上没人去看界面,hhhh,我就偷懒啦!
#!/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()
附:
本次实验遇到的问题记录:
1、创表全为varchar类型,需要把全部输入数据库类型转换为str类型
2、起初创建表是 name(key value)、wendu、shidu
我插入语句时遇见问题:主键已存在、不能重复插入
最初:
改为:(用时间插入)
3、还有这里我没设置sleep,一直读取,可以设置一下,我不详说了!
本次实验追加 客户端远程查询 操作,下一篇博客给出:
https://blog.csdn.net/cungudafa/article/details/86525807