物联网开发笔记(31)- 使用Micropython开发ESP32开发板之手机扫二维码远程控制开关灯(1)

2023-10-27

一、目的

        我们分3节讲述远程控制。这一节在我们的240x240的oled屏幕上显示二维码,然后用手机扫二维码,从开发板的TCP服务器上返回字符串。

二、环境

        ESP32 + 240x240的oled彩色屏幕+ Thonny IDE + 几根杜邦线    

        接线方式请看上前面的章节,此处不再重复赘述。

三、用到的知识

        前面我们学习的远程控制开关LED灯和240x240屏幕的知识。大家不会的话,请看前面的章节。不懂得也可以留言哈。

四、代码

from uQR import QRCode
from machine import Pin, SPI
import st7789_new
import socket
import time
import network
import machine


def do_connect():  # 连接无线
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        # WIFI名字和密码 # WIFI 名字写错会报错“OSError: Wifi Internal Error” # 电脑WIFI不要使用5G频率,否则运行报错
        wlan.connect('WIFI名字', 'WIFI密码')  # 请换成你的WIFI信息
        i = 1
        while not wlan.isconnected():
            print("正在链接中...{}".format(i))
            i += 1
            time.sleep(1)
    print('network config:', wlan.ifconfig())
    return wlan.ifconfig()[0]


def show_qrcode(ip):  # 屏幕显示二维码
    tft = st7789_new.ST7889_Image(SPI(2, 80000000), dc=Pin(2), cs=Pin(5), rst=Pin(15))
    tft.fill(st7789_new.color565(255, 255, 255))  # 背景设置为白色


    qr = QRCode(border=2)
    qr.add_data('http://{}'.format(ip))  # 显示完整链接
    matrix = qr.get_matrix()

    row_len = len(matrix)
    col_len = len(matrix[0])

    print("row=%d, col=%d" % (row_len, col_len))

    # 放大倍数
    scale_rate = 8

    # 准备黑色,白色数据
    buffer_black = bytearray(scale_rate * scale_rate * 2)  # 每个点pixel有2个字节表示颜色
    buffer_white = bytearray(scale_rate * scale_rate * 2)  # 每个点pixel有2个字节表示颜色
    color_black = st7789_new.color565(0, 0, 0)
    color_black_byte1 = color_black & 0xff00 >> 8
    color_black_byte2 = color_black & 0xff
    color_white = st7789_new.color565(255, 255, 255)
    color_white_byte1 = color_white & 0xff00 >> 8
    color_white_byte2 = color_white & 0xff

    for i in range(0, scale_rate * scale_rate * 2, 2):
        buffer_black[i] = color_black_byte1
        buffer_black[i + 1] = color_black_byte2
        buffer_white[i] = color_white_byte1
        buffer_white[i + 1] = color_white_byte2

    # 循环次数不增加,只增加每次发送的数据量,每次发送scale_rate X scale_rate个点的信息
    for row in range(row_len):
        for col in range(col_len):
            if matrix[row][col]:
                # tft.pixel(row, col, st7789_new.color565(0, 0, 0))
                tft.show_img(row * scale_rate, col * scale_rate, row * scale_rate + scale_rate - 1, col * scale_rate + scale_rate - 1, buffer_black)
            else:
                # tft.pixel(row, col, st7789_new.color565(255, 255, 255))
                tft.show_img(row * scale_rate, col * scale_rate, row * scale_rate + scale_rate - 1 , col * scale_rate + scale_rate - 1, buffer_white)
            col += 1
        row += 1


def handle_request(client_socket):  # 处理浏览器请求
    """
    处理浏览器发送过来的数据
    然后回送相对应的数据(html、css、js、img。。。)
    :return:
    """
    print("---6-1---")
    # 1. 接收
    recv_content = client_socket.recv(1024).decode("utf-8")
    print("---6-2---")
    print("-----接收到的数据如下----:")
    print(recv_content)
    print("---6-3---")
    # 2. 处理请求(此时忽略)

    # 3.1 整理要回送的数据
    response_headers = "HTTP/1.1 200 OK\r\n"
    response_headers += "Content-Type:text/html;charset=utf-8\r\n"
    response_headers += "\r\n"

    response_boy = "Test successful"

    response = response_headers + response_boy
    print("---6-4---")
    # 3.2 给浏览器回送对应的数据
    client_socket.send(response.encode("utf-8"))
    print("---6-5---")
    # 4. 关闭套接字
    client_socket.close()


def tcp_server_control_led():  # 创建TCP服务器套接字
    print("---1---")
    # 1. 创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 为了保证在tcp先断开的情况下,下一次依然能够使用指定的端口,需要设置
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    print("---2---")
    # 2. 绑定本地信息
    tcp_server_socket.bind(("", 80))
    print("---3---")
    # 3. 变成监听套接字
    tcp_server_socket.listen(128)

    print("---4---")
    # 4. 等待客户端的链接
    client_socket, client_info = tcp_server_socket.accept()
    print("---5---")
    print(client_info)  # 打印 当前是哪个客户端进行了请求
    print("---6---")
    # 5. 为客户端服务
    handle_request(client_socket)
    print("---7---")
    # 6. 关闭套接字
    tcp_server_socket.close()


def main():
    # 1. 链接wifi
    ip = do_connect()
    print("ip地址是:", ip)
    
    # 2. 显示二维码
    show_qrcode(ip)
    
    # 3. 创建tcp服务器,等待客户端链接,然后根据客户端的命令控制LED灯
    tcp_server_control_led()
    
    
if __name__ == "__main__":
    main()

五、运行代码
        我们使用Thoony IDE进行开发,这个工具很好用。运行上面代码后,Thonny会再shell窗口中显示打印出来的信息。我们运行看下哈:

首先打印出网络连接的信息:

这里我们可以知道,ESP32开发板的IP地址是192.168.0.106。然后打印出1,2,3,4,我们看到此时我们的屏幕上已经显示出二维码:

 

我们打开手机扫一扫二维码,然后手机会打开一个页面:

这里手机扫面二维码后,手机浏览器向开发板TCP服务器发起请求,开发板再收到请求后返回对应的结果。

 

这里环境我们已经测试成功,下一节,我们接着讲手机远程控制灯的开关。再见哈。。。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

物联网开发笔记(31)- 使用Micropython开发ESP32开发板之手机扫二维码远程控制开关灯(1) 的相关文章

  • 京东店铺所有商品API接口(JD整店商品查询API接口)

    可以通过京东店铺所有商品API接口采集店铺所有商品详情页各项数据 包含商品标题 SKU信息 价格 优惠价 收藏数 销量 SKU图 标题 详情页图片等店铺内页面上有的数据均可以拿到 大家都知道 京东的反爬虫机制十分严 而很多时候 没办法高效的
  • 一个99%的人都说不清楚知识点——Spring 事务传播行为

    面试过很多人 大部分都能把事务的四个特性及隔离级别说得七七八八 但当问到 Spring 的传播行为时 就基本上没人能说出个一二三了 我们都知道 一个事务要么成功 要么失败 但当若干个事务配合完成一个复杂任务时 就不能简单的这样一刀切了 我们
  • vim快速跳转快捷键

    快捷键 描述 跳转到括号匹配处 gD 跳转到局部变量的定义处 跳转到光标上次停留处 mx 设置书签 x为a z任意字母 x 跳转到书签处 gt 增加缩进 n gt 增加以下b行的缩进 lt 减少缩进 n lt 减少以下n行的缩进 跳到上一段
  • uni-app修改页面背景色:

    1 设置全局背景色 法一 globalStyle navigationBarTextStyle black navigationBarTitleText 管理 navigationBarTitleText 管理 navigationBarB

随机推荐

  • 在Python中调用和执行JavaScript

    在Python中调用和执行JavaScript 引言 在Web开发中 Python和JavaScript是两种常用的编程语言 Python通常用于服务器端开发 而JavaScript则用于客户端浏览器中的脚本编写 然而 有时候我们需要在Py
  • Kubernetes 证书详解

    K8S 证书介绍 在 Kube apiserver 中提供了很多认证方式 其中最常用的就是 TLS 认证 当然也有 BootstrapToken BasicAuth 认证等 只要有一个认证通过 那么 Kube apiserver 即认为认证
  • PHP自学过程之 运算符与流程控制

    一 PHP的运算符 PHP中有丰富的运算符集 它们中大部分直接来自于C语言 按照不同功能区分 运算符可以分为 算术运算符 字符串运算符 赋值运算符 位运算符 条件运算符 以及逻辑运算符等 当各种运算符在同一个表达式中时 它们的运算是有一定的
  • 算法分析与设计——LeetCode Problem.547 Friend Circles

    问题详情 There are N students in a class Some of them are friends while some are not Their friendship is transitive in natur
  • vue 手动挂载html,vue中的.$mount('#app')手动挂载操作--龙方网络

    在Vue构造函数时 需要配置一个el属性 如果没有没有el属性时 可以使用 mount app 进行挂载 配置了el属性 new Vue el app router 如果没有配置el属性 可以使用手动挂载 mount app new Vue
  • 泊松过程、伽马分布、贝塔分布及狄利克雷分布

    泊松过程 伽马分布 贝塔分布及狄利克雷分布 1 泊松过程 1 1Poisson过程的定义 1 2Poisson过程的应用 2 伽马分布 2 1伽马分布的定义 2 2伽马分布的性质 2 3伽马分布与其他分布的关系 3 贝塔分布 3 1贝塔分布
  • 机器学习十大算法之CART

    一 概述 CART Classification And Regression Tree 即分类回归树算法 它是决策树的一种实现 通常决策树主要有三种实现 分别是ID3算法 CART算法和C4 5算法 CART算法是一种二分递归分割技术 把
  • python线性拟合、不确定性

    1 线性回归 可以直接调用sklearn中的linear model模块进行线性回归 import numpy as np from sklearn linear model import LinearRegression model Li
  • CTP使用

    1 CTP介绍 1 1 CTP简介 综合交易平台CTP Comprehensive Transaction Platform 是由上海期货信息技术有限公司 上海期货交易所的全资子公司 开发的期货交易平台 CTP平台以 新一代交易所系统 的核
  • 温故知新:深入理解Android插件化技术

    现在普通人一听 宿主 第一想到的就是欧美电影里的恐怖画面 甚至感觉瘆得慌 但是在移动开发领域 我们经常会提及的 宿主 却有完全不一样的意义 那就是支持插件的app主体 从2012年插件化概念被提出 到2016年的时候 插件化技术百家争鸣 被
  • RabbitMQ-生产者、消费者简单实现

    QueueingConsumer实现 maven依赖
  • flutter 用 webview_flutter 与 h5 交互

    这里是本地 h5 页面 需要在 pubspec yaml 里添加资源 div style margin top 80px span Flutter发送过来的消息是 span div div div
  • Python五大主要用途+零基础基础入门全攻略

    Python可以做什么 Python的热度毋庸置疑 现在国内 不仅考国家二级计算机证需要学习Python 它甚至出现在了小学生的教材里 那么高度如此高涨的Python 都可以用来做什么呢 目前来说 Python有五大主要用途以及多类其他用途
  • 做不完的事情...

    小赵 化名 最近遇上了难题 他理解不了事务的概念 早晨上班 在公共汽车上也一直思考这个问题 300路上班时间很挤 这时一个衣着前卫 凹凸有致的妙龄女子被挤到了小赵的身前 小赵无可抗拒地停止了对专业问题的思考 而被紧紧靠在身上的这团香艳弄得血
  • Android Studio中启动模拟器时提示HAXM错误的解决方法

    Android Studio中启动模拟器时 会提示HAXM错误 如图1所示 图1 提示HAXM错误 以上错误的提示信息是需要在BIOS中打开 VT x 设置 但是打开该设置后 依然会显示该错误信息 相关链接1 VT x 其中 VT是Virt
  • jenkins下载插件下载不了,解决办法

    虚拟机运行下载更新jenkins插件失败 jenkins安装更新插件失败 java io IOException Server returned HTTP response code 503 for URL https get jenkin
  • 完全用Linux工作之三(GUI vs. CLI)

    原文地址 http www chinaunix net jh 4 16102 html GUI vs CLI 做一个坚定不移的 两面派 大家看到这个标题是不是热血沸腾 两派大虾都可以围攻我了 GUI派用户 哇 我一看你这小子就是 CLI 的
  • WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED

    git pull代码出现下面提示 WARNING REMOTE HOST IDENTIFICATION HAS CHANGED IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY Som
  • 求最大公倍数三大通解

    1 常规求解法 求5 7的最小公倍数 define CRT SECURE NO WARNINGS 1 include
  • 物联网开发笔记(31)- 使用Micropython开发ESP32开发板之手机扫二维码远程控制开关灯(1)

    一 目的 我们分3节讲述远程控制 这一节在我们的240x240的oled屏幕上显示二维码 然后用手机扫二维码 从开发板的TCP服务器上返回字符串 二 环境 ESP32 240x240的oled彩色屏幕 Thonny IDE 几根杜邦线 接线