Micropython学习交流群 学习QQ群:786510434 提供多种固件下载和学习交流。

Micropython-扇贝物联 QQ群:31324057 扇贝物联是一个让你与智能设备沟通更方便的物联网云平台

Micropython学习交流群 学习QQ群:468985481 学习交流ESP8266、ESP32、ESP8285、wifi模块开发交流、物联网。

Micropython老哥俩的IT农场分享QQ群:929132891 为喜欢科创制作的小白们分享一些自制的计算机软硬件免费公益课程,由两位多年从事IT研发的中年大叔发起。

Micropython ESP频道

micropython esp32 最牛的TCP服务器


micropython最牛的TCP服务器


帮沈阳老铁做个项目,需要esp32 24个组网。。。然后难倒了我了!

有线传数据吧,串口线吓死人,spi,i2c,mpy不能做从机,告辞!

无线的,espnow太飘渺,而且怎么获取mac地址啊,这是个问题,蓝牙最大10多个,主要是24个有点多,如果4个那不是随便拿捏。。。

最后盯上了tcp,udp有点佛系,我还是尽量稳定的。。。

然后老问题来了,连一个,网上一堆教程,连多个。。。呵呵,没了,也没人测试,当然我也没有24个esp32一起测。

难点就在于一对多,既不能卡死阻塞,也得支持掉线自动重连,现在压力来到了服务端这边,客户端倒是好说。。。

然后CSDN找了一个python的,整挺好啊,移植呗,核心思想是来一个客户端,新建一个thraed去处理,嗯,挺符合我要求,就是没测24个一起跑会不会炸。

另外有新发现:

mpy的_thread模块依赖内存(这好像是废话),不带psram的大概能跑15个内存,去翻了源码,每个thread有最小的size哦,4096貌似,默认是5*1024?


#define MP_THREAD_MIN_STACK_SIZE                        (4 * 1024)

#define MP_THREAD_DEFAULT_STACK_SIZE                    (MP_THREAD_MIN_STACK_SIZE + 1024)


所以带psram就随便霍霍,来嘛来嘛。。

老规矩上代码,貌似又是全网唯一,为mpy又做了贡献,然后并没几个人看我也不在意了。

import network
import socket
import time
import _thread

ap = network.WLAN(network.AP_IF)
ap.active(True) 
ap.config(essid='ESP-FLOWER')   #官网这个参数写的是ssid,会报错,坑啊!!!
ap.config(authmode=3,password='flowerjd3096')
ap.config(max_clients=24)       #写多少都不会报错,但是不知道是不是真好使啊
print(ap.ifconfig())
#用到的变量
port=3096
buffsize=1024
conn_list = []
conn_dt = {}

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',port))
s.listen(24)
print('server start')

def tcplink(sock,addr):
    while True:
        try:
            recvdata=sock.recv(buffsize).decode('utf-8')
            print(recvdata, addr)
            if not recvdata:
                break
        except:
            sock.close()
            print(addr,'offline')
            _index = conn_list.index(addr)
            conn_dt.pop(addr)
            conn_list.pop(_index)
            break

while True:
    clientsock,clientaddress=s.accept()
    if clientaddress not in conn_list:
        conn_list.append(clientaddress)
        conn_dt[clientaddress] = clientsock
    print('connect from:',clientaddress)
    #在这里创建线程,就可以每次都将socket进行保持
    t=_thread.start_new_thread(tcplink,(clientsock,clientaddress))

就是不知道脆弱的mpy能承受多少个进程,实测跟内存有关,不带psram的大概最多15个,带psram的随便加,卡死我不负责。。。。


————————————————

原文链接:https://blog.csdn.net/jd3096/article/details/128227204



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 ESP56.com All Rights Reserved

执行时间: 0.0082628726959229 seconds