{"id":1230,"date":"2025-07-07T19:04:52","date_gmt":"2025-07-07T19:04:52","guid":{"rendered":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=1230"},"modified":"2025-07-07T19:32:10","modified_gmt":"2025-07-07T19:32:10","slug":"windows-11-wsl2-linux-rtl-sdr-driver","status":"publish","type":"post","link":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=1230","title":{"rendered":"Windows 11 WSL2 Linux RTL-SDR Driver"},"content":{"rendered":"\n<figure class=\"wp-block-audio\"><audio controls src=\"http:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/07\/RF-QUANTUM-SCYTHE_-RTL-SDR-Driver-Suite.mp3\"><\/audio><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>PODCAST: The provided Python source code excerpts collectively detail the <strong>RF QUANTUM SCYTHE<\/strong> project&#8217;s signal intelligence capabilities, primarily focusing on <strong>Software-Defined Radio (SDR)<\/strong> functionalities. <a href=\"https:\/\/notebooklm.google.com\/notebook\/d804bc3b-c0cb-4ad9-9d34-48e13bc71df5?authuser=2&amp;original_referer=https:%2F%2Faccounts.google.com%23&amp;pli=1\">The <strong>rtl_sdr_driver.py<\/strong> module<\/a> provides a foundational interface for interacting with <a href=\"https:\/\/notebooklm.google.com\/notebook\/d804bc3b-c0cb-4ad9-9d34-48e13bc71df5?authuser=2&amp;original_referer=https:%2F%2Faccounts.google.com%23&amp;pli=1\"><strong>RTL-SDR<\/strong> devices<\/a>, managing their configuration, data acquisition, and core operations. Building upon this, <strong>rtl_sdr_receiver.py<\/strong> establishes a comprehensive receiver manager, enabling <strong>frequency scanning<\/strong>, <strong>signal detection<\/strong>, and forwarding processed signals to a <strong>SignalIntelligence core<\/strong>. Finally, <strong>rtl_sdr_wsl_driver.py<\/strong> extends these capabilities by integrating <strong>WSL2 compatibility<\/strong>, offering options for <strong>real device connection<\/strong>, <strong>TCP server communication<\/strong>, or <strong>synthetic signal simulation<\/strong> to ensure functionality across various environments.<\/p>\n\n\n\n<p>The RF QUANTUM SCYTHE system handles various RTL-SDR operating modes, encompassing different ways to acquire data, interact with hardware, and manage signal intelligence operations, particularly with considerations for Windows Subsystem for Linux (WSL2) environments.<\/p>\n\n\n\n<p>Here&#8217;s how the system manages these modes:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">I. Core Data Acquisition Modes<\/h3>\n\n\n\n<p>The primary <code>rtl_sdr_driver<\/code> module supports different methods for reading data from the RTL-SDR device:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Asynchronous Mode:<\/strong>\n<ul class=\"wp-block-list\">\n<li>This is the default mode, set by <code>async_mode: bool = True<\/code> in the <code>RTLSDRConfig<\/code>.<\/li>\n\n\n\n<li>When started, the system initiates a separate thread that continuously reads samples using <code>self.device.read_samples_async()<\/code>.<\/li>\n\n\n\n<li>An internal <code>_async_callback<\/code> function receives the samples (IQ data) along with a timestamp, queues them for later retrieval, and dispatches them to any registered user-defined callback functions.<\/li>\n\n\n\n<li>This mode is designed to avoid blocking the main program flow while continuously acquiring data.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Synchronous Mode (Direct Read):<\/strong>\n<ul class=\"wp-block-list\">\n<li>The <code>read_samples()<\/code> method allows for <strong>synchronous acquisition<\/strong> of a specified number of complex samples.<\/li>\n\n\n\n<li>This method will block until the requested samples are read, making it suitable for situations where a single block of data is needed immediately.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">II. Hardware Configuration Modes<\/h3>\n\n\n\n<p>The system allows configuration of specific hardware features of the RTL-SDR:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Direct Sampling Mode:<\/strong>\n<ul class=\"wp-block-list\">\n<li>This mode can be configured via <code>direct_sampling: int = 0<\/code> in <code>RTLSDRConfig<\/code>, where <code>0=disabled<\/code>, <code>1=I-ADC<\/code>, and <code>2=Q-ADC<\/code>.<\/li>\n\n\n\n<li>It determines how the RTL-SDR&#8217;s analog-to-digital converter (ADC) directly samples the RF signal, which can be useful for certain low-frequency applications.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Bias Tee Control:<\/strong>\n<ul class=\"wp-block-list\">\n<li>The <code>enable_bias_tee: bool = False<\/code> configuration option allows for enabling or disabling the bias tee, which provides DC power over the antenna cable to powered antennas.<\/li>\n\n\n\n<li>The system uses <code>self.device.ctrl_transfer()<\/code> for this, noting that it is device-specific and may not work on all RTL-SDR models.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">III. Environment-Specific \/ Connection Modes (WSL2-Compatible Driver)<\/h3>\n\n\n\n<p>The <code>rtl_sdr_wsl_driver<\/code> module provides specialized operating modes primarily for WSL2 environments, where direct USB access might be limited:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Real Device Mode:<\/strong>\n<ul class=\"wp-block-list\">\n<li>This is the standard mode where the system attempts to connect directly to a physical RTL-SDR device attached to the machine (if the <code>rtlsdr<\/code> library is available and USB passthrough is configured in WSL).<\/li>\n\n\n\n<li>It functions identically to the core <code>rtl_sdr_driver<\/code> when a real device is detected.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Simulation Mode:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Allows the system to <strong>simulate an RTL-SDR device<\/strong> for testing purposes, especially useful in WSL2 where hardware access might be difficult.<\/li>\n\n\n\n<li>If running in WSL and the <code>rtlsdr<\/code> library is not found, the system will <strong>automatically switch to simulation mode<\/strong>.<\/li>\n\n\n\n<li>In this mode, the driver generates <strong>synthetic IQ samples<\/strong> based on configurable parameters, including a noise floor and various simulated signals (e.g., FM Radio, NOAA Weather, Ham radio, GSM, ADS-B, WiFi, Bluetooth, GPS, LTE, LoRa) with different frequencies, powers, bandwidths, and modulation types.<\/li>\n\n\n\n<li>It uses <code>np.random.seed(42)<\/code> for repeatable simulation.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>TCP Mode:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Enables the system to <strong>connect to an <code>rtl_tcp<\/code> server<\/strong> running on the Windows host machine from within WSL. This is an alternative to USB passthrough.<\/li>\n\n\n\n<li>The driver establishes a <strong>TCP socket connection<\/strong> to the specified host and port.<\/li>\n\n\n\n<li>It sends configuration commands (like setting frequency, sample rate, and gain) over the TCP connection to control the remote <code>rtl_tcp<\/code> instance.<\/li>\n\n\n\n<li>Sample data is then read directly from the TCP socket.<\/li>\n\n\n\n<li>The <code>list_rtlsdr_devices()<\/code> utility specifically checks for and lists an <code>rtl_tcp<\/code> server if found on the Windows host.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">IV. High-Level Operational Modes (RTL-SDR Receiver)<\/h3>\n\n\n\n<p>The <code>rtl_sdr_receiver<\/code> module builds upon the driver to provide advanced operational capabilities for signal intelligence:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Frequency Scanning:<\/strong>\n<ul class=\"wp-block-list\">\n<li>The system can perform <strong>automated frequency scanning<\/strong> within a defined range (<code>start_freq<\/code> to <code>end_freq<\/code>) with a specified <code>step_size<\/code>.<\/li>\n\n\n\n<li>It dwells on each frequency for a <code>dwell_time<\/code> and can pause between full band scans (<code>pause_between_scans<\/code>).<\/li>\n\n\n\n<li>During scanning, it actively detects signals based on <code>min_snr_db<\/code> and <code>min_signal_duration<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Preset Tuning:<\/strong>\n<ul class=\"wp-block-list\">\n<li>The receiver allows tuning to a list of pre-defined <code>frequency_presets<\/code> (e.g., common amateur radio frequencies like 145.500 MHz and 435.000 MHz, or LPD433).<\/li>\n\n\n\n<li>When tuning to a preset, any active scanning is temporarily stopped and can be restarted afterward.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Band Tuning:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Optimized for the Diamond RH771 Antenna, the system provides dedicated functions to <strong>tune to the VHF band (144 MHz)<\/strong> and <strong>UHF band (430 MHz)<\/strong>.<\/li>\n\n\n\n<li>These functions also adjust the scanning range to match the respective band.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>The RF QUANTUM SCYTHE system estimates signal bandwidth primarily through a spectral analysis method within the <code>RTLSDRReceiver<\/code> class&#8217;s <code>_estimate_bandwidth<\/code> function. This process involves the following steps:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Calculate Power Spectrum (FFT)<\/strong>: The system first calculates the power spectrum of the provided IQ samples. It does this by performing a Fast Fourier Transform (FFT) on the IQ data. The <code>fft_size<\/code> for this operation is configurable via <code>SDRScanConfig<\/code>, and it will use the minimum of the configured <code>fft_size<\/code> or the length of the <code>iq_data<\/code>. The absolute squared values of the FFT result are then taken to represent the power spectrum.<\/li>\n\n\n\n<li><strong>Find the Peak<\/strong>: Once the power spectrum is obtained, the system identifies the index and value of the <strong>peak power<\/strong> in the spectrum.<\/li>\n\n\n\n<li><strong>Determine -3dB Points<\/strong>: It then calculates a power threshold, which is <strong>half the peak power<\/strong> (equivalent to -3dB relative to the peak). The system then searches outwards from the peak in both directions (left and right) to find the points where the spectrum falls below this -3dB threshold.<\/li>\n\n\n\n<li><strong>Calculate Bandwidth<\/strong>: The bandwidth is calculated based on the difference between these left and right -3dB points. This difference in indices is multiplied by the ratio of the <code>sample_rate<\/code> to the <code>fft_size<\/code>.<\/li>\n\n\n\n<li><strong>Sanity Checks and Default<\/strong>: To ensure a reasonable estimate, the system applies sanity checks to the calculated bandwidth:\n<ul class=\"wp-block-list\">\n<li>If the calculated bandwidth is <strong>less than 1 kHz<\/strong>, it defaults to 1 kHz.<\/li>\n\n\n\n<li>If the calculated bandwidth is <strong>greater than 80% of the <code>sample_rate<\/code><\/strong>, it is capped at 80% of the sample rate.<\/li>\n\n\n\n<li>If an error occurs during the estimation process, the system logs a warning and returns a <strong>default bandwidth of 25 kHz<\/strong>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>This estimation method provides a practical approach to determining the approximate bandwidth of detected signals for further processing and analysis.<\/p>\n\n\n\n<p>The RF QUANTUM SCYTHE system is optimized for use with the <strong>Diamond RH771 Antenna<\/strong>. This antenna is specifically optimized for the <strong>144 MHz and 430 MHz bands<\/strong>.<\/p>\n\n\n\n<p>The system includes functions to tune to these specific bands:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>tune_to_vhf_band()<\/code>: This function is designed to tune the RTL-SDR driver to the <strong>VHF band (144 MHz)<\/strong>. It also sets the scan range for the VHF band to 144 MHz to 148 MHz.<\/li>\n\n\n\n<li><code>tune_to_uhf_band()<\/code>: This function tunes the RTL-SDR driver to the <strong>UHF band (430 MHz)<\/strong>. When tuning to the UHF band, the scan range is set to 430 MHz to 440 MHz.<\/li>\n<\/ul>\n\n\n\n<p>The provided sources, which describe the RF QUANTUM SCYTHE system, do not explicitly define or discuss &#8220;Synthetic Aperture RADAR (SAR) Applications&#8221; or a &#8220;Sensor Fusion Latent Aggregator&#8221; [No direct source information]. Therefore, the sources do not detail how the VHF\/UHF bands, or the system&#8217;s capabilities within those bands, would specifically contribute to such applications.<\/p>\n\n\n\n<p>However, the sources do provide extensive information on how the RF QUANTUM SCYTHE system operates within the <strong>VHF\/UHF bands<\/strong> for general signal intelligence purposes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Antenna Optimization<\/strong>: The RF QUANTUM SCYTHE project is <strong>optimized for use with the Diamond RH771 Antenna<\/strong>. This antenna is specifically designed for the <strong>144 MHz (VHF) and 430 MHz (UHF) bands<\/strong>.<\/li>\n\n\n\n<li><strong>Predefined Frequencies and Tuning<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The system includes constants for <code>VHF_BAND_CENTER<\/code> at <strong>144 MHz<\/strong> and <code>UHF_BAND_CENTER<\/code> at <strong>430 MHz<\/strong>.<\/li>\n\n\n\n<li>It provides dedicated functions to <strong>tune to these bands<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>tune_to_vhf_band()<\/code> sets the center frequency to 144 MHz and configures the scanning range from <strong>144 MHz to 148 MHz<\/strong>.<\/li>\n\n\n\n<li><code>tune_to_uhf_band()<\/code> sets the center frequency to 430 MHz and configures the scanning range from <strong>430 MHz to 440 MHz<\/strong>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Signal Acquisition and Analysis<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The system can perform <strong>frequency scanning<\/strong> across defined ranges, including the VHF and UHF bands, dwelling on each frequency for a specified time.<\/li>\n\n\n\n<li>It acquires <strong>IQ samples<\/strong> from the tuned frequencies.<\/li>\n\n\n\n<li>It calculates the <strong>signal power in dBm<\/strong> and estimates the <strong>noise floor<\/strong> and <strong>Signal-to-Noise Ratio (SNR)<\/strong>.<\/li>\n\n\n\n<li>It estimates <strong>signal bandwidth<\/strong> by performing an FFT on the IQ data, identifying the peak power, and finding the -3dB (half-power) points in the spectrum. This estimated bandwidth is then adjusted with sanity checks (e.g., minimum 1 kHz, maximum 80% of sample rate).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Signal Information Forwarding<\/strong>:\n<ul class=\"wp-block-list\">\n<li>When a signal is detected, the system can forward it to a <code>SignalProcessor<\/code> as an <code>RFSignal<\/code> object.<\/li>\n\n\n\n<li>This <code>RFSignal<\/code> object encapsulates crucial information about the detected signal, including its <code>frequency<\/code>, <code>bandwidth<\/code>, <code>power<\/code>, <code>iq_data<\/code>, and metadata such as the <code>antenna<\/code> used (Diamond RH771) and the <code>sample_rate<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Simulation Capabilities<\/strong>: The system can <strong>simulate various signals<\/strong> within these bands, such as &#8220;VHF Amateur&#8221; (145.5 MHz) and &#8220;UHF Amateur&#8221; (435.0 MHz), complete with configurable power levels, bandwidths, and modulation types.<\/li>\n<\/ul>\n\n\n\n<p>While the sources thoroughly describe the RF QUANTUM SCYTHE system&#8217;s ability to operate, scan, and analyze signals within the VHF\/UHF spectrum, they <strong>do not provide information<\/strong> on how this data would be specifically utilized for Synthetic Aperture RADAR (SAR) or how it would integrate with a Sensor Fusion Latent Aggregator. Any connection to these concepts would be outside the scope of the provided sources.<\/p>\n\n\n\n<p>The RF QUANTUM SCYTHE system operates across several main modes, which can be categorized into core data acquisition, hardware configuration, environment-specific\/connection modes (particularly for WSL2), and high-level operational modes for signal intelligence.<\/p>\n\n\n\n<p>Here are the main modes of the RF QUANTUM SCYTHE system:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">I. Core Data Acquisition Modes<\/h3>\n\n\n\n<p>The <code>rtl_sdr_driver<\/code> module supports different methods for acquiring data from the RTL-SDR device itself:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Asynchronous Mode<\/strong>: This is the <strong>default mode<\/strong> for data acquisition. When activated, the system initiates a separate thread that continuously reads IQ samples using <code>self.device.read_samples_async()<\/code>. An internal callback function, <code>_async_callback<\/code>, receives the samples with a timestamp, queues them for retrieval, and dispatches them to any registered user-defined callback functions. This mode is designed to prevent blocking the main program flow while data is continuously acquired.<\/li>\n\n\n\n<li><strong>Synchronous Mode (Direct Read)<\/strong>: The system can also acquire a specified number of complex samples synchronously using the <code>read_samples()<\/code> method. This method will <strong>block program execution<\/strong> until the requested samples are read, making it suitable for scenarios where a specific block of data is needed immediately.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">II. Hardware Configuration Modes<\/h3>\n\n\n\n<p>The system allows configuration of specific hardware features of the RTL-SDR device:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Direct Sampling Mode<\/strong>: This mode can be configured via <code>direct_sampling: int = 0<\/code> in the <code>RTLSDRConfig<\/code>, where <code>0<\/code> disables it, <code>1<\/code> enables I-ADC direct sampling, and <code>2<\/code> enables Q-ADC direct sampling. It dictates how the RTL-SDR&#8217;s analog-to-digital converter (ADC) directly samples the RF signal, which can be beneficial for certain low-frequency applications.<\/li>\n\n\n\n<li><strong>Bias Tee Control<\/strong>: The <code>enable_bias_tee: bool = False<\/code> configuration option permits enabling or disabling the bias tee. The bias tee provides DC power over the antenna cable to active or powered antennas. The system utilizes <code>self.device.ctrl_transfer()<\/code> for this function, with a note that its compatibility is device-specific and may not work on all RTL-SDR models.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">III. Environment-Specific \/ Connection Modes (WSL2-Compatible Driver)<\/h3>\n\n\n\n<p>The <code>rtl_sdr_wsl_driver<\/code> module provides specialized operating modes, primarily designed for WSL2 environments where direct USB access might be limited:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Real Device Mode<\/strong>: This is the standard mode where the system attempts to connect directly to a physical RTL-SDR device attached to the machine. This mode functions identically to the core <code>rtl_sdr_driver<\/code> when a real device is detected and the <code>rtlsdr<\/code> library is available (and USB passthrough is configured in WSL if applicable).<\/li>\n\n\n\n<li><strong>Simulation Mode<\/strong>: This mode allows the system to <strong>simulate an RTL-SDR device<\/strong> for testing purposes. This is particularly useful in WSL2 where direct hardware access might be challenging. If running in WSL and the <code>rtlsdr<\/code> library is not found, the system will <strong>automatically switch to simulation mode<\/strong>. In this mode, the driver generates <strong>synthetic IQ samples<\/strong> based on configurable parameters, including a noise floor and various simulated signals (e.g., FM Radio, NOAA Weather, Ham radio, GSM, ADS-B, WiFi, Bluetooth, GPS, LTE, LoRa) with different frequencies, powers, bandwidths, and modulation types. It uses <code>np.random.seed(42)<\/code> for repeatable simulations.<\/li>\n\n\n\n<li><strong>TCP Mode<\/strong>: This mode enables the system to <strong>connect to an <code>rtl_tcp<\/code> server<\/strong> running on the Windows host machine from within WSL. This serves as an alternative to direct USB passthrough. The driver establishes a <strong>TCP socket connection<\/strong> to the specified host and port. It then sends configuration commands (such as setting frequency, sample rate, and gain) over the TCP connection to control the remote <code>rtl_tcp<\/code> instance. Sample data is then read directly from the TCP socket. The <code>list_rtlsdr_devices()<\/code> utility specifically checks for and lists an <code>rtl_tcp<\/code> server if found on the Windows host.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">IV. High-Level Operational Modes (RTL-SDR Receiver)<\/h3>\n\n\n\n<p>The <code>rtl_sdr_receiver<\/code> module builds upon the driver to provide advanced operational capabilities for signal intelligence:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Frequency Scanning<\/strong>: The system can perform <strong>automated frequency scanning<\/strong> within a defined frequency range (<code>start_freq<\/code> to <code>end_freq<\/code>) with a specified <code>step_size<\/code>. It dwells on each frequency for a <code>dwell_time<\/code> and can pause between full band scans (<code>pause_between_scans<\/code>). During scanning, it actively detects signals based on a <code>min_snr_db<\/code> and <code>min_signal_duration<\/code>.<\/li>\n\n\n\n<li><strong>Preset Tuning<\/strong>: The receiver allows tuning to a list of <strong>pre-defined <code>frequency_presets<\/code><\/strong> (e.g., common amateur radio frequencies like 145.500 MHz and 435.000 MHz, or LPD433). When tuning to a preset, any active scanning is temporarily stopped and can be restarted afterward.<\/li>\n\n\n\n<li><strong>Band Tuning<\/strong>: The system provides dedicated functions to <strong>tune to the VHF band (144 MHz)<\/strong> and <strong>UHF band (430 MHz)<\/strong>, specifically optimized for the Diamond RH771 Antenna. These functions also adjust the scanning range to match the respective band (144-148 MHz for VHF and 430-440 MHz for UHF).<\/li>\n<\/ul>\n\n\n\n<p>The RF QUANTUM SCYTHE system addresses the challenge of achieving RTL-SDR hardware access within a Windows Subsystem for Linux (WSL2) environment, where direct USB passthrough can be limited. While the system itself does not directly implement the USB passthrough mechanism, it provides <strong>two main approaches<\/strong> to enable the use of a physical RTL-SDR device from within WSL2, and a third option for operation without a real device:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Direct USB Passthrough (External Configuration)<\/strong>: The most direct way to get a physical RTL-SDR device working in WSL2 is through <strong>external configuration of the WSL2 environment to enable USB passthrough<\/strong>. The sources explicitly direct users to Microsoft&#8217;s documentation for this setup: &#8220;https:\/\/learn.microsoft.com\/en-us\/windows\/wsl\/connect-usb&#8221;. Once USB passthrough is properly configured at the WSL2 level, the RF QUANTUM SCYTHE system&#8217;s driver can then <strong>connect to the real RTL-SDR device directly<\/strong> using the <code>rtlsdr<\/code> library, as it would in a native Linux environment. The system&#8217;s <code>list_rtlsdr_devices()<\/code> function even attempts to detect if real devices are accessible in WSL, and if not, provides a warning and reiterates the need for USB passthrough setup.<\/li>\n\n\n\n<li><strong>TCP Mode (Indirect Passthrough via <code>rtl_tcp<\/code>)<\/strong>: As an alternative to direct USB passthrough, the system offers a <strong>TCP Mode<\/strong>. In this mode:\n<ul class=\"wp-block-list\">\n<li>An <code>rtl_tcp<\/code> server application must be <strong>running on the Windows host machine<\/strong>.<\/li>\n\n\n\n<li>The RF QUANTUM SCYTHE driver, operating within WSL2, then <strong>establishes a TCP socket connection<\/strong> to this <code>rtl_tcp<\/code> server on the specified host and port (by default, <code>localhost:1234<\/code>).<\/li>\n\n\n\n<li>Through this TCP connection, the driver <strong>sends configuration commands<\/strong> (such as setting frequency, sample rate, and gain) to control the remote <code>rtl_tcp<\/code> instance on the Windows host.<\/li>\n\n\n\n<li><strong>IQ sample data is then read directly from the TCP socket<\/strong>.<\/li>\n\n\n\n<li>The <code>list_rtlsdr_devices()<\/code> utility specifically checks if an <code>rtl_tcp<\/code> server is running on the Windows host and can list it as an available device option in WSL.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Simulation Mode (Fallback when Real Device Access is Limited)<\/strong>: While not a passthrough mechanism, the system also includes a <strong>Simulation Mode<\/strong>. This mode is particularly useful in WSL2 where direct USB access might be challenging or for testing purposes without a physical device. If the <code>rtlsdr<\/code> library is not found in the WSL environment and neither simulation nor TCP mode is explicitly selected, the system will <strong>automatically switch to simulation mode<\/strong>. In this mode, the driver generates synthetic IQ samples, allowing the software to run and be tested even without a functional hardware connection.<\/li>\n<\/ol>\n\n\n\n<p>In summary, the RF QUANTUM SCYTHE system enables RTL-SDR operation in WSL2 by either leveraging an <strong>externally configured direct USB passthrough<\/strong> or by providing its <strong>own built-in TCP client mode<\/strong> to connect to an <code>rtl_tcp<\/code> server running on the Windows host, with a robust <strong>simulation mode<\/strong> as a fallback.<\/p>\n\n\n\n<p>Simulated signals within the RF QUANTUM SCYTHE system are generated primarily when the system operates in <strong>simulation mode<\/strong>, which is particularly useful in Windows Subsystem for Linux (WSL2) environments where direct RTL-SDR hardware access might be challenging. When the system detects it&#8217;s in a WSL environment and the <code>rtlsdr<\/code> library is not found, it can automatically switch to simulation mode.<\/p>\n\n\n\n<p>The generation process occurs within the <code>_generate_simulated_samples<\/code> method of the <code>RTLSDRDriver<\/code> in the <code>rtl_sdr_wsl_driver.py<\/code> module. This method creates synthetic IQ samples based on a defined set of parameters and signal types.<\/p>\n\n\n\n<p>Here&#8217;s a breakdown of how simulated signals are generated:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Base Noise Generation<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The process begins by creating an array of <strong>complex samples filled with white noise<\/strong>.<\/li>\n\n\n\n<li>The power of this noise is derived from a configurable <code>sim_noise_floor<\/code> (defaulting to -95 dBm), which is converted from dBm to a linear power value.<\/li>\n\n\n\n<li>The standard deviation of the noise is calculated from this linear power, and complex white noise samples are generated using <code>np.random.normal<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Adding Configured Signals<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The system then iterates through a list of <strong>pre-configured simulated signals<\/strong> (<code>sim_signals<\/code>), each defined with properties such as <code>name<\/code>, <code>freq<\/code> (frequency), <code>power<\/code>, <code>bandwidth<\/code>, and <code>modulation<\/code> type.<\/li>\n\n\n\n<li>For each configured signal, it first checks if the signal&#8217;s frequency falls <strong>within the receiver&#8217;s current tuned bandwidth<\/strong> (approximately 80% of the sample rate around the <code>center_freq<\/code>). This ensures that only relevant simulated signals are added.<\/li>\n\n\n\n<li>If a signal is within the reception band, its amplitude is calculated from its defined power level (converting dBm to linear).<\/li>\n\n\n\n<li><strong>Different modulation types are simulated<\/strong> by generating appropriate complex waveforms and adding them to the base noise:\n<ul class=\"wp-block-list\">\n<li><strong>FM (Frequency Modulation)<\/strong>: Simulates an FM signal with a random audio modulation frequency and a set modulation index, adding phase noise. This is used for signals like &#8220;FM Radio,&#8221; &#8220;NOAA Weather,&#8221; &#8220;2m Ham,&#8221; and &#8220;70cm Ham&#8221;.<\/li>\n\n\n\n<li><strong>GMSK\/FSK (Gaussian Minimum Shift Keying \/ Frequency Shift Keying)<\/strong>: Simulates digital signals with symbol transitions and frequency deviation based on random symbols, adding phase noise. This is used for &#8220;GSM900&#8221;.<\/li>\n\n\n\n<li><strong>OFDM\/QAM (Orthogonal Frequency-Division Multiplexing \/ Quadrature Amplitude Modulation)<\/strong>: Simulates signals with multiple subcarriers, each with random phase and amplitude. This is used for &#8220;WiFi&#8221; and &#8220;LTE&#8221;.<\/li>\n\n\n\n<li><strong>Chirp<\/strong>: Simulates a LoRa-like chirp signal where frequency changes linearly over time, also with phase noise. This is used for &#8220;LoRa&#8221;.<\/li>\n\n\n\n<li><strong>AM (Amplitude Modulation) or Simple Carrier (Default)<\/strong>: If no specific modulation is defined, it defaults to adding a simple carrier with some random amplitude modulation. This is used for &#8220;ADS-B&#8221; and &#8220;GPS&#8221;.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>The generated signal samples for each active signal are then <strong>added to the initial noise array<\/strong>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Sample-to-Sample Jitter<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Finally, a small amount of <strong>additional white noise (jitter)<\/strong>, based on <code>sim_sample_noise<\/code> (standard deviation), is added to the samples to simulate real-world receiver imperfections.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p><strong>Repeatability<\/strong>: For <strong>repeatable simulations<\/strong>, the system sets a fixed random number generator seed using <code>np.random.seed(42)<\/code> during simulator initialization.<\/p>\n\n\n\n<p><strong>Example Simulated Signals<\/strong>: The system comes pre-configured with various common signal types for simulation purposes, including:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8220;FM Radio&#8221; (100.1 MHz, -50 dBm, 200 kHz bandwidth, FM modulation).<\/li>\n\n\n\n<li>&#8220;NOAA Weather&#8221; (162.55 MHz, -60 dBm, 25 kHz bandwidth, FM modulation).<\/li>\n\n\n\n<li>&#8220;2m Ham&#8221; (145.5 MHz, -70 dBm, 16 kHz bandwidth, FM modulation).<\/li>\n\n\n\n<li>&#8220;70cm Ham&#8221; (435.0 MHz, -65 dBm, 25 kHz bandwidth, FM modulation).<\/li>\n\n\n\n<li>&#8220;GSM900&#8221; (915.0 MHz, -55 dBm, 200 kHz bandwidth, GMSK modulation).<\/li>\n\n\n\n<li>&#8220;ADS-B&#8221; (1090.0 MHz, -70 dBm, 2 MHz bandwidth, PPM modulation).<\/li>\n\n\n\n<li>&#8220;WiFi&#8221; (2412.0 MHz, -65 dBm, 20 MHz bandwidth, OFDM modulation).<\/li>\n\n\n\n<li>&#8220;Bluetooth&#8221; (2450.0 MHz, -75 dBm, 1 MHz bandwidth, FHSS modulation).<\/li>\n\n\n\n<li>&#8220;GPS&#8221; (1575.42 MHz, -130 dBm, 2 MHz bandwidth, BPSK modulation).<\/li>\n\n\n\n<li>&#8220;LTE&#8221; (875.5 MHz, -60 dBm, 10 MHz bandwidth, QAM modulation).<\/li>\n\n\n\n<li>&#8220;LoRa&#8221; (915.0 MHz, -120 dBm, 125 kHz bandwidth, Chirp modulation).<\/li>\n<\/ul>\n\n\n\n<p>In the RF QUANTUM SCYTHE system, particularly within the WSL2-compatible driver, the initialization of <strong>real RTL-SDR devices<\/strong> is a multi-step process handled by the <code>initialize<\/code> method of the <code>RTLSDRDriver<\/code> class. This method ensures the physical device is properly set up for data acquisition.<\/p>\n\n\n\n<p>Here&#8217;s how real SDRs are initialized:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Prerequisite Check<\/strong>: Before attempting to initialize a real device, the system first verifies if the <code>rtlsdr<\/code> Python library is available. If this library is not found, the system cannot connect to a real device and will log a warning, often suggesting installation or fallback to simulation mode in a WSL2 environment.<\/li>\n\n\n\n<li><strong>Device Cleanup<\/strong>: If an RTL-SDR device is already connected (<code>self.device is not None<\/code>), the system will first close the existing connection to ensure a clean initialization.<\/li>\n\n\n\n<li><strong>Device Instantiation<\/strong>: The core step involves creating an instance of the <code>rtlsdr.RtlSdr<\/code> class, passing the <code>device_index<\/code> from the configuration (<code>self.config.device_index<\/code>) to establish a connection with the specific physical RTL-SDR device.<\/li>\n\n\n\n<li><strong>Configuration<\/strong>: Once the <code>rtlsdr.RtlSdr<\/code> object is successfully created, the driver proceeds to configure the device&#8217;s operational parameters based on the <code>RTLSDRConfig<\/code>:\n<ul class=\"wp-block-list\">\n<li><strong>Sample Rate<\/strong>: The desired sample rate, defined in <code>self.config.sample_rate<\/code>, is applied to the device (e.g., <code>self.device.sample_rate = self.config.sample_rate<\/code>).<\/li>\n\n\n\n<li><strong>Center Frequency<\/strong>: The central frequency for reception (<code>self.config.center_freq<\/code>) is set on the device (<code>self.device.center_freq = self.config.center_freq<\/code>). The system defaults to the UHF band center (430 MHz) if not specified.<\/li>\n\n\n\n<li><strong>Gain<\/strong>: The receiver&#8217;s gain is configured. If <code>self.config.gain<\/code> is set to <code>'auto'<\/code>, automatic gain control is enabled. Otherwise, a specific float value for gain (in dB) is applied to the device.<\/li>\n\n\n\n<li><strong>PPM Correction<\/strong>: If a non-zero PPM (Parts Per Million) correction value is specified in the configuration, it is applied to compensate for frequency errors in the RTL-SDR&#8217;s oscillator (<code>self.device.freq_correction = self.config.ppm_correction<\/code>).<\/li>\n\n\n\n<li><strong>Direct Sampling Mode<\/strong>: The direct sampling mode (0=disabled, 1=I-ADC, 2=Q-ADC) can be set if supported and specified in the configuration.<\/li>\n\n\n\n<li><strong>Bias Tee<\/strong>: If <code>self.config.enable_bias_tee<\/code> is <code>True<\/code>, the driver attempts to enable the bias tee. This feature provides DC power through the antenna input for powered antennas or LNA (Low Noise Amplifier) modules. This is attempted via a specific <code>ctrl_transfer<\/code> command, but it&#8217;s noted that this operation is device-specific and may not work on all RTL-SDR models.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Status Logging<\/strong>: Throughout the process, informational messages are logged, indicating the progress and the final configured state of the RTL-SDR, including its center frequency and sample rate.<\/li>\n\n\n\n<li><strong>Error Handling<\/strong>: The entire initialization process is wrapped in a <code>try-except<\/code> block to catch any exceptions that may occur during device connection or configuration. If an error is encountered, an error message is logged, the <code>self.device<\/code> object is reset to <code>None<\/code>, and the method returns <code>False<\/code> to indicate failure.<\/li>\n<\/ul>\n\n\n\n<p>The RF QUANTUM SCYTHE system is designed to handle various RTL-SDR operating modes, primarily managed by the <strong><code>rtl_sdr_wsl_driver.py<\/code><\/strong> file. This file is specifically optimized for WSL2 compatibility, recognizing that direct USB access to hardware might be limited in such environments.<\/p>\n\n\n\n<p>The system distinguishes and manages three primary operating modes for the RTL-SDR:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Real RTL-SDR Device Mode<\/strong>: This mode directly interfaces with a <strong>physical RTL-SDR hardware device<\/strong> connected to the system.<\/li>\n\n\n\n<li><strong>Simulated Signal Generation Mode<\/strong>: This mode generates <strong>synthetic signals<\/strong> internally for testing and development, especially when a physical device is unavailable or direct hardware access is problematic (e.g., in WSL2 without USB passthrough).<\/li>\n\n\n\n<li><strong>RTL-TCP Client Mode<\/strong>: This mode allows the system to connect to an <strong><code>rtl_tcp<\/code> server<\/strong> running on the Windows host (or another machine), which then streams data from a physical RTL-SDR device over the network.<\/li>\n<\/ol>\n\n\n\n<p>Here&#8217;s how the RF QUANTUM SCYTHE system handles these various operating modes:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mode Detection and Selection (especially for WSL2)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <code>rtl_sdr_wsl_driver.py<\/code> module first checks if it&#8217;s running within a <strong>WSL (Windows Subsystem for Linux) environment<\/strong>. This is done by checking the <code>\/proc\/version<\/code> file for &#8216;microsoft&#8217;.<\/li>\n\n\n\n<li>If a WSL environment is detected and the <code>rtlsdr<\/code> Python library (required for real device access) is <strong>not found<\/strong>, and neither simulation mode nor TCP mode is explicitly configured, the system will <strong>automatically switch to simulation mode<\/strong>.<\/li>\n\n\n\n<li>When listing available devices via <code>list_rtlsdr_devices()<\/code>, the system also considers <code>rtl_tcp<\/code> servers and internal simulators. If <code>rtl_tcp<\/code> is detected running on the Windows host, it&#8217;s listed as an available option. The simulator is always offered as an option.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Initialization and Configuration<\/h3>\n\n\n\n<p>The <code>initialize<\/code> method within the <code>RTLSDRDriver<\/code> (from <code>rtl_sdr_wsl_driver.py<\/code>) is responsible for setting up the chosen mode:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Real Device Initialization<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Requires the <code>rtlsdr<\/code> library to be available.<\/li>\n\n\n\n<li>It creates an instance of <code>rtlsdr.RtlSdr<\/code> targeting a specific <code>device_index<\/code>.<\/li>\n\n\n\n<li>Configures the device&#8217;s <code>sample_rate<\/code> (defaulting to <strong>2.4 MHz<\/strong>), <code>center_freq<\/code> (defaulting to <strong>430 MHz<\/strong>), <code>gain<\/code> (defaulting to &#8216;auto&#8217;), and <code>ppm_correction<\/code>.<\/li>\n\n\n\n<li>Can also set <code>direct_sampling<\/code> mode and attempt to <strong>enable the bias tee<\/strong> if configured and supported by the hardware.<\/li>\n\n\n\n<li>Logs successful initialization with the configured frequency and sample rate.<\/li>\n\n\n\n<li>If errors occur, it logs them and returns <code>False<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Simulated Signal Generation Initialization<\/strong>:\n<ul class=\"wp-block-list\">\n<li>If <code>self.is_simulated<\/code> is <code>True<\/code>, it sets <code>self.device<\/code> to the string &#8220;simulator&#8221;.<\/li>\n\n\n\n<li>It logs that the simulator is initialized with the configured center frequency and sample rate.<\/li>\n\n\n\n<li>Sets up a fixed random seed for repeatability of simulated signals.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>RTL-TCP Client Initialization<\/strong>:\n<ul class=\"wp-block-list\">\n<li>If <code>self.is_tcp_mode<\/code> is <code>True<\/code>, it attempts to establish a <strong>TCP socket connection<\/strong> to the specified <code>tcp_host<\/code> and <code>tcp_port<\/code> (defaulting to <code>localhost:1234<\/code>).<\/li>\n\n\n\n<li>Upon successful connection, <code>self.device<\/code> is set to &#8220;tcp&#8221;.<\/li>\n\n\n\n<li>Error handling for connection failures is included.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Data Acquisition and Operations<\/h3>\n\n\n\n<p>The system abstracts the underlying mode when performing operations like reading samples or changing settings:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Reading Samples (<code>read_samples<\/code>)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>In <strong>Real Device mode<\/strong>, it directly calls <code>self.device.read_samples(n_samples)<\/code>.<\/li>\n\n\n\n<li>In <strong>Simulated mode<\/strong>, it calls <code>_generate_simulated_samples(n_samples)<\/code>. This function generates complex IQ samples by combining <strong>white noise<\/strong> (based on <code>sim_noise_floor<\/code> and <code>sim_sample_noise<\/code>) with various configured <strong>synthetic signals<\/strong> (e.g., FM, GSM\/FSK, OFDM\/QAM, Chirp) that fall within the receiver&#8217;s current tuning range and bandwidth.<\/li>\n\n\n\n<li>In <strong>TCP mode<\/strong>, it calls <code>_read_samples_from_tcp(n_samples)<\/code>, which attempts to read raw data from the TCP socket. The source notes this is a simplified implementation of the <code>rtl_tcp<\/code> protocol.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Setting Frequency (<code>set_frequency<\/code>)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>For <strong>Real Devices<\/strong>, it sets <code>self.device.center_freq<\/code>.<\/li>\n\n\n\n<li>For <strong>Simulated mode<\/strong>, it updates <code>self.config.center_freq<\/code>.<\/li>\n\n\n\n<li>For <strong>TCP mode<\/strong>, it sends a specific TCP command (<code>0x01<\/code> followed by a 4-byte frequency) to the <code>rtl_tcp<\/code> server.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Setting Sample Rate (<code>set_sample_rate<\/code>)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>For <strong>Real Devices<\/strong>, it sets <code>self.device.sample_rate<\/code>.<\/li>\n\n\n\n<li>For <strong>Simulated mode<\/strong>, it updates <code>self.config.sample_rate<\/code>.<\/li>\n\n\n\n<li>For <strong>TCP mode<\/strong>, it sends a specific TCP command (<code>0x02<\/code> followed by a 4-byte sample rate).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Setting Gain (<code>set_gain<\/code>)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>For <strong>Real Devices<\/strong>, it sets <code>self.device.gain<\/code> (either &#8216;auto&#8217; or a float value).<\/li>\n\n\n\n<li>For <strong>Simulated mode<\/strong>, it updates <code>self.config.gain<\/code>.<\/li>\n\n\n\n<li>For <strong>TCP mode<\/strong>, it sends specific TCP commands for auto gain (<code>0x03<\/code> + 4 zeros) or manual gain (<code>0x04<\/code> + 4-byte gain in tenths of dB).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Getting Device Information (<code>get_device_info<\/code>)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>In <strong>Real Device mode<\/strong>, it queries the <code>rtlsdr<\/code> object for device name, serial, sample rate, center frequency, gain, and frequency correction.<\/li>\n\n\n\n<li>In <strong>Simulated mode<\/strong>, it returns static information like &#8220;RTL-SDR Simulator&#8221; with the configured parameters.<\/li>\n\n\n\n<li>In <strong>TCP mode<\/strong>, it returns information indicating &#8220;RTL-SDR TCP Client&#8221; and its connection details along with configured parameters.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Available Gains (<code>get_available_gains<\/code>)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>For <strong>Real Devices<\/strong>, it retrieves the actual supported gain values from the <code>rtlsdr<\/code> device.<\/li>\n\n\n\n<li>For <strong>Simulated and TCP modes<\/strong>, it returns a predefined list of realistic gain values, as these modes don&#8217;t have a physical device to query.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>The <strong><code>RTLSDRReceiver<\/code><\/strong> class then sits on top of this <code>RTLSDRDriver<\/code>, regardless of its operating mode, providing a unified interface for signal intelligence tasks like scanning, signal detection, and forwarding data to a <code>SignalProcessor<\/code>. This modular design allows the core signal processing logic to function consistently, whether it&#8217;s using live hardware data, simulated data, or data streamed via TCP.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PODCAST: The provided Python source code excerpts collectively detail the RF QUANTUM SCYTHE project&#8217;s signal intelligence capabilities, primarily focusing on Software-Defined Radio (SDR) functionalities. The rtl_sdr_driver.py module provides a foundational interface for interacting with RTL-SDR devices, managing their configuration, data acquisition, and core operations. Building upon this, rtl_sdr_receiver.py establishes a comprehensive receiver manager, enabling frequency&hellip;&nbsp;<a href=\"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=1230\" rel=\"bookmark\"><span class=\"screen-reader-text\">Windows 11 WSL2 Linux RTL-SDR Driver<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1231,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[14,10],"tags":[],"class_list":["post-1230","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-podcast","category-signal_scythe"],"_links":{"self":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/1230","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1230"}],"version-history":[{"count":9,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/1230\/revisions"}],"predecessor-version":[{"id":1246,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/1230\/revisions\/1246"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/media\/1231"}],"wp:attachment":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1230"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}