kylinpoet 发表于 2019-11-25 12:37:11

掌控板独立显示天气信息

本帖最后由 kylinpoet 于 2019-11-25 12:55 编辑

上个星期在群里看到阿豪发了一篇文章说,掌控板不支持某个不需要apikey的天气网站的返回信息解码,今天研究了下,发现
http://wthrcdn.etouch.cn/weather_mini?citykey=101110101
这个天气网站的返回信息在掌控板里不能正常显示的原因是:它的内容是经过gzip压缩的,虚谷号因为使用的是完整的requests库,默认自动解压,所以返回数据是没有问题。
而掌控板自带的库 urequests 是阉割版的,没有提供解压功能,所以造成数据的乱码。
上午研究并解决了这个问题,发文记录下。
解决此问题,引入一个函数即可,具体请看代码:

from mpython import *
import network
import urequests
import ujson

def decompress(data):
    FTEXT    = 1
    FHCRC    = 2
    FEXTRA   = 4
    FNAME    = 8
    FCOMMENT = 16
   
    assert data == 0x1f and data == 0x8b
    assert data == 8
    flg = data
    assert flg & 0xe0 == 0
    i = 10
    if flg & FEXTRA:
      i += data << 8 + data + 2
    if flg & FNAME:
      while data:
            i += 1
      i += 1
    if flg & FCOMMENT:
      while data:
            i += 1
      i += 1
    if flg & FHCRC:
      i += 2
    return zlib.decompress(memoryview(data), -15)


my_wifi = wifi()
my_wifi.connectWiFi("wifi账号", 'wifi密码')

oled.fill(0)
oled.DispChar(my_wifi.sta.ifconfig(), 0, 0, 1)
oled.show()

url = 'http://wthrcdn.etouch.cn/weather_mini?citykey=101110101'
r = urequests.get(url)
result = ujson.loads(bytes(decompress(r.content)))
print(result)
oled.DispChar(result['data']['ganmao'], 0, 16, 1)
oled.show()






gada888 发表于 2019-11-25 14:25:53

多点图就更好了

rzyzzxw 发表于 2019-12-1 09:06:41

陈老师,高人也
页: [1]
查看完整版本: 掌控板独立显示天气信息