06-基础例程6

基础例程6

01、WIFI实验—WebServer

实验介绍

​ 连接路由器上网是我们每天都做的事情,日常生活中只需要知道路由器的账号和密码,就可以使用手机或电脑连接到路由器,然后上网。

​ 连接路由器,将ESP32的IP地址等信息通过shell控制台输出显示

​ 模块包括热点AP模式客户端STA模式

​ 热点AP模式是指电脑或手机端直接连接ESP32发出的热点实现连接,如果电脑连接模块AP热点,这样电脑就不能上网。

​ 因此在使用电脑端和模块进行网络通信时,一般情况下使用STA模式。也就是电脑和设备同时连接到相同网段的路由器上。

硬件设计

​ 内置WIFI功能,不需要额外连接

软件设计

/* 深圳市普中科技有限公司(PRECHIN 普中)
   技术支持:www.prechin.net
 * 
 * 实验名称:WIFI实验--WebServer
 * 
 * 接线说明:LED模块-->ESP32 IO
             (D1)-->(15)
 * 
 * 实验现象:程序下载成功后,手机连接的WIFI需和ESP32连接的WIFI处于同一频段(比如192.168.1.xx),
            然后在手机网页输入串口控制台输出的本机IP地址即可进入手机端网页控制板子LED。
 * 
 * 注意事项:
 */

#include "public.h"
#include <WiFi.h>

//路由器账号和密码
const char* ssid     = "uestc-2019";
const char* password = "wyj1347863";

WiFiServer server(80);

//LED控制引脚
#define led_pin   15

//WIFI连接路由器
void wifi_connect(void)
{
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void setup(){
  Serial.begin(115200);
  pinMode(led_pin, OUTPUT);      // set the LED pin mode
  delay(10);
  wifi_connect();
  server.begin();
  
}
  
void loop(){
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("New Client.");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/H\">here</a> to turn the LED on pin 15 on.<br>");
            client.print("Click <a href=\"/L\">here</a> to turn the LED on pin 15 off.<br>");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(led_pin, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(led_pin, LOW);                // GET /L turns the LED off
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}


实验现象

Connecting to uestc-2019
..
WiFi connected.
IP address: 
192.168.0.102
New Client.
GET /H HTTP/1.1
Host: 192.168.0.102
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.0.102/H
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6

Client Disconnected.
New Client.
GET /favicon.ico HTTP/1.1
Host: 192.168.0.102
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203
Accept: image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://192.168.0.102/L
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6

Client Disconnected.

02、WIFI实验—Socket

实验介绍

​ 01章节学习了使用ESP32连接到无线路由器。现在学习Socket通信。

​ 在这里,我们尝试以最容易理解的方式讲述Socket。

网络通信的分层

在这里插入图片描述

​ TCP/IP模型的传输层和应用层,传输层比较熟悉的是TCP和UDP,UDP协议基本没有对IP层的数据进行任何的处理。而TCP协议还加入了更加复杂的传输控制,比如滑动的数据发送窗口(Slice Window),以及接收确认和重发机制,以达到数据的可靠传输。应用层中网页常用的则是HTTP

​ 网络通信时最基础依赖于IP和端口的,HTTP一般情况下默认使用端口80。多人连接问题。

​ 应用层HTTP通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要同一个TCP协议端口传输数据。为了区分不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)。应用层和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。


​ 其实,Socket抽象层介于传输层和应用层之间,跟TCP/IP并没有什么联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。

在这里插入图片描述
套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议(通常是TCP或UDP),本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

​ Socket的出现只是为了更方便的使用TCP/IP协议,简单理解就是其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create、listen、accept、connect、read和write等,以下为通信流程:

在这里插入图片描述

​ 一个Socket通信需要一个服务器端和一个客户端。本例中,ESP32开发板为客户端,电脑使用网络调试助手作为服务器端,双方使用TCP协议传输。对于客户端,则只需要知道电脑端的IP和端口即可简历连接。

软件设计

'''
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN
 普中

实验名称:WIFI实验-Socket通信
接线说明:LED模块-->ESP32 IO
         (D1)-->(15)
         
实验现象:程序下载成功后,软件shell控制台输出当前IP、子网掩码、网关的地址信息,在网络调试助手上
         连接成功后,可数据收发。
         
注意事项:ESP32 WIFI作为客户端连接路由器热点,然后电脑也连接路由器,此时可在电脑端使用网络调试助手,
         设置:协议类型:TCP Server,本机主机地址:电脑端IP地址,本机主机端口:10000

'''

#导入Pin模块
from machine import Pin
import time
import network
import usocket

#定义LED控制对象
led1=Pin(15,Pin.OUT)

#路由器WIFI账号和密码
ssid="uestc-2019"
password="wyj1347863"

#服务器地址和端口
dest_ip="192.168.0.100"
dest_port=10000

#WIFI连接
def wifi_connect():
    wlan=network.WLAN(network.STA_IF)  #STA模式
    wlan.active(True)  #激活
    start_time=time.time()  #记录时间做超时判断
    
    if not wlan.isconnected():
        print("conneting to network...")
        wlan.connect(ssid,password)  #输入WIFI账号和密码
        
        while not wlan.isconnected():
            led1.value(1)
            time.sleep_ms(300)
            led1.value(0)
            time.sleep_ms(300)
            
            #超时判断,15 秒没连接成功判定为超时
            if time.time()-start_time>15:
                print("WIFI Connect Timeout!")
                break
        return False
    
    else:
        led1.value(0)
        print("network information:", wlan.ifconfig())
        return True


#程序入口
if __name__=="__main__":
    
    if wifi_connect():
        socket=usocket.socket()  #创建socket连接
        addr=(dest_ip,dest_port)  #服务器IP地址和端口
        socket.connect(addr)
        socket.send("Hello PRECHIN")
        
        while True:
            text=socket.recv(128)  #单次最多接收128字节
            if text==None:
                pass
            else:
                print(text)
                socket.send("I get:"+text.decode("utf-8"))
            time.sleep_ms(300)
        


shell的窗口

network information: ('192.168.0.102', '255.255.255.0', '192.168.0.1', '192.168.0.1')
b'12345678\r\n'
b'123456'

03、WIFI实验—MQTT

​ 前面学习了Socket通信,当服务器和客户端建立起连接时,就可以相互通信。在互联网应用,大多使用WebSocket接口来传输数据。

​ 在物联网中,如果是海量的数据,就需要用到MQTT(消息队列遥测传输)协议。

实验介绍

​ MQTT是IBM于1999年提出的,和HTTP一样属于应用层,工作在TCP/IP协议族上,通常还会调用socket接口。是一个基于客户端-服务器的消息发布/订阅传输协议。其特点是协议是轻量、简单、开放和易于实现的,这些特点使得它适用范围非常广泛。

​ 总结下来MQTT有以下的优势/特性:

  • 异步消息协议
  • 面向长连接
  • 双向数据传输
  • 协议轻量级
  • 被动数据获取

在这里插入图片描述

​ 从上图可看到,MQTT通信的角色有两个,分别是服务器和客户端。服务器只负责中转数据,不做存储;客户端可以是信息发送者或订阅者,也可以同时是两者。如下图所示。

在这里插入图片描述

​ 确定了角色后,数据如何传输呢?下图是MQTT最基本的数据帧格式,例如温度传感器发布了主题“Temperature”编号,消息是“25”(表示温度)。那么所有订阅了这个主题编号的客户端(手机应用)就会收到相关信息,从而实现通信。

在这里插入图片描述

​ 由于特殊的发布/订阅机制,服务器不需要存储数据(当然也可以在服务器的设备上建立一个客户端来订阅保存信息),因此非常适合海量设备的传输。

在这里插入图片描述

硬件设计

软件设计

分为发布者和订阅者

发布者

'''
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN
 普中

实验名称:WIFI实验-MQTT通信(发布者)
接线说明:LED模块-->ESP32 IO
         (D1)-->(15)
         
实验现象:程序下载成功后,软件shell控制台输出当前IP、子网掩码、网关的地址信息,
         MQTT在线助手,输入网址:http://www.tongxinmao.com/txm/webmqtt.php#
         进入,按默认设置,选择连接,然后在Subscribe订阅主题中选择程序中设置的Topic主题:
         /public/pz_esp32/1
         
注意事项:ESP32 WIFI作为客户端连接路由器热点,然后电脑也连接路由器,此时可连接成功输出信息

'''

#导入Pin模块
from machine import Pin
import time
from machine import Timer
import network
from simple import MQTTClient

#定义LED控制对象
led1=Pin(15,Pin.OUT)

#路由器WIFI账号和密码
ssid="uestc-2019"
password="wyj1347863"

#WIFI连接
def wifi_connect():
    wlan=network.WLAN(network.STA_IF)  #STA模式
    wlan.active(True)  #激活
    start_time=time.time()  #记录时间做超时判断
    
    if not wlan.isconnected():
        print("conneting to network...")
        wlan.connect(ssid,password)  #输入WIFI账号和密码
        
        while not wlan.isconnected():
            led1.value(1)
            time.sleep_ms(300)
            led1.value(0)
            time.sleep_ms(300)
            
            #超时判断,15 秒没连接成功判定为超时
            if time.time()-start_time>150:
                print("WIFI Connect Timeout!")
                break
        return False
    
    else:
        led1.value(0)
        print("network information:", wlan.ifconfig())
        return True

#发布数据任务
def mqtt_send(tim):
    client.publish(TOPIC, "Hello PRECHIN")

#程序入口
if __name__=="__main__":
    
    if wifi_connect():
        SERVER="mq.tongxinmao.com"
        PORT=18830            #通信猫的端口
        CLIENT_ID="PZ-ESP32"  #客户端ID
        TOPIC="/public/pz_esp32/1"  #TOPIC名称
        client = MQTTClient(CLIENT_ID, SERVER, PORT)
        client.connect()
        
        #开启RTOS定时器,周期 1000ms,执行MQTT通信接收任务
        tim = Timer(0)
        tim.init(period=1000, mode=Timer.PERIODIC,callback=mqtt_send)

ESP32作为客户端,发布者

电脑作为客户端,订阅者

调试软件

在这里插入图片描述

shell

在这里插入图片描述

订阅者

'''
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN
 普中

实验名称:WIFI实验-MQTT通信(订阅者)
接线说明:LED模块-->ESP32 IO
         (D1)-->(15)
         
实验现象:程序下载成功后,软件shell控制台输出当前IP、子网掩码、网关的地址信息,
         MQTT在线助手,输入网址:http://www.tongxinmao.com/txm/webmqtt.php#
         进入,按默认设置,选择连接,然后在Publish发布主题中选择程序中设置的Topic主题:
         /public/pz_esp32/1
         ,设置要发送的信息,点击发布,在Shell控制台即可输出主题和消息
         
注意事项:ESP32 WIFI作为客户端连接路由器热点,然后电脑也连接路由器,此时可连接成功输出信息

'''

#导入Pin模块
from machine import Pin
from machine import Timer
import time
import network
from simple import MQTTClient

#定义LED控制对象
led1=Pin(15,Pin.OUT)

#路由器WIFI账号和密码
ssid="uestc-2019"
password="wyj1347863"

#WIFI连接
def wifi_connect():
    wlan=network.WLAN(network.STA_IF)  #STA模式
    wlan.active(True)  #激活
    start_time=time.time()  #记录时间做超时判断
    
    if not wlan.isconnected():
        print("conneting to network...")
        wlan.connect(ssid,password)  #输入WIFI账号和密码
        
        while not wlan.isconnected():
            led1.value(1)
            time.sleep_ms(300)
            led1.value(0)
            time.sleep_ms(300)
            
            #超时判断,15 秒没连接成功判定为超时
            if time.time()-start_time>150:
                print("WIFI Connect Timeout!")
                break
        return False
    
    else:
        led1.value(0)
        print("network information:", wlan.ifconfig())
        return True

#设置 MQTT 回调函数,有信息时候执行
def mqtt_callback(topic,msg):
    print("topic: {}".format(topic))
    print("msg: {}".format(msg))
    
#接收数据任务
def mqtt_recv(tim):
    client.check_msg()
    

#程序入口
if __name__=="__main__":
    
    if wifi_connect():
        SERVER="mq.tongxinmao.com"
        PORT=18830
        CLIENT_ID="PZ-ESP32"  #客户端ID
        TOPIC="/public/pz_esp32/1"  #TOPIC名称
        client = MQTTClient(CLIENT_ID, SERVER, PORT)  #建立客户端
        client.set_callback(mqtt_callback)  #配置回调函数
        client.connect()
        client.subscribe(TOPIC)  #订阅主题
        
        #开启RTOS定时器,周期 300ms,执行MQTT通信接收任务
        tim = Timer(0)
        tim.init(period=300, mode=Timer.PERIODIC,callback=mqtt_recv)

ESP32作为客户端的订阅者,订阅主题

电脑作为客户端的发布者,发布主题

  • 调试软件

在这里插入图片描述

shell界面

在这里插入图片描述

04、WIFI实验—手机控制LED

软件设计

'''
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN
 普中

实验名称:WIFI实验-手机控制LED
接线说明:LED模块-->ESP32 IO
         (D1)-->(15)
         
实验现象:程序下载成功后,手机连接的WIFI需和ESP32连接的WIFI处于同一频段(比如192.168.1.xx),
         然后在手机网页输入Shell控制台输出的本机IP地址即可进入手机端网页控制板子LED
         
注意事项:ESP32作为服务器,手机或电脑作为客户端

'''

#导入Pin模块
from machine import Pin
import time
import network
import socket

#定义LED控制对象
led1=Pin(15,Pin.OUT,Pin.PULL_DOWN)

#连接的WIFI账号和密码
ssid = "uestc-2019"
password = "wyj1347863"

#WIFI连接
def wifi_connect():
    wlan=network.WLAN(network.STA_IF)  #STA模式
    wlan.active(True)  #激活
    
    if not wlan.isconnected():
        print("conneting to network...")
        wlan.connect(ssid,password)  #输入 WIFI 账号密码
        
        while not wlan.isconnected():
            led1.value(1)
            time.sleep_ms(300)
            led1.value(0)
            time.sleep_ms(300)
        led1.value(0)
        return False
    else:
        led1.value(0)
        print("network information:", wlan.ifconfig())
        return True

#网页数据
def web_page():
    if led1.value() == 0:
        gpio_state="OFF"
    else:
        gpio_state="ON"
  
    html = """<html><head> <title>ESP32 LED control</title> <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="icon" href="data:,"> <style>html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}
        h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}.button{display: inline-block; background-color: #e7bd3b; border: none; 
        border-radius: 4px; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
        .button2{background-color: #4286f4;}</style></head><body> <h1>ESP32 LED control</h1> 
        <p>GPIO state: <strong>""" + gpio_state + """</strong></p><p><a href="/?led=on"><button class="button">ON</button></a></p>
        <p><a href="/?led=off"><button class="button button2">OFF</button></a></p></body></html>"""
    return html

#程序入口
if __name__=="__main__":
    
    if wifi_connect():
        #SOCK_STREAM表示的是TCP协议,SOCK_DGRAM表示的是UDP协议
        my_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #创建socket连接
        # 将socket对象绑定ip地址和端口号
        my_socket.bind(('', 80))
        # 相当于电话的开机 括号里的参数表示可以同时接收5个请求
        my_socket.listen(5)
        
        while True:
            # 进入监听状态,等待别人链接过来,有两个返回值,
            #一个是对方的socket对象,一个是对方的ip以及端口
            client, addr = my_socket.accept()
            print('Got a connection from %s' % str(addr))
            # recv表示接收,括号里是最大接收字节
            request = client.recv(1024)
            request = str(request)
            print('Content = %s' % request)
            led_on = request.find('/?led=on')
            led_off = request.find('/?led=off')
            if led_on == 6:
                print('LED ON')
                led1.value(1)
            if led_off == 6:
                print('LED OFF')
                led1.value(0)
            response = web_page()
            client.send('HTTP/1.1 200 OK\n')
            client.send('Content-Type: text/html\n')
            client.send('Connection: close\n\n')
            client.sendall(response)
            client.close()


实验现象

在这里插入图片描述

网页端

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LSM6DS3TR-C是一种6轴惯性传感器,常用于测量加速度和角速度。它具有高精度、低功耗和小尺寸等特点,被广泛应用于智能手机、可穿戴设备和运动控制等领域。 要使用LSM6DS3TR-C,我们可以根据其提供的例程进行开发。例程是一份代码指南,帮助我们了解如何与传感器进行通信和控制。 首先,我们需要选择合适的开发平台,例如Arduino或者其他单片机。然后,我们可以在相关的开发平台上下载LSM6DS3TR-C的例程代码。 例程代码一般包含以下几个方面的内容: 1. 通信设置:我们需要设定传感器与开发平台之间的通信接口和协议,例如I2C或SPI。 2. 初始化设置:通过配置传感器的寄存器来初始化传感器,包括其工作模式、输出数据速率和量程等。 3. 数据获取:通过读取传感器的寄存器,获取加速度和角速度的原始数据。根据传感器的精度和分辨率,我们可以根据需要进行数据的处理和转换。 4. 数据处理:根据应用的需求,我们可以对原始数据进行滤波、积分或其他相关算法的处理,以获得更有用的信息。 5. 数据输出:将处理后的数据进行输出,可以通过串口、无线通信或其他方式传输给其他设备或系统。 通过使用LSM6DS3TR-C的例程,我们能够快速上手和开发应用,如运动检测、姿态跟踪和导航等。但是需要注意的是,例程只是一个起始点,我们还可以根据具体应用的需要对代码进行修改和优化,以满足更高级的功能要求。 总之,LSM6DS3TR-C的例程提供了一个快速开发的平台,帮助我们更好地了解和应用这款传感器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值