1个不稳定版本
0.1.0 | 2023年10月19日 |
---|
#3 in #software
36KB
397 行
MikrotikLite
MikrotikLite 是一个用于与 Mikrotik 路由器交互的 Rust 库。
特性
- 简单易用:该库提供了一个简单直观的接口,用于与 Mikrotik 路由器交互。
- 异步:该库是异步的,使其适用于长时间运行的操作。
- 不支持事件监听:该库不支持事件监听。这是因为它会使得库更复杂且难以使用。它还会在与并发操作工作时产生问题。未来可能会添加事件监听,但目前没有计划。
示例:以 JSON 格式检索数据
use mikrotik_lite::MikrotikLite;
let mut api = MikrotikLite::new(
"api_login".to_string(),
"api_pass".to_string(),
"10.80.80.1:8728".to_string(),
).unwrap();
// Get the current user identity.
let identity_json = api.send_command_json("/system/identity/print".to_string(), None).unwrap();
// Print the JSON string.
println!("{}", identity_json);
您可以预先定义一个结构,并将响应解析到该结构中
use serde::Deserialize;
use mikrotik_lite::MikrotikLite;
// `Identity` struct
#[derive(Debug, Deserialize)]
struct Identity {
pub name: String
}
let mut api = MikrotikLite::new(
"api_login".to_string(),
"api_pass".to_string(),
"10.80.80.1:8728".to_string(),
).unwrap();
let identity = api.send_command::<Identity>(
"/system/identity/print".to_string(),
None
).unwrap();
println!("{:#?}", identity);
此库不提供预定义的结构,但您可以通过通过 send_command_json
发送请求并基于您需要的字段创建结构来轻松创建自己的结构。序列化和反序列化使用 serde
库处理。在处理特定字段类型时有一些考虑,因为 MikroTik 在其响应中不提供类型标记。您应使用 deserialize_bool_from_anything
用于布尔值,以及 deserialize_string_from_number
用于数值。
处理布尔值 #[serde(deserialize_with = "deserialize_bool_from_anything")]
处理数值 #[serde(deserialize_with = "deserialize_string_from_number")]
此外,一些字段名称不遵循 Rust 命名约定,应使用 serde(rename = "dst-address")
属性进行重命名。
在 examples
目录中,您可以找到库的使用示例。
所有方法都有带有 _async
后缀的异步对应方法,允许您使用 Tokio 进行并发请求。以下是一个示例
use mikrotik_lite::MikrotikLite;
let mut api1 = MikrotikLite::new(
"api_login".to_string(),
"api_pass".to_string(),
"10.80.80.1:8728".to_string(),
).unwrap();
let mut api2 = MikrotikLite::new(
"api_login".to_string(),
"api_pass".to_string(),
"10.80.80.1:8728".to_string(),
).unwrap();
let route_future = api1.send_command_json_async(
"/ip/route/print".to_string(),
None
);
let identity_future = api2.send_command_json_async(
"/system/identity/print".to_string(),
None
);
async {
let (route, identity) = tokio::join!(route_future, identity_future);
println!("{}", route.unwrap());
println!("{}", identity.unwrap());
};
您可以通过这种方式将参数传递到您的命令中
use std::collections::HashMap;
use mikrotik_lite::MikrotikLite;
let mut api = MikrotikLite::new(
"api_login".to_string(),
"api_pass".to_string(),
"10.80.80.1:8728".to_string(),
).unwrap();
let mut attr = HashMap::new();
attr.insert("address".to_string(), "8.8.8.8".to_string());
attr.insert("count".to_string(), "5".to_string());
let ping = api.send_command_json(
"/ping".to_string(),
Some(attr.clone())
).unwrap();
println!("{}", ping);
依赖项
~2.4–4MB
~65K SLoC