import utptime
uftptime.settime() #同步网络时间
这次我们在OneNET平台上新建数据流,同时使用MQTT协议中publish报文格式上传数据点。
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:
发布者(Publish):发布数据点
代理(Broker)(服务器):接受C端连接,处理发,订,退,转数据信息
订阅者(Subscribe):订阅数据点
其中,消息的发布者pub和订阅者sub都是客户端,消息代理broker是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
Payload消息体位MQTT数据包的第三部分,包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息:
from umqtt.simple import MQTTClient
from machine import Pin
import network
import time
import json
CLIENT_ID = "588234870" #设备ID
username = "3297741" #产品ID
password = "vaGMSmffsdfecCzMz4rs7y=rQ8gmo=" #APIKEY
SERVER = 'mqtt.heclouds.com' #183.230.40.39
TOPIC = 'wefdaidu'
state = 0
c=None
def sub_cb(topic, msg):
global state
print((topic, msg))
if msg == b"on":
#led.value(1)
state = 0
print("1")
elif msg == b"off":
#led.value(0)
state = 1
print("0")
elif msg == b"toggle":
#led.value(state)
state = 1 - state
#要上报的数据点
message = {'datastreams':[{'id':'temperature','datapoints':[{'value':27}]}]}
def pub_data(data): #组合成协议要求的报文格式
j_d = json.dumps(data)
j_l = len(j_d)
arr = bytearray(j_l + 3)
arr[0] = 1 #publish数据类型为json
arr[1] = int(j_l / 256) # json数据长度 高位字节
arr[2] = j_l % 256 # json数据长度 低位字节
arr[3:] = j_d.encode('ascii') # json数据
return arr
def main():
server=SERVER
c = MQTTClient(CLIENT_ID, server,6002,username,password,keepalive=60) #创建客户端连接
c.set_callback(sub_cb) #set callback
c.connect() #connect mqtt
c.subscribe(TOPIC) #订阅
c.publish('$dp',pub_data(message)) #发布
#print('publish message:',message)
time.sleep(5)
try:
while 1:
c.wait_msg()
except:
c.disconnect()
if __name__ == '__main__':
while True:
main()
注:
MQTT connect 报文中,需要设置keepalive(即保活时间),keepalive支持范围为:10~1800,单位为秒
设备若需保持长连接,则设备在连续的设置的keepalive 时间内,必须要有上行数据报文(包括 publish、ping、subscribe 等)
平台若在连续的 设置的keepalive的1.5倍 的时间内没有收到设备上行数据,则会设备断开连接
-------------------------------
简单原理图 5v降压模块
-------------------------------------------
一、Python连接MySQL数据库
#导入模块
import pymysql
#打开数据库连接数据库testdb
db = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='1234', db='testdb', charset='utf8')
#使用cursor方法创建一个游标
cursor = db.cursor()
#查询数据库版本
cursor.execute("select version()")
data = cursor.fetchone()
print(" Database Version:%s" % data)
#创建数据库test
cursor.execute("drop database if exists test") #如果数据库已经存在,那么删除后重新创建
sql = "create database test"
cursor.execute(sql)
#创建数据库表
cursor.execute("drop table if exists employee") #如果数据表已经存在,那么删除后重新创建
sql = """
CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )
"""
cursor.execute(sql)
#查询数据表数据
sql = "select * from employee"
cursor.execute(sql)
data = cursor.fetchone()
print(data)
#插入数据
sql = "insert into employee values ('李','梅',20,'W',5000)"
cursor.execute(sql)
db.commit()
#查看插入后的结果
sql = "select * from employee"
cursor.execute(sql)
data = cursor.fetchone()
print(data)
#指定条件查询数据表数据
sql = " select * from employee where income > '%d' " % (1000)
cursor.execute(sql)
data = cursor.fetchone()
print(data)
#更新数据库
sql = " update employee set age = age+1 where sex = '%c' " % ('W')
cursor.execute(sql)
db.commit()
#查看更新后的结果
sql = "select * from employee"
cursor.execute(sql)
data = cursor.fetchone()
print(data)
#删除数据
sql = " delete from employee where age > '%d' " % (30)
cursor.execute(sql)
db.commit()
#查看更新后的结果
sql = "select * from employee"
cursor.execute(sql)
data = cursor.fetchone()
print(data)
#关闭数据库
db.close()
二、增、删、改、查
增、删、改:conn.commit()
获取数据:fetchone
,fetchall
,fetchmany
获取插入数据自增ID:cursor.lastrowid
1、增、改
import pymysql
user = '小黑'
pwd = '06161086'
conn = pymysql.connect(host='localhost',user='root',password='',database='db1')
cursor = conn.cursor()
sql = "insert into userinfo(user,password) values(%s,%s)"#增
# sql = "update userinfo set password='06161088' where user='耿娃'"#改
r = cursor.execute(sql,user,pwd)#返回值r为受影响的行数
# cursor.executemany(sql,[
# ('小张','06161085'),
# ('小王','06161084'),
# ('小段','06161083'),
# ('小余','06161082')])提交多条数据
conn.commit()
print(cursor.lastrowid)
cursor.close()
conn.close()
2、查
import pymysql
conn = pymysql.connect(host='localhost',user='root',password='',database='db1')
# cursor = conn.cursor()
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select * from userinfo" #查
r = cursor.execute(sql) #返回值r为受影响的行数
# cursor.scroll(1,mode='relative') #相对当前位置移动
# cursor.scroll(2,mode='absolute') #相对绝对位置移动
# ret = cursor.fetchone()
# ret = cursor.executemany(4) #一次取四个
ret = cursor.fetchall()
for rev in ret:
print(rev)
cursor.close()
conn.close()
3、执行存储过程
cursor.callproc('p1') #执行存储过程
三、其他说明
1、说明
·上例中"sql=..."语句,是经典的MySQL语句的形式,将数据库语句写在双引号内,形成类似字符串的形式;
·使用cursor对象的execute()方法具体执行数据库的操作;
·对于插入、更新、删除等操作,需要使用db.commit()来提交到数据库执行,对于查询、创建数据库和数据表的操作不需要此语句。
2、为有效避免因为错误导致的后果,使用以下方式来执行数据库的操作:
try:
# 执行 SQL 语句
cursor.execute(sql)
# 提交修改
db.commit()
except:
# 发生错误时回滚
db.rollback()