Micropython实现 基于模块 urequests 的 HTTP GET请求 (附示例代码:MicroPython ESP8266 网络时钟)

注:以下代码和说明是在ESP8266 开发板上实现。参考资料下载:

1.ESP8266 连接到网络

2.ESP8266实现WEB端控制 LED

 

简介


本MicroPython教程旨在阐释如何借助urequests模块用MicroPython执行HTTP GET请求。本教程在ESP8266的MicroPython上均进行了测试。下文所示数据出自ESP8266 上的测试,你可以在这里(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py)访问库的源代码。

重要提示:本文撰写之际,所用的MicroPython版本内含urequests模块。请注意,此情况或有变化,之后版本的默认配置可能不会包含该模块,你需要先进行手动安装。
当然,为适用本教程,我们首先需要连接到WiFi网络,以便访问互联网。本教程将不再赘述如何连接WiFi网络。如果你想手动连接,请参阅这篇(http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=272122)详细指南。

我们将通过连接MicroPython提示符并一次发送一个命令来运行代码。如果你愿意的话,可以在脚本中编写命令并从你的计算机运行该脚本,如此处(翻译中)所述。另一个选择是将脚本上传到MicroPython的文件系统并从提示符运行该脚本,如此处(https://www.dfrobot.com/index.php?route=DFblog/blogs)所述。

1. GET请求命令的实现:

import urequests

response = urequests.get('http://jsonplaceholder.typicode.com/albums/1')

   #注: 我们要通过HTTP GET请求访问的网站URL是http://jsonplaceholder.typicode.com/albums/1,你可以通过在web浏览器上

  # 访问该网站来查看预期结果。访问该网站时,你应该会得到如下所示的内容,这是虚拟相册对象的JSON结构。

print(type(response))

  #返回的对象是Response类

print(response.text)

#访问HTTP请求响应得到实际内容,只要访问其text属性

print(type(response.text))

JSON格式

parsed = response.json()

#请求响应是 json 格式

print(type(parsed))

#因此可知json 是字典类数据   <class 'dict'>

print(parsed["userId"])
print(parsed["id"])
print(parsed["title"])

#可以通过字典对象上值的键来获取每个单独的JSON值
##可借助ujson库来解析内容

另一个检索请求响应内容的有趣方法是使用以字节为单位返回响应的content属性

print(response.content)
#b'{\n  "userId": 1,\n  "id": 1,\n  "title": "quidem molestiae enim"\n}'

print(type(response.content))
#<class 'bytes'>

HTTP状态代码和原因



print(response.status_code)
#200

print(response.reason)
#b'OK'

 

 

 

 

# ESP8266 MicroPython Web Clock
# by Alan Wang

import network
import urequests
import ujson
import utime
import ssd1306
import machine
from machine import RTC, I2C, Pin

# user data
ssid = "ssid" # wifi router name
pw = "pw" # wifi router password
url = 'http://worldtimeapi.org/api/timezone/Asia/Hong_Kong'
# see http://worldtimeapi.org/timezones
#url = http://worldtimeapi.org/timezone/Asia/Hong_Kong


web_query_delay = 60000 # interval time of web JSON query
retry_delay = 5000 # interval time of retry after a failed Web query


# initialization

# SSD1306 OLED display
print("Connecting to wifi...")
oled = ssd1306.SSD1306_I2C(128, 64, I2C(scl=Pin(5), sda=Pin(4)))
oled.fill(0)
oled.text("Connecting", 0, 5)
oled.text(" to wifi...", 0, 15)
oled.show()

# internal real time clock
rtc = RTC()

# wifi connection
wifi = network.WLAN(network.STA_IF) # station mode
wifi.active(True)
wifi.connect(ssid, pw)

# wait for connection
while not wifi.isconnected():
    pass

# wifi connected
print("IP: " + str(wifi.ifconfig()[0]) + "\n")
oled.text("Connected. IP: ", 0, 35)
oled.text(" " + str(wifi.ifconfig()[0]), 0, 45)
oled.show()

# set timer
update_time = utime.ticks_ms() - web_query_delay

# main loop
while True:
    
    # if lose wifi connection reboot ESP8266
    if not wifi.isconnected():
        machine.reset()
    
    # query and get web JSON every web_query_delay ms
    if utime.ticks_ms() - update_time >= web_query_delay:
    
        # HTTP GET data
        response = urequests.get(url)
    
        if response.status_code == 200: # query success
        
            print("JSON response:\n" + response.text)
            
            # parse JSON
            parsed = ujson.loads(response.text) 
			# you can also use parsed = response.json()
            datetime_str = str(parsed["datetime"])
            year = int(datetime_str[0:4])
            month = int(datetime_str[5:7])
            day = int(datetime_str[8:10])
            hour = int(datetime_str[11:13])
            minute = int(datetime_str[14:16])
            second = int(datetime_str[17:19])
            subsecond = int(round(int(datetime_str[20:26]) / 10000))
        
            # update internal RTC
            rtc.datetime((year, month, day, 0, hour, minute, second, subsecond))
            update_time = utime.ticks_ms()
            print("RTC updated\n")
   
        else: # query failed, retry retry_delay ms later
            update_time = utime.ticks_ms() - web_query_delay + retry_delay
    
    # generate formated date/time strings from internal RTC
    date_str = "{:02}/{:02}/{:4}".format(rtc.datetime()[1], rtc.datetime()[2], rtc.datetime()[0])
    time_str = "{:02}:{:02}:{:02}".format(rtc.datetime()[4], rtc.datetime()[5], rtc.datetime()[6])

    # update SSD1306 OLED display
    oled.fill(0)
    oled.text("ESP8266 Clock", 0, 5)
    oled.text("Date: " + date_str, 0, 25)
    oled.text("Time: " + time_str, 0, 45)
    oled.show()
    
    utime.sleep(0.1)
    

 

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2022 / 01/ 30: 新版esptool 刷micropython固件指令不是 esptool.py cmd... 而是 esptool cmd... 即可;另外rshell 在 >= python 3.10 的时候出错解决方法可以查看:  已于2022年发布的: 第二章:修复rshell在python3.10出错 免费内容: https://edu.csdn.net/course/detail/29666 micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。为记录单片机传输过来的数据, 本教程会教大家入门数据库。  本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 本教程micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。  学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)  
您好!对于ESP8266进行网络编程,使用Arduino编程语言可以很方便地实现。如果您在使用HttpClient库时遇到了"connection refused"的错误,可能是因为连接被服务器拒绝了。 这种错误通常有以下几个原因: 1. 服务器未启动或不可用:请确保您要访问的服务器已经启动,并且可以从您的设备所在的网络访问到该服务器。 2. 服务器地址或端口错误:请检查您在代码中设置的服务器地址和端口号是否正确。确保它们与服务器配置一致。 3. 防火墙或网络限制:某些网络环境可能会对某些端口或IP地址进行限制。请确保您的网络环境允许通过所需的端口进行通信。 以下是一个简单的示例代码,演示如何在ESP8266上使用HttpClient库进行GET请求: ```cpp #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> const char* ssid = "YourNetworkSSID"; const char* password = "YourNetworkPassword"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); // 发起GET请求 HTTPClient http; // 设置服务器地址和端口 http.begin("http://example.com/api/data"); // 替换为您的服务器地址 // 发送GET请求 int httpCode = http.GET(); if (httpCode > 0) { // 获取响应内容 String response = http.getString(); Serial.println(response); } else { Serial.println("Error on HTTP request"); } // 关闭连接 http.end(); } void loop() { // 其他代码... } ``` 请根据您的网络环境和服务器配置,将上述代码中的网络参数进行相应的修改。希望这能够帮助您解决问题!如果仍然有疑问,请随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值