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()

get_weather.zip

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();
}

工程

f103_Project_20260114.zip

Codex 聊天记录

rollout-2026-01-15T10-55-21-019bbf94-39e1-7ac0-aba1-d1215b25189b.jsonl

posted @ 2026-01-15 20:51  16岁的小菜  阅读(1)  评论(0)    收藏  举报