esp32作为物联网芯片,不联网怎么会好玩呢,今天我们就看一下如何使用阿里云API获取天气信息。
这里我们要用到network模块
class network.WLAN(interface_id) interface_id: network.STA_IF — 客户端,连接到上游WiFi接入点network.AP_IF — 接入点,允许其他WiFi客户端连接这里我们是作为客户端接入wifi所以我们用network.STA_IF
简要代码如下
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请求 我们平时浏览网页并不是与服务器建立长连接,而是我们先与服务器建立连接,之后向服务器请求数据,也就是发送请求,服务器做出响应,发送数据回来,之后断开连接,然后浏览器对得到的数据进行渲染,呈现出我们所看到的画面。
请求方法 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方法中使用。要发送的数据就在这一部分这里我们主要看一下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)看着是不是和上面的请求头有点类似,它们都是由键值对构成的,只不过结构可能更复杂。 可以看到,返回的数据有三部分,分别是code、msg、result;而result中又包含各种其他信息,我们所需要的天气预报信息就包含在其中。
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将其显示出来