4G模块_AIR780_M100(DTU版)_连接 连接天气平台
4G模块_AIR780_M100(DTU版)_获取天气数据_STM32F103C8T6获取天气数据并显示在OLED屏幕上
管理平台
配置界面
:::info
api.open-meteo.com
443
:::


get指令
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&timezone=auto HTTP/1.1
Host: api.open-meteo.com
Connection: close
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 15:58:54.755 T] GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&timezone=auto HTTP/1.1
Host: api.open-meteo.com
Connection: close
[2026-01-15 15:59:08.769 T] GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&timezone=auto HTTP/1.1
Host: api.open-meteo.com
Connection: close
[2026-01-15 15:59:16.092 R] HTTP/1.1 200 OK
Date: Thu, 15 Jan 2026 07:59:15 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: close
c0e
{"latitude":39.125,"longitude":117.25,"generationtime_ms":0.08869171142578125,"utc_offset_seconds":28800,"timezone":"Asia/Shanghai","timezone_abbreviation":"GMT+8","elevation":2.0,"hourly_units":{"time":"iso8601","temperature_2m":"°C","relativehumidity_2m":"%","precipitation_probability":"%"},"hourly":{"time":["2026-01-15T00:00","2026-01-15T01:00","2026-01-15T02:00","2026-01-15T03:00","2026-01-15T04:00","2026-01-15T05:00","2026-01-15T06:00","2026-01-15T07:00","2026-01-15T08:00","2026-01-15T09:00","2026-01-15T10:00","2026-01-15T11:00","2026-01-15T12:00","2026-01-15T13:00","2026-01-15T14:00","2026-01-15T15:00","2026-01-15T16:00","2026-01-15T17:00","2026-01-15T18:00","2026-01-15T19:00","2026-01-15T20:00","2026-01-15T21:00","2026-01-15T22:00","2026-01-15T23:00","2026-01-16T00:00","2026-01-16T01:00","2026-01-16T02:00","2026-01-16T03:00","2026-01-16T04:00","2026-01-16T05:00","2026-01-16T06:00","2026-01-16T07:00","2026-01-16T08:00","2026-01-16T09:00","2026-01-16T10:00","2026-01-16T11:00","2026-01-16T12:00","2026-01-16T13:00","2026-01-16T14:00","2026-01-16T15:00","2026-01-16T16:00","2026-01-16T17:00","2026-01-16T18:00","2026-01-16T19:00","2026-01-16T20:00","2026-01-16T21:00","2026-01-16T22:00","2026-01-16T23:00","2026-01-17T00:00","2026-01-17T01:00","2026-01-17T02:00","2026-01-17T03:00","2026-01-17T04:00","2026-01-17T05:00","2026-01-17T06:00","2026-01-17T07:00","2026-01-17T08:00","2026-01-17T09:00","2026-01-17T10:00","2026-01-17T11:00","2026-01-17T12:00","2026-01-17T13:00","2026-01-17T14:00","2026-01-17T15:00","2026-01-17T16:00","2026-01-17T17:00","2026-01-17T18:00","2026-01-17T19:00","2026-01-17T20:00","2026-01-17T21:00","2026-01-17T22:00","2026-01-17T23:00","2026-01-18T00:00","2026-01-18T01:00","2026-01-18T02:00","2026-01-18T03:00","2026-01-18T04:00","2026-01-18T05:00","2026-01-18T06:00","2026-01-18T07:00","2026-01-18T08:00","2026-01-18T09:00","2026-01-18T10:00","202
[2026-01-15 15:59:16.321 R] 6-01-18T11:00","2026-01-18T12:00","2026-01-18T13:00","2026-01-18T14:00","2026-01-18T15:00","2026-01-18T16:00","2026-01-18T17:00","2026-01-18T18:00","2026-01-18T19:00","2026-01-18T20:00","2026-01-18T21:00","2026-01-18T22:00","2026-01-18T23:00","2026-01-19T00:00","2026-01-19T01:00","2026-01-19T02:00","2026-01-19T03:00","2026-01-19T04:00","2026-01-19T05:00","2026-01-19T06:00","2026-01-19T07:00","2026-01-19T08:00","2026-01-19T09:00","2026-01-19T10:00","2026-01-19T11:00","2026-01-19T12:00","2026-01-19T13:00","2026-01-19T14:00","2026-01-19T15:00","2026-01-19T16:00","2026-01-19T17:00","2026-01-19T18:00","2026-01-19T19:00","2026-01-19T20:00","2026-01-19T21:00","2026-01-19T22:00","2026-01-19T23:00","2026-01-20T00:00","2026-01-20T01:00","2026-01-20T02:00","2026-01-20T03:00","2026-01-20T04:00","2026-01-20T05:00","2026-01-20T06:00","2026-01-20T07:00","2026-01-20T08:00","2026-01-20T09:00","2026-01-20T10:00","2026-01-20T11:00","2026-01-20T12:00","2026-01-20T13:00","2026-01-20T14:00","2026-01-20T15:00","2026-01-20T16:00","2026-01-20T17:00","2026-01-20T18:00","2026-01-20T19:00","2026-01-20T20:00","2026-01-20T21:00","2026-01-20T22:00","2026-01-20T23:00","2026-01-21T00:00","2026-01-21T01:00"
8a3
,"2026-01-21T02:00","2026-01-21T03:00","2026-01-21T04:00","2026-01-21T05:00","2026-01-21T06:00","2026-01-21T07:00","2026-01-21T08:00","2026-01-21T09:00","2026-01-21T10:00","2026-01-21T11:00","2026-01-21T12:00","2026-01-21T13:00","2026-01-21T14:00","2026-01-21T15:00","2026-01-21T16:00","2026-01-21T17:00","2026-01-21T18:00","2026-01-21T19:00","2026-01-21T20:00","2026-01-21T21:00","2026-01-21T22:00","2026-01-21T23:00"],"temperature_2m":[-3.4,-3.8,-3.9,-3.8,-3.9,-3.9,-4.0,-4.0,-5.3,-4.3,-2.0,1.2,4.1,6.2,7.8,8.6,8.2,5.9,3.5,2.0,1.2,0.9,0.5,-0.1,-0.6,-1.1,-1.8,-2.6,-3.5,-4.2,-4.6,-4.8,-4.8,-4.1,-2.2,0.0,1.8,2.9,4.0,4.5,3.8,2.5,0.8,-0.7,-1.9,-2.9,-3.9,-4.7,-5.4,-5.9,-6.2,-5.8,-5.8,-6.4,-6.9,-7.2,-7.4,-6.5,-4.8,-3.1,-2.4,-2.3,-2.4,-2.8,-3.2,-3.6,-3.9,-4.1,-4.4,-4.6,-4.9,-5.2,-5.5,-6.3,-6.8,-7.1,-7.2,-7.5,-7.6,-7.5,-7.3,-6.9,-6.4,-6.2,-5.5,-4.6,
[2026-01-15 15:59:20.728 T] GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&timezone=auto HTTP/1.1
Host: api.open-meteo.com
Connection: close
[2026-01-15 15:59:24.494 R] HTTP/1.1 200 OK
Date: Thu, 15 Jan 2026 07:59:23 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: close
c0e
{"latitude":39.125,"longitude":117.25,"generationtime_ms":0.10395050048828125,"utc_offset_seconds":28800,"timezone":"Asia/Shanghai","timezone_abbreviation":"GMT+8","elevation":2.0,"hourly_units":{"time":"iso8601","temperature_2m":"°C","relativehumidity_2m":"%","precipitation_probability":"%"},"hourly":{"time":["2026-01-15T00:00","2026-01-15T01:00","2026-01-15T02:00","2026-01-15T03:00","2026-01-15T04:00","2026-01-15T05:00","2026-01-15T06:00","2026-01-15T07:00","2026-01-15T08:00","2026-01-15T09:00","2026-01-15T10:00","2026-01-15T11:00","2026-01-15T12:00","2026-01-15T13:00","2026-01-15T14:00","2026-01-15T15:00","2026-01-15T16:00","2026-01-15T17:00","2026-01-15T18:00","2026-01-15T19:00","2026-01-15T20:00","2026-01-15T21:00","2026-01-15T22:00","2026-01-15T23:00","2026-01-16T00:00","2026-01-16T01:00","2026-01-16T02:00","2026-01-16T03:00","2026-01-16T04:00","2026-01-16T05:00","2026-01-16T06:00","2026-01-16T07:00","2026-01-16T08:00","2026-01-16T09:00","2026-01-16T10:00","2026-01-16T11:00","2026-01-16T12:00","2026-01-16T13:00","2026-01-16T14:00","2026-01-16T15:00","2026-01-16T16:00","2026-01-16T17:00","2026-01-16T18:00","2026-01-16T19:00","2026-01-16T20:00","2026-01-16T21:00","2026-01-16T22:00","2026-01-16T23:00","2026-01-17T00:00","2026-01-17T01:00","2026-01-17T02:00","2026-01-17T03:00","2026-01-17T04:00","2026-01-17T05:00","2026-01-17T06:00","2026-01-17T07:00","2026-01-17T08:00","2026-01-17T09:00","2026-01-17T10:00","2026-01-17T11:00","2026-01-17T12:00","2026-01-17T13:00","2026-01-17T14:00","2026-01-17T15:00","2026-01-17T16:00","2026-01-17T17:00","2026-01-17T18:00","2026-01-17T19:00","2026-01-17T20:00","2026-01-17T21:00","2026-01-17T22:00","2026-01-17T23:00","2026-01-18T00:00","2026-01-18T01:00","2026-01-18T02:00","2026-01-18T03:00","2026-01-18T04:00","2026-01-18T05:00","2026-01-18T06:00","2026-01-18T07:00","2026-01-18T08:00","2026-01-18T09:00","2026-01-18T10:00","2026-01-18T11:
[2026-01-15 15:59:24.721 R] 00","2026-01-18T12:00","2026-01-18T13:00","2026-01-18T14:00","2026-01-18T15:00","2026-01-18T16:00","2026-01-18T17:00","2026-01-18T18:00","2026-01-18T19:00","2026-01-18T20:00","2026-01-18T21:00","2026-01-18T22:00","2026-01-18T23:00","2026-01-19T00:00","2026-01-19T01:00","2026-01-19T02:00","2026-01-19T03:00","2026-01-19T04:00","2026-01-19T05:00","2026-01-19T06:00","2026-01-19T07:00","2026-01-19T08:00","2026-01-19T09:00","2026-01-19T10:00","2026-01-19T11:00","2026-01-19T12:00","2026-01-19T13:00","2026-01-19T14:00","2026-01-19T15:00","2026-01-19T16:00","2026-01-19T17:00","2026-01-19T18:00","2026-01-19T19:00","2026-01-19T20:00","2026-01-19T21:00","2026-01-19T22:00","2026-01-19T23:00","2026-01-20T00:00","2026-01-20T01:00","2026-01-20T02:00","2026-01-20T03:00","2026-01-20T04:00","2026-01-20T05:00","2026-01-20T06:00","2026-01-20T07:00","2026-01-20T08:00","2026-01-20T09:00","2026-01-20T10:00","2026-01-20T11:00","2026-01-20T12:00","2026-01-20T13:00","2026-01-20T14:00","2026-01-20T15:00","2026-01-20T16:00","2026-01-20T17:00","2026-01-20T18:00","2026-01-20T19:00","2026-01-20T20:00","2026-01-20T21:00","2026-01-20T22:00","2026-01-20T23:00","2026-01-21T00:00","2026-01-21T01:00"
8a3
,"2026-01-21T02:00","2026-01-21T03:00","2026-01-21T04:00","2026-01-21T05:00","2026-01-21T06:00","2026-01-21T07:00","2026-01-21T08:00","2026-01-21T09:00","2026-01-21T10:00","2026-01-21T11:00","2026-01-21T12:00","2026-01-21T13:00","2026-01-21T14:00","2026-01-21T15:00","2026-01-21T16:00","2026-01-21T17:00","2026-01-21T18:00","2026-01-21T19:00","2026-01-21T20:00","2026-01-21T21:00","2026-01-21T22:00","2026-01-21T23:00"],"temperature_2m":[-3.4,-3.8,-3.9,-3.8,-3.9,-3.9,-4.0,-4.0,-5.3,-4.3,-2.0,1.2,4.1,6.2,7.8,8.6,8.2,5.9,3.5,2.0,1.2,0.9,0.5,-0.1,-0.6,-1.1,-1.8,-2.6,-3.5,-4.2,-4.6,-4.8,-4.8,-4.1,-2.2,0.0,1.8,2.9,4.0,4.5,3.8,2.5,0.8,-0.7,-1.9,-2.9,-3.9,-4.7,-5.4,-5.9,-6.2,-5.8,-5.8,-6.4,-6.9,-7.2,-7.4,-6.5,-4.8,-3.1,-2.4,-2.3,-2.4,-2.8,-3.2,-3.6,-3.9,-4.1,-4.4,-4.6,-4.9,-5.2,-5.5,-6.3,-6.8,-7.1,-7.2,-7.5,-7.6,-7.5,-7.3,-6.9,-6.4,-6.2,-5.5,-4.6,
[2026-01-15 15:59:32.767 R] HTTP/1.1 200 OK
Date: Thu, 15 Jan 2026 07:59:32 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: close
c0e
{"latitude":39.125,"longitude":117.25,"generationtime_ms":0.09465217590332031,"utc_offset_seconds":28800,"timezone":"Asia/Shanghai","timezone_abbreviation":"GMT+8","elevation":2.0,"hourly_units":{"time":"iso8601","temperature_2m":"°C","relativehumidity_2m":"%","precipitation_probability":"%"},"hourly":{"time":["2026-01-15T00:00","2026-01-15T01:00","2026-01-15T02:00","2026-01-15T03:00","2026-01-15T04:00","2026-01-15T05:00","2026-01-15T06:00","2026-01-15T07:00","2026-01-15T08:00","2026-01-15T09:00","2026-01-15T10:00","2026-01-15T11:00","2026-01-15T12:00","2026-01-15T13:00","2026-01-15T14:00","2026-01-15T15:00","2026-01-15T16:00","2026-01-15T17:00","2026-01-15T18:00","2026-01-15T19:00","2026-01-15T20:00","2026-01-15T21:00","2026-01-15T22:00","2026-01-15T23:00","2026-01-16T00:00","2026-01-16T01:00","2026-01-16T02:00","2026-01-16T03:00","2026-01-16T04:00","2026-01-16T05:00","2026-01-16T06:00","2026-01-16T07:00","2026-01-16T08:00","2026-01-16T09:00","2026-01-16T10:00","2026-01-16T11:00","2026-01-16T12:00","2026-01-16T13:00","2026-01-16T14:00","2026-01-16T15:00","2026-01-16T16:00","2026-01-16T17:00","2026-01-16T18:00","2026-01-16T19:00","2026-01-16T20:00","2026-01-16T21:00","2026-01-16T22:00","2026-01-16T23:00","2026-01-17T00:00","2026-01-17T01:00","2026-01-17T02:00","2026-01-17T03:00","2026-01-17T04:00","2026-01-17T05:00","2026-01-17T06:00","2026-01-17T07:00","2026-01-17T08:00","2026-01-17T09:00","2026-01-17T10:00","2026-01-17T11:00","2026-01-17T12:00","2026-01-17T13:00","2026-01-17T14:00","2026-01-17T15:00","2026-01-17T16:00","2026-01-17T17:00","2026-01-17T18:00","2026-01-17T19:00","2026-01-17T20:00","2026-01-17T21:00","2026-01-17T22:00","2026-01-17T23:00","2026-01-18T00:00","2026-01-18T01:00","2026-01-18T02:00","2026-01-18T03:00","2026-01-18T04:00","2026-01-18T05:00","2026-01-18T06:00","2026-01-18T07:00","2026-01-18T08:00","2026-01-18T09:00","2026-01-18T10:00","2026-01-18T11:00","2026-01-18T12:00","2026-01-18T13:00","2026-01-18T14:00","2026-01
[2026-01-15 15:59:32.994 R] -18T15:00","2026-01-18T16:00","2026-01-18T17:00","2026-01-18T18:00","2026-01-18T19:00","2026-01-18T20:00","2026-01-18T21:00","2026-01-18T22:00","2026-01-18T23:00","2026-01-19T00:00","2026-01-19T01:00","2026-01-19T02:00","2026-01-19T03:00","2026-01-19T04:00","2026-01-19T05:00","2026-01-19T06:00","2026-01-19T07:00","2026-01-19T08:00","2026-01-19T09:00","2026-01-19T10:00","2026-01-19T11:00","2026-01-19T12:00","2026-01-19T13:00","2026-01-19T14:00","2026-01-19T15:00","2026-01-19T16:00","2026-01-19T17:00","2026-01-19T18:00","2026-01-19T19:00","2026-01-19T20:00","2026-01-19T21:00","2026-01-19T22:00","2026-01-19T23:00","2026-01-20T00:00","2026-01-20T01:00","2026-01-20T02:00","2026-01-20T03:00","2026-01-20T04:00","2026-01-20T05:00","2026-01-20T06:00","2026-01-20T07:00","2026-01-20T08:00","2026-01-20T09:00","2026-01-20T10:00","2026-01-20T11:00","2026-01-20T12:00","2026-01-20T13:00","2026-01-20T14:00","2026-01-20T15:00","2026-01-20T16:00","2026-01-20T17:00","2026-01-20T18:00","2026-01-20T19:00","2026-01-20T20:00","2026-01-20T21:00","2026-01-20T22:00","2026-01-20T23:00","2026-01-21T00:00","2026-01-21T01:00"
8a3
,"2026-01-21T02:00","2026-01-21T03:00","2026-01-21T04:00","2026-01-21T05:00","2026-01-21T06:00","2026-01-21T07:00","2026-01-21T08:00","2026-01-21T09:00","2026-01-21T10:00","2026-01-21T11:00","2026-01-21T12:00","2026-01-21T13:00","2026-01-21T14:00","2026-01-21T15:00","2026-01-21T16:00","2026-01-21T17:00","2026-01-21T18:00","2026-01-21T19:00","2026-01-21T20:00","2026-01-21T21:00","2026-01-21T22:00","2026-01-21T23:00"],"temperature_2m":[-3.4,-3.8,-3.9,-3.8,-3.9,-3.9,-4.0,-4.0,-5.3,-4.3,-2.0,1.2,4.1,6.2,7.8,8.6,8.2,5.9,3.5,2.0,1.2,0.9,0.5,-0.1,-0.6,-1.1,-1.8,-2.6,-3.5,-4.2,-4.6,-4.8,-4.8,-4.1,-2.2,0.0,1.8,2.9,4.0,4.5,3.8,2.5,0.8,-0.7,-1.9,-2.9,-3.9,-4.7,-5.4,-5.9,-6.2,-5.8,-5.8,-6.4,-6.9,-7.2,-7.4,-6.5,-4.8,-3.1,-2.4,-2.3,-2.4,-2.8,-3.2,-3.6,-3.9,-4.1,-4.4,-4.6,-4.9,-5.2,-5.5,-6.3,-6.8,-7.1,-7.2,-7.5,-7.6,-7.5,-7.3,-6.9,-6.4,-6.2,-5.5,-4.6,
[2026-01-15 16:05:08.394 R] HTTP/1.1 400 Bad Request
Server: nginx
Date: Thu, 15 Jan 2026 08:05:07 GMT
Content-Type: text/html
Content-Length: 150
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
[2026-01-15 16:06:41.701 R] HTTP/1.1 400 Bad Request
Server: nginx
Date: Thu, 15 Jan 2026 08:06:41 GMT
Content-Type: text/html
Content-Length: 150
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
[2026-01-15 16:07:54.157 R] HTTP/1.1 400 Bad Request
Server: nginx
Date: Thu, 15 Jan 2026 08:07:53 GMT
Content-Type: text/html
Content-Length: 150
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
[2026-01-15 17:15:13.911]# SEND ASCII/237 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:15:16.004]# RECV ASCII/2637 <<<
HTTP/1.1 200 OK
Date: Thu, 15 Jan 2026 09:15:14 GMT
Content-Type: application/json; charset=utf-8
Connection: close
{"latitude":39.125,"longitude":117.25,"generationtime_ms":0.06771087646484375,"utc_offset_seconds":28800,"timezone":"Asia/Shanghai","timezone_abbreviation":"GMT+8","elevation":2.0,"hourly_units":{"time":"iso8601","temperature_2m":"掳C","relativehumidity_2m":"%","precipitation_probability":"%"},"hourly":{"time":["2026-01-15T17:00","2026-01-15T18:00","2026-01-15T19:00","2026-01-15T20:00","2026-01-15T21:00","2026-01-15T22:00","2026-01-15T23:00","2026-01-16T00:00","2026-01-16T01:00","2026-01-16T02:00","2026-01-16T03:00","2026-01-16T04:00","2026-01-16T05:00","2026-01-16T06:00","2026-01-16T07:00","2026-01-16T08:00","2026-01-16T09:00","2026-01-16T10:00","2026-01-16T11:00","2026-01-16T12:00","2026-01-16T13:00","2026-01-16T14:00","2026-01-16T15:00","2026-01-16T16:00","2026-01-16T17:00","2026-01-16T18:00","2026-01-16T19:00","2026-01-16T20:00","2026-01-16T21:00","2026-01-16T22:00","2026-01-16T23:00","2026-01-17T00:00","2026-01-17T01:00","2026-01-17T02:00","2026-01-17T03:00","2026-01-17T04:00","2026-01-17T05:00","2026-01-17T06:00","2026-01-17T07:00","2026-01-17T08:00","2026-01-17T09:00","2026-01-17T10:00","2026-01-17T11:00","2026-01-17T12:00","2026-01-17T13:00","2026-01-17T14:00","2026-01-17T15:00","2026-01-17T16:00","2026-01-17T17:00","2026-01-17T18:00","2026-01-17T19:00","2026-01-17T20:00","2026-01-17T21:00","2026-01-17T22:00","2026-01-17T23:00","2026-01-18T00:00","2026-01-18T01:00","2026-01-18T02:00","2026-01-18T03:00","2026-01-18T04:00","2026-01-18T05:00","2026-01-18T06:00","2026-01-18T07:00","2026-01-18T08:00","2026-01-18T09:00","2026-01-18T10:00","2026-01-18T11:00","2026-01-18T12:00","2026-01-18T13:00","2026-01-18T14:00","2026-01-18T15:00","2026-01-18T16:00","2026-01-18T17:00"],"temperature_2m":[5.9,3.5,2.0,1.2,0.9,0.5,-0.1,-0.6,-1.1,-1.8,-2.6,-3.5,-4.2,-4.6,-4.8,-4.8,-4.1,-2.2,0.0,1.8,2.9,4.0,4.5,3.8,2.5,0.8,-0.7,-1.9,-2.9,-3.9,-4.7,-5.4,-5.9,-6.2,-5.8,-5.8,-6.4,-6.9,-7.2,-7.4,-6.5,-4.8,-3.1,-2.4,-2.3,-2.4,-2.8,-3.2,-3.6,-3.9,-4.1,-4.4,-4.6,-4.9,-5.2,-5.5,-6.3,-6.8,-7.1,-7.2,-7.5,-7.6,-7.5,-7.3,-6.9,-6.4,-6.2,-5.5,-4.6,-3.9,-3.7,-3.7,-3.9],"relativehumidity_2m":[50,66,81,88,86,84,82,77,75,74,72,68,63,59,57,57,54,47,42,40,41,40,28,25,26,25,26,29,27,27,28,29,30,44,59,50,45,47,49,49,47,46,48,51,53,54,57,59,61,63,68,72,74,75,75,74,70,67,69,65,60,54,47,41,38,34,32,30,26,21,19,19,19],"precipitation_probability":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,7,10,13,15,17,18,19,20,22,23,25,27,29,31,32,33,33,33,33,33,31,30,28,25,22]}}
[2026-01-15 17:09:12.013]# SEND ASCII/187 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&timezone=auto HTTP/1.1
Host: api.open-meteo.com
Connection: close
[2026-01-15 17:09:21.608]# SEND ASCII/189 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&timezone=auto HTTP/1.1
Host: api.open-meteo.com
Connection: close
[2026-01-15 17:09:22.174]# RECV ASCII/295 <<<
HTTP/1.1 400 Bad Request
Server: nginx
Date: Thu, 15 Jan 2026 09:09:21 GMT
Content-Type: text/html
Content-Length: 150
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
[2026-01-15 17:09:34.885]# SEND ASCII/188 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&timezone=auto HTTP/1.1
Host: api.open-meteo.com
Connection: close
[2026-01-15 17:09:47.740]# RECV ASCII/4096 <<<
HTTP/1.1 200 OK
Date: Thu, 15 Jan 2026 09:09:35 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: close
c0e
{"latitude":39.125,"longitude":117.25,"generationtime_ms":0.09870529174804688,"utc_offset_seconds":28800,"timezone":"Asia/Shanghai","timezone_abbreviation":"GMT+8","elevation":2.0,"hourly_units":{"time":"iso8601","temperature_2m":"掳C","relativehumidity_2m":"%","precipitation_probability":"%"},"hourly":{"time":["2026-01-15T00:00","2026-01-15T01:00","2026-01-15T02:00","2026-01-15T03:00","2026-01-15T04:00","2026-01-15T05:00","2026-01-15T06:00","2026-01-15T07:00","2026-01-15T08:00","2026-01-15T09:00","2026-01-15T10:00","2026-01-15T11:00","2026-01-15T12:00","2026-01-15T13:00","2026-01-15T14:00","2026-01-15T15:00","2026-01-15T16:00","2026-01-15T17:00","2026-01-15T18:00","2026-01-15T19:00","2026-01-15T20:00","2026-01-15T21:00","2026-01-15T22:00","2026-01-15T23:00","2026-01-16T00:00","2026-01-16T01:00","2026-01-16T02:00","2026-01-16T03:00","2026-01-16T04:00","2026-01-16T05:00","2026-01-16T06:00","2026-01-16T07:00","2026-01-16T08:00","2026-01-16T09:00","2026-01-16T10:00","2026-01-16T11:00","2026-01-16T12:00","2026-01-16T13:00","2026-01-16T14:00","2026-01-16T15:00","2026-01-16T16:00","2026-01-16T17:00","2026-01-16T18:00","2026-01-16T19:00","2026-01-16T20:00","2026-01-16T21:00","2026-01-16T22:00","2026-01-16T23:00","2026-01-17T00:00","2026-01-17T01:00","2026-01-17T02:00","2026-01-17T03:00","2026-01-17T04:00","2026-01-17T05:00","2026-01-17T06:00","2026-01-17T07:00","2026-01-17T08:00","2026-01-17T09:00","2026-01-17T10:00","2026-01-17T11:00","2026-01-17T12:00","2026-01-17T13:00","2026-01-17T14:00","2026-01-17T15:00","2026-01-17T16:00","2026-01-17T17:00","2026-01-17T18:00","2026-01-17T19:00","2026-01-17T20:00","2026-01-17T21:00","2026-01-17T22:00","2026-01-17T23:00","2026-01-18T00:00","2026-01-18T01:00","2026-01-18T02:00","2026-01-18T03:00","2026-01-18T04:00","2026-01-18T05:00","2026-01-18T06:00","2026-01-18T07:00","2026-01-18T08:00","2026-01-18T09:00","2026-01-18T10:00","2026-01-18T11:00","2026-01-18T12:00","2026-01-18T13:00","2026-01-18T14:00","2026-01-18T15:00","2026-01-18T16:00","2026-01-18T17:00","2026-01-18T18:00","2026-01-18T19:00","2026-01-18T20:00","2026-01-18T21:00","2026-01-18T22:00","2026-01-18T23:00","2026-01-19T00:00","2026-01-19T01:00","2026-01-19T02:00","2026-01-19T03:00","2026-01-19T04:00","2026-01-19T05:00","2026-01-19T06:00","2026-01-19T07:00","2026-01-19T08:00","2026-01-19T09:00","2026-01-19T10:00","2026-01-19T11:00","2026-01-19T12:00","2026-01-19T13:00","2026-01-19T14:00","2026-01-19T15:00","2026-01-19T16:00","2026-01-19T17:00","2026-01-19T18:00","2026-01-19T19:00","2026-01-19T20:00","2026-01-19T21:00","2026-01-19T22:00","2026-01-19T23:00","2026-01-20T00:00","2026-01-20T01:00","2026-01-20T02:00","2026-01-20T03:00","2026-01-20T04:00","2026-01-20T05:00","2026-01-20T06:00","2026-01-20T07:00","2026-01-20T08:00","2026-01-20T09:00","2026-01-20T10:00","2026-01-20T11:00","2026-01-20T12:00","2026-01-20T13:00","2026-01-20T14:00","2026-01-20T15:00","2026-01-20T16:00","2026-01-20T17:00","2026-01-20T18:00","2026-01-20T19:00","2026-01-20T20:00","2026-01-20T21:00","2026-01-20T22:00","2026-01-20T23:00","2026-01-21T00:00","2026-01-21T01:00"
8a3
,"2026-01-21T02:00","2026-01-21T03:00","2026-01-21T04:00","2026-01-21T05:00","2026-01-21T06:00","2026-01-21T07:00","2026-01-21T08:00","2026-01-21T09:00","2026-01-21T10:00","2026-01-21T11:00","2026-01-21T12:00","2026-01-21T13:00","2026-01-21T14:00","2026-01-21T15:00","2026-01-21T16:00","2026-01-21T17:00","2026-01-21T18:00","2026-01-21T19:00","2026-01-21T20:00","2026-01-21T21:00","2026-01-21T22:00","2026-01-21T23:00"],"temperature_2m":[-3.4,-3.8,-3.9,-3.8,-3.9,-3.9,-4.0,-4.0,-5.3,-4.3,-2.0,1.2,4.1,6.2,7.8,8.6,8.2,5.9,3.5,2.0,1.2,0.9,0.5,-0.1,-0.6,-1.1,-1.8,-2.6,-3.5,-4.2,-4.6,-4.8,-4.8,-4.1,-2.2,0.0,1.8,2.9,4.0,4.5,3.8,2.5,0.8,-0.7,-1.9,-2.9,-3.9,-4.7,-5.4,-5.9,-6.2,-5.8,-5.8,-6.4,-6.9,-7.2,-7.4,-6.5,-4.8,-3.1,-2.4,-2.3,-2.4,-2.8,-3.2,-3.6,-3.9,-4.1,-4.4,-4.6,-4.9,-5.2,-5.5,-6.3,-6.8,-7.1,-7.2,-7.5,-7.6,-7.5,-7.3,-6.9,-6.4,-6.2,-5.5,-4.6,
[2026-01-15 17:13:27.761]# SEND ASCII/235 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:13:51.109]# SEND ASCII/235 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:14:13.108]# SEND ASCII/235 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:14:13.734]# RECV ASCII/295 <<<
HTTP/1.1 400 Bad Request
Server: nginx
Date: Thu, 15 Jan 2026 09:14:13 GMT
Content-Type: text/html
Content-Length: 150
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
[2026-01-15 17:14:52.508]# SEND ASCII/235 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:14:58.280]# SEND ASCII/235 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:14:58.934]# RECV ASCII/295 <<<
HTTP/1.1 400 Bad Request
Server: nginx
Date: Thu, 15 Jan 2026 09:14:58 GMT
Content-Type: text/html
Content-Length: 150
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
[2026-01-15 17:14:59.776]# SEND ASCII/235 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:15:02.496]# SEND ASCII/237 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:15:06.652]# RECV ASCII/295 <<<
HTTP/1.1 400 Bad Request
Server: nginx
Date: Thu, 15 Jan 2026 09:15:06 GMT
Content-Type: text/html
Content-Length: 150
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
[2026-01-15 17:15:13.911]# SEND ASCII/237 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:15:16.004]# RECV ASCII/2637 <<<
HTTP/1.1 200 OK
Date: Thu, 15 Jan 2026 09:15:14 GMT
Content-Type: application/json; charset=utf-8
Connection: close
{"latitude":39.125,"longitude":117.25,"generationtime_ms":0.06771087646484375,"utc_offset_seconds":28800,"timezone":"Asia/Shanghai","timezone_abbreviation":"GMT+8","elevation":2.0,"hourly_units":{"time":"iso8601","temperature_2m":"掳C","relativehumidity_2m":"%","precipitation_probability":"%"},"hourly":{"time":["2026-01-15T17:00","2026-01-15T18:00","2026-01-15T19:00","2026-01-15T20:00","2026-01-15T21:00","2026-01-15T22:00","2026-01-15T23:00","2026-01-16T00:00","2026-01-16T01:00","2026-01-16T02:00","2026-01-16T03:00","2026-01-16T04:00","2026-01-16T05:00","2026-01-16T06:00","2026-01-16T07:00","2026-01-16T08:00","2026-01-16T09:00","2026-01-16T10:00","2026-01-16T11:00","2026-01-16T12:00","2026-01-16T13:00","2026-01-16T14:00","2026-01-16T15:00","2026-01-16T16:00","2026-01-16T17:00","2026-01-16T18:00","2026-01-16T19:00","2026-01-16T20:00","2026-01-16T21:00","2026-01-16T22:00","2026-01-16T23:00","2026-01-17T00:00","2026-01-17T01:00","2026-01-17T02:00","2026-01-17T03:00","2026-01-17T04:00","2026-01-17T05:00","2026-01-17T06:00","2026-01-17T07:00","2026-01-17T08:00","2026-01-17T09:00","2026-01-17T10:00","2026-01-17T11:00","2026-01-17T12:00","2026-01-17T13:00","2026-01-17T14:00","2026-01-17T15:00","2026-01-17T16:00","2026-01-17T17:00","2026-01-17T18:00","2026-01-17T19:00","2026-01-17T20:00","2026-01-17T21:00","2026-01-17T22:00","2026-01-17T23:00","2026-01-18T00:00","2026-01-18T01:00","2026-01-18T02:00","2026-01-18T03:00","2026-01-18T04:00","2026-01-18T05:00","2026-01-18T06:00","2026-01-18T07:00","2026-01-18T08:00","2026-01-18T09:00","2026-01-18T10:00","2026-01-18T11:00","2026-01-18T12:00","2026-01-18T13:00","2026-01-18T14:00","2026-01-18T15:00","2026-01-18T16:00","2026-01-18T17:00"],"temperature_2m":[5.9,3.5,2.0,1.2,0.9,0.5,-0.1,-0.6,-1.1,-1.8,-2.6,-3.5,-4.2,-4.6,-4.8,-4.8,-4.1,-2.2,0.0,1.8,2.9,4.0,4.5,3.8,2.5,0.8,-0.7,-1.9,-2.9,-3.9,-4.7,-5.4,-5.9,-6.2,-5.8,-5.8,-6.4,-6.9,-7.2,-7.4,-6.5,-4.8,-3.1,-2.4,-2.3,-2.4,-2.8,-3.2,-3.6,-3.9,-4.1,-4.4,-4.6,-4.9,-5.2,-5.5,-6.3,-6.8,-7.1,-7.2,-7.5,-7.6,-7.5,-7.3,-6.9,-6.4,-6.2,-5.5,-4.6,-3.9,-3.7,-3.7,-3.9],"relativehumidity_2m":[50,66,81,88,86,84,82,77,75,74,72,68,63,59,57,57,54,47,42,40,41,40,28,25,26,25,26,29,27,27,28,29,30,44,59,50,45,47,49,49,47,46,48,51,53,54,57,59,61,63,68,72,74,75,75,74,70,67,69,65,60,54,47,41,38,34,32,30,26,21,19,19,19],"precipitation_probability":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,7,10,13,15,17,18,19,20,22,23,25,27,29,31,32,33,33,33,33,33,31,30,28,25,22]}}
[2026-01-15 17:59:36.044]# SEND ASCII/237 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:59:40.756]# RECV ASCII/2636 <<<
HTTP/1.1 200 OK
Date: Thu, 15 Jan 2026 09:59:39 GMT
Content-Type: application/json; charset=utf-8
Connection: close
{"latitude":39.125,"longitude":117.25,"generationtime_ms":0.06830692291259766,"utc_offset_seconds":28800,"timezone":"Asia/Shanghai","timezone_abbreviation":"GMT+8","elevation":2.0,"hourly_units":{"time":"iso8601","temperature_2m":"掳C","relativehumidity_2m":"%","precipitation_probability":"%"},"hourly":{"time":["2026-01-15T17:00","2026-01-15T18:00","2026-01-15T19:00","2026-01-15T20:00","2026-01-15T21:00","2026-01-15T22:00","2026-01-15T23:00","2026-01-16T00:00","2026-01-16T01:00","2026-01-16T02:00","2026-01-16T03:00","2026-01-16T04:00","2026-01-16T05:00","2026-01-16T06:00","2026-01-16T07:00","2026-01-16T08:00","2026-01-16T09:00","2026-01-16T10:00","2026-01-16T11:00","2026-01-16T12:00","2026-01-16T13:00","2026-01-16T14:00","2026-01-16T15:00","2026-01-16T16:00","2026-01-16T17:00","2026-01-16T18:00","2026-01-16T19:00","2026-01-16T20:00","2026-01-16T21:00","2026-01-16T22:00","2026-01-16T23:00","2026-01-17T00:00","2026-01-17T01:00","2026-01-17T02:00","2026-01-17T03:00","2026-01-17T04:00","2026-01-17T05:00","2026-01-17T06:00","2026-01-17T07:00","2026-01-17T08:00","2026-01-17T09:00","2026-01-17T10:00","2026-01-17T11:00","2026-01-17T12:00","2026-01-17T13:00","2026-01-17T14:00","2026-01-17T15:00","2026-01-17T16:00","2026-01-17T17:00","2026-01-17T18:00","2026-01-17T19:00","2026-01-17T20:00","2026-01-17T21:00","2026-01-17T22:00","2026-01-17T23:00","2026-01-18T00:00","2026-01-18T01:00","2026-01-18T02:00","2026-01-18T03:00","2026-01-18T04:00","2026-01-18T05:00","2026-01-18T06:00","2026-01-18T07:00","2026-01-18T08:00","2026-01-18T09:00","2026-01-18T10:00","2026-01-18T11:00","2026-01-18T12:00","2026-01-18T13:00","2026-01-18T14:00","2026-01-18T15:00","2026-01-18T16:00","2026-01-18T17:00"],"temperature_2m":[6.9,4.3,2.6,1.7,1.1,0.7,0.2,-0.2,-0.7,-1.5,-2.3,-3.2,-3.8,-4.4,-4.7,-5.0,-4.2,-2.1,0.1,1.6,2.7,4.1,4.2,3.3,1.9,0.2,-1.3,-2.5,-3.5,-4.3,-5.2,-5.8,-6.3,-6.7,-6.7,-6.2,-6.3,-6.9,-7.4,-7.6,-6.7,-5.0,-3.3,-2.5,-2.3,-2.3,-2.7,-3.3,-3.9,-4.2,-4.5,-4.8,-5.1,-5.5,-5.8,-6.1,-6.9,-7.7,-8.0,-8.1,-8.3,-8.2,-8.2,-8.0,-7.5,-7.0,-6.3,-5.6,-4.9,-4.5,-4.1,-4.1,-4.4],"relativehumidity_2m":[43,57,75,84,86,84,83,79,76,75,71,65,61,58,58,59,56,49,44,43,44,34,24,24,21,23,24,27,29,30,31,31,32,40,60,60,49,46,49,52,50,45,43,44,47,50,52,56,59,62,67,74,75,73,73,73,73,72,69,60,57,49,38,33,29,25,23,21,20,19,18,19,20],"precipitation_probability":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,7,10,13,15,17,18,19,20,22,23,25,27,29,31,32,33,33,33,33,33,31,30,28,25,22]}}
[2026-01-15 17:59:43.565]# SEND ASCII/237 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
[2026-01-15 17:59:48.743]# RECV ASCII/2636 <<<
HTTP/1.1 200 OK
Date: Thu, 15 Jan 2026 09:59:47 GMT
Content-Type: application/json; charset=utf-8
Connection: close
{"latitude":39.125,"longitude":117.25,"generationtime_ms":0.05805492401123047,"utc_offset_seconds":28800,"timezone":"Asia/Shanghai","timezone_abbreviation":"GMT+8","elevation":2.0,"hourly_units":{"time":"iso8601","temperature_2m":"掳C","relativehumidity_2m":"%","precipitation_probability":"%"},"hourly":{"time":["2026-01-15T17:00","2026-01-15T18:00","2026-01-15T19:00","2026-01-15T20:00","2026-01-15T21:00","2026-01-15T22:00","2026-01-15T23:00","2026-01-16T00:00","2026-01-16T01:00","2026-01-16T02:00","2026-01-16T03:00","2026-01-16T04:00","2026-01-16T05:00","2026-01-16T06:00","2026-01-16T07:00","2026-01-16T08:00","2026-01-16T09:00","2026-01-16T10:00","2026-01-16T11:00","2026-01-16T12:00","2026-01-16T13:00","2026-01-16T14:00","2026-01-16T15:00","2026-01-16T16:00","2026-01-16T17:00","2026-01-16T18:00","2026-01-16T19:00","2026-01-16T20:00","2026-01-16T21:00","2026-01-16T22:00","2026-01-16T23:00","2026-01-17T00:00","2026-01-17T01:00","2026-01-17T02:00","2026-01-17T03:00","2026-01-17T04:00","2026-01-17T05:00","2026-01-17T06:00","2026-01-17T07:00","2026-01-17T08:00","2026-01-17T09:00","2026-01-17T10:00","2026-01-17T11:00","2026-01-17T12:00","2026-01-17T13:00","2026-01-17T14:00","2026-01-17T15:00","2026-01-17T16:00","2026-01-17T17:00","2026-01-17T18:00","2026-01-17T19:00","2026-01-17T20:00","2026-01-17T21:00","2026-01-17T22:00","2026-01-17T23:00","2026-01-18T00:00","2026-01-18T01:00","2026-01-18T02:00","2026-01-18T03:00","2026-01-18T04:00","2026-01-18T05:00","2026-01-18T06:00","2026-01-18T07:00","2026-01-18T08:00","2026-01-18T09:00","2026-01-18T10:00","2026-01-18T11:00","2026-01-18T12:00","2026-01-18T13:00","2026-01-18T14:00","2026-01-18T15:00","2026-01-18T16:00","2026-01-18T17:00"],"temperature_2m":[6.9,4.3,2.6,1.7,1.1,0.7,0.2,-0.2,-0.7,-1.5,-2.3,-3.2,-3.8,-4.4,-4.7,-5.0,-4.2,-2.1,0.1,1.6,2.7,4.1,4.2,3.3,1.9,0.2,-1.3,-2.5,-3.5,-4.3,-5.2,-5.8,-6.3,-6.7,-6.7,-6.2,-6.3,-6.9,-7.4,-7.6,-6.7,-5.0,-3.3,-2.5,-2.3,-2.3,-2.7,-3.3,-3.9,-4.2,-4.5,-4.8,-5.1,-5.5,-5.8,-6.1,-6.9,-7.7,-8.0,-8.1,-8.3,-8.2,-8.2,-8.0,-7.5,-7.0,-6.3,-5.6,-4.9,-4.5,-4.1,-4.1,-4.4],"relativehumidity_2m":[43,57,75,84,86,84,83,79,76,75,71,65,61,58,58,59,56,49,44,43,44,34,24,24,21,23,24,27,29,30,31,31,32,40,60,60,49,46,49,52,50,45,43,44,47,50,52,56,59,62,67,74,75,73,73,73,73,72,69,60,57,49,38,33,29,25,23,21,20,19,18,19,20],"precipitation_probability":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,7,10,13,15,17,18,19,20,22,23,25,27,29,31,32,33,33,33,33,33,31,30,28,25,22]}}
[2026-01-15 18:00:53.202]# SEND ASCII/237 >>>
GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly=temperature_2m,relativehumidity_2m,precipitation_probability&forecast_hours=73&timezone=auto HTTP/1.0
Host: api.open-meteo.com
Accept-Encoding: identity
Connection: close
测试 DTU 串口发送到本地(选看)
:::info
打开串口发送之后,就无法进行透传了
:::
function
local uid = 1
UartStopProRecCh(uid)
while true do
UartSetSendCh(uid, "TEST\r\n")
sys.wait(1000)
end
end


:::info
网络参数关闭打开都一样
:::

python 获取天气数据工程代码
import os
import requests
SENIVERSE_URL = "https://api.seniverse.com/v3/weather/hourly.json"
OPEN_METEO_GEO = "https://geocoding-api.open-meteo.com/v1/search"
OPEN_METEO_FORECAST = "https://api.open-meteo.com/v1/forecast"
def fetch_seniverse(api_key: str, location: str, hours: int) -> dict:
params = {
"key": api_key,
"location": location, # e.g. "39.93:116.40" or "beijing"
"language": "zh-Hans",
"unit": "c",
"start": 0,
"hours": hours,
}
r = requests.get(SENIVERSE_URL, params=params, timeout=10)
r.raise_for_status()
data = r.json()
return data["results"][0]
def normalize_hourly(items: list[dict]) -> list[dict]:
normalized = []
for item in items:
normalized.append(
{
"time": item.get("time"),
"temperature": item.get("temperature"),
"humidity": item.get("humidity"),
"precip_probability": item.get("precip_probability"),
}
)
return normalized
def fetch_open_meteo(location: str) -> dict:
geo = requests.get(
OPEN_METEO_GEO,
params={"name": location, "count": 1, "language": "zh", "format": "json"},
timeout=10,
)
geo.raise_for_status()
geo_data = geo.json()
results = geo_data.get("results") or []
if not results:
raise RuntimeError(f"Location not found: {location}")
place = results[0]
lat = place["latitude"]
lon = place["longitude"]
name = place.get("name", location)
country = place.get("country", "")
forecast = requests.get(
OPEN_METEO_FORECAST,
params={
"latitude": lat,
"longitude": lon,
"hourly": "temperature_2m,relativehumidity_2m,precipitation_probability",
"timezone": "auto",
},
timeout=10,
)
forecast.raise_for_status()
forecast_data = forecast.json()
hourly_block = forecast_data.get("hourly", {})
times = hourly_block.get("time", [])
temps = hourly_block.get("temperature_2m", [])
humidity = hourly_block.get("relativehumidity_2m", [])
pop = hourly_block.get("precipitation_probability", [])
limit = min(len(times), len(temps), len(humidity), len(pop))
hourly = [
{
"time": times[i],
"temperature": temps[i],
"humidity": humidity[i],
"precip_probability": pop[i],
}
for i in range(limit)
]
return {
"location": {"name": f"{name}, {country}".strip(", ")},
"hourly": hourly,
}
def main() -> None:
location = "tianjin"
default_key = "P31ROznL9DFRtPxLO"
api_key = os.getenv("SENIVERSE_API_KEY", default_key).strip()
data = None
if api_key:
try:
data = fetch_seniverse(api_key, location, 72)
except requests.RequestException as exc:
status = getattr(getattr(exc, "response", None), "status_code", None)
if status not in (401, 403, 429, None):
raise
print(f"Seniverse request failed (HTTP {status}); falling back.")
if data is None:
data = fetch_open_meteo(location)
print(data["location"]["name"])
data["hourly"] = normalize_hourly(data.get("hourly", []))
if not data["hourly"]:
print("No hourly data")
return
# Show forecast for 24-72 hours ahead.
start = 24
end = 72
hourly = data["hourly"][start:end]
for item in hourly:
print(
f"{item['time']} temp={item['temperature']}C "
f"humidity={item['humidity']}% "
f"pop={item['precip_probability']}%"
)
if __name__ == "__main__":
main()

STM32F103C8T6获取天气数据并显示在OLED屏幕上
接线图
OLED 显示数据
SCL --> PB8
SDA --> PB9
串口1 连接4G模块 (我在这里额外接了一个串口查看4G模块过来的数据并方便调试4G模块)
TX1 --> PA9 --> RX
RX1 --> PA10 --> TX
串口2 调试信息
TX2 --> PA2
TX2 --> PA3

代码
main.c
#include "bsp_led.h"
#include "delay.h"
#include "oled.h"
#include "stm32f10x.h"
#include "bsp_weather/bsp_weather.h"
#include <stdbool.h>
int main(void)
{
uint8_t page = 0;
// 基础外设初始化
delay_Init(72); // 初始化延时函数,参数为系统时钟频率
OLED_Init(); // 初始化 OLED
OLED_Clear();
OLED_Printf(0, 0, OLED_8X16, "Weather Ready");
OLED_Update();
// 初始化天气模块:串口1接收数据,串口2输出日志
weather_init(115200, 115200);
while (1)
{
// 有新数据时重置页面轮显
if (weather_poll())
{
page = 0;
}
if (weather_is_valid())
{
// 轮显 24/48/72 小时数据
weather_show_page(page);
page = (page + 1) % 3;
delay_ms(2000); // 轮显 24/48/72 小时
}
else
{
// 未获取到有效数据时降频刷新
delay_ms(500);
}
}
}
bsp_weather.h
#ifndef __BSP_WEATHER_H__
#define __BSP_WEATHER_H__
#include "stm32f10x.h"
// 串口2日志开关:1=开启,0=关闭
#define WEATHER_LOG_ENABLE 1
// 天气数据结构(仅保留 24/48/72 小时节点)
typedef struct
{
uint8_t valid; // 数据有效标志
int temp_24; // 24 小时温度
int hum_24; // 24 小时湿度
int pop_24; // 24 小时降水概率
int temp_48; // 48 小时温度
int hum_48; // 48 小时湿度
int pop_48; // 48 小时降水概率
int temp_72; // 72 小时温度
int hum_72; // 72 小时湿度
int pop_72; // 72 小时降水概率
} WeatherData;
// 初始化天气模块:串口1接收数据,串口2输出日志
void weather_init(uint32_t uart1_baud, uint32_t uart2_baud);
// 发送一次天气请求
void weather_request(void);
// 轮询接收并解析数据,成功返回1
int weather_poll(void);
// 判断当前是否有有效数据
uint8_t weather_is_valid(void);
// 获取最新天气数据
const WeatherData *weather_get(void);
// OLED 显示指定页(0/1/2)
void weather_show_page(uint8_t page);
#endif
bsp_weather.c
#include "bsp_weather/bsp_weather.h"
#include "cJSON.h"
#include "oled.h"
#include "usart1.h"
#include "usart2.h"
#include <ctype.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
// 仅取 24/48/72 小时节点的数据
#define WEATHER_IDX_24 24
#define WEATHER_IDX_48 48
#define WEATHER_IDX_72 72
// HTTP 直连请求,使用 HTTP/1.0 避免分块传输
static const char g_weather_req[] =
"GET /v1/forecast?latitude=39.0851&longitude=117.1994&hourly="
"temperature_2m,relativehumidity_2m,precipitation_probability&"
"forecast_hours=73&timezone=auto HTTP/1.0\r\n"
"Host: api.open-meteo.com\r\n"
"Accept-Encoding: identity\r\n"
"Connection: close\r\n"
"\r\n";
static WeatherData g_weather = {0}; // 天气数据
static char g_json_buf[USART1_REC_LEN + 1]; // JSON 缓冲区
static char g_log_buf[128]; // 调试日志缓冲区
#if WEATHER_LOG_ENABLE
static void log_printf(const char *fmt, ...)
{
va_list args;
int len;
va_start(args, fmt);
len = vsnprintf(g_log_buf, sizeof(g_log_buf), fmt, args);
va_end(args);
if (len < 0)
{
return;
}
if (len >= (int)sizeof(g_log_buf))
{
len = (int)sizeof(g_log_buf) - 1;
}
uart2_sendlen((uint8_t *)g_log_buf, len);
}
#else
static void log_printf(const char *fmt, ...)
{
(void)fmt;
}
#endif
static void weather_send_request(void)
{
// 直接向服务器发送固定的 HTTP 请求
uart1_sendlen((uint8_t *)g_weather_req, -1);
}
// 浮点转整数,按 0.5 四舍五入
static int weather_round_int(double value)
{
if (value >= 0)
{
return (int)(value + 0.5);
}
return (int)(value - 0.5);
}
static int weather_get_array_int(cJSON *array, int index, int *out_value)
{
cJSON *item = cJSON_GetArrayItem(array, index);
if (!cJSON_IsNumber(item))
{
return 0;
}
*out_value = weather_round_int(cJSON_GetNumberValue(item));
return 1;
}
static int weather_parse_json(const char *json, WeatherData *out)
{
int ok = 0;
cJSON *root = cJSON_Parse(json);
if (!root)
{
return 0;
}
// 仅解析 hourly 字段下的三组数组
cJSON *hourly = cJSON_GetObjectItem(root, "hourly");
cJSON *temp = hourly ? cJSON_GetObjectItem(hourly, "temperature_2m") : NULL;
cJSON *hum = hourly ? cJSON_GetObjectItem(hourly, "relativehumidity_2m") : NULL;
cJSON *pop = hourly ? cJSON_GetObjectItem(hourly, "precipitation_probability") : NULL;
if (!cJSON_IsArray(temp) || !cJSON_IsArray(hum) || !cJSON_IsArray(pop))
{
cJSON_Delete(root);
return 0;
}
// 确保数组长度覆盖 72 小时节点
if (cJSON_GetArraySize(temp) <= WEATHER_IDX_72 ||
cJSON_GetArraySize(hum) <= WEATHER_IDX_72 ||
cJSON_GetArraySize(pop) <= WEATHER_IDX_72)
{
cJSON_Delete(root);
return 0;
}
// 依次取出 24/48/72 小时的温湿度与降水概率
if (!weather_get_array_int(temp, WEATHER_IDX_24, &out->temp_24) ||
!weather_get_array_int(hum, WEATHER_IDX_24, &out->hum_24) ||
!weather_get_array_int(pop, WEATHER_IDX_24, &out->pop_24) ||
!weather_get_array_int(temp, WEATHER_IDX_48, &out->temp_48) ||
!weather_get_array_int(hum, WEATHER_IDX_48, &out->hum_48) ||
!weather_get_array_int(pop, WEATHER_IDX_48, &out->pop_48) ||
!weather_get_array_int(temp, WEATHER_IDX_72, &out->temp_72) ||
!weather_get_array_int(hum, WEATHER_IDX_72, &out->hum_72) ||
!weather_get_array_int(pop, WEATHER_IDX_72, &out->pop_72))
{
cJSON_Delete(root);
return 0;
}
out->valid = 1;
ok = 1;
cJSON_Delete(root);
return ok;
}
// 解析数组中的第 N 个数值(支持负数和小数)
static int weather_parse_index_value(const char *p, int index, int *out_value)
{
int i = 0;
while (p && *p)
{
int sign = 1;
int int_part = 0;
int frac_part = 0;
int frac_scale = 1;
int has_num = 0;
while (*p && *p != '-' && !isdigit((int)*p) && *p != ']')
{
p++;
}
if (*p == ']')
{
return 0;
}
if (*p == '-')
{
sign = -1;
p++;
}
while (*p && isdigit((int)*p))
{
has_num = 1;
int_part = int_part * 10 + (*p - '0');
p++;
}
if (*p == '.')
{
p++;
while (*p && isdigit((int)*p))
{
frac_part = frac_part * 10 + (*p - '0');
frac_scale *= 10;
p++;
}
}
if (!has_num)
{
return 0;
}
if (i == index)
{
int value = int_part * sign;
if (frac_part != 0)
{
int frac = (frac_part * 10) / frac_scale;
if (sign >= 0)
{
value += (frac >= 5) ? 1 : 0;
}
else
{
value -= (frac >= 5) ? 1 : 0;
}
}
*out_value = value;
return 1;
}
i++;
while (*p && *p != ',' && *p != ']')
{
p++;
}
if (*p == ',')
{
p++;
}
else if (*p == ']')
{
return 0;
}
}
return 0;
}
// 从 JSON 文本中按键名提取数组指定索引的值
static int weather_extract_array_value(const char *json, const char *key, int index, int *out_value)
{
char marker[32];
const char *p;
const char *arr;
snprintf(marker, sizeof(marker), "\"%s\":[", key);
p = strstr(json, marker);
if (!p)
{
return 0;
}
arr = strchr(p, '[');
if (!arr)
{
return 0;
}
arr++;
return weather_parse_index_value(arr, index, out_value);
}
// cJSON 失败时使用轻量解析兜底
static int weather_parse_json_fallback(const char *json, WeatherData *out)
{
// 先走 cJSON,失败再用轻量解析
if (weather_parse_json(json, out))
{
return 1;
}
if (!weather_extract_array_value(json, "temperature_2m", WEATHER_IDX_24, &out->temp_24) ||
!weather_extract_array_value(json, "relativehumidity_2m", WEATHER_IDX_24, &out->hum_24) ||
!weather_extract_array_value(json, "precipitation_probability", WEATHER_IDX_24, &out->pop_24) ||
!weather_extract_array_value(json, "temperature_2m", WEATHER_IDX_48, &out->temp_48) ||
!weather_extract_array_value(json, "relativehumidity_2m", WEATHER_IDX_48, &out->hum_48) ||
!weather_extract_array_value(json, "precipitation_probability", WEATHER_IDX_48, &out->pop_48) ||
!weather_extract_array_value(json, "temperature_2m", WEATHER_IDX_72, &out->temp_72) ||
!weather_extract_array_value(json, "relativehumidity_2m", WEATHER_IDX_72, &out->hum_72) ||
!weather_extract_array_value(json, "precipitation_probability", WEATHER_IDX_72, &out->pop_72))
{
return 0;
}
out->valid = 1;
return 1;
}
// 从 HTTP 响应中提取 JSON 主体
static int weather_trim_http(char *buf, uint16_t *len)
{
uint16_t start = 0;
uint16_t end = 0;
uint16_t i = 0;
uint16_t n = *len;
if (n == 0)
{
log_printf("HTTP empty\r\n");
return 0;
}
// 找到第一个 '{' 作为 JSON 起点
while (i < n && buf[i] != '{')
{
i++;
}
if (i >= n)
{
log_printf("HTTP no json\r\n");
return 0;
}
start = i;
// 找到最后一个 '}' 作为 JSON 终点
i = n;
while (i > start)
{
i--;
if (buf[i] == '}')
{
end = i;
break;
}
}
if (end <= start)
{
log_printf("HTTP json cut\r\n");
return 0;
}
// 就地整理 JSON,便于后续解析
if (start > 0)
{
memmove(buf, buf + start, end - start + 1);
}
buf[end - start + 1] = '\0';
*len = (uint16_t)(end - start + 1);
log_printf("JSON len=%u\r\n", *len);
return 1;
}
void weather_init(uint32_t uart1_baud, uint32_t uart2_baud)
{
// 初始化串口并发送一次请求
uart1_init(uart1_baud);
uart2_init(uart2_baud);
weather_send_request();
}
void weather_request(void)
{
// 外部触发重新请求
weather_send_request();
}
int weather_poll(void)
{
uint16_t len;
// 等待串口1帧完成标志
if (USART1_FRAME_READY == 0)
{
return 0;
}
len = USART1_RX_LEN;
if (len >= USART1_REC_LEN)
{
len = USART1_REC_LEN - 1;
}
// 复制串口数据到解析缓冲区
memcpy(g_json_buf, USART1_RX_BUF, len);
g_json_buf[len] = '\0';
// 清空接收状态,准备下一帧
USART1_RX_STA = 0;
USART1_FRAME_READY = 0;
USART1_RX_LEN = 0;
// 先提取 JSON,再进行解析
if (weather_trim_http(g_json_buf, &len))
{
if (!weather_parse_json_fallback(g_json_buf, &g_weather))
{
log_printf("JSON parse fail\r\n");
return 0;
}
return 1;
}
log_printf("JSON not found\r\n");
return 0;
}
uint8_t weather_is_valid(void)
{
return g_weather.valid;
}
const WeatherData *weather_get(void)
{
return &g_weather;
}
void weather_show_page(uint8_t page)
{
int temp = 0;
int hum = 0;
int pop = 0;
const char *title = "24h";
// 数据无效时不刷新屏幕
if (!g_weather.valid)
{
return;
}
// 根据页码选择 24/48/72 小时数据
if (page == 0)
{
temp = g_weather.temp_24;
hum = g_weather.hum_24;
pop = g_weather.pop_24;
title = "24h";
}
else if (page == 1)
{
temp = g_weather.temp_48;
hum = g_weather.hum_48;
pop = g_weather.pop_48;
title = "48h";
}
else
{
temp = g_weather.temp_72;
hum = g_weather.hum_72;
pop = g_weather.pop_72;
title = "72h";
}
OLED_Clear();
OLED_Printf(0, 0, OLED_8X16, "Tianjin %s", title);
OLED_Printf(0, 16, OLED_8X16, "T:%dC H:%d%%", temp, hum);
OLED_Printf(0, 32, OLED_8X16, "P:%d%%", pop);
OLED_Printf(0, 48, OLED_8X16, "24-72 hours");
OLED_Update();
}
工程
Codex 聊天记录
rollout-2026-01-15T10-55-21-019bbf94-39e1-7ac0-aba1-d1215b25189b.jsonl

浙公网安备 33010602011771号