fache 0.1.351

发车工具箱
Documentation
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);
        }
    }
    // 获取锁的开关状态
    // 返回值: 锁的开关状态:0-关,1-开,2-未知
    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
            );
        }
    }
}