#google-drive #web-api #radio #http #http-client #api #web

bin+lib wspr_cdk

该包提供了一种抽象,允许您对 wspr 的实时观测数据进行分析

12个版本

0.0.12 2024年6月11日
0.0.11 2024年6月11日
0.0.5 2024年5月31日

#64 in 地理空间

BSD-1-Clause

120KB
548

WSPR CDK

wspr_cdk 为访问和分析 WSPR (弱信号传播报告者) 实时观测数据提供了抽象。此包允许您轻松执行查询并从 WSPR 数据库获取数据。

先决条件

在运行应用程序时,请确保已正确设置 service_account.json 文件。此文件包含访问 Google Drive API 所需的认证 凭据

  • 如果此文件缺失或配置不正确,则在尝试将文件上传到 Google Drive 时将遇到认证错误。

以下是确保正确设置的步骤指南

  1. 创建服务帐户:
  • 前往 Google Cloud 控制台。
  • 导航到 IAM & Admin > 服务帐户页面。
  • 点击“创建服务帐户”。
  • 填写必要详情并点击“创建”。
  1. 生成JSON密钥:
  • 创建服务帐户后,点击您创建的服务帐户。
  • 转到“密钥”选项卡。
  • 点击“添加密钥”,然后选择“创建新密钥”。
  • 选择 JSON 作为密钥类型并点击“创建”。这将下载包含您的凭据的 JSON 文件。
  1. 提供必要权限:
  • 确保服务帐户有权访问 Google Drive。您可以通过将适当的角色分配给服务帐户来授予必要权限。
  1. 配置环境:
  • 将下载的 service_account.json 文件放置在应用程序可访问的位置。确保文件名为 service_account.json
  • 如果在 Docker 容器中运行应用程序,请确保在运行时将 service_account.json 文件 挂载 到容器中。

在开发容器中运行项目

您可以在一个开发容器中运行wspr_cdk项目,确保设置过程只需在您的系统上安装Docker。这简化了设置并提供了一致的开发环境。

service_account.json文件挂载到Docker容器中

为了在使用Google Cloud服务帐户的情况下安全地运行容器化应用程序,您可以直接将您的service_account.json文件挂载到容器中。这确保了敏感凭证不会包含在Docker镜像中,但在运行时可供应用程序使用。

您可以通过使用-标志将service_account.json文件挂载到容器中,以及使用-标志设置GOOGLE_APPLICATION_CREDENTIALS环境变量来实现这一点。以下命令演示了如何运行具有必要配置的容器

sudo docker run -it -p 8000:8000 -e GOOGLE_APPLICATION_CREDENTIALS=/wspr_cdk/service_account.json -v ./service_account.json:/wspr_cdk/service_account.json wspr_cdk python ./hyper/hyper/server.py --interval 10 --num_rows 10
  • -8000:8000:将您本地机器上的端口8000映射到容器的端口8000。
  • -GOOGLE_APPLICATION_CREDENTIALS=/wspr_cdk/service_account.json:将环境变量设置为指向容器内部的服务帐户JSON文件。
  • -./service_account.json:/wspr_cdk/service_account.json:将本地service_account.json文件挂载到容器中的/wspr_cdk/service_account.json
  • wspr_cdk:Docker镜像的名称。
  • python ./hyper/hyper/server.py --interval 10 --num_rows 10:运行Python服务器并指定间隔的命令。

使用此方法,您确保在运行时将服务帐户凭证安全地提供给容器,而无需将其包含在Docker镜像中。

这些步骤应确保正确设置了service_account.json文件,从而使server模块能够成功认证Google Cloud并避免遇到所提到的认证错误

功能

  • 以各种格式(JSONJSONCompactJSONEachRow)获取WSPR斑点数据
  • 易于与Tokio集成以进行异步操作
  • 用于管理会话状态并将操作调度到ClickHouse客户端的抽象
  • 服务器组件,通过HTTP访问和共享实时数据

即将推出的功能

  • 相互TLS,用于安全客户端-服务器通信
  • SSL (OpenSSL)支持加密数据传输

安装

要使用此crate,请将wspr_cdk添加到您的Cargo.toml

[dependencies]
wspr_cdk = "0.0.12"

环境变量

在使用crate之前,请确保您已设置以下环境变量

export BASE_URL=http://db1.wspr.live/

用法

  • 要运行Python服务器,请使用
docker run -it wspr_cdk python ./hyper/hyper/server.py --interval 5 --num_rows 5
  • 要运行 Rust 服务器,请使用
docker run -e ROCKET_ADDRESS=0.0.0.0 -e ROCKET_PORT=8000 -it wspr_cdk rust

以下是一些使用 wspr_cdk 集成的示例

#![allow(unused)]

use chrono::NaiveDateTime;
use wspr::{services::prelude::*, state::prelude::*};

#[tokio::main]
async fn main() {
    // Initialize the ClickHouse client state
    let mut state = ClickHouseClient::init();
    let session = session_manager::SessionManager::new();

    // Dispatch a GET request to fetch data in JSON format
    ClickHouseClient::dispatch(&mut state, ClickHouseAction::Get, "10", "JSON").await;

    // Print the state after fetching data
    println!("\n{:#?}\n", state);

    // Example of fetching data by ID
    ClickHouseClient::dispatch(&mut state, ClickHouseAction::GetById(1));
    println!("\n[OUTPUT]: {:?}", state);

    // Example of serializing response to JSON
    let json_response = serde_json::to_string_pretty(&response).unwrap();
    println!("{}", json_response);
}

示例查询

wget -q -O - "http://db1.wspr.live/?query=SELECT * FROM wspr.rx LIMIT 5 FORMAT JSON;"

示例输出

Fetching all records...

ClickHouseState {
    DATA: [
        WsprSpot {
            id: 7766261671,
            time: 2024-05-29T17:30:00,
            band: -1,
            rx_sign: "F6CWA",
            rx_lat: 48.021,
            rx_lon: -4.125,
            rx_loc: "IN78wa",
            tx_sign: "DL7NN",
            ...
        },
    ],
    STATUS: "Fetching all records.",
}

服务器组件

服务器组件允许您通过 HTTP 访问和共享实时 WSPR 数据。以下是服务器组件源代码片段

#[macro_use]
extern crate rocket;

use anyhow::Error;
use rocket::http::Status;
use rocket::response::{content, status};
use rocket::serde::json::Json;
use serde::{Deserialize, Serialize};
use std::result::Result::{Err, Ok};

// Required [modules].
use wspr_cdk::{services::prelude::*, state::prelude::*};

/// Get all <wspr> spots.
#[get("/api/spots")]
async fn get_wspr_spots() -> Result<Json<Vec<WsprSpot>>, status::Custom<String>> {
    let mut state = ClickHouseClient::init();
    let _session = session_manager::SessionManager::new();

    match ClickHouseClient::dispatch(&mut state, ClickHouseAction::Get, "10", "JSON").await {
        Ok(Some(spots)) => Ok(Json(spots)),
        Ok(None) => Err(status::Custom(Status::NotFound, "No spots found".into())),
        Err(e) => Err(status::Custom(
            Status::InternalServerError,
            format!("Failed to fetch spots: {:?}", e),
        )),
    }
}

#[launch]
#[rocket::main]
async fn rocket() -> _ {
    rocket::build().mount("/", routes![get_wspr_spots])
}

示例 cURL 请求

要使用服务器组件获取 WSPR 位置,可以使用以下 cURL 命令

curl -X GET https://127.0.0.1:8000/api/spots

客户端使用示例

您也可以使用客户端 JavaScript 获取 WSPR 数据。以下是一个示例实现

<!doctype html>
<html>
  <head>
    <title>WSPR Spots</title>
  </head>
  <body>
    <div id="demo"></div>

    <script>
      const content = document.getElementById("demo");
      async function getData() {
        let response = await fetch("https://127.0.0.1:8000/api/spots");
        let raw = await response.json();

        for (let i of raw) {
          console.log(i);
          content.innerHTML += `
                    <h2>Spot id: ${i.id}</h2>
                    <p>Time: ${i.time}</p>
                    <p>Band: ${i.band}</p>
                `;
        }
      }
      getData();
    </script>
  </body>
</html>

WSPR 指南

免责声明:数据集包含由 wsprnet.org 报告、保存和发布的原始 位置 数据。因此,数据中可能存在 重复虚假 位置和其他 错误。当您看到奇怪的事情时,请记住这一点。您可以使用 wspr.live 上提供的服务进行您自己的研究和项目,只要结果对所有人均免费即可。您 不允许 使用此服务进行任何 商业盈利性 的使用案例。WSPR 完整基础设施由志愿者在业余时间维护,因此对这些服务的正确性、可用性或稳定性不提供保证。

许可证

本项目采用 BSD 许可证授权。有关详细信息,请参阅 LICENSE 文件。

贡献

欢迎贡献力量!如有需要,请提交问题或拉取请求。确保您的贡献符合规定的许可和指南。

致谢

特别感谢 WSPR 社区提供数据访问和维护基础设施。

Docker 镜像

wspr_cdk 也可用作 Docker 镜像

docker pull lexaraprime/wspr_cdk:master

您可以在 Docker Hub 上找到它:lexaraprime/wspr_cdk


此文档也作为 crates.io 上的 crate 提供

依赖项

~11–22MB
~339K SLoC