如何通过Curl/PHP获取气象站的HTTP POST数据流?
解决气象站POST数据获取问题的方法
1. 修正PHP CURL配置以获取响应体
默认情况下CURL会直接输出响应内容并返回状态值,要拿到响应体必须开启CURLOPT_RETURNTRANSFER选项。同时避免误设置只获取响应头的参数,修正后的示例代码:
$url = 'http://WeatherStation'; $ch = curl_init($url); // 核心设置:让CURL返回响应体而非直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 若需要模拟气象站的POST请求(用于测试接收服务),可添加以下代码 // $postParams = ['PASSKEY' => 'your_passkey', 'tempinf' => 24.3]; // curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postParams)); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 输出结果 if ($httpCode === 200) { echo $response; } else { echo "请求失败,状态码:{$httpCode}"; }
2. 切换到“接收推送”的服务逻辑
气象站是主动向raspberrypi推送POST数据,因此你需要在raspberrypi上搭建一个接收POST的PHP服务,而非用Curl请求气象站地址。接收脚本示例(如weather_receiver.php):
// 读取气象站推送的原始POST数据 $rawPostData = file_get_contents('php://input'); // 若数据是表单格式,直接用$_POST解析;若是JSON则用json_decode $parsedData = $_POST; // $parsedData = json_decode($rawPostData, true); // 保存数据到日志或数据库 file_put_contents('weather_records.log', date('Y-m-d H:i:s') . ' ' . $rawPostData . PHP_EOL, FILE_APPEND); // 输出解析后的数据用于调试 print_r($parsedData);
之后配置raspberrypi的Web服务(Nginx/Apache),让气象站能访问该脚本的URL(如http://raspberrypi/weather_receiver.php),即可捕获推送的温湿度、雨量等数据。
3. 拆分响应头与响应体(若需同时获取)
如果必须同时拿到响应头和响应体,可开启CURLOPT_HEADER选项后手动拆分:
curl_setopt($ch, CURLOPT_HEADER, true); $fullResponse = curl_exec($ch); $headerLength = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $responseHeader = substr($fullResponse, 0, $headerLength); $responseBody = substr($fullResponse, $headerLength); echo "响应头:\n{$responseHeader}\n"; echo "响应体:\n{$responseBody}\n";
4. 验证气象站的推送目标地址
确认气象站的POST目标是raspberrypi上你的接收服务地址,而非你用Curl请求的http://WeatherStation——若该地址是气象站自身地址,它大概率不支持拉取数据,仅会主动向外推送。
内容的提问来源于stack exchange,提问作者JanB
相关产品推荐
相关产品推荐

