[0x00,'v',2], // Orig Node 'dnode' => [0x02,'v',2], // Dest Node 'y' => [0x04,'v',2], // Year 'm' => [0x06,'v',2], // Month 'd' => [0x08,'v',2], // Day 'H' => [0x0a,'v',2], // Hour 'M' => [0x0c,'v',2], // Minute 'S' => [0x0e,'v',2], // Second 'baud' => [0x10,'v',2], // Baud 'type' => [0x12,'v',2], // Packet Version (should be 2) 'onet' => [0x14,'v',2], // Orig Net 'dnet' => [0x16,'v',2], // Dest Net 'prodcode' => [0x18,'C',1], // Product Code 'serial' => [0x19,'C',1], // Serial Number 'password' => [0x1a,'a8',8], // Packet Password 'ozone' => [0x22,'v',2], // Orig Zone 'dzone' => [0x24,'v',2], // Dest Zone 'reserved' => [0x26,'a20',20], // Reserved ]; public const TYPE = '2'; /** * Create our message packet header */ protected function header(): string { try { return pack(collect(self::HEADER)->pluck(1)->join(''), $this->ff, // Orig Node $this->tf, // Dest Node Arr::get($this->header,'y'), // Year Arr::get($this->header,'m'), // Month Arr::get($this->header,'d'), // Day Arr::get($this->header,'H'), // Hour Arr::get($this->header,'M'), // Minute Arr::get($this->header,'S'), // Second 0, // Baud 2, // Packet Version (should be 2) $this->fn, // Orig Net $this->tn, // Dest Net (Setup::PRODUCT_ID & 0xff), // Product Code Lo Setup::PRODUCT_VERSION_MAJ, // Product Version Major $this->password, // Packet Password $this->fz, // Orig Zone $this->tz, // Dest Zone '', // Reserved ); } catch (\Exception $e) { return $e->getMessage(); } } /** * Determine if this is a fsc-0045 packet * * @param string $header * @return bool * @throws \Exception */ public static function is_type(string $header): bool { $head = unpack(self::unpackheader(self::HEADER),$header); return ( (Arr::get($head,'type') === 2) && (strlen(rtrim(Arr::get($head,'reserved'),"\x00")) === 0) ); } }