<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.simtx.net/index.php?action=history&amp;feed=atom&amp;title=SimTX_API_v24%2FQuick_start</id>
	<title>SimTX API v24/Quick start - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.simtx.net/index.php?action=history&amp;feed=atom&amp;title=SimTX_API_v24%2FQuick_start"/>
	<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=SimTX_API_v24/Quick_start&amp;action=history"/>
	<updated>2026-11-04T22:43:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=SimTX_API_v24/Quick_start&amp;diff=2285&amp;oldid=prev</id>
		<title>Clanker: Archive the v24 protocol reference: use the v24 templates, links and categories</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=SimTX_API_v24/Quick_start&amp;diff=2285&amp;oldid=prev"/>
		<updated>2026-10-24T16:27:18Z</updated>

		<summary type="html">&lt;p&gt;Archive the v24 protocol reference: use the v24 templates, links and categories&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:27, 24 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{SimTX API navigation}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24 &lt;/ins&gt;navigation}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This page gets a program talking to SimTX with nothing but a standard Python 3 installation. The first example receives IQ anonymously; the second transmits a tone with an account. Both use only the standard library, so that every byte on the wire is visible. The same steps translate directly to any language with TLS sockets.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This page gets a program talking to SimTX with nothing but a standard Python 3 installation. The first example receives IQ anonymously; the second transmits a tone with an account. Both use only the standard library, so that every byte on the wire is visible. The same steps translate directly to any language with TLS sockets.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Receiving ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Receiving ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The program below connects to the public server, completes an anonymous [[SimTX API/Packets/Handshake|handshake]], requests a receiver on 7.1 MHz in Budapest, and prints the power of the first ten IQ blocks.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The program below connects to the public server, completes an anonymous [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Packets/Handshake|handshake]], requests a receiver on 7.1 MHz in Budapest, and prints the power of the first ten IQ blocks.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l95&quot;&gt;Line 95:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 95:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Things to notice:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Things to notice:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* The program asked for 4,800 samples per block and received 1,920. The server decides; the [[SimTX API/Packets/IqStreamDescriptor|IqStreamDescriptor]] says what it decided. See [[SimTX API/Receiver session#Negotiation|Negotiation]].&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* The program asked for 4,800 samples per block and received 1,920. The server decides; the [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Packets/IqStreamDescriptor|IqStreamDescriptor]] says what it decided. See [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Receiver session#Negotiation|Negotiation]].&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* A mean power of about 1.3 × 10&amp;lt;sup&amp;gt;−7&amp;lt;/sup&amp;gt; is −12 + 10·log&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt;(1.3 × 10&amp;lt;sup&amp;gt;−7&amp;lt;/sup&amp;gt;) ≈ &amp;#039;&amp;#039;&amp;#039;−81 dBm&amp;#039;&amp;#039;&amp;#039;: mostly the 40 m band&amp;#039;s background noise in a 48 kHz bandwidth. Tune to a frequency where someone is transmitting and it rises.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* A mean power of about 1.3 × 10&amp;lt;sup&amp;gt;−7&amp;lt;/sup&amp;gt; is −12 + 10·log&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt;(1.3 × 10&amp;lt;sup&amp;gt;−7&amp;lt;/sup&amp;gt;) ≈ &amp;#039;&amp;#039;&amp;#039;−81 dBm&amp;#039;&amp;#039;&amp;#039;: mostly the 40 m band&amp;#039;s background noise in a 48 kHz bandwidth. Tune to a frequency where someone is transmitting and it rises.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; are hard-coded for brevity. Real software should take them from the [[SimTX API/Server directory|server directory]] or from its configuration.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; are hard-coded for brevity. Real software should take them from the [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Server directory|server directory]] or from its configuration.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;To feed the samples to a demodulator, convert each block into complex values (&amp;lt;code&amp;gt;I + jQ&amp;lt;/code&amp;gt;, scaled as shown) and pass them on. To change frequency, send &amp;lt;code&amp;gt;b&amp;quot;\x0d&amp;quot; + struct.pack(&amp;quot;&amp;gt;f&amp;quot;, new_frequency_hz)&amp;lt;/code&amp;gt; at any time.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;To feed the samples to a demodulator, convert each block into complex values (&amp;lt;code&amp;gt;I + jQ&amp;lt;/code&amp;gt;, scaled as shown) and pass them on. To change frequency, send &amp;lt;code&amp;gt;b&amp;quot;\x0d&amp;quot; + struct.pack(&amp;quot;&amp;gt;f&amp;quot;, new_frequency_hz)&amp;lt;/code&amp;gt; at any time.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Transmitting ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Transmitting ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Transmitting requires an account with the &amp;lt;code&amp;gt;game.transmit&amp;lt;/code&amp;gt; [[SimTX API/Permissions|permission]]. For a script, the simplest credential is a personal credential created on the account website. Put it in the &amp;lt;code&amp;gt;SIMTX_TOKEN&amp;lt;/code&amp;gt; environment variable. Interactive software should use [[SimTX API/Device login|device login]] instead.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Transmitting requires an account with the &amp;lt;code&amp;gt;game.transmit&amp;lt;/code&amp;gt; [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Permissions|permission]]. For a script, the simplest credential is a personal credential created on the account website. Put it in the &amp;lt;code&amp;gt;SIMTX_TOKEN&amp;lt;/code&amp;gt; environment variable. Interactive software should use [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Device login|device login]] instead.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The program below obtains a [[SimTX API/Game tickets|game ticket]], opens a transmitter session on 14.230 MHz USB at 100 W, waits for admission, transmits a 1 kHz tone for ten seconds while printing telemetry, and goes off air.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The program below obtains a [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Game tickets|game ticket]], opens a transmitter session on 14.230 MHz USB at 100 W, waits for admission, transmits a 1 kHz tone for ten seconds while printing telemetry, and goes off air.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l255&quot;&gt;Line 255:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 255:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Things to notice:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Things to notice:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Only the 13 required fields of the [[SimTX API/Packets/TransmitterSessionRequest|TransmitterSessionRequest]] are sent. The server uses defaults for the transmitter imperfections (fields 14 to 28).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Only the 13 required fields of the [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Packets/TransmitterSessionRequest|TransmitterSessionRequest]] are sent. The server uses defaults for the transmitter imperfections (fields 14 to 28).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* The sender paces itself to real time with a deadline per block. Sending as fast as possible would fill the server&amp;#039;s buffer, and anything beyond the allowed burst would be discarded. The &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt; value in the telemetry should stay roughly constant.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* The sender paces itself to real time with a deadline per block. Sending as fast as possible would fill the server&amp;#039;s buffer, and anything beyond the allowed burst would be discarded. The &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt; value in the telemetry should stay roughly constant.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Telemetry is read on a separate thread. A client that stops reading is disconnected after five seconds.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Telemetry is read on a separate thread. A client that stops reading is disconnected after five seconds.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l261&quot;&gt;Line 261:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 261:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Next steps ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Next steps ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[SimTX API/Connection and handshake]] explains the handshake and its failure codes.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Connection and handshake]] explains the handshake and its failure codes.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[SimTX API/Receiver session]] and [[SimTX API/Transmitter session]] cover negotiation, flow control and live updates.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Receiver session]] and [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Transmitter session]] cover negotiation, flow control and live updates.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[SimTX API/Control session]] adds the station list, so that a receiver can show who is on the air.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Control session]] adds the station list, so that a receiver can show who is on the air.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[SimTX API/Limits and errors]] explains what to do when the server simply hangs up.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [[SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;/Limits and errors]] explains what to do when the server simply hangs up.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{SimTX API navbox}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24 &lt;/ins&gt;navbox}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:SimTX API]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:SimTX API &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;v24&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Clanker</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=SimTX_API_v24/Quick_start&amp;diff=2270&amp;oldid=prev</id>
		<title>Clanker: Clanker moved page SimTX API/Quick start to SimTX API v24/Quick start: Archive the v24 protocol reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=SimTX_API_v24/Quick_start&amp;diff=2270&amp;oldid=prev"/>
		<updated>2026-10-24T16:20:13Z</updated>

		<summary type="html">&lt;p&gt;Clanker moved page &lt;a href=&quot;/index.php/SimTX_API/Quick_start&quot; title=&quot;SimTX API/Quick start&quot;&gt;SimTX API/Quick start&lt;/a&gt; to &lt;a href=&quot;/index.php/SimTX_API_v24/Quick_start&quot; title=&quot;SimTX API v24/Quick start&quot;&gt;SimTX API v24/Quick start&lt;/a&gt;: Archive the v24 protocol reference&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:20, 24 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Clanker</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=SimTX_API_v24/Quick_start&amp;diff=1993&amp;oldid=prev</id>
		<title>Clanker: SimTX API documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=SimTX_API_v24/Quick_start&amp;diff=1993&amp;oldid=prev"/>
		<updated>2026-10-24T09:48:28Z</updated>

		<summary type="html">&lt;p&gt;SimTX API documentation&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{SimTX API navigation}}&lt;br /&gt;
This page gets a program talking to SimTX with nothing but a standard Python 3 installation. The first example receives IQ anonymously; the second transmits a tone with an account. Both use only the standard library, so that every byte on the wire is visible. The same steps translate directly to any language with TLS sockets.&lt;br /&gt;
&lt;br /&gt;
== Receiving ==&lt;br /&gt;
The program below connects to the public server, completes an anonymous [[SimTX API/Packets/Handshake|handshake]], requests a receiver on 7.1 MHz in Budapest, and prints the power of the first ten IQ blocks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
HOST, PORT = &amp;quot;argon.simtx.net&amp;quot;, 5556&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_exact(sock, n):&lt;br /&gt;
    buf = bytearray()&lt;br /&gt;
    while len(buf) &amp;lt; n:&lt;br /&gt;
        chunk = sock.recv(n - len(buf))&lt;br /&gt;
        if not chunk:&lt;br /&gt;
            raise ConnectionError(&amp;quot;server closed the connection&amp;quot;)&lt;br /&gt;
        buf += chunk&lt;br /&gt;
    return bytes(buf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_utf(s):&lt;br /&gt;
    data = s.encode(&amp;quot;utf-8&amp;quot;)  # fine for ASCII; see Data types for modified UTF-8&lt;br /&gt;
    return struct.pack(&amp;quot;&amp;gt;H&amp;quot;, len(data)) + data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_utf(sock):&lt;br /&gt;
    (n,) = struct.unpack(&amp;quot;&amp;gt;H&amp;quot;, read_exact(sock, 2))&lt;br /&gt;
    return read_exact(sock, n).decode(&amp;quot;utf-8&amp;quot;, &amp;quot;replace&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
raw = socket.create_connection((HOST, PORT), timeout=10)&lt;br /&gt;
raw.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)&lt;br /&gt;
sock = ssl.create_default_context().wrap_socket(raw, server_hostname=HOST)&lt;br /&gt;
&lt;br /&gt;
# Handshake: magic, version, role 1 (RECEIVER), authKind 0 (ANONYMOUS), empty credential&lt;br /&gt;
sock.sendall(struct.pack(&amp;quot;&amp;gt;iibb&amp;quot;, 0x53494D54, 24, 1, 0) + write_utf(&amp;quot;&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
packet_id, status = struct.unpack(&amp;quot;&amp;gt;BB&amp;quot;, read_exact(sock, 2))&lt;br /&gt;
assert packet_id == 30, packet_id&lt;br /&gt;
message = read_utf(sock)&lt;br /&gt;
if read_exact(sock, 1)[0]:&lt;br /&gt;
    read_exact(sock, 16)  # account UUID&lt;br /&gt;
read_utf(sock)  # handle&lt;br /&gt;
read_utf(sock)  # display name&lt;br /&gt;
for _ in range(read_exact(sock, 1)[0]):&lt;br /&gt;
    read_utf(sock)  # permission&lt;br /&gt;
read_exact(sock, 16)  # authorizationRevision, leaseExpiresAtEpochMillis&lt;br /&gt;
if status != 0:&lt;br /&gt;
    raise SystemExit(f&amp;quot;handshake rejected ({status}): {message}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# ReceiverSessionRequest&lt;br /&gt;
antenna = write_utf(&amp;quot;DIPOLE&amp;quot;) + struct.pack(&amp;quot;&amp;gt;ffffi&amp;quot;, 10.0, 0.0, 0.0, 0.0, 0)&lt;br /&gt;
request = (&lt;br /&gt;
    write_utf(&amp;quot;N0CALL&amp;quot;)&lt;br /&gt;
    + struct.pack(&amp;quot;&amp;gt;ddd&amp;quot;, 47.4979, 19.0402, 120.0)&lt;br /&gt;
    + antenna&lt;br /&gt;
    + struct.pack(&amp;quot;&amp;gt;fffii&amp;quot;, 5.0, 7_100_000.0, 48_000.0, 48_000, 4_800)&lt;br /&gt;
    + write_utf(&amp;quot;&amp;quot;)&lt;br /&gt;
)&lt;br /&gt;
sock.sendall(b&amp;quot;\x01&amp;quot; + request)&lt;br /&gt;
&lt;br /&gt;
packet_id = read_exact(sock, 1)[0]&lt;br /&gt;
assert packet_id == 1, packet_id&lt;br /&gt;
rate, center, chunk, fmt = struct.unpack(&amp;quot;&amp;gt;ifib&amp;quot;, read_exact(sock, 13))&lt;br /&gt;
print(f&amp;quot;stream: {rate} S/s at {center:.0f} Hz, {chunk} samples/block, format {fmt}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
width = 2 if fmt == 1 else 1&lt;br /&gt;
full_scale = 32767 if fmt == 1 else 127&lt;br /&gt;
for _ in range(10):&lt;br /&gt;
    packet_id = read_exact(sock, 1)[0]&lt;br /&gt;
    assert packet_id == 2, packet_id&lt;br /&gt;
    (length,) = struct.unpack(&amp;quot;&amp;gt;i&amp;quot;, read_exact(sock, 4))&lt;br /&gt;
    payload = read_exact(sock, length)&lt;br /&gt;
    (scale,) = struct.unpack(&amp;quot;&amp;gt;f&amp;quot;, payload[:4])&lt;br /&gt;
    code = &amp;quot;&amp;gt;%dh&amp;quot; % (chunk * 2) if fmt == 1 else &amp;quot;&amp;gt;%db&amp;quot; % (chunk * 2)&lt;br /&gt;
    raw_iq = struct.unpack(code, payload[4:])&lt;br /&gt;
    power = sum((v * scale / full_scale) ** 2 for v in raw_iq) / chunk&lt;br /&gt;
    print(f&amp;quot;block: {length} bytes, scale {scale:.4g}, mean power {power:.3e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
sock.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
stream: 48000 S/s at 7100000 Hz, 1920 samples/block, format 1&lt;br /&gt;
block: 7684 bytes, scale 0.0009043, mean power 1.337e-07&lt;br /&gt;
block: 7684 bytes, scale 0.0009922, mean power 1.366e-07&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Things to notice:&lt;br /&gt;
* The program asked for 4,800 samples per block and received 1,920. The server decides; the [[SimTX API/Packets/IqStreamDescriptor|IqStreamDescriptor]] says what it decided. See [[SimTX API/Receiver session#Negotiation|Negotiation]].&lt;br /&gt;
* A mean power of about 1.3 × 10&amp;lt;sup&amp;gt;−7&amp;lt;/sup&amp;gt; is −12 + 10·log&amp;lt;sub&amp;gt;10&amp;lt;/sub&amp;gt;(1.3 × 10&amp;lt;sup&amp;gt;−7&amp;lt;/sup&amp;gt;) ≈ &amp;#039;&amp;#039;&amp;#039;−81 dBm&amp;#039;&amp;#039;&amp;#039;: mostly the 40 m band&amp;#039;s background noise in a 48 kHz bandwidth. Tune to a frequency where someone is transmitting and it rises.&lt;br /&gt;
* &amp;lt;code&amp;gt;HOST&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PORT&amp;lt;/code&amp;gt; are hard-coded for brevity. Real software should take them from the [[SimTX API/Server directory|server directory]] or from its configuration.&lt;br /&gt;
&lt;br /&gt;
To feed the samples to a demodulator, convert each block into complex values (&amp;lt;code&amp;gt;I + jQ&amp;lt;/code&amp;gt;, scaled as shown) and pass them on. To change frequency, send &amp;lt;code&amp;gt;b&amp;quot;\x0d&amp;quot; + struct.pack(&amp;quot;&amp;gt;f&amp;quot;, new_frequency_hz)&amp;lt;/code&amp;gt; at any time.&lt;br /&gt;
&lt;br /&gt;
== Transmitting ==&lt;br /&gt;
Transmitting requires an account with the &amp;lt;code&amp;gt;game.transmit&amp;lt;/code&amp;gt; [[SimTX API/Permissions|permission]]. For a script, the simplest credential is a personal credential created on the account website. Put it in the &amp;lt;code&amp;gt;SIMTX_TOKEN&amp;lt;/code&amp;gt; environment variable. Interactive software should use [[SimTX API/Device login|device login]] instead.&lt;br /&gt;
&lt;br /&gt;
The program below obtains a [[SimTX API/Game tickets|game ticket]], opens a transmitter session on 14.230 MHz USB at 100 W, waits for admission, transmits a 1 kHz tone for ten seconds while printing telemetry, and goes off air.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
import json&lt;br /&gt;
import math&lt;br /&gt;
import os&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import struct&lt;br /&gt;
import threading&lt;br /&gt;
import time&lt;br /&gt;
import urllib.request&lt;br /&gt;
&lt;br /&gt;
AUTH = &amp;quot;https://auth.simtx.net&amp;quot;&lt;br /&gt;
TOKEN = os.environ[&amp;quot;SIMTX_TOKEN&amp;quot;]  # a personal credential (stx_pc1_...)&lt;br /&gt;
SERVER_ID = &amp;quot;argon&amp;quot;&lt;br /&gt;
HOST, PORT = &amp;quot;argon.simtx.net&amp;quot;, 5556&lt;br /&gt;
RATE = 48_000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def post_json(path, body):&lt;br /&gt;
    request = urllib.request.Request(&lt;br /&gt;
        AUTH + path,&lt;br /&gt;
        data=json.dumps(body).encode(),&lt;br /&gt;
        headers={&amp;quot;Authorization&amp;quot;: &amp;quot;Bearer &amp;quot; + TOKEN, &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot;},&lt;br /&gt;
    )&lt;br /&gt;
    with urllib.request.urlopen(request, timeout=10) as response:&lt;br /&gt;
        return json.load(response)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_exact(sock, n):&lt;br /&gt;
    buf = bytearray()&lt;br /&gt;
    while len(buf) &amp;lt; n:&lt;br /&gt;
        chunk = sock.recv(n - len(buf))&lt;br /&gt;
        if not chunk:&lt;br /&gt;
            raise ConnectionError(&amp;quot;server closed the connection&amp;quot;)&lt;br /&gt;
        buf += chunk&lt;br /&gt;
    return bytes(buf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def write_utf(s):&lt;br /&gt;
    data = s.encode(&amp;quot;utf-8&amp;quot;)&lt;br /&gt;
    return struct.pack(&amp;quot;&amp;gt;H&amp;quot;, len(data)) + data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_utf(sock):&lt;br /&gt;
    (n,) = struct.unpack(&amp;quot;&amp;gt;H&amp;quot;, read_exact(sock, 2))&lt;br /&gt;
    return read_exact(sock, n).decode(&amp;quot;utf-8&amp;quot;, &amp;quot;replace&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def field(field_id, payload):&lt;br /&gt;
    return struct.pack(&amp;quot;&amp;gt;Bi&amp;quot;, field_id, len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def f32(value):&lt;br /&gt;
    return struct.pack(&amp;quot;&amp;gt;f&amp;quot;, value)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def transmitter_request():&lt;br /&gt;
    antenna = write_utf(&amp;quot;DIPOLE&amp;quot;) + struct.pack(&amp;quot;&amp;gt;ffffi&amp;quot;, 10.0, 0.0, 0.0, 20.0, 0)&lt;br /&gt;
    fields = [&lt;br /&gt;
        field(1, b&amp;quot;N0CALL&amp;quot;),                                    # callsign&lt;br /&gt;
        field(2, struct.pack(&amp;quot;&amp;gt;ddd&amp;quot;, 47.4979, 19.0402, 120.0)),  # location&lt;br /&gt;
        field(3, antenna),                                      # antenna&lt;br /&gt;
        field(4, b&amp;quot;USB&amp;quot;),                                       # modulation&lt;br /&gt;
        field(5, f32(14_230_000.0)),                            # frequencyHz&lt;br /&gt;
        field(6, f32(100.0)),                                   # powerWatts&lt;br /&gt;
        field(7, b&amp;quot;AUDIO_STREAM&amp;quot;),                              # sourceType&lt;br /&gt;
        field(8, struct.pack(&amp;quot;&amp;gt;i&amp;quot;, RATE)),                      # sampleRate&lt;br /&gt;
        field(9, f32(1.0)),                                     # audioGain&lt;br /&gt;
        field(10, f32(2_700.0)),                                # txBandwidthHz&lt;br /&gt;
        field(11, f32(300.0)),                                  # audioLowCutHz&lt;br /&gt;
        field(12, f32(0.0)),                                    # toneHz&lt;br /&gt;
        field(13, f32(1.0)),                                    # dutyCycle&lt;br /&gt;
    ]&lt;br /&gt;
    return b&amp;quot;\x02&amp;quot; + struct.pack(&amp;quot;&amp;gt;B&amp;quot;, len(fields)) + b&amp;quot;&amp;quot;.join(fields)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ticket = post_json(&amp;quot;/api/v1/game-tickets&amp;quot;, {&amp;quot;serverId&amp;quot;: SERVER_ID, &amp;quot;role&amp;quot;: &amp;quot;tx-audio&amp;quot;})[&amp;quot;ticket&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
raw = socket.create_connection((HOST, PORT), timeout=10)&lt;br /&gt;
raw.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)&lt;br /&gt;
sock = ssl.create_default_context().wrap_socket(raw, server_hostname=HOST)&lt;br /&gt;
&lt;br /&gt;
# Handshake: role 2 (TX_AUDIO), authKind 1 (GAME_TICKET)&lt;br /&gt;
sock.sendall(struct.pack(&amp;quot;&amp;gt;iibb&amp;quot;, 0x53494D54, 24, 2, 1) + write_utf(ticket))&lt;br /&gt;
packet_id, status = struct.unpack(&amp;quot;&amp;gt;BB&amp;quot;, read_exact(sock, 2))&lt;br /&gt;
message = read_utf(sock)&lt;br /&gt;
if read_exact(sock, 1)[0]:&lt;br /&gt;
    read_exact(sock, 16)&lt;br /&gt;
handle = read_utf(sock)&lt;br /&gt;
read_utf(sock)&lt;br /&gt;
permissions = [read_utf(sock) for _ in range(read_exact(sock, 1)[0])]&lt;br /&gt;
read_exact(sock, 16)&lt;br /&gt;
if status != 0:&lt;br /&gt;
    raise SystemExit(f&amp;quot;handshake rejected ({status}): {message}&amp;quot;)&lt;br /&gt;
print(&amp;quot;signed in as&amp;quot;, handle, &amp;quot;with&amp;quot;, permissions)&lt;br /&gt;
&lt;br /&gt;
sock.sendall(transmitter_request())&lt;br /&gt;
&lt;br /&gt;
# Admission: TxQueue (4) until TxAccept (3), or TxReject (5)&lt;br /&gt;
while True:&lt;br /&gt;
    packet_id = read_exact(sock, 1)[0]&lt;br /&gt;
    if packet_id == 3:&lt;br /&gt;
        print(&amp;quot;on air&amp;quot;)&lt;br /&gt;
        break&lt;br /&gt;
    if packet_id == 4:&lt;br /&gt;
        ahead, total = struct.unpack(&amp;quot;&amp;gt;ii&amp;quot;, read_exact(sock, 8))&lt;br /&gt;
        print(f&amp;quot;queued: {ahead} ahead of {total}&amp;quot;)&lt;br /&gt;
    elif packet_id == 5:&lt;br /&gt;
        raise SystemExit(&amp;quot;rejected: &amp;quot; + read_utf(sock))&lt;br /&gt;
    else:&lt;br /&gt;
        raise SystemExit(f&amp;quot;unexpected packet {packet_id}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
sock.settimeout(None)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_telemetry():&lt;br /&gt;
    try:&lt;br /&gt;
        while True:&lt;br /&gt;
            packet_id = read_exact(sock, 1)[0]&lt;br /&gt;
            if packet_id == 7:&lt;br /&gt;
                values = struct.unpack(&amp;quot;&amp;gt;qq16f?&amp;quot;, read_exact(sock, 8 + 8 + 16 * 4 + 1))&lt;br /&gt;
                forward, vswr, buffer_s = values[4], values[7], values[12]&lt;br /&gt;
                print(f&amp;quot;forward {forward:6.1f} W  SWR {vswr:4.2f}  buffer {buffer_s:4.2f} s&amp;quot;)&lt;br /&gt;
            elif packet_id == 6:&lt;br /&gt;
                print(&amp;quot;kicked:&amp;quot;, read_utf(sock))&lt;br /&gt;
                return&lt;br /&gt;
            else:&lt;br /&gt;
                print(&amp;quot;unexpected packet&amp;quot;, packet_id)&lt;br /&gt;
                return&lt;br /&gt;
    except (ConnectionError, OSError):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
threading.Thread(target=read_telemetry, daemon=True).start()&lt;br /&gt;
&lt;br /&gt;
# Ten seconds of a 1 kHz tone, sent in real time in 20 ms blocks&lt;br /&gt;
block = RATE // 50&lt;br /&gt;
start = time.monotonic()&lt;br /&gt;
for n in range(500):&lt;br /&gt;
    samples = [0.5 * math.sin(2 * math.pi * 1000 * (n * block + i) / RATE) for i in range(block)]&lt;br /&gt;
    sock.sendall(b&amp;quot;\x03&amp;quot; + struct.pack(&amp;quot;&amp;gt;i%df&amp;quot; % block, block, *samples))&lt;br /&gt;
    time.sleep(max(0.0, start + (n + 1) * 0.02 - time.monotonic()))&lt;br /&gt;
&lt;br /&gt;
sock.shutdown(socket.SHUT_WR)&lt;br /&gt;
sock.close()&lt;br /&gt;
print(&amp;quot;off air&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Things to notice:&lt;br /&gt;
* Only the 13 required fields of the [[SimTX API/Packets/TransmitterSessionRequest|TransmitterSessionRequest]] are sent. The server uses defaults for the transmitter imperfections (fields 14 to 28).&lt;br /&gt;
* The sender paces itself to real time with a deadline per block. Sending as fast as possible would fill the server&amp;#039;s buffer, and anything beyond the allowed burst would be discarded. The &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt; value in the telemetry should stay roughly constant.&lt;br /&gt;
* Telemetry is read on a separate thread. A client that stops reading is disconnected after five seconds.&lt;br /&gt;
* There is no &amp;quot;stop transmitting&amp;quot; packet. Closing the socket takes the station off air.&lt;br /&gt;
&lt;br /&gt;
== Next steps ==&lt;br /&gt;
* [[SimTX API/Connection and handshake]] explains the handshake and its failure codes.&lt;br /&gt;
* [[SimTX API/Receiver session]] and [[SimTX API/Transmitter session]] cover negotiation, flow control and live updates.&lt;br /&gt;
* [[SimTX API/Control session]] adds the station list, so that a receiver can show who is on the air.&lt;br /&gt;
* [[SimTX API/Limits and errors]] explains what to do when the server simply hangs up.&lt;br /&gt;
&lt;br /&gt;
{{SimTX API navbox}}&lt;br /&gt;
[[Category:SimTX API]]&lt;/div&gt;</summary>
		<author><name>Clanker</name></author>
	</entry>
</feed>