<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kostas Ereksonas</title>
    <description>The latest articles on DEV Community by Kostas Ereksonas (@kostasereksonas).</description>
    <link>https://dev.to/kostasereksonas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3808187%2F76f2c179-be65-4358-8008-a713fb92b9be.jpeg</url>
      <title>DEV Community: Kostas Ereksonas</title>
      <link>https://dev.to/kostasereksonas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kostasereksonas"/>
    <language>en</language>
    <item>
      <title>DVRIP/Sofia Protocol Dissector for Wireshark (Written in Lua)</title>
      <dc:creator>Kostas Ereksonas</dc:creator>
      <pubDate>Sat, 09 May 2026 10:12:02 +0000</pubDate>
      <link>https://dev.to/kostasereksonas/dvripsofia-protocol-dissector-for-wireshark-written-in-lua-2mhb</link>
      <guid>https://dev.to/kostasereksonas/dvripsofia-protocol-dissector-for-wireshark-written-in-lua-2mhb</guid>
      <description>&lt;p&gt;A Wireshark dissector for DVRIP/Sofia protocol found on Xiongmai based IP cameras.&lt;/p&gt;

&lt;p&gt;Full working dissector code is available at a &lt;a href="https://github.com/KostasEreksonas/DVRIP_analysis" rel="noopener noreferrer"&gt;DVRIP analysis repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Full writeup of a sample IP camera on which this dissector was tested is available at &lt;a href="https://github.com/KostasEreksonas/Besder-6024PB-XMA501-ip-camera-security-investigation" rel="noopener noreferrer"&gt;Besder 6024PB-XMA501 IP camera security investigation&lt;/a&gt; repository.&lt;/p&gt;

&lt;h1&gt;
  
  
  Table of Contents
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
Usage

&lt;ul&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;li&gt;Windows&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Test Device&lt;/li&gt;

&lt;li&gt;

DVRIP/Sofia Headers

&lt;ul&gt;
&lt;li&gt;DVRIP/Sofia Message Header&lt;/li&gt;
&lt;li&gt;Audio Header&lt;/li&gt;
&lt;li&gt;I-Frame Header&lt;/li&gt;
&lt;li&gt;P-Frame Header&lt;/li&gt;
&lt;li&gt;Information Frame Header&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Saving Streams&lt;/li&gt;

&lt;li&gt;Cloud Communications&lt;/li&gt;

&lt;li&gt;DVRIP/Sofia Protocol Field List&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Linux
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp dvripWireshark.lua /usr/lib/wireshark/plugins/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Windows
&lt;/h2&gt;

&lt;p&gt;Copy dvripWireshark.lua to &lt;code&gt;%APPDATA%\Wireshark\plugins&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Test Device
&lt;/h1&gt;

&lt;p&gt;This dissector is based on a DVRIP Wireshark Dissector for Port TCP/37777 (Dahua IP camera), which can be found here: &lt;a href="https://github.com/r4bit999/dvrip-analysis/tree/master" rel="noopener noreferrer"&gt;https://github.com/r4bit999/dvrip-analysis/tree/master&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DVRIP/Sofia protocol found in Xiongmai-based IP cameras run on the following ports:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;TCP/34567 for local controls and media stream.&lt;/li&gt;
&lt;li&gt;TCP/6611 for cloud controls and media stream.&lt;/li&gt;
&lt;li&gt;UDP/34569 and UDP/34571 for local configs.&lt;/li&gt;
&lt;li&gt;UDP/7999 and UDP/8765 for cloud configs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tested on Besder 6024PB-XMA501 IP camera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model: XM530_50X50-WG_8M
Firmware version: V5.00.R02.00030747.10010.349f17
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  DVRIP/Sofia Headers
&lt;/h1&gt;

&lt;p&gt;Aside from the main DVRIP/Sofia message header, protocol's media payloads have their own headers. All media payload header fields (except first 4 bits - signature that indicates the type of a media payload) are reordered to their little-endian (LE) values.&lt;/p&gt;

&lt;p&gt;Media payload headers were reconstructed based on &lt;a href="https://www.scribd.com/document/669666260/%E7%A0%81%E6%B5%81%E5%B8%A7%E6%A0%BC%E5%BC%8F%E6%96%87%E6%A1%A3" rel="noopener noreferrer"&gt;Xiongmai bitstream frame format document&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  DVRIP/Sofia Message Header
&lt;/h2&gt;

&lt;p&gt;Header description of a single DVRIP/Sofia message is based on &lt;a href="https://github.com/OpenIPC/python-dvr/blob/master/doc/%E9%9B%84%E8%BF%88%E6%95%B0%E5%AD%97%E8%A7%86%E9%A2%91%E5%BD%95%E5%83%8F%E6%9C%BA%E6%8E%A5%E5%8F%A3%E5%8D%8F%E8%AE%AE_V1.0.0.pdf" rel="noopener noreferrer"&gt;Digital Video Recorder Interface Protocol document&lt;/a&gt;, the actual diagram being on page 7.&lt;/p&gt;

&lt;p&gt;Diagram of DVRIP/Sofia header:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3xdtqnph3qw9sxlcvzn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3xdtqnph3qw9sxlcvzn.png" alt=" " width="800" height="61"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same DVRIP/Sofia header in Wireshark:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3rm0epsvwph878twa8su.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3rm0epsvwph878twa8su.png" alt=" " width="265" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BIT 0: message header bit, fixed as 0xFF.&lt;/li&gt;
&lt;li&gt;BIT 1: observed to be equal to 0 for requests and equal to 1 for responses from the IP camera.&lt;/li&gt;
&lt;li&gt;BIT 2: reserved bit 1:

&lt;ul&gt;
&lt;li&gt;Equals &lt;code&gt;0&lt;/code&gt; when H.264 video codec is used (BIT4 = &lt;code&gt;0x02&lt;/code&gt; on I-Frame header).&lt;/li&gt;
&lt;li&gt;Equals &lt;code&gt;1&lt;/code&gt; when H.265 video codec is used (BIT4 = &lt;code&gt;0x12&lt;/code&gt; on I-Frame header).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;BIT 3: reserved bit 2:

&lt;ul&gt;
&lt;li&gt;Equals &lt;code&gt;128&lt;/code&gt; when DVRIP message contains audio frames.&lt;/li&gt;
&lt;li&gt;Equals &lt;code&gt;0&lt;/code&gt; otherwise.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;BIT 4-7: session ID. Assigned by the camera after successful login. Needs to be present in every subsequent message.&lt;/li&gt;
&lt;li&gt;BIT 8-11: sequence number. Increments from 0 after startup, and after reaching the (unknown) maximum, starts from 0 again.&lt;/li&gt;
&lt;li&gt;BIT 12: total number of messages in a single packet. Value of 0 or 1 indicate a single message per packet. &lt;/li&gt;
&lt;li&gt;BIT 13: number of a current message in a packet. Meaningful only when the value of total packets (BIT 12) is greater than 1.&lt;/li&gt;
&lt;li&gt;BIT 14-15: command code (also called message id). The code defines what action to perform.&lt;/li&gt;
&lt;li&gt;BIT 16-19: data (payload) length. Length of a JSON payload, which starts immediately after DVRIP/Sofia header.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Audio Header
&lt;/h2&gt;

&lt;p&gt;Diagram of audio header:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3zgdzgl3n56ouptregv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3zgdzgl3n56ouptregv.png" alt=" " width="351" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Audio header in Wireshark:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvo873s2z4qzzwdbj1mva.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvo873s2z4qzzwdbj1mva.png" alt=" " width="306" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BIT 0-3: signature&lt;/li&gt;
&lt;li&gt;BIT 4: audio codec (0x0e = G711A)&lt;/li&gt;
&lt;li&gt;BIT 5: sampling rate (0x02 = 8kHz sampling)&lt;/li&gt;
&lt;li&gt;BIT 6-7: length of audio payload&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  I-Frame Header
&lt;/h2&gt;

&lt;p&gt;I-Frame header diagram:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi20hh4xqdja236la5ki.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi20hh4xqdja236la5ki.png" alt=" " width="701" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I-Frame header in Wireshark:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60j5rmtthjca0j2i4k6r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60j5rmtthjca0j2i4k6r.png" alt=" " width="296" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BIT 0-3: signature&lt;/li&gt;
&lt;li&gt;BIT 4: video codec (0x01 = MPEG4, 0x02 = H.264, 0x12 = H.265)&lt;/li&gt;
&lt;li&gt;BIT 5: encoded framerate (variable; 1-25 for PAL, 1-30 for NTSC)&lt;/li&gt;
&lt;li&gt;BIT 6: low 8 bits of image width; the value is actual width divided by 8&lt;/li&gt;
&lt;li&gt;BIT 7: low 8 bits of image height; the value is actual height divided by 8&lt;/li&gt;
&lt;li&gt;BIT 8-11: datetime of the capture&lt;/li&gt;
&lt;li&gt;BIT 12-15: length of I-Frame payload&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First 4 bits of an I-Frame payload (BITS 16-19) are equal to &lt;code&gt;0x00000001&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Same exact header fields are shared between I-Frames (FC) and snapshots (FE).&lt;/p&gt;

&lt;h2&gt;
  
  
  P-Frame Header
&lt;/h2&gt;

&lt;p&gt;P-Frame header diagram:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fresuloan6pnqtz6jeqkw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fresuloan6pnqtz6jeqkw.png" alt=" " width="331" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P-Frame header in Wireshark:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft37mnofvyh19qa66elu6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft37mnofvyh19qa66elu6.png" alt=" " width="283" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Extension of I-Frames.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BIT 0-3: signature&lt;/li&gt;
&lt;li&gt;BIT 4-7: length of P-Frame payload&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First 4 bits of a P-Frame payload (BITS 8-11) are equal to &lt;code&gt;0x00000001&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Information Frame Header
&lt;/h2&gt;

&lt;p&gt;Information frame header diagram:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wwwh5giyrp2x0tpr4dn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wwwh5giyrp2x0tpr4dn.png" alt=" " width="351" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Information frame header in Wireshark:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8yyi4vc596z4ot2bjx8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8yyi4vc596z4ot2bjx8.png" alt=" " width="252" height="101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BIT 0-3: signature&lt;/li&gt;
&lt;li&gt;BIT 4: general information (unconfirmed)&lt;/li&gt;
&lt;li&gt;BIT 5: unused value&lt;/li&gt;
&lt;li&gt;BIT 6-7: payload length&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Used for information transmission. First bit after signature (bit 4):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;0x01 - general information.&lt;/li&gt;
&lt;li&gt;0x06 - unknown value.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Saving Streams
&lt;/h1&gt;

&lt;p&gt;This dissector is programmed to reconstruct audio and video streams from the packet capture (.pcap) file. In Wireshark GUI, navigate to the &lt;code&gt;Tools&lt;/code&gt; menu and select &lt;code&gt;DVRIP Save Streams&lt;/code&gt; entry. In the pop-up dialog box, enter the desired folder to save streams in.&lt;/p&gt;

&lt;p&gt;File names of saved streams are structured as follows:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;camera-ip-address&amp;gt;_&amp;lt;reserved-bit-1&amp;gt;_&amp;lt;reserved-bit-2&amp;gt;_&amp;lt;audio|video&amp;gt;.&amp;lt;g711|h265&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Cloud Communications
&lt;/h1&gt;

&lt;p&gt;Same logic is used both for local and cloud communications with the IP camera. Only observed difference is that for local communications, port &lt;code&gt;TCP/34567&lt;/code&gt; is used and for cloud communications, it is port &lt;code&gt;TCP/6611&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  DVRIP/Sofia Protocol Field List
&lt;/h1&gt;

&lt;p&gt;DVRIP/Sofia protocol fields used in this protocol dissector:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field Name&lt;/th&gt;
&lt;th&gt;Filter Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_header&lt;/td&gt;
&lt;td&gt;dvrip.header&lt;/td&gt;
&lt;td&gt;Full DVRIP/Sofia header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_header_id&lt;/td&gt;
&lt;td&gt;dvrip.header_id&lt;/td&gt;
&lt;td&gt;First byte of DVRIP header, observed to be &lt;code&gt;0xFF&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_req_resp&lt;/td&gt;
&lt;td&gt;dvrip.req_resp&lt;/td&gt;
&lt;td&gt;Request/response byte. &lt;code&gt;0x00&lt;/code&gt; for request and &lt;code&gt;0x01&lt;/code&gt; for response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_reserved_1&lt;/td&gt;
&lt;td&gt;dvrip.reserved_1&lt;/td&gt;
&lt;td&gt;Reserved bit 1. Indicates video stream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_reserved_2&lt;/td&gt;
&lt;td&gt;dvrip.reserved_2&lt;/td&gt;
&lt;td&gt;Reserved bit 2. Indicates audio stream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_session_id&lt;/td&gt;
&lt;td&gt;dvrip.session_id&lt;/td&gt;
&lt;td&gt;ID of an established session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_sequence_id&lt;/td&gt;
&lt;td&gt;dvrip.sequence_id&lt;/td&gt;
&lt;td&gt;Sequence ID. Message number in the current session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_total_packets&lt;/td&gt;
&lt;td&gt;dvrip.total_packets&lt;/td&gt;
&lt;td&gt;Number of messages in a single packet. 0 or 1 indicate a single message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_current_packet&lt;/td&gt;
&lt;td&gt;dvrip.current_packet&lt;/td&gt;
&lt;td&gt;current message in a packet. Meaningful only when total packets &amp;gt; 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_command_code&lt;/td&gt;
&lt;td&gt;dvrip.command_code&lt;/td&gt;
&lt;td&gt;Command code/Message ID. Identifies an action to perform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_payload_size&lt;/td&gt;
&lt;td&gt;dvrip.payload_size&lt;/td&gt;
&lt;td&gt;Payload size of a current message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_payload_JSON_RAW&lt;/td&gt;
&lt;td&gt;dvrip.data&lt;/td&gt;
&lt;td&gt;JSON data payload. Starts immediately after header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_newline&lt;/td&gt;
&lt;td&gt;dvrip.newline&lt;/td&gt;
&lt;td&gt;Trailin newline after JSON payload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_cloud_ip&lt;/td&gt;
&lt;td&gt;dvrip.cloud_ip&lt;/td&gt;
&lt;td&gt;IP address of cloud relay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_home_ip&lt;/td&gt;
&lt;td&gt;dvrip.home_ip&lt;/td&gt;
&lt;td&gt;Public IP address of a home network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_device_id&lt;/td&gt;
&lt;td&gt;dvrip.device_id&lt;/td&gt;
&lt;td&gt;Serial number of IP camera&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_device_mac&lt;/td&gt;
&lt;td&gt;dvrip.device_mac_address&lt;/td&gt;
&lt;td&gt;MAC address of IP camera&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_encrypted&lt;/td&gt;
&lt;td&gt;dvrip.encrypted&lt;/td&gt;
&lt;td&gt;Encrypted payload of a message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_signature&lt;/td&gt;
&lt;td&gt;dvrip.signature&lt;/td&gt;
&lt;td&gt;Signature of media frame&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_stream_type&lt;/td&gt;
&lt;td&gt;dvrip.stream_type&lt;/td&gt;
&lt;td&gt;Video stream type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_framerate&lt;/td&gt;
&lt;td&gt;dvrip.framerate&lt;/td&gt;
&lt;td&gt;Stream framerate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_width&lt;/td&gt;
&lt;td&gt;dvrip.width&lt;/td&gt;
&lt;td&gt;Width of video frame (divided by 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_height&lt;/td&gt;
&lt;td&gt;dvrip.height&lt;/td&gt;
&lt;td&gt;Height of video frame (divided by 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_datetime&lt;/td&gt;
&lt;td&gt;dvrip.datetime&lt;/td&gt;
&lt;td&gt;Start date of the stream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_media_payload_size&lt;/td&gt;
&lt;td&gt;dvrip.media_payload_size&lt;/td&gt;
&lt;td&gt;Payload size of media frame&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_sampling_rate&lt;/td&gt;
&lt;td&gt;dvrip.sampling_rate&lt;/td&gt;
&lt;td&gt;Audio sampling rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVRIP_unused_field&lt;/td&gt;
&lt;td&gt;dvrip.unused_field&lt;/td&gt;
&lt;td&gt;Unused field in information frame header&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>lua</category>
      <category>networking</category>
      <category>iot</category>
      <category>cybersecurity</category>
    </item>
  </channel>
</rss>
