硬件:ESP32,DS18B20测温模块

软件:MicroPython,Thonny,EMQX

软件环境搭建和硬件接线可直接参考 王铭东 老师的教程 Thonny+MicroPython+ESP32开发环境搭建

 效果图:

MQTT汇报温度.py

改好WIFI链接信息和MQTT服务器信息即可。

import time
import network
from umqttsimple import MQTTClient
from machine import Pin
import onewire, ds18x20# MQTT配置信息
mqtt_client_id = ''
mqtt_server_ip = ''
mqtt_server_port = ''
mqtt_topic = ''# 温度传感器初始化
ds_pin = Pin(13)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
print('发现设备: ', roms)# 获取当前温度
def read_ds_sensor():ds_sensor.convert_temp()for rom in roms:temp = ds_sensor.read_temp(rom)if isinstance(temp, float):temp = round(temp, 2)return tempreturn 0# 链接WIFI联网
def wifi():wlan = network.WLAN(network.STA_IF)wlan.active(True)if not wlan.isconnected():print('connecting to network...')wlan.connect('嘉然今天吃向晚', '12345678')i = 1while not wlan.isconnected():print("正在链接...{}".format(i))i += 1time.sleep(1)print('network config:', wlan.ifconfig())# MQTT建立链接
def mqtt_init():# 建立一个MQTT客户端mqtt_client = MQTTClient(mqtt_client_id, mqtt_server_ip, mqtt_server_port)# 设置回调函数# mqtt_client.set_callback(mqtt_sub)# 建立连接mqtt_client.connect()# 监控ledctl这个通道,接收控制命令# mqtt_client.subscribe(mqtt_topic)return mqtt_client# MQTT回调函数,收到服务器消息后会调用这个函数
def mqtt_sub(topic, msg): print('收到服务器信息')print(topic, msg)wifi()
mqtt_client = mqtt_init()
while True:current_temp = str(read_ds_sensor())print('当前温度:' + current_temp)mqtt_client.publish(mqtt_topic, current_temp)time.sleep(5)

umqttsimple.py

import usocket as socket
import ustruct as struct
from ubinascii import hexlifyclass MQTTException(Exception):passclass MQTTClient:def __init__(self,client_id,server,port=0,user=None,password=None,keepalive=0,ssl=False,ssl_params={},):if port == 0:port = 8883 if ssl else 1883self.client_id = client_idself.sock = Noneself.server = serverself.port = portself.ssl = sslself.ssl_params = ssl_paramsself.pid = 0self.cb = Noneself.user = userself.pswd = passwordself.keepalive = keepaliveself.lw_topic = Noneself.lw_msg = Noneself.lw_qos = 0self.lw_retain = Falsedef _send_str(self, s):self.sock.write(struct.pack("!H", len(s)))self.sock.write(s)def _recv_len(self):n = 0sh = 0while 1:b = self.sock.read(1)[0]n |= (b & 0x7F) << shif not b & 0x80:return nsh += 7def set_callback(self, f):self.cb = fdef set_last_will(self, topic, msg, retain=False, qos=0):assert 0 <= qos <= 2assert topicself.lw_topic = topicself.lw_msg = msgself.lw_qos = qosself.lw_retain = retaindef connect(self, clean_session=True):self.sock = socket.socket()addr = socket.getaddrinfo(self.server, self.port)[0][-1]self.sock.connect(addr)if self.ssl:import usslself.sock = ussl.wrap_socket(self.sock, **self.ssl_params)premsg = bytearray(b"\x10\0\0\0\0\0")msg = bytearray(b"\x04MQTT\x04\x02\0\0")sz = 10 + 2 + len(self.client_id)msg[6] = clean_session << 1if self.user is not None:sz += 2 + len(self.user) + 2 + len(self.pswd)msg[6] |= 0xC0if self.keepalive:assert self.keepalive < 65536msg[7] |= self.keepalive >> 8msg[8] |= self.keepalive & 0x00FFif self.lw_topic:sz += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3msg[6] |= self.lw_retain << 5i = 1while sz > 0x7F:premsg[i] = (sz & 0x7F) | 0x80sz >>= 7i += 1premsg[i] = szself.sock.write(premsg, i + 2)self.sock.write(msg)# print(hex(len(msg)), hexlify(msg, ":"))self._send_str(self.client_id)if self.lw_topic:self._send_str(self.lw_topic)self._send_str(self.lw_msg)if self.user is not None:self._send_str(self.user)self._send_str(self.pswd)resp = self.sock.read(4)assert resp[0] == 0x20 and resp[1] == 0x02if resp[3] != 0:raise MQTTException(resp[3])return resp[2] & 1def disconnect(self):self.sock.write(b"\xe0\0")self.sock.close()def ping(self):self.sock.write(b"\xc0\0")def publish(self, topic, msg, retain=False, qos=0):pkt = bytearray(b"\x30\0\0\0")pkt[0] |= qos << 1 | retainsz = 2 + len(topic) + len(msg)if qos > 0:sz += 2assert sz < 2097152i = 1while sz > 0x7F:pkt[i] = (sz & 0x7F) | 0x80sz >>= 7i += 1pkt[i] = sz# print(hex(len(pkt)), hexlify(pkt, ":"))self.sock.write(pkt, i + 1)self._send_str(topic)if qos > 0:self.pid += 1pid = self.pidstruct.pack_into("!H", pkt, 0, pid)self.sock.write(pkt, 2)self.sock.write(msg)if qos == 1:while 1:op = self.wait_msg()if op == 0x40:sz = self.sock.read(1)assert sz == b"\x02"rcv_pid = self.sock.read(2)rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]if pid == rcv_pid:returnelif qos == 2:assert 0def subscribe(self, topic, qos=0):assert self.cb is not None, "Subscribe callback is not set"pkt = bytearray(b"\x82\0\0\0")self.pid += 1struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)# print(hex(len(pkt)), hexlify(pkt, ":"))self.sock.write(pkt)self._send_str(topic)self.sock.write(qos.to_bytes(1, "little"))while 1:op = self.wait_msg()if op == 0x90:resp = self.sock.read(4)# print(resp)assert resp[1] == pkt[2] and resp[2] == pkt[3]if resp[3] == 0x80:raise MQTTException(resp[3])return# Wait for a single incoming MQTT message and process it.# Subscribed messages are delivered to a callback previously# set by .set_callback() method. Other (internal) MQTT# messages processed internally.def wait_msg(self):res = self.sock.read(1)self.sock.setblocking(True)if res is None:return Noneif res == b"":raise OSError(-1)if res == b"\xd0":  # PINGRESPsz = self.sock.read(1)[0]assert sz == 0return Noneop = res[0]if op & 0xF0 != 0x30:return opsz = self._recv_len()topic_len = self.sock.read(2)topic_len = (topic_len[0] << 8) | topic_len[1]topic = self.sock.read(topic_len)sz -= topic_len + 2if op & 6:pid = self.sock.read(2)pid = pid[0] << 8 | pid[1]sz -= 2msg = self.sock.read(sz)self.cb(topic, msg)if op & 6 == 2:pkt = bytearray(b"\x40\x02\0\0")struct.pack_into("!H", pkt, 2, pid)self.sock.write(pkt)elif op & 6 == 4:assert 0# Checks whether a pending message from server is available.# If not, returns immediately with None. Otherwise, does# the same processing as wait_msg.def check_msg(self):self.sock.setblocking(False)return self.wait_msg()

ESP32 使用 MicroPython 实现温度数据上报MQTT服务器相关推荐

  1. ESP8266_RTOS_SDK v3.x 发送温度数据到MQTT服务器

    陈拓 2021/05/13-2021/05/19 1. 概述 我们在<ESP8266与MQTT服务器收发送数据> https://zhuanlan.zhihu.com/p/36792134 ...

  2. 天问51单片机结合WIFI模块上传温度数据到TCP服务器

    目 录 一.前言 二.项目准备 三.设计思路 四.项目主要代码 五.项目成果 一.前言: 天问51系统单片机作为增强型51单片机,它比传统的51单片机性能提升很多,而公司开发的天问BLOCK软件编程也 ...

  3. 1、esp32(arduino)接入阿里云MQTT及数据处理

    esp32(arduino)接入阿里云MQTT服务器 1.遇到的问题和需求 2.解决方案 2.1.系统框图 2.2.待测产品 2.3.采集器 2.3.网关 2.4.服务器 2.5.数据库 2.6.客户 ...

  4. 天问51单片机结合WIFI模块上传温度数据到巴法云平台

    目 录 一.前言 二.项目准备 三.设计思路 四.项目主要代码 五.项目成果 六.项目不足 一.前言: 继前一个项目<天问51单片机结合WIFI模块上传温度数据到TCP服务器>,本次项目是 ...

  5. web前端埋点及数据上报

    web前端埋点及数据上报 简介 前端埋点即在产品客户端获取用户行为和使用情况的一种监控方式.通过埋点可以获取到用户行为数据,借助这些数据,我们可以从用户角度出发,升级迭代产品,使其更加贴近用户使用习惯 ...

  6. Android UsageStatsService 系统数据统计和数据上报

    1. 概况 在项目中,有需求要实现监测手机系统中设备事件和应用事件,然后每隔固定的周期上报给服务器,后台拿到这些数据后,挖掘分析统计出设备的销售数量,安装应用使用活跃度,用户使用时长等有用的价值信息, ...

  7. 应用场景一:西门子PLC通过桥接器连接MQTT服务器

    应用场景描述: 云平台.MES等数据采集.设备管理系统,需要通过MQTT的方式,上传和下发数据,MQTT服务器可以获取PLC的实时状态数据,也可以下发控制指令.桥接器提供4G.WIFI和有线三种连接方 ...

  8. 从零开始开发物联网项目(1)——mqtt服务器搭建

    去年开发了一个物联网的项目,入了很多坑,花了很多时间,不过最后终于做出了一个初代版本,也算完成了项目.为了避免自己遗忘,也为了让有兴趣学习物联网的同学少入点坑,我整理了一下,写成一个系列教程.通过这个 ...

  9. 【迷你强的物联网】起始篇-简介与MQTT服务器【从零开始搭建自己的物联网系统】

    简介 此为系列文章,主要写什么是物联网,当然啦,这个概念过于抽象,所以我会从自己动手构建出一个完整的物联网系统这个方式来折腾.   这个项目也会是一个连载项目,完成一部分就会发布出来,会同步更新于工坊 ...

最新文章

  1. lammps linux运行命令,[转载]linux下 lammps的安装以及计算初步使用
  2. 惊!!!CV界的BERT要来了?准确率提高近25%!
  3. Ruby 2.2.0发布,支持增量式垃圾收集和符号的垃圾收集
  4. 深信服副总裁张开翼:随需应变的IT新架构
  5. 说明使用assert和防错代码的区别
  6. python链表的创建_python数据结构之链表的实例讲解
  7. Codeforces Round #277 (Div. 2) A. Calculating Function 水题
  8. android xpath解析xml,Android 中处理 XML 的四种方式-DOM
  9. 简单事务:.NET Core应用程序的微服务示例体系结构
  10. 查询SQL的null与''
  11. Java高质量20问
  12. java面试之多线程篇
  13. VS | 设置头文件包含目录(无法打开包括文件,No such file or directory的解决)
  14. 股票 - - 常用指标【上】
  15. 最高100,000美元大奖,2021腾讯广告算法大赛开启
  16. 陶哲轩实分析 6.4 节习题试解
  17. 微信小程序获取当前系统时间以及判断周几
  18. JME3 官方教程翻译 - 自定义网格形状
  19. Excel受保护的工作表怎么操作?
  20. 网络安全:渗透流程之信息收集

热门文章

  1. 西安交大轴承实验集XJTU-SY_Bearing_Datasets的python调用代码
  2. 成功解决:计算交叉熵lossFunction报错“1D target tensor expected, multi-target not supported”的解决办法
  3. Mac电脑高手都会用的10个Mac OS实用技巧,都是干货值得收藏!
  4. 新的一天,加油努力!
  5. 基于php的宠物狗销售网站
  6. GBDT、XGBoost、LightGBM比较
  7. 【CISSP】安全评估与测试
  8. 浪潮和思科联合 华为、新华三怎么看?
  9. Android studio打包签名报错:Error:(3) Error: app_name is not translated in am (Amharic);
  10. 心田花开:二年级语文阅读《黄山奇石》附答案解析