#protocols #devices #astronomical #networking #distributed #instrument #equipment

indi

Instrument Neutral Distributed Interface (INDI) 协议的接口客户端库

7 个版本 (稳定)

3.2.0 2023年12月4日
3.0.1 2023年6月9日
3.0.0 2023年5月2日
2.0.0 2023年3月15日
0.1.0 2022年12月14日

#1558网络编程

每月32 次下载

MIT/Apache

135KB
3.5K SLoC

indi

此crate提供了对用于控制天文设备的网络接口的Instrument Neutral Distributed Interface (INDI)网络协议的支持。有关INDI的更多信息,请参阅项目网站 https://www.indilib.org/index.html

有关文档,请参阅: https://docs.rs/indi/

贡献

欢迎贡献。

一般来说,我们遵循“分支和拉取”Git工作流程。

  1. 在GitHub上 分支repo
  2. 克隆 项目到您的机器上
  3. 提交 改变到您的分支
  4. 推送到 您的分支到您的分支
  5. 提交一个 拉取请求 以便我们可以审查您的更改

注意:在提交拉取请求之前,请务必合并“上游”的最新更改!


lib.rs:

一个用于与INDI协议交互的通用库。

Instrument Neutral Distributed Interface (INDI,简称) 协议是一种类似于XML的通讯协议,在天文社区中用于控制和监控天文设备。有关INDI的更多信息,请参阅项目的网站 此处

此crate的目的是提供一种方便的方式与设备使用INDI协议交互。有关协议的详细信息,请参阅 此处

快速入门

先决条件

要编译此crate,您必须首先安装libcfitsio库。对于基于debian的Linux发行版,可以通过运行以下命令来满足此要求:

$ sudo apt install libcfitsio-dev

完成上述步骤后,您应能够使用cargo安装此crate。

简单用法。

使用此crate最简单的方法是打开一个 TcpStream 并读取/写入INDI 命令

示例

use std::net::TcpStream;
use indi::client::ClientConnection;

fn main() {
    // Connect to local INDI server.
    let connection = TcpStream::connect("127.0.0.1:7624").expect("Connecting to INDI server");

    // Write command to server instructing it to track all properties.
    connection.write(&indi::serialization::GetProperties {
        version: indi::INDI_PROTOCOL_VERSION.to_string(),
        device: None,
        name: None,
    })
    .expect("Sending GetProperties command");

    // Loop through commands recieved from the INDI server
    for command in connection.iter().expect("Creating iterator over commands") {
        println!("Received from server: {:?}", command);
    }
}

使用客户端接口

上述简单用法有其用途,但如果你想在INDI服务器上跟踪和修改设备状态,建议使用客户端接口。客户端允许你获取设备,当这些设备发生变化时通知你,并请求更改

示例

use std::time::Duration;
use std::net::TcpStream;

#[tokio::main]
async fn main() {
    // Create a client with a connection to localhost listening for all device properties.
    let client = indi::client::new(
        TcpStream::connect("127.0.0.1:7624").expect("Connecting to INDI server"),
        None,
        None).expect("Initializing connection");

    // Get an specific camera device
    let camera = client
        .get_device::<()>("ZWO CCD ASI294MM Pro")
        .await
        .expect("Getting camera device");

    // Setting the 'CONNECTION' parameter to `on` to ensure the indi device is connected.
    camera
        .change("CONNECTION", vec![("CONNECT", true)])
        .await
        .expect("Connecting to camera");

    // Enabling blob transport for the camera.  
    camera
        .enable_blob(Some("CCD1"), indi::BlobEnable::Also)
        .await
        .expect("Enabling image retrieval");

    // Configuring a varienty of the camera's properties at the same time.
    tokio::try_join!(
        camera.change("CCD_CAPTURE_FORMAT", vec![("ASI_IMG_RAW16", true)]),
        camera.change("CCD_TRANSFER_FORMAT", vec![("FORMAT_FITS", true)]),
        camera.change("CCD_CONTROLS", vec![("Offset", 10.0), ("Gain", 240.0)]),
        camera.change("FITS_HEADER", vec![("FITS_OBJECT", "")]),
        camera.change("CCD_BINNING", vec![("HOR_BIN", 2.0), ("VER_BIN", 2.0)]),
        camera.change("CCD_FRAME_TYPE", vec![("FRAME_FLAT", true)]),
        )
        .expect("Configuring camera");

    // Capture a 5 second exposure from the camera
    let fits = camera.capture_image(Duration::from_secs(5)).await.expect("Capturing image");

    // Save the fits file to disk.
    fits.save("flat.fits").expect("Saving image");
}

依赖项

~24–32MB
~461K SLoC