基于mpy的esp32无线数据收发调试器

设计了一个结合esp32的WIFI和蓝牙功能的系统,用于电子设计竞赛的无线调试和数据监测。蓝牙4.0用于与手机APP无线通信,WiFi连接TCP服务器实现远程数据传输。系统提高了调试效率,但TCP数据传输可能因网络延迟导致较高延时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计初衷

本设计初衷在于对准备电子设计竞赛阶段的调试和数据监测。
经实际应用后效果显著,调试效率大大提升,该设计旨在解决串口调试模块由于无法做到无线收发,
因此基于esp32的WIFI和蓝牙功能制作了一款能够无线调参并且通过TCP协议实时查看数据的应用。

设计思路

本设计一共用到了esp32的WIFI和蓝牙两个功能,两个功能互不影响。

蓝牙功能

蓝牙功能主要用于与手机端app通信并且实现数据的收发,用户可以通过该设计的蓝牙功能实现无线调参和数据监测。

WIFI功能

WIFI功能主要用于连接当前现有的WIFI局域网,然后通过python的socket模块实现TCP服务器的连接,通过TCP服务器,本设计可以将数据通过TCP协议发送给服务器端,从而实现远程的数据收发。

蓝牙部分

本设计的蓝牙部分使用的是版本为4.0的低功耗蓝牙,下文为低功耗蓝牙的简介:

引用自ChatGPT

低功耗蓝牙(Low Energy Bluetooth,简称BLE)是一种蓝牙无线通信技术,专门设计用于低功耗应用。它是蓝牙4.0版本引入的一项重要功能,旨在满足对电池寿命和设备尺寸要求较高的应用场景。

与传统蓝牙技术相比,低功耗蓝牙在功耗方面做了很多优化,使得设备可以以较低的能耗进行通信,从而延长电池寿命。它通常应用于智能穿戴设备、健康监测设备、智能家居、物联网设备等需要长时间运行且对功耗有严格要求的场景。

低功耗蓝牙采用了一种称为“广播-扫描-连接”的通信模式。设备可以以低功耗方式进行广播,发送数据包含自身的身份信息。其他设备可以进入扫描模式,接收广播并检测周围的低功耗蓝牙设备。一旦设备发现感兴趣的广播信息,它可以发起连接并进行数据交换。

BLE在物理层使用了2.4GHz的ISM频段,与传统蓝牙共享相同的频率范围。它具有较短的通信距离(通常在10到100米之间),但相对较高的数据传输速率(通常在1 Mbps左右)。此外,BLE还采用了一种快速连接和断开连接的机制,以进一步降低能耗。

低功耗蓝牙具有多种优点,包括低功耗、低成本、广泛的设备兼容性和易于开发。它为物联网设备提供了一种有效的无线通信解决方案,推动了可穿戴技术、智能家居和健康监测等领域的发展。

本设计的蓝牙使用了micropython的bluetooth库,官方文档详见micro python低功耗蓝牙

其主要代码如下:

class ESP32_BLE():
    def __init__(self, name):
        self.led = Pin(2, Pin.OUT)
        self.timer1 = Timer(0)
        self.name = name
        self.ble = bluetooth.BLE()
        self.ble.active(True)
        self.ble.config(gap_name=name)
        self.disconnected()
        self.ble.irq(self.ble_irq)
        self.register()
        self.advertiser()

    def connected(self):
        self.led.value(1)
        self.timer1.deinit()

    def disconnected(self):        
        self.timer1.init(period=100, mode=Timer.PERIODIC, callback=lambda t: self.led.value(not self.led.value()))

    def ble_irq(self, event, data):
        global BLE_MSG_x,BLE_MSG_y,BLE_MSG_flii,connected
        if event == 1: #_IRQ_CENTRAL_CONNECT 手机链接了此设备
            self.connected()
            connected = True
        elif event == 2: #_IRQ_CENTRAL_DISCONNECT 手机断开此设备
            self.advertiser()
            self.disconnected()
            connected = False
        elif event == 3: #_IRQ_GATTS_WRITE 手机发送了数据 
            buffer = self.ble.gatts_read(self.rx)
            print(buffer)
            Speed_left = str(int(struct.unpack('f', buffer[1:5])[0]))
            P = str(struct.unpack('f', buffer[5:9])[0])
            I = str(struct.unpack('f', buffer[9:13])[0])
            D = str(struct.unpack('f', buffer[13:17])[0])
            uart1.write(f"8,{P},{I},{D},{Speed_left},\r\n")  # write 5 bytes
            self.send(f"P:{P} I:{I} D:{D}")
            print(f"P:{P} I:{I} D:{D} \n Speed_left:{Speed_left}")
    def register(self):        
        service_uuid = '6E400004-B5A3-F393-E0A9-E50E24DCCA9E'
        reader_uuid = '6E400005-B5A3-F393-E0A9-E50E24DCCA9E'
        reader_uuid = '6E400006-B5A3-F393-E0A9-E50E24DCCA9E'

        services = (
            (
                bluetooth.UUID(service_uuid), 
                (
                    (bluetooth.UUID(sender_uuid), bluetooth.FLAG_NOTIFY), 
                    (bluetooth.UUID(reader_uuid), bluetooth.FLAG_WRITE),
                )
            ), 
        )

        ((self.tx, self.rx,), ) = self.ble.gatts_register_services(services)

    def send(self, data):
        self.ble.gatts_notify(0, self.tx, data + '\n')

    def advertiser(self):
        name = bytes(self.name, 'UTF-8')
        adv_data = bytearray('\x02\x01\x06') + bytearray((len(name) + 1, 0x09)) + name
        self.ble.gap_advertise(100, adv_data)
        print(adv_data)
        print("\r\n")

其中register()函数用来注册蓝牙服务,其中的services是提供给ble对象用来注册蓝牙服务(GATT Server),其中的三个UUID分别作为访问服务,用于管理设备的连接和广告。
reader_uuid和reader_uuid分别用来处理蓝牙的接收服务和发送服务。
而ble_irq()函数用来处理ble蓝牙对象的各种中断事件,本设计使用了连接事件(_IRQ_CENTRAL_CONNECT)、断开事件(_IRQ_CENTRAL_DISCONNECT)、接收到数据事件(_IRQ_GATTS_WRITE)
用户可以在蓝牙中断中根据各种事件做出对应的处理从而达到用户预想的目的。

WIFI部分

本设计的WIFI部分使用的是频段为2.4G的WIFI协议,下文为2.4GWIFI的简介:

引用自ChatGPT

2.4GHz Wi-Fi是一种无线局域网技术,工作在2.4GHz频段。它是一种常见且广泛应用于家庭和办公环境的无线网络技术。

2.4GHz Wi-Fi基于IEEE 802.11标准系列,其中最常见的是802.11b/g/n。它使用频段为2.4GHz的无线电波进行数据传输,能够提供可靠的无线网络连接。

2.4GHz频段的Wi-Fi具有一些特点和优势:

较广的覆盖范围:2.4GHz频段的信号在传播过程中能够穿透障碍物(如墙壁)相对较好,因此具有较广的覆盖范围。
兼容性:2.4GHz Wi-Fi已经存在多年,得到了广泛的支持和应用,许多设备都能够连接和使用2.4GHz的网络。
信号穿透性强:2.4GHz的信号相对较低的频率,能够更好地穿透物体,因此在一些信号覆盖较差的环境下,如墙壁较厚的房间,2.4GHz Wi-Fi信号表现较好。
然而,2.4GHz Wi-Fi也存在一些局限性:

信道干扰:2.4GHz频段被许多其他设备使用,如蓝牙设备、微波炉等,可能导致信道干扰,影响Wi-Fi的性能和稳定性。
有限的带宽:2.4GHz频段的带宽相对较窄,通常只有20MHz或40MHz,相比之下,5GHz频段的Wi-Fi提供了更宽的带宽,更适合高速数据传输。
连接数量限制:由于2.4GHz频段的带宽和信道限制,同时连接的设备数量较多时,可能导致网络拥塞和性能下降。
总之,2.4GHz Wi-Fi是一种常见的无线局域网技术,具有广泛的应用和兼容性。它在覆盖范围和信号穿透性方面表现良好,但受到频段拥堵和带宽限制的影响。随着无线技术的发展,5GHz频段的Wi-Fi也逐渐得到广泛应用,提供更高的速度和更少的干扰,成为一种更好的选择。

其主要代码如下:

ssid = "OrayBox-BA2C"
key = "1234567890"

def do_connect():
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    while True:
        if not wlan.isconnected():
            print('connecting to network...')
            try:
                wlan.connect(ssid, key)
            except:
                time.sleep(5)
            while not wlan.isconnected():
                pass
        else:
            break
    print('network config:', wlan.ifconfig())

上述代码实现了esp32阻塞式连接WIFI,当没有wifi连接时,系统会每隔5秒重新连接一次,直到连接成功,连接成功后打印出设备的ip情况

TCP部分

本设计采用的无线通信中的TCP协议,下文为TCP协议的简介:

引用自ChatGPT
TCP(Transmission Control Protocol,传输控制协议)是一种在计算机网络中常用的传输层协议。它提供可靠的、面向连接的数据传输,用于确保数据在网络上的可靠交付。

下面是TCP协议的一些关键特点和功能:

  1. 可靠性:TCP使用可靠的数据传输机制,通过使用序号、确认和重传等技术来保证数据的完整性和正确性。它可以检测并纠正丢失的数据、重复的数据和乱序的数据,确保数据按照正确的顺序到达目的地。

  2. 面向连接:在TCP通信中,发送方和接收方在通信之前需要建立一个连接。连接的建立包括三次握手过程,确保发送方和接收方都准备好进行通信。通信结束后,还需要进行连接的释放,以确保网络资源的释放和管理。

  3. 流量控制和拥塞控制:TCP通过流量控制和拥塞控制机制来处理网络拥塞和资源管理。流量控制用于控制发送方发送数据的速率,确保接收方能够处理和接收数据。拥塞控制用于检测网络的拥塞情况并调整发送速率,以避免网络的过载和崩溃。

  4. 多路复用:TCP支持多路复用,即在单个TCP连接上同时传输多个应用程序的数据。它使用端口号来区分不同的应用程序或服务,确保数据正确地传输到相应的应用程序。

  5. 高效性:尽管TCP在可靠性和连接管理方面提供了许多功能,但它也努力提供高效的数据传输。通过使用滑动窗口和拥塞控制等机制,TCP可以优化数据的传输速度和网络资源的利用。

TCP是互联网中最常用的传输协议之一,它在许多应用场景中被广泛使用,如Web浏览、电子邮件、文件传输等。它提供了可靠的数据传输和连接管理,为网络通信提供了重要的基础。

其主要代码如下:

def TCP_Connect():
    # 1. 创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
    # 2. 绑定本地信息 bind
    #tcp_server_socket.bind(("此处填入你的TCP服务端IP地址", 此处填入TCP服务端端口))
    tcp_server_socket.connect(("此处填入你的TCP服务端IP地址", 此处填入TCP服务端端口))
    # 3 .让默认的套接字有主动变为被动 listen,这样就可以接收别人的数据了
    print("----连接服务器成功----")
    
    while True:
        recv_data = uart1.readline()
        #print(recv_data)
        # 接收一行数据
        if recv_data:
            recv_data = recv_data.decode('utf-8')
            tcp_server_socket.send(recv_data)
            print("接收到的数据为:", recv_data)
    tcp_server_socket.close()

上述代码实现了esp对tcp客户端的模拟和对TCP服务器端的连接,当连接TCP服务端成功后,系统打印“连接服务器成功”并进入循环。
进入循环后,系统开始对uart串口进行循环接收,当串口有数据传入时,系统会将串口传入的数据发送到TCP服务端,从而实现数据的远程显示。

.
.
.
.
.
.

写在后面的话

这个代码还是有很多bug的,首先TCP发送数据时,不太确定是TCP服务器的延时太高还是esp32网络问题,在以TCP协议发送数据时,数据量一大,数据的延时就会比较高,如果遇到其他问题可以在底部留言或者在侧边栏联系我,会尽快给出答复~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值