esp32作为物联网芯片,不联网怎么会好玩呢,今天我们就看一下如何使用阿里云API获取天气信息。
这里我们要用到network模块
import network
wifi=network.WLAN(network.STA_IF)
这里我们是作为客户端接入wifi所以我们用network.STA_IF
wifi.active(True)
wifi.connect('xxxxx','xxxxxx')
简要代码如下
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地址
阿里云市场中的API基本都是通过HTTP请求来调用的,在我们开始使用其之前先了解一下HTTP请求
我们平时浏览网页并不是与服务器建立长连接,而是我们先与服务器建立连接,之后向服务器请求数据,也就是发送请求,服务器做出响应,发送数据回来,之后断开连接,然后浏览器对得到的数据进行渲染,呈现出我们所看到的画面。
Url: http://jisutqybmf.market.alicloudapi.com/weather/query?citycode=164
这里我们主要看一下get请求。
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)
正常返回示例
{
"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中又包含各种其他信息,我们所需要的天气预报信息就包含在其中。
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将其显示出来