jt1078 0.1.0

jt1078协议库实现
Documentation
use jt808::models::{Jt808, Jt808BodySerialize, Jt808BodyTrans, Ver808};
use jt_util::{bytes::{IBuffRead, IBuffWrite}, bytes_gbk::BytesGBK};
use chrono::{DateTime, Local, TimeZone};



#[derive(Debug, Default)]
pub struct Jt0x9201 {
    /// 服务器地址
    pub ipaddress: BytesGBK,
    /// 服务器视频通道监听端口号(TCP)
    pub tcp_port: u16,
    /// 服务器视频通道监听端口号(UDP)
    pub udp_port: u16,
    /// 逻辑通道号
    pub channel: u8,
    /// 音视频类型(0:音视频,1:音频,2:视频,3:视频或音视频)
    pub media_type: u8,
    /// 码流类型(0:主码流或子码流,1:主码流,2:子码流;如果此通道只传输音频,此字段置0)
    pub stream_type: u8,
    /// 存储器类型(0:主存储器或灾备存储器,1:主存储器,2:灾备存储器)
    pub storage_type: u8,
    /// 回放方式(0:正常回放,1:快进回放,2:关键帧快退回放,3:关键帧播放,4:单帧上传)
    pub playback_mode: u8,
    /// 快进或快退倍数(0:无效,1:1倍,2:2倍,3:4倍,4:8倍,5:16倍)
    pub multiple: u8,
    /// 开始时间(回放方式为4时,该字段表示单帧上传时间)
    pub starttime: i64,
    /// 结束时间(UTC时间戳格式 单位秒,为0表示一直码回放,回放方式为4时,该字段无效)
    pub endtime: i64,
}

lazy_static::lazy_static! {
    static ref ZERO_TIME:DateTime<Local> = Local.ymd(2022, 1, 1).and_hms(1, 1, 1);
}

impl Jt808BodySerialize for Jt0x9201 {
    fn write(&mut self, _ver: &Ver808, buf: &mut dyn IBuffWrite) {
        buf.put_u8(self.ipaddress.bytes_len() as u8);
        buf.put(self.ipaddress.get_bytes());
        buf.put_u16(self.tcp_port);
        buf.put_u16(self.udp_port);
        buf.put_u8(self.channel);
        buf.put_u8(self.media_type);
        buf.put_u8(self.stream_type);
        buf.put_u8(self.storage_type);
        buf.put_u8(self.playback_mode);
        buf.put_u8(self.multiple);
        buf.put_dt_bcd6(Local.timestamp(self.starttime, 0));
        //TODO: endtime = 0
        if self.endtime == 0 {
            buf.put_slice(&[0; 6]);
        } else {
            buf.put_dt_bcd6(Local.timestamp(self.endtime, 0));
        }
        
    }

    fn len(&self, _ver: &Ver808) -> usize {
        self.ipaddress.bytes_len() + 23
    }
}


impl Jt808BodyTrans for Jt0x9201 {
    fn fill_new<T>(buf: &mut T, _jt808: &Jt808) -> Self
    where
        T: IBuffRead,
    {
        let len = buf.get_u8();

        Self {
            ipaddress: BytesGBK::new_with_bytes(buf.split_to(len as usize)),
            tcp_port: buf.get_u16(),
            udp_port: buf.get_u16(),
            channel: buf.get_u8(),
            media_type: buf.get_u8(),
            stream_type: buf.get_u8(),
            storage_type: buf.get_u8(),
            playback_mode: buf.get_u8(),
            multiple: buf.get_u8(),
            starttime: buf.get_dt_bcd6_timestamp(),
            endtime:buf.get_dt_bcd6_timestamp()
        }
    }
}