Esp32_micropython学习(三):使用阿里云API获取天气信息

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请求
我们平时浏览网页并不是与服务器建立长连接,而是我们先与服务器建立连接,之后向服务器请求数据,也就是发送请求,服务器做出响应,发送数据回来,之后断开连接,然后浏览器对得到的数据进行渲染,呈现出我们所看到的画面。

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

调用API

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

  1. 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

  1. 导入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将其显示出来

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxfeng~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值