696|4

10

帖子

6

TA的资源

一粒金砂(中级)

楼主
 

【得捷电子Follow me第2期】 任务2:网络功能使用 [复制链接]

 

【得捷电子Follow me第2期】 任务2:网络功能使用

完成网络功能的使用,能够创建热点和连接到WiFi

接线:

编程语言和环境用CircuitPython:

开发板:

Adafruit Feather ESP32-S3 TFT

运行环境:

Adafruit CircuitPython 8.2.3 on 2023-08-11

编辑器:

mu-editor

用到的模块:

需要在code.py同目录下创建一个secrets.py,存放要连接的wifi名称跟密码。

代码解析:

以下是secrets.py文件完整代码:(相应位置要改成自己的wifi名称跟密码,其他几个暂时没用上)

secrets={
    "ssid":"要连接的wifi名称",
    "password":"要连接的wifi密码",
    'aio_username' : 'adafruit io账号',# 暂时用不上
    'aio_key' : 'adafruit io API key',# 暂时用不上
    'timezone' : "America/New_York", # http://worldtimeapi.org/timezones
}

以下是code.py文件完整代码:

import wifi
import socketpool
import struct
import time
import rtc
import ipaddress
import digitalio
import board


try:
    from secrets import secrets
except ImportError:
    print("need secrets.py, please add them!")
    raise

#NTP_ADDR = "ntp.ntsc.ac.cn"
NTP_ADDR = "ntp.tencent.com"
#NTP_ADDR = "ntp3.aliyun.com"
NTP_PORT = 123
UTC = 8

HOT_POINT_SSID = "MY-ESP32-S3"
HOT_POINT_PASSWORD = "12345678"
HOT_POINT_IP = "192.168.111.1"

#扫描wifi,这里用不上,只是展示一下。
for network in wifi.radio.start_scanning_networks():
    print("\t%s\t\tRSSI: %d\tChannel: %d"%(str(network.ssid, "utf-8"), network.rssi, network.channel))
wifi.radio.stop_scanning_networks()

print("wifi conneting...")
#连接secrets里面指定的wifi
wifi.radio.connect(secrets["ssid"],secrets["password"])

pool = socketpool.SocketPool(wifi.radio)


def getNTPTime(pool):
    print("getting network time...")
    sc = pool.socket(socketpool.SocketPool.AF_INET, socketpool.SocketPool.SOCK_DGRAM)
    sc.settimeout(3)
    #网上抄的NTP请求包
    #data = struct.pack("!BBBBIIIQQQQ",3<<6|3<<3|3,1,10,1,1,10,0,0,0,0,0)
    data = struct.pack("!BBBBIIIQQQQ",0x1b,0,0,0,0,0,0,0,0,0,0)
    buf=bytearray(48)
    print("ntp recving...")
    sc.sendto(data, (NTP_ADDR, NTP_PORT))
    t0=time.time()
    n,addr=sc.recvfrom_into(buf)
    sc.close()
    print("recv: ",n,addr)
    TIME1970  = 0x83aa7e80
    t = struct.unpack("!12I", buf)[10]
    t1=time.time()
    print("used: ",t1-t0)
    t -= TIME1970
    t = time.localtime(t)
    return t

def startHotPoint():
    print("wifi hot point starting...")
    ip=ipaddress.IPv4Address(HOT_POINT_IP)
    mask=ipaddress.IPv4Address("255.255.255.0")
    gateway=wifi.radio.ipv4_gateway
    wifi.radio.set_ipv4_address_ap(ipv4=ip, netmask=mask, gateway=gateway)
    wifi.radio.start_ap(HOT_POINT_SSID, HOT_POINT_PASSWORD)
    print("Hot Point: ", wifi.radio.ap_active)
    print("SSID: ", HOT_POINT_SSID)
    print("Password: ", HOT_POINT_PASSWORD)
    print("ap gateway: ", wifi.radio.ipv4_gateway_ap)
    print("ap subnet: ", wifi.radio.ipv4_subnet_ap)
    print("ap ipv4: ", wifi.radio.ipv4_address_ap)

t = getNTPTime(pool)
rtc.RTC().datetime=t
t0 = time.localtime(time.time())


btn=digitalio.DigitalInOut(board.BOOT0)
btn.switch_to_input(digitalio.Pull.UP)

isHotPointStarted = False
while True:
    if not btn.value:
        if not isHotPointStarted:
            startHotPoint()
            isHotPointStarted=True
        else:
            wifi.radio.stop_ap()
            isHotPointStarted=False
            print("Hot point stopped!")
        time.sleep(1)

    t1 = time.localtime(time.time())
    if t1.tm_sec!=t0.tm_sec:
        t0=t1
        print("%d-%02d-%02d %02d:%02d:%02d"%(t1.tm_year, t1.tm_mon, t1.tm_mday, t1.tm_hour + UTC, t1.tm_min, t1.tm_sec))
    time.sleep(0.2)



如果只是单纯的完成任务代码其实可以很简单:

连接wifi的功能只要这一句代码:wifi.radio.connect(secrets["ssid"],secrets["password"])

创建wifi热点的功能只要这一句代码:wifi.radio.start_ap(HOT_POINT_SSID, HOT_POINT_PASSWORD)

扫描wifi可以用这一句:wifi.radio.start_scanning_networks()

东西太少没法水时长,所以顺便把获取网络时间也写上去了。

我这里是创建UDP类型的socket,发送NTP报文,请求网络标准时间,端口号是123,

比TCP通过http请求速度应该是要快的,流量也少。

data = struct.pack("!BBBBIIIQQQQ",0x1b,0,0,0,0,0,0,0,0,0,0)

这句就是ntp协议的请求报文,通过udp发出去,

就可以收到NTP服务器返回48字节的时间数据,当然还要解析一下数据的:

t = struct.unpack("!12I", buf)[10]

获取到时间后通过RTC模块,更新esp32的系统时间。

rtc.RTC().datetime=t

任务视频演示

任务源码

活动的心得体会:

CircuitPython的wifi没法做到网络共享,就是不能通过它的热点来上网,有点可惜。

不过有个wifi.radio.Monitor可以用来监控网络数据的,试了一下,没深入研究。

 

最新回复

你可以写一个路由的功能,那就牛了,或者烧个开源的路由器固件玩玩。   详情 回复 发表于 2023-8-27 20:40
点赞 关注
 
 

回复
举报

6973

帖子

11

TA的资源

版主

沙发
 

CircuitPython的wifi没法做到网络共享,就是不能通过它的热点来上网,有点可惜。

不能配置为ap模式吗?我记得esp8266可以配置为混杂模式的。

点评

可以创建AP,但是你的手机接它的AP就上不了网。 虽然它自己接了路由的wifi可以上网,但是你接它的AP就上不了,就是不能网络共享。  详情 回复 发表于 2023-8-27 20:02
 
 
 

回复

10

帖子

6

TA的资源

一粒金砂(中级)

板凳
 
lugl4313820 发表于 2023-8-27 08:46 CircuitPython的wifi没法做到网络共享,就是不能通过它的热点来上网,有点可惜。 不能配置为ap模式吗? ...

可以创建AP,但是你的手机接它的AP就上不了网。

虽然它自己接了路由的wifi可以上网,但是你接它的AP就上不了,就是不能网络共享。

点评

那是有点可惜了,我不怎么懂网络,估计没有转发的能力吧。  详情 回复 发表于 2023-8-27 20:39
 
 
 

回复

6973

帖子

11

TA的资源

版主

4
 
青蛙2009 发表于 2023-8-27 20:02 可以创建AP,但是你的手机接它的AP就上不了网。 虽然它自己接了路由的wifi可以上网,但是你接它的AP就 ...

那是有点可惜了,我不怎么懂网络,估计没有转发的能力吧。

 
 
 

回复

6973

帖子

11

TA的资源

版主

5
 

你可以写一个路由的功能,那就牛了,或者烧个开源的路由器固件玩玩。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表