esp32作为物联网芯片,不联网怎么会好玩呢,今天我们就看一下如何使用阿里云API获取天气信息。
联网
这里我们要用到network模块
- class network.WLAN(interface_id)
- interface_id:
- network.STA_IF — 客户端,连接到上游WiFi接入点
- network.AP_IF — 接入点,允许其他WiFi客户端连接
- interface_id:
首先要创建一个对象
import network
wifi=network.WLAN(network.STA_IF)
这里我们是作为客户端接入wifi所以我们用network.STA_IF
激活网络接口
- wlan.active(is_active)
带有参数时,为是否激活界面,不带参数为查询当前状态。- is_active:是否激活
- True — 激活网络接口
- False — 停用网络接口
- is_active:是否激活
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 请求可能会导致新的资源的建立和/或已有资源的修改。
- GET
- 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将其显示出来