use reqwest::Client;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Lock {
#[serde(rename = "clienTid")]
pub client_id: String,
#[serde(rename = "accessToken")]
pub access_token: String,
#[serde(rename = "lockId")]
pub lock_id: String,
pub date: i64,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct LockRes {
pub errcode: Option<i64>,
pub errmsg: Option<String>,
pub description: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct LockResPower {
pub state: Option<i64>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct LockResTime {
pub date: i64,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct LockResState {
#[serde(rename = "electricQuantity")]
pub electric_quantity: i64,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct LockGateWay {
#[serde(rename = "gatewayId")]
gateway_id: u64,
#[serde(rename = "gatewayMac")]
gateway_mac: String,
#[serde(rename = "gatewayName")]
gateway_name: String,
rssi: i32,
#[serde(rename = "rssiUpdateDate")]
rssi_update_date: i64,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GateWayLock {
#[serde(rename = "lockId")]
lock_id: i64,
#[serde(rename = "lockMac")]
lock_mac: String,
#[serde(rename = "lockName")]
lock_name: String,
#[serde(rename = "lockAlias")]
lock_alias: String,
rssi: i32,
#[serde(rename = "updateDate")]
update_date: i64,
}
impl Lock {
pub async fn open(&self) -> LockRes {
let response = Client::new()
.post("https://cnapi.sciener.com/v3/lock/unlock")
.header("Content-Type", "application/x-www-form-urlencoded")
.form(&self)
.send()
.await;
let res = response.expect("远程开锁失败");
if res.status().is_success() {
res.json::<LockRes>().await.expect("解析远程开锁数据失败")
} else {
let status = res.status();
let error_text = res.text().await;
println!("发起远程开锁失败:{:#?}", self);
panic!("发起远程开锁失败{},错误内容:{:#?}", status, error_text);
}
}
pub async fn close(&self) -> LockRes {
let response = Client::new()
.post("https://cnapi.sciener.com/v3/lock/lock")
.header("Content-Type", "application/x-www-form-urlencoded")
.form(&self)
.send()
.await;
let res = response.expect("远程关锁失败");
if res.status().is_success() {
res.json::<LockRes>().await.expect("解析远程关锁数据失败")
} else {
let status = res.status();
let error_text = res.text().await;
println!("发起远程关锁失败:{:#?}", self);
panic!("发起远程关锁失败{},错误内容:{:#?}", status, error_text);
}
}
pub async fn state(&self) -> LockResState {
let response = Client::new()
.post("https://cnapi.sciener.com/v3/lock/queryOpenState")
.header("Content-Type", "application/x-www-form-urlencoded")
.form(&self)
.send()
.await;
let res = response.expect("查询锁的开关状态失败");
if res.status().is_success() {
res.json::<LockResState>()
.await
.expect("解析锁的开关状态数据失败")
} else {
let status = res.status();
let error_text = res.text().await;
println!("发起查询锁的开关状态失败:{:#?}", self);
panic!("发起查询锁的开关状态{},错误内容:{:#?}", status, error_text);
}
}
pub async fn get_lock_time(&self) -> LockResTime {
let response = Client::new()
.post("https://cnapi.sciener.com/v3/lock/queryDate")
.header("Content-Type", "application/x-www-form-urlencoded")
.form(&self)
.send()
.await;
let res = response.expect("查询锁的时间失败");
if res.status().is_success() {
res.json::<LockResTime>().await.expect("解析锁的时间失败")
} else {
let status = res.status();
let error_text = res.text().await;
println!("发起查询锁的时间失败:{:#?}", self);
panic!("发起查询锁的时间失败{},错误内容:{:#?}", status, error_text);
}
}
pub async fn set_lock_time(&self) -> LockResTime {
let response = Client::new()
.post("https://cnapi.sciener.com/v3/lock/updateDate")
.header("Content-Type", "application/x-www-form-urlencoded")
.form(&self)
.send()
.await;
let res = response.expect("设置锁的时间失败");
if res.status().is_success() {
res.json::<LockResTime>()
.await
.expect("解析设置锁的时间数据失败")
} else {
let status = res.status();
let error_text = res.text().await;
println!("发起设置锁的时间失败:{:#?}", self);
panic!("发起设置锁的时间失败{},错误内容:{:#?}", status, error_text);
}
}
pub async fn power(&self) -> LockResState {
let response = Client::new()
.post("https://cnapi.sciener.com/v3/lock/queryOpenState")
.header("Content-Type", "application/x-www-form-urlencoded")
.form(&self)
.send()
.await;
let res = response.expect("查询锁的开关状态失败");
if res.status().is_success() {
res.json::<LockResState>()
.await
.expect("解析锁的开关状态数据失败")
} else {
let status = res.status();
let error_text = res.text().await;
println!("发起查询锁的开关状态失败:{:#?}", self);
panic!(
"发起查询锁的开关状态失败{},错误内容:{:#?}",
status, error_text
);
}
}
pub async fn lock_gateway_list(&self) -> Vec<LockGateWay> {
let url = format!(
"https://cnapi.sciener.com/v3/gateway/listByLock?clienTid={0}&accessToken={1}&lockId={2}&date={3}",
self.client_id, self.access_token, self.lock_id, self.date
);
let response = Client::new()
.get(url)
.header("Content-Type", "application/x-www-form-urlencoded")
.send()
.await;
let res = response.expect("获取锁连接的网关列表失败");
if res.status().is_success() {
res.json::<Vec<LockGateWay>>()
.await
.expect("解析获取锁连接的网关列表数据失败")
} else {
let status = res.status();
let error_text = res.text().await;
println!("发起获取锁连接的网关列表失败:{:#?}", self);
panic!(
"发起获取锁连接的网关列表失败{},错误内容:{:#?}",
status, error_text
);
}
}
pub async fn gateway_lock_list(&self) -> Vec<GateWayLock> {
let url = format!(
"https://cnapi.sciener.com/v3/gateway/listLock?clienTid={0}&accessToken={1}&lockId={2}&date={3}",
self.client_id, self.access_token, self.lock_id, self.date
);
let response = Client::new()
.get(url)
.header("Content-Type", "application/x-www-form-urlencoded")
.send()
.await;
let res = response.expect("获取锁连接的网关列表失败");
if res.status().is_success() {
res.json::<Vec<GateWayLock>>()
.await
.expect("解析获取锁连接的网关列表数据失败")
} else {
let status = res.status();
let error_text = res.text().await;
println!("发起获取锁连接的网关列表失败:{:#?}", self);
panic!(
"发起获取锁连接的网关列表失败{},错误内容:{:#?}",
status, error_text
);
}
}
}