目录
5.1. 1. 格林尼治时间(Greenwich Mean Time, GMT)
5.2. 2. 北京时间(China Standard Time, CST)
前言
在物联网(IoT)和智能设备开发中,无线网络通信是核心功能之一。无论是让设备作为客户端(STA模式)接入现有网络,还是作为热点(AP模式)为其他设备提供连接,亦或是通过NTP协议同步全球时间,这些技术都是构建智能化应用的基石。
本文将以ESP32为例,深入解析STA/AP模式的配置与使用,演示如何发起HTTP请求获取网络数据,并详细讲解通过NTP服务器同步时间的完整流程(包括时区转换)。无论你是初学者还是有一定经验的开发者,都能通过这篇指南快速掌握无线网络编程的关键技术,为你的项目赋予更强的连接能力。
1. 网络模式
STA(Station)模式和AP(Access Point)模式是无线网络中两种常见的工作模式。
STA模式
- 定义:STA模式是指无线设备作为客户端连接到无线网络中的一个接入点(AP)。在此模式下,设备需要进行身份验证和连接才能访问网络资源。
- 使用场景:常见于笔记本电脑、智能手机、平板电脑等终端设备,它们通过连接到AP来访问互联网或局域网中的其他设备。
- 特点:
-
- 通常只能连接到一个接入点。
- 设备在STA模式下只能作为用户终端,不能提供网络服务给其他设备。
AP模式
- 定义:AP模式是指无线设备作为接入点,能够为其他无线设备提供网络服务。在此模式下,设备充当一个中心点,允许其他无线设备连接并共享网络资源。
- 使用场景:通常用于无线路由器或无线接入设备,使得其他无线设备(如手机、笔记本电脑等)能够连接到网络。
- 特点:
-
- 可以支持多个STA连接。
- 提供无线网络服务,允许其他设备通过它访问互联网或局域网。
总结
- STA模式主要是客户端的角色,连接到网络,获取数据;
- AP模式则是提供网络服务的角色,允许其他设备连接并使用网络资源。
这两种模式可以根据具体的应用需求灵活使用。例如,在家庭或办公室环境中,路由器一般工作在AP模式,而连接到路由器的设备则处于STA模式。
2. AP 模式
import network
ap = network.WLAN(network.AP_IF) # create access-point interface
ap.config(ssid='icheima-esp32') # set the SSID of the access point
ap.config(max_clients=10) # set how many clients can connect to the network
ap.active(True) # activate the interface
3. STA模式
import network
import time
wlan = network.WLAN(network.STA_IF) # 创建wlan,设置为sta模式
wlan.active(True) # 激活wlan
wlan.scan() # 扫描网络
wlan.isconnected() # 检查网络状态
wlan.connect('你家路由器帐号', '你家路由器密码') # connect to an AP
wlan.config('mac') # 获取mac地址
print("正在连接网络...")
while not wlan.isconnected() :
print("等待连接路由器...")
time.sleep(1)
print("网络连接成功,可以开始装逼了...")
while True:
print("我太困了,可是学习太TM有意思啦!")
time.sleep(1)
4. 发起网络请求
通过使用requests获取网络上的数据
# 可以去发起网络请求
import requests
try:
# 发送 GET 请求(带参数)
response = requests.get("https://httpbin.org/get")
# 解析 JSON 响应
data = response.json()
print("请求成功!响应内容:",data)
except :
print("出错了")
5. NTP获取网络时间
5.1. 1. 格林尼治时间(Greenwich Mean Time, GMT)
- 定义:
GMT 是以英国伦敦格林尼治天文台的本地平太阳时为基准的时间标准,曾是全球时间的参考点(本初子午线所在时区)。 - 特点:
-
- 时区标识:UTC+0(与协调世界时 UTC 在数值上一致,但 GMT 是时区,UTC 是时间标准)。
- 历史地位:过去广泛用于航空、航海和科学领域,现逐渐被 UTC 取代。
- 夏令时:英国本地时间(BST)在夏令时会调整为 UTC+1,但 GMT 本身不包含夏令时。
5.2. 2. 北京时间(China Standard Time, CST)
- 定义:
中国采用的标准时间,覆盖全国(东八区),比 UTC 快 8 小时,无夏令时。 - 特点:
-
- 时区标识:UTC+8。
- 统一性:中国全境(包括香港、澳门、台湾)均使用北京时间,无论地理经度差异。
- 国际交流:在国际场合常被写作 UTC+8,避免与“中部标准时间”(Central Standard Time, UTC-6)混淆。
5.3. 3. GMT vs UTC vs 北京时间的区别
特性 | GMT | UTC | 北京时间(CST) |
性质 | 时区 | 时间标准 | 时区(UTC+8) |
精度 | 基于地球自转 | 基于原子钟 | 基于 UTC+8 |
夏令时 | 无(但英国本地有) | 无 | 无 |
应用场景 | 历史遗留领域 | 全球通用标准 | 中国全境 |
与 UTC 的关系 | UTC+0 | 基准 | UTC+8 |
这里默认获取出来的是格林尼治时间,所以我们需要UTC+8
import network
import ntptime
import time
import machine
# Wi-Fi 配置
WIFI_SSID = "TP-Genki"
WIFI_PASSWORD = "3.1415926"
# 连接 Wi-Fi
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print("Connecting to Wi-Fi...")
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
pass
print("Wi-Fi connected!")
print("Network config:", wlan.ifconfig())
# 同步网络时间
def sync_time():
try:
ntptime.host = "ntp.aliyun.com" # 使用阿里云的 NTP 服务器
ntptime.settime()
print("Time synchronized successfully!")
print("UTC time:", time.localtime())
except Exception as e:
print("Failed to synchronize time:", e)
# 设置时区(UTC+8)
def get_localtime(offset=8):
current_time = time.time()
local_time = current_time + offset * 3600
# (year, month, day, hour, minute, second, weekday, yearday)
return time.localtime(local_time)
import time
# 主程序
def main():
connect_wifi()
sync_time()
#
while True:
local_time = get_localtime()
print("Local time:", local_time)
time.sleep(3)
# 运行主程序
main()
结语
通过本文的学习,你已经掌握了ESP32在无线网络中的两大核心模式(STA/AP)、网络请求的发起方法,以及如何通过NTP同步全球时间并适配本地时区。这些技能不仅能用于智能家居、远程监控等场景,还能为更复杂的物联网应用打下基础。
技术的魅力在于实践——不妨尝试将这些代码融入你的项目中,比如做一个自动校时的电子钟,或是搭建一个本地Wi-Fi热点数据采集系统。如果在实现过程中遇到问题,不妨回顾本文的代码示例,或进一步探索网络协议的底层原理。
未来已来,连接即力量。 愿你的每一行代码都能让设备更“聪明”,让世界更互联! 🚀