Esp32

    技术2024-12-08  11

    esp32作为物联网芯片,不联网怎么会好玩呢,今天我们就看一下如何使用阿里云API获取天气信息。

    联网

    这里我们要用到network模块

    class network.WLAN(interface_id) interface_id: network.STA_IF — 客户端,连接到上游WiFi接入点network.AP_IF — 接入点,允许其他WiFi客户端连接

    首先要创建一个对象

    import network wifi=network.WLAN(network.STA_IF)

    这里我们是作为客户端接入wifi所以我们用network.STA_IF

    激活网络接口

    wlan.active(is_active) 带有参数时,为是否激活界面,不带参数为查询当前状态。 is_active:是否激活 True — 激活网络接口False — 停用网络接口 wifi.active(True)

    连接wifi

    wlan.connect(ssid, password) 连接到无线网络。 ssid:WiFi名称password:WiFi密码 wifi.connect('xxxxx','xxxxxx')

    检查是否连接上

    wlan.isconnected() 检查站点是否连接到AP。 在STA模式下,如果连接到WiFi接入点并具有有效的IP地址则返回True,否则返回False。在AP模式下,当站点连接时返回True,否则返回False。 wlan.ifconfig([(ip, subnet, gateway, dns)]) 不带参数时,返回一个4元组(ip, subnet_mask, gateway, DNS_server)。 ip:IP地址subnet_mask:子网掩码gateway:网关DNS_server:DNS服务器

    简要代码如下

    import network SSID = "yourSSID" #WiFi名称 PASSWORD = "yourPASSWD" #WiFi密码 wlan = network.WLAN(network.STA_IF) #创建WLAN对象 wlan.active(True) #激活界面 wlan.scan() #扫描接入点 wlan.connect(SSID, PASSWORD) #连接到AP wlan.isconnected() #检查站点是否连接到AP wlan.ifconfig() #获取接口的IP/netmask/gw/DNS地址

    HTTP请求

    阿里云市场中的API基本都是通过HTTP请求来调用的,在我们开始使用其之前先了解一下HTTP请求 我们平时浏览网页并不是与服务器建立长连接,而是我们先与服务器建立连接,之后向服务器请求数据,也就是发送请求,服务器做出响应,发送数据回来,之后断开连接,然后浏览器对得到的数据进行渲染,呈现出我们所看到的画面。

    请求方法 HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。最常的两种GET和POST。 GET GET方法要求将URL定位的资源放在响应报文的数据部分。使用GET方法时,传递的数据直接放在地址中,所以GET方式的请求一般不包含“请求内容”部分,请求数据以地址的形式表现在请求行。地址中‘?’之后的部分就是通过GET发送的请求数据,各个数据之间用‘&’符号隔开。该方法的弊端就是保密性差,传输的信息可以直接1从URL中提取出来。POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 URL URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。 组成:<协议>://<主机>:<端口>/<路径> 端口和路径有时也可省略(例如:HTTP默认端口号是80) 示例: Url: http://jisutqybmf.market.alicloudapi.com/weather/query?citycode=164 请求头部 请求头部为请求报文添加了一些附加信息,由键值对组成,每行一对,键和值之间使用冒号分隔,各键值对之间用逗号分隔。 + Host:接受请求的服务器地址 + User-Agent:发送请求的应用程序名称(有些网站为了反爬会检查此项,来初步判断你是人还是机器) …请求数据 GET方法中一般用不到,而是在POST方法中使用。要发送的数据就在这一部分

    调用API

    这里我们主要看一下get请求。

    GET 下面是调试时发送的请求,在实际使用时我们只需要在请求头中包含"Authorization"就可以了。 Request: Url: http://jisutqybmf.market.alicloudapi.com/weather/query?citycode=2 Header: { "Authorization":"APPCODE 8428bfb45ab84273a558c7eb3bbdc584", "X-Ca-Timestamp":"1594875749320","gateway_channel":"http", "X-Ca-Key":"203492926", "x-ca-nonce":"cd24223b-91d3-854b-961c-82d4b729aa06", "X-Ca-Request-Mode":"DEBUG","X-Ca-Stage":"RELEASE", "Host":"jisutqybmf.market.alicloudapi.com", "Content-MD5":"1B2M2Y4AsgTpgAmY2PhCfg==", "Content-Type":"application/json; charset=utf-8"} import urequests url='http://jisutqybmf.market.alicloudapi.com/weather/query' header={"Authorization":"APPCODE 8184bfb45ab88123a558c7eb3bbdc584"} params={'citycode':2} re=urequests.get(url,header=header,params=params)

    当然也可以不用params

    import urequests url='http://jisutqybmf.market.alicloudapi.com/weather/query?citycode=2' header={"Authorization":"APPCODE 8184bfb45ab84273a558c7eb3bbdc584"} re=urequests.get(url,header=header)

    处理得到的数据

    json树

    正常返回示例 { "status": "0", "msg": "ok", "result": { "city": "安顺", "cityid": "111", "citycode": "101260301", "date": "2015-12-22", "week": "星期二", "weather": "多云", "temp": "16", "temphigh": "18", "templow": "9", "img": "1", "humidity": "55", "pressure": "879", "windspeed": "14.0", "winddirect": "南风", "windpower": "2级", "updatetime": "2015-12-22 15:37:03", "index": [ { "iname": "空调指数", "ivalue": "较少开启", "detail": "您将感到很舒适,一般不需要开启空调。" }, { "iname": "运动指数", "ivalue": "较适宜", "detail": "天气较好,无雨水困扰,较适宜进行各种运动,但因气温较低,在户外运动请注意增减衣物。" } ], "aqi": { "so2": "37", "so224": "43", "no2": "24", "no224": "21", "co": "0.647", "co24": "0.675", "o3": "26", "o38": "14", "o324": "30", "pm10": "30", "pm1024": "35", "pm2_5": "23", "pm2_524": "24", "iso2": "13", "ino2": "13", "ico": "7", "io3": "9", "io38": "7", "ipm10": "35", "ipm2_5": "35", "aqi": "35", "primarypollutant": "PM10", "quality": "优", "timepoint": "2015-12-09 16:00:00", "aqiinfo": { "level": "一级", "color": "#00e400", "affect": "空气质量令人满意,基本无空气污染", "measure": "各类人群可正常活动" } }, "daily": [ { "date": "2015-12-22", "week": "星期二", "sunrise": "07:39", "sunset": "18:09", "night": { "weather": "多云", "templow": "9", "img": "1", "winddirect": "无持续风向", "windpower": "微风" }, "day": { "weather": "多云", "temphigh": "18", "img": "1", "winddirect": "无持续风向", "windpower": "微风" } } ], "hourly": [ { "time": "16:00", "weather": "多云", "temp": "14", "img": "1" }, { "time": "17:00", "weather": "多云", "temp": "13", "img": "1" } ] } }

    看着是不是和上面的请求头有点类似,它们都是由键值对构成的,只不过结构可能更复杂。 可以看到,返回的数据有三部分,分别是code、msg、result;而result中又包含各种其他信息,我们所需要的天气预报信息就包含在其中。

    解析JSON

    导入uJSON模块 import ujson

    2.解析

    ujson.loads(str#解析JSON str并返回一个对象

    到这里就基本完成了 但是micropython好像不支持中文编码,所以json树里中文都是ASCII码的形式。 下面是代码:

    import network import urequests SSID = "yourSSID" #WiFi名称 PASSWORD = "yourPASSWD" #WiFi密码 wlan = network.WLAN(network.STA_IF) #创建WLAN对象 wlan.active(True) #激活界面 wlan.scan() #扫描接入点 wlan.connect(SSID, PASSWORD) #连接到AP url='http://jisutqybmf.market.alicloudapi.com/weather/query?cityid=1' header={"Authorization":"APPCODE 8184bd45ab88543a5774c7eb3bbdc578"} re=urequests.get(url,headers=header) re.status_code# 查看是HTTP状态码,200为正常 p=re.json()#生成json树 #t=re.text 字符串 print(rec['result']['daily'][0]['sunrise'])#打印当天日出时间

    你还可以用个1306将其显示出来

    Processed: 0.057, SQL: 9