micropython实现MQTT数据发布中移动OneNet平台(含继电器使用说明)及对mysql数据库的操作

16 篇文章 1 订阅
9 篇文章 1 订阅

import utptime

uftptime.settime()   #同步网络时间

这次我们在OneNET平台上新建数据流,同时使用MQTT协议中publish报文格式上传数据点。

MQTT协议实现方式

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:

发布者(Publish):发布数据点
代理(Broker)(服务器):接受C端连接,处理发,订,退,转数据信息
订阅者(Subscribe):订阅数据点
其中,消息的发布者pub订阅者sub都是客户端,消息代理broker是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

  • (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
  • (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

Payload消息体

Payload消息体位MQTT数据包的第三部分,包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息:

  • (1)CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
  • (2)SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
  • (3)SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
  • (4)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()

注:

OneNet平台设备保活

MQTT connect 报文中,需要设置keepalive(即保活时间),keepalive支持范围为:10~1800,单位为秒

设备若需保持长连接,则设备在连续的设置的keepalive 时间内,必须要有上行数据报文(包括 publish、ping、subscribe 等)

平台若在连续的 设置的keepalive的1.5倍 的时间内没有收到设备上行数据,则会设备断开连接

 

-------------------------------

继电器使用

简单原理图                         5v降压模块

在这里插入图片描述

 

 

因GPIO口输出电流不足,继电器操作可以引用电源或上拉一个10K电阻来触发控制信号

-------------------------------------------

python操作mysql数据库

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

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值