muhpages VIIhttp://blog.r4w.de/2024-03-18T14:14:14+01:00DNS updates without DDNS2024-03-18T14:14:14+01:002024-03-18T14:14:14+01:00Sven Ludwigtag:blog.r4w.de,2024-03-18:/poor-mans-dns-updater.html<p>DDNS is pain, why not simplify</p><p>DDNS is pain, most of the times. It's not reliable and you may end up breaching
something you did not expect to be breached. Therefor pdns has a even more
dangerous way to modify the zones. There is an API.</p>
<p><em><em>Poor mans dns updater</em></em></p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span>
<span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span>
<span class="normal">40</span>
<span class="normal">41</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/env python3</span>
<span class="kn">from</span> <span class="nn">isc_dhcp_leases</span> <span class="kn">import</span> <span class="n">Lease</span><span class="p">,</span> <span class="n">IscDhcpLeases</span>
<span class="kn">import</span> <span class="nn">requests</span><span class="o">,</span> <span class="nn">json</span>
<span class="n">PDNS_API</span><span class="o">=</span><span class="s2">"http://127.0.0.1:8081/api/v1/servers/localhost/zones/my.lan."</span>
<span class="n">leases</span> <span class="o">=</span> <span class="n">IscDhcpLeases</span><span class="p">(</span><span class="s1">'/var/lib/dhcp/dhcpd.leases'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">mac</span><span class="p">,</span> <span class="n">lease</span> <span class="ow">in</span> <span class="n">leases</span><span class="o">.</span><span class="n">get_current</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">d</span><span class="o">=</span><span class="p">{</span><span class="s2">"rrsets"</span><span class="p">:[]}</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">lease</span><span class="o">.</span><span class="n">valid</span><span class="p">:</span> <span class="k">continue</span>
<span class="n">ip_addr</span><span class="o">=</span><span class="n">lease</span><span class="o">.</span><span class="n">ip</span>
<span class="k">if</span> <span class="n">lease</span><span class="o">.</span><span class="n">hostname</span><span class="o">!=</span><span class="s2">""</span><span class="p">:</span>
<span class="n">d</span><span class="p">[</span><span class="s1">'rrsets'</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="p">{</span>
<span class="s2">"name"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">lease</span><span class="o">.</span><span class="n">hostname</span><span class="si">}</span><span class="s2">.muh.lan."</span><span class="p">,</span>
<span class="s2">"ttl"</span><span class="p">:</span> <span class="mi">60</span><span class="p">,</span>
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"A"</span><span class="p">,</span>
<span class="s2">"changetype"</span><span class="p">:</span> <span class="s2">"replace"</span><span class="p">,</span>
<span class="s2">"records"</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">"content"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">lease</span><span class="o">.</span><span class="n">ip</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
<span class="s2">"disabled"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">],</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="n">d</span><span class="p">[</span><span class="s1">'rrsets'</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="p">{</span>
<span class="s2">"name"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"mac-</span><span class="si">{</span><span class="n">mac</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">':'</span><span class="p">,</span><span class="s1">''</span><span class="p">)</span><span class="si">}</span><span class="s2">.my.lan."</span><span class="p">,</span>
<span class="s2">"ttl"</span><span class="p">:</span> <span class="mi">60</span><span class="p">,</span>
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"A"</span><span class="p">,</span>
<span class="s2">"changetype"</span><span class="p">:</span> <span class="s2">"replace"</span><span class="p">,</span>
<span class="s2">"records"</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s2">"content"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">lease</span><span class="o">.</span><span class="n">ip</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
<span class="s2">"disabled"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">],</span>
<span class="p">}</span>
<span class="p">)</span>
<span class="n">requests</span><span class="o">.</span><span class="n">patch</span><span class="p">(</span><span class="n">PDNS_API</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">d</span><span class="p">),</span> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="s1">'X-API-Key'</span><span class="p">:</span> <span class="s1">'PASSWORD'</span><span class="p">})</span>
</code></pre></div></td></tr></table></div>
<p>This is not a product, but a proof of concept.</p>
<p>This script runs every few seconds and updates the DNS zone for the local
network.</p>Read temperature on a pi2024-03-17T01:01:01+01:002024-03-17T01:01:01+01:00Sven Ludwigtag:blog.r4w.de,2024-03-17:/read-temp-on-pi.html<p>Wanted to get w1 temp to prometheus via node_exporter</p><p>I had the idea to have my DS1820 read and stored to a prometheus service. In
the past I had a telegraf service running starting some shell script. As
usual the pi and the script died the sd-card death it deserved, so it was time
to have a new implementation.</p>
<p><em><em>Implementations in shell</em></em></p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/bin/sh</span>
cat<span class="w"> </span><span class="nv">$1</span>
</code></pre></div>
<p><em><em>Runtime in shell</em></em></p>
<div class="highlight"><pre><span></span><code><span class="gh">#</span> time ./read_temp.sh /sys/devices/w1_bus_master1/28-011831b1c7ff/temperature
3812
real 0m0.853s
user 0m0.005s
sys 0m0.023s
</code></pre></div>
<p><em><em>Implementations in lua</em></em></p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="cp">#!/usr/bin/lua</span>
<span class="n">file</span> <span class="o">=</span> <span class="nb">io.open</span><span class="p">(</span><span class="n">arg</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s2">"r"</span><span class="p">)</span>
<span class="nb">io.input</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">io.read</span><span class="p">())</span>
<span class="nb">io.close</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
</code></pre></div></td></tr></table></div>
<p><em><em>Runtime in lua</em></em></p>
<div class="highlight"><pre><span></span><code><span class="c"># time ./read_temp.lua /sys/devices/w1_bus_master1/28-011831b1c7ff/temperature</span>
<span class="n">3812</span>
<span class="n">real 0m0.862s</span>
<span class="n">user 0m0.000s</span>
<span class="n">sys 0m0.026s</span>
</code></pre></div>
<p><em><em>Implementations in awk</em></em></p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><code>#!/usr/bin/awk -f
{ print "$1" }
</code></pre></div></td></tr></table></div>
<p><em><em>Runtime in awk</em></em></p>
<div class="highlight"><pre><span></span><code><span class="gh">#</span> time ./read_temp.awk /sys/devices/w1_bus_master1/28-011831b1c7ff/temperature
3750
real 0m0.884s
user 0m0.013s
sys 0m0.012s
</code></pre></div>
<p>Most time is spend reading the sensor, not starting the interpreter. As
personal preference, I go with awk.</p>
<p>After some iterations I ended with the following version. We need to first
have 2 comment lines telling prometheus what the metric is. Next we read the
sensor data and write all sensors to stdout.</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="err">#!</span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">awk</span><span class="w"> </span><span class="o">-</span><span class="n">f</span>
<span class="k">BEGIN</span><span class="w"> </span><span class="err">{</span>
<span class="w"> </span><span class="k">print</span><span class="w"> </span><span class="ss">"# HELP temperature current temperator."</span>
<span class="w"> </span><span class="k">print</span><span class="w"> </span><span class="ss">"# TYPE temperature gauge"</span>
<span class="err">}</span>
<span class="err">{</span>
<span class="w"> </span><span class="n">split</span><span class="p">(</span><span class="n">FILENAME</span><span class="p">,</span><span class="k">array</span><span class="p">,</span><span class="ss">"/"</span><span class="p">)</span>
<span class="w"> </span><span class="n">sensor_id</span><span class="o">=</span><span class="n">length</span><span class="p">(</span><span class="k">array</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="ss">"temperature{sensor=\"</span><span class="o">%</span><span class="n">s</span><span class="err">\</span><span class="ss">"} %s\n"</span><span class="p">,</span><span class="k">array</span><span class="o">[</span><span class="n">sensor_id</span><span class="o">]</span><span class="p">,</span><span class="err">$</span><span class="mi">1</span><span class="o">/</span><span class="mi">1000</span><span class="p">)</span>
<span class="err">}</span>
</code></pre></div></td></tr></table></div>
<p>This is executed periodly via systemd timer every minute and updates the file
read by node_exporter.</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/bin/sh</span>
/usr/local/bin/read_temp.awk<span class="w"> </span><span class="se">\</span>
<span class="w"> </span><span class="k">$(</span>find<span class="w"> </span>/sys/devices/w1_bus_master1<span class="w"> </span>-name<span class="w"> </span>temperature<span class="k">)</span><span class="w"> </span><span class="se">\</span>
<span class="w"> </span>><span class="w"> </span>/var/lib/node_exporter/temperature.prom
</code></pre></div></td></tr></table></div>
<p>This makes reading the temperature easy and even if I add mode sensors it
dynamically extends.</p>
<p><em><em>BUT</em></em></p>
<div class="highlight"><pre><span></span><code><span class="c1"># HELP node_hwmon_temp_celsius Hardware monitor for temperature (input)</span>
<span class="c1"># TYPE node_hwmon_temp_celsius gauge</span>
<span class="n">node_hwmon_temp_celsius</span><span class="p">{</span><span class="n">chip</span><span class="o">=</span><span class="s2">"thermal_thermal_zone0"</span><span class="p">,</span><span class="n">sensor</span><span class="o">=</span><span class="s2">"temp0"</span><span class="p">}</span><span class="w"> </span><span class="mf">34.324</span>
<span class="n">node_hwmon_temp_celsius</span><span class="p">{</span><span class="n">chip</span><span class="o">=</span><span class="s2">"thermal_thermal_zone0"</span><span class="p">,</span><span class="n">sensor</span><span class="o">=</span><span class="s2">"temp1"</span><span class="p">}</span><span class="w"> </span><span class="mf">34.862</span>
<span class="n">node_hwmon_temp_celsius</span><span class="p">{</span><span class="n">chip</span><span class="o">=</span><span class="s2">"w1_bus_master1_28_011831b1c7ff"</span><span class="p">,</span><span class="n">sensor</span><span class="o">=</span><span class="s2">"temp1"</span><span class="p">}</span><span class="w"> </span><span class="mf">11.375</span>
<span class="n">node_hwmon_temp_celsius</span><span class="p">{</span><span class="n">chip</span><span class="o">=</span><span class="s2">"w1_bus_master1_28_0517b24af9ff"</span><span class="p">,</span><span class="n">sensor</span><span class="o">=</span><span class="s2">"temp1"</span><span class="p">}</span><span class="w"> </span><span class="mf">3.0620000000000003</span>
<span class="n">node_textfile_mtime_seconds</span><span class="p">{</span><span class="n">file</span><span class="o">=</span><span class="s2">"/var/spool/node_exporter/temperature.prom"</span><span class="p">}</span><span class="w"> </span><span class="mf">1.710634991e+09</span>
<span class="c1"># HELP node_thermal_zone_temp Zone temperature in Celsius</span>
<span class="c1"># TYPE node_thermal_zone_temp gauge</span>
<span class="n">node_thermal_zone_temp</span><span class="p">{</span><span class="n">type</span><span class="o">=</span><span class="s2">"cpu-thermal"</span><span class="p">,</span><span class="n">zone</span><span class="o">=</span><span class="s2">"0"</span><span class="p">}</span><span class="w"> </span><span class="mf">34.324</span>
<span class="c1"># HELP temperature current temperator.</span>
<span class="c1"># TYPE temperature gauge</span>
<span class="n">temperature</span><span class="p">{</span><span class="n">sensor</span><span class="o">=</span><span class="s2">"28-011831b1c7ff"</span><span class="p">}</span><span class="w"> </span><span class="mf">11.312</span>
<span class="n">temperature</span><span class="p">{</span><span class="n">sensor</span><span class="o">=</span><span class="s2">"28-0517b24af9ff"</span><span class="p">}</span><span class="w"> </span><span class="mf">3.062</span>
</code></pre></div>
<p>It wasn't expected to find an already working read of sensors, as I used the
w1_temp kernel module.</p>So little unix - Fuzix2021-02-24T11:11:11+01:002021-02-24T11:11:11+01:00Sven Ludwigtag:blog.r4w.de,2021-02-24:/fuzix.html<p>Stumbled across this Unix</p><p>Found this. As I am still hasitating with IOT in general as a concept this
seems to be a refreshing way. I'll present to you a unix for IOT:</p>
<p>Homepage: <a href="http://www.fuzix.org/">http://www.fuzix.org/</a>
Orig: <a href="https://github.com/EtchedPixels/FUZIX">https://github.com/EtchedPixels/FUZIX</a>
Fork: <a href="https://github.com/davidgiven/FUZIX/tree/esp8266">https://github.com/davidgiven/FUZIX/tree/esp8266</a></p>
<p>So it's ported to the brand new Raspberry Pico and also to esp8266.</p>
<p><a href="https://www.raspberrypi.org/blog/how-to-get-started-with-fuzix-on-raspberry-pi-pico/">https://www.raspberrypi.org/blog/how-to-get-started-with-fuzix-on-raspberry-pi-pico/</a></p>Rewrite anything in Postfix using Python2020-10-27T21:55:42+01:002020-10-27T21:55:42+01:00Sven Ludwigtag:blog.r4w.de,2020-10-27:/postfix-srs-light-with-python.html<p>How to use Python to do simplified srs in Postfix</p><p>There is always a well working, prepared, documented and good way to solve a
problem. The problem with that is that in the most cases we end up with a rat
tail of components, we cannot install, maintain or want.</p>
<p>The real solution can be found here:</p>
<p><a href="https://dokuwiki.nausch.org/doku.php/centos:mail_c7:spam_11">https://dokuwiki.nausch.org/doku.php/centos:mail_c7:spam_11</a>
<a href="https://github.com/roehling/postsrsd/">https://github.com/roehling/postsrsd/</a></p>
<p>It sounds very simple to implement working srs with Postfix. There is a tool set
to perform this task. My only problem was that it was over engeneered to my
understanding of the problem I found and liked to solve.</p>
<p>Make things easier for me and not for others, was my goal. So simple Python hack
was my choice.</p>
<p>Postfix has a simple communication protocol to have TCP backed maps in place.</p>
<div class="highlight"><pre><span></span><code><span class="err">#</span><span class="w"> </span><span class="nx">Postfix</span><span class="w"> </span><span class="nx">asks</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">it</span>
<span class="p"><</span><span class="w"> </span><span class="nx">get</span><span class="w"> </span><span class="nx">localpart</span><span class="err">@</span><span class="nx">domain</span><span class="p">.</span><span class="nx">com</span>
<span class="err">#</span><span class="w"> </span><span class="nx">You</span><span class="w"> </span><span class="nx">reply</span><span class="w"> </span><span class="nx">with</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">new</span><span class="w"> </span><span class="nx">address</span>
<span class="p">></span><span class="w"> </span><span class="mi">200</span><span class="w"> </span><span class="nx">new</span><span class="o">-</span><span class="nx">localpart</span><span class="err">@</span><span class="nx">domain</span><span class="p">.</span><span class="nx">com</span>
</code></pre></div>
<p>There might also be the case, that you cannot lookup or have an error.</p>
<div class="highlight"><pre><span></span><code><span class="err">#</span><span class="w"> </span><span class="nx">Postfix</span><span class="w"> </span><span class="nx">asks</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">it</span>
<span class="p"><</span><span class="w"> </span><span class="nx">get</span><span class="w"> </span><span class="nx">localpart</span><span class="err">@</span><span class="nx">domain</span><span class="p">.</span><span class="nx">com</span>
<span class="err">#</span><span class="w"> </span><span class="nx">You</span><span class="w"> </span><span class="nx">reply</span><span class="w"> </span><span class="nx">with</span><span class="w"> </span><span class="nx">an</span><span class="w"> </span><span class="nx">error</span><span class="w"> </span><span class="nx">code</span><span class="w"> </span><span class="k">and</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">original</span><span class="w"> </span><span class="nx">address</span>
<span class="p">></span><span class="w"> </span><span class="mi">400</span><span class="w"> </span><span class="nx">localpart</span><span class="err">@</span><span class="nx">domain</span><span class="p">.</span><span class="nx">com</span>
</code></pre></div>
<p>This is simple to implement and with utilizing some other modules like the
hashlib to generate a salted hash it's robust.</p>
<div class="highlight"><pre><span></span><code><span class="sd">"""Server to provide address encoding for simplified SRS"""</span>
<span class="kn">import</span> <span class="nn">SocketServer</span>
<span class="kn">import</span> <span class="nn">hashlib</span><span class="o">,</span> <span class="nn">base64</span>
<span class="n">MY_DOMAIN</span><span class="o">=</span><span class="s1">'example.com'</span>
<span class="n">SECRET</span><span class="o">=</span><span class="s1">'Who does know me?'</span>
<span class="k">class</span> <span class="nc">MyTCPHandler</span><span class="p">(</span><span class="n">SocketServer</span><span class="o">.</span><span class="n">BaseRequestHandler</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'get '</span><span class="p">,</span><span class="s1">''</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">MY_DOMAIN</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'200 </span><span class="si">{0}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">))</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'""'</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'200 </span><span class="si">{0}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">))</span>
<span class="k">if</span> <span class="s1">'@'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'400 </span><span class="si">{0}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">))</span>
<span class="n">d</span><span class="o">=</span><span class="n">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="sa">b</span><span class="s2">"</span><span class="si">{0}{1}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">SECRET</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">))</span><span class="o">.</span><span class="n">digest</span><span class="p">();</span> <span class="n">d</span><span class="o">=</span><span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">d</span><span class="p">);</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'200 </span><span class="si">{0}</span><span class="s1">#</span><span class="si">{1}</span><span class="s1">@</span><span class="si">{2}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'@'</span><span class="p">,</span><span class="s1">'-at-'</span><span class="p">),</span> <span class="n">d</span><span class="p">,</span> <span class="n">MY_DOMAIN</span><span class="p">))</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
<span class="n">HOST</span><span class="p">,</span> <span class="n">PORT</span> <span class="o">=</span> <span class="s2">"localhost"</span><span class="p">,</span> <span class="mi">9999</span>
<span class="n">SocketServer</span><span class="o">.</span><span class="n">TCPServer</span><span class="o">.</span><span class="n">allow_reuse_address</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">SocketServer</span><span class="o">.</span><span class="n">TCPServer</span><span class="p">((</span><span class="n">HOST</span><span class="p">,</span> <span class="n">PORT</span><span class="p">),</span> <span class="n">MyTCPHandler</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
</code></pre></div>
<p>And to convert everything back the following was the way to go.</p>
<div class="highlight"><pre><span></span><code><span class="sd">"""Server to provide address decoding for simplified SRS"""</span>
<span class="kn">import</span> <span class="nn">SocketServer</span>
<span class="kn">import</span> <span class="nn">hashlib</span><span class="o">,</span> <span class="nn">base64</span>
<span class="n">MY_DOMAIN</span><span class="o">=</span><span class="s1">'example.com'</span>
<span class="n">SECRET</span><span class="o">=</span><span class="s1">'Who does know me?'</span>
<span class="k">class</span> <span class="nc">MyTCPHandler</span><span class="p">(</span><span class="n">SocketServer</span><span class="o">.</span><span class="n">BaseRequestHandler</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'get '</span><span class="p">,</span><span class="s1">''</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'@</span><span class="si">{0}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">MY_DOMAIN</span><span class="p">)):</span>
<span class="k">if</span> <span class="s1">'#'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">and</span> <span class="s1">'-at-'</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">:</span>
<span class="n">orig</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'#'</span><span class="p">,</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'-at-'</span><span class="p">,</span><span class="s1">'@'</span><span class="p">)</span>
<span class="n">orighash</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'#'</span><span class="p">,</span><span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'@'</span><span class="p">,</span><span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">d</span><span class="o">=</span><span class="n">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="sa">b</span><span class="s2">"</span><span class="si">{0}{1}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">SECRET</span><span class="p">,</span> <span class="n">orig</span><span class="p">))</span><span class="o">.</span><span class="n">digest</span><span class="p">();</span> <span class="n">d</span><span class="o">=</span><span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">d</span><span class="p">);</span>
<span class="k">if</span> <span class="n">d</span> <span class="o">==</span> <span class="n">orighash</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'200 </span><span class="si">{0}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">orig</span><span class="p">))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'200 </span><span class="si">{0}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'200 </span><span class="si">{0}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">))</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
<span class="n">HOST</span><span class="p">,</span> <span class="n">PORT</span> <span class="o">=</span> <span class="s2">"localhost"</span><span class="p">,</span> <span class="mi">9998</span>
<span class="n">SocketServer</span><span class="o">.</span><span class="n">TCPServer</span><span class="o">.</span><span class="n">allow_reuse_address</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">SocketServer</span><span class="o">.</span><span class="n">TCPServer</span><span class="p">((</span><span class="n">HOST</span><span class="p">,</span> <span class="n">PORT</span><span class="p">),</span> <span class="n">MyTCPHandler</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
</code></pre></div>
<p>In order to make it play nice with Postfix you need to enable the lookup via TCP
socket there.</p>
<div class="highlight"><pre><span></span><code><span class="gh">#</span> main.cf
recipient_canonical_maps = tcp:127.0.0.1:9998
recipient_canonical_classes = envelope_recipient
sender_canonical_maps = tcp:127.0.0.1:9999
sender_canonical_classes = envelope_sender
<span class="gh">#</span> master.cf
smtp inet n - - - - smtpd
-o sender_canonical_maps=tcp:127.0.0.1:9999
-o sender_canonical_classes=envelope_sender
</code></pre></div>
<p>With that the emails are encoded and decoded in and out.</p>How to get your mails back (from a public folder)2019-10-30T16:00:42+01:002019-10-30T16:00:42+01:00Sven Ludwigtag:blog.r4w.de,2019-10-30:/python-download-public-folders.html<p>How to use python exchangelib module to download emails from exchange public folders into eml files.</p><p>You may use this script to get a sub tree of a public folder forest back into
eml format, which then can be imported into other email oriented solutions.
You also may need to change the <code>auth_type</code> for the <code>Configuration</code> object and the
<code>access_type</code> for the <code>Account</code> object. Both may differ in your environment.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Public folder download (c) by Sven Ludwig</span>
<span class="c1"># </span>
<span class="c1"># Public folder download is licensed under a</span>
<span class="c1"># Creative Commons Attribution-ShareAlike 4.0 Unported License.</span>
<span class="c1"># </span>
<span class="c1"># You should have received a copy of the license along with this</span>
<span class="c1"># work. If not, see <http://creativecommons.org/licenses/by-sa/4.0/>.</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">getpass</span>
<span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">from</span> <span class="nn">exchangelib</span> <span class="kn">import</span> <span class="n">Account</span><span class="p">,</span> <span class="n">Folder</span><span class="p">,</span> <span class="n">Credentials</span><span class="p">,</span> <span class="n">Configuration</span><span class="p">,</span> <span class="n">NTLM</span><span class="p">,</span> <span class="n">DELEGATE</span>
<span class="kn">from</span> <span class="nn">exchangelib.protocol</span> <span class="kn">import</span> <span class="n">BaseProtocol</span><span class="p">,</span> <span class="n">NoVerifyHTTPAdapter</span>
<span class="c1"># Tell exchangelib to use this adapter class instead of the default</span>
<span class="n">BaseProtocol</span><span class="o">.</span><span class="n">HTTP_ADAPTER_CLS</span> <span class="o">=</span> <span class="n">NoVerifyHTTPAdapter</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">()</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--server'</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"Server to be contacted"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--account'</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"Account to be used (Email address)"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--path'</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"Path to be dumped"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'--username'</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"Username to be used for authentication"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
<span class="n">args</span><span class="o">=</span><span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">isatty</span><span class="p">():</span>
<span class="k">if</span> <span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o">></span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">)):</span>
<span class="k">def</span> <span class="nf">getInput</span><span class="p">(</span><span class="n">description</span><span class="p">,</span> <span class="n">parser</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="n">parser</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">parser</span>
<span class="k">if</span> <span class="n">password</span><span class="p">:</span>
<span class="k">return</span> <span class="n">getpass</span><span class="o">.</span><span class="n">getpass</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">input</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">getInput</span><span class="p">(</span><span class="n">description</span><span class="p">,</span> <span class="n">parser</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="n">parser</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">parser</span>
<span class="k">if</span> <span class="n">password</span><span class="p">:</span>
<span class="k">return</span> <span class="n">getpass</span><span class="o">.</span><span class="n">getpass</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
<span class="k">return</span> <span class="n">raw_input</span><span class="p">(</span><span class="n">description</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">getInput</span><span class="p">(</span><span class="n">description</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">return</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Enter basic configuration"</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"===================================================================="</span><span class="p">)</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">getInput</span><span class="p">(</span><span class="s2">"Server (exchange.example.com): "</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">server</span><span class="p">)</span>
<span class="n">account</span> <span class="o">=</span> <span class="n">getInput</span><span class="p">(</span><span class="s2">"Account (name.surname@exam.pl): "</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">account</span><span class="p">)</span>
<span class="n">path</span> <span class="o">=</span> <span class="n">getInput</span><span class="p">(</span><span class="s2">"Path (a/b/c): "</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">path</span><span class="p">)</span>
<span class="n">username</span> <span class="o">=</span> <span class="n">getInput</span><span class="p">(</span><span class="s2">"Username: "</span><span class="p">,</span> <span class="n">args</span><span class="o">.</span><span class="n">username</span><span class="p">)</span>
<span class="n">password</span> <span class="o">=</span> <span class="n">getInput</span><span class="p">(</span><span class="s2">"Password: "</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
<span class="nb">print</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Aborted"</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">credentials</span> <span class="o">=</span> <span class="n">Credentials</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">Configuration</span><span class="p">(</span><span class="n">server</span><span class="o">=</span><span class="n">server</span><span class="p">,</span> <span class="n">credentials</span><span class="o">=</span><span class="n">credentials</span><span class="p">,</span><span class="n">auth_type</span><span class="o">=</span><span class="n">NTLM</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">Account</span><span class="p">(</span><span class="n">account</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="n">config</span><span class="p">,</span> <span class="n">autodiscover</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">access_type</span><span class="o">=</span><span class="n">DELEGATE</span><span class="p">)</span>
<span class="n">a</span><span class="o">.</span><span class="n">root</span><span class="o">.</span><span class="n">refresh</span><span class="p">()</span>
<span class="n">a</span><span class="o">.</span><span class="n">public_folders_root</span><span class="o">.</span><span class="n">refresh</span><span class="p">()</span>
<span class="n">current_folder</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">public_folders_root</span>
<span class="k">for</span> <span class="n">subdir</span> <span class="ow">in</span> <span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">):</span>
<span class="k">if</span> <span class="n">subdir</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">==</span> <span class="s1">''</span><span class="p">:</span> <span class="k">continue</span>
<span class="n">current_folder</span> <span class="o">=</span> <span class="n">current_folder</span> <span class="o">/</span> <span class="n">subdir</span>
<span class="n">paths</span><span class="o">=</span><span class="p">[</span><span class="n">current_folder</span><span class="p">]</span>
<span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">current_folder</span><span class="o">.</span><span class="n">walk</span><span class="p">():</span>
<span class="n">path</span><span class="o">.</span><span class="n">refresh</span><span class="p">()</span>
<span class="n">paths</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">absolute</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">total_count</span><span class="p">)</span>
<span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">paths</span><span class="p">:</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">path</span><span class="o">.</span><span class="n">all</span><span class="p">()</span><span class="o">.</span><span class="n">iterator</span><span class="p">():</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'</span><span class="si">{0}</span><span class="s1">-</span><span class="si">{1}</span><span class="s1">.eml'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">path</span><span class="o">.</span><span class="n">absolute</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'/'</span><span class="p">,</span><span class="s1">'_'</span><span class="p">),</span> <span class="n">item</span><span class="o">.</span><span class="n">message_id</span><span class="p">),</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">mime_content</span><span class="p">)</span>
</code></pre></div>FRITZ!Box as a slave2019-04-15T19:42:05+02:002019-04-15T19:42:05+02:00Sven Ludwigtag:blog.r4w.de,2019-04-15:/firtzbox-as-a-slave.html<p>How to connect a FRITZ!Box as a client to an asterisk 1.15.x+ with pjsip</p><h3>Getting the FRITZ!Box to be a client</h3>
<p>First after reseting your FRITZ!Box to factory defaults you have to configure
an internet uplink. Therefor you go to Internet > Zugangdaten and choose</p>
<div class="highlight"><pre><span></span><code>Internetanbieter
Wählen Sie Ihren Internetanbieter aus.
Internetanbieter 1.: Weitere Internetanbieter
Internetanbieter 2.: Anderer Internetanbieter
Name: $NAME
</code></pre></div>
<p>It's import to check the following flags to enable IP-Client-Mode.</p>
<div class="highlight"><pre><span></span><code>Anschluss an externes Modem oder Router
Wählen Sie diesen Zugang, wenn die FRITZ!Box über "LAN 1" an ein bereits vorhandenes externes Modem oder einen Router angeschlossen ist.
</code></pre></div>
<p>And of course the IP-Client-Mode itself.</p>
<div class="highlight"><pre><span></span><code>Vorhandene Internetverbindung mitbenutzen (IP-Client-Modus)
Die FRITZ!Box wird Teil des vorhandenen Netzwerkes und übernimmt diesen IP-Adressbereich. Die Firewall der FRITZ!Box wird dabei deaktiviert.
</code></pre></div>
<p>The import thing is that the fritzbox not disabled it's firewall making the
interaction within the nextwork less annoying and complex.</p>
<p>You also should specify the up and downstream according to your LAN speed.</p>
<h3>Make it a slave</h3>
<p>If you like to use a FRITZ!Box as a asterisk client you have to register it to
your asterisk server. Therefor you have to navigate into the telephony settings
menu and add another callid.</p>
<div class="highlight"><pre><span></span><code>Wählen Sie Ihren Telefonie-Anbieter aus und tragen Sie die Rufnummer und die Ihnen mitgeteilten Anmeldedaten ein.
Telefonie-Anbieter:
Rufnummer für die Anmeldung: 50
Interne Rufnummer in der FRITZ!Box: 50
Zugangsdaten
Benutzername: 50
Kennwort: **
Registrar: asterisk.my.net
</code></pre></div>
<p>Simple as that you can have it be a client to an asterisk.</p>
<h3>Smart numbering</h3>
<p>You should add N+1 numbers to the FRITZ!Box following the very same
configuration path.</p>
<p>N is the number of telephones manages by the FRITZ!Box (3 in my case) and the
additional number is for group calling. This makes it possible to always have
all phones ring at the same time for an incoming call without addressing them
individually. Less hassle when implementing Dial commands in asterisk.</p>
<p>All phones registered hook onto their individual number and the group call
number.</p>They said it's simple2019-04-13T13:13:13+02:002019-04-13T13:13:13+02:00Sven Ludwigtag:blog.r4w.de,2019-04-13:/pjsip-and-phones-with-sms.html<p>How to enable internal text communication using ip-telephones connected with pjsip to an asterisk 15.x+ to send and receive SMS locally.</p><p>And they said it's going to be simple.</p>
<h3>Why?</h3>
<p>It's kind of cool having SMS. Texts can be more then thousand words. But in the
specific case we're dealing with at least 250 chars of pure message transport
which may be useful.</p>
<h3>How?</h3>
<p>In order to enable SMS, we have to add a message context to our basic macros,
which are used to configure the phones</p>
<div class="highlight"><pre><span></span><code><span class="na">[phone_endpoint_macro](!)</span>
<span class="na">type</span><span class="o">=</span><span class="s">endpoint</span>
<span class="na">transport</span><span class="o">=</span><span class="s">transport-udp</span>
<span class="na">context</span><span class="o">=</span><span class="s">internalsip</span>
<span class="na">disallow</span><span class="o">=</span><span class="s">all</span>
<span class="na">allow</span><span class="o">=</span><span class="s">g722</span>
<span class="na">allow</span><span class="o">=</span><span class="s">alaw</span>
<span class="na">message_context</span><span class="o">=</span><span class="s">messages</span><span class="w"> </span><span class="c1">## new line</span>
</code></pre></div>
<h3>Auth failed</h3>
<p>The first tries ended (again) with auth failes, but as the traning of the last
pjsip and asterisk experience helped to understand the product, it was simple.</p>
<div class="highlight"><pre><span></span><code><span class="mi">2019</span><span class="mo">-04</span><span class="mi">-15</span><span class="n">T23</span><span class="o">:</span><span class="mi">47</span><span class="o">:</span><span class="mf">47.375293</span><span class="o">+</span><span class="mo">02</span><span class="o">:</span><span class="mo">00</span><span class="w"> </span><span class="n">asterisk</span><span class="w"> </span><span class="n">asterisk</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">:</span><span class="w"> </span><span class="n">NOTICE</span><span class="p">[</span><span class="mi">295</span><span class="p">]</span><span class="o">:</span><span class="w"> </span><span class="n">res_pjsip</span><span class="o">/</span><span class="n">pjsip_distributor</span><span class="p">.</span><span class="n">c</span><span class="o">:</span><span class="mi">676</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">log_failed_request</span><span class="o">:</span><span class="w"> </span><span class="n">Request</span><span class="w"> </span><span class="err">'</span><span class="n">MESSAGE</span><span class="err">'</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="err">'</span><span class="o"><</span><span class="n">sip</span><span class="o">:</span><span class="mi">11</span><span class="p">@</span><span class="n">asterisk</span><span class="p">.</span><span class="n">my</span><span class="p">.</span><span class="n">net</span><span class="o">></span><span class="err">'</span><span class="w"> </span><span class="n">failed</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="err">'</span><span class="mf">10.11.12.89</span><span class="o">:</span><span class="mi">5062</span><span class="err">'</span><span class="w"> </span><span class="p">(</span><span class="n">callid</span><span class="o">:</span><span class="w"> </span><span class="mi">3342885942</span><span class="mf">@10.11.12.89</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">No</span><span class="w"> </span><span class="n">matching</span><span class="w"> </span><span class="n">endpoint</span><span class="w"> </span><span class="n">found</span>
<span class="mi">2019</span><span class="mo">-04</span><span class="mi">-15</span><span class="n">T23</span><span class="o">:</span><span class="mi">47</span><span class="o">:</span><span class="mf">47.378077</span><span class="o">+</span><span class="mo">02</span><span class="o">:</span><span class="mo">00</span><span class="w"> </span><span class="n">asterisk</span><span class="w"> </span><span class="n">asterisk</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">:</span><span class="w"> </span><span class="n">NOTICE</span><span class="p">[</span><span class="mi">295</span><span class="p">]</span><span class="o">:</span><span class="w"> </span><span class="n">res_pjsip</span><span class="o">/</span><span class="n">pjsip_distributor</span><span class="p">.</span><span class="n">c</span><span class="o">:</span><span class="mi">676</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">log_failed_request</span><span class="o">:</span><span class="w"> </span><span class="n">Request</span><span class="w"> </span><span class="err">'</span><span class="n">MESSAGE</span><span class="err">'</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="err">'</span><span class="o"><</span><span class="n">sip</span><span class="o">:</span><span class="mi">11</span><span class="p">@</span><span class="n">asterisk</span><span class="p">.</span><span class="n">my</span><span class="p">.</span><span class="n">net</span><span class="o">></span><span class="err">'</span><span class="w"> </span><span class="n">failed</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="err">'</span><span class="mf">10.11.12.89</span><span class="o">:</span><span class="mi">5062</span><span class="err">'</span><span class="w"> </span><span class="p">(</span><span class="n">callid</span><span class="o">:</span><span class="w"> </span><span class="mi">3342885942</span><span class="mf">@10.11.12.89</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Failed</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">authenticate</span>
</code></pre></div>
<p>You have to enable history. History is what makes future generation better
then the current one, as the could learn from us and do not redo our faults.
Yes - this is theoretically true. In this case we could learn and see how
this works by issuing <code>pjsip set history on</code> into the asterisk console.</p>
<p>Looking into the history helped understanding that the <code>Contact:</code> header is not
present in a sip <code>MESSAGE</code> message. I needed another way to identify the phones.
The <code>From:</code> header appears to be a better choice.</p>
<div class="highlight"><pre><span></span><code><span class="k">[11_message]</span>
<span class="na">type</span><span class="o">=</span><span class="s">identify</span>
<span class="na">endpoint</span><span class="o">=</span><span class="s">phone_11</span>
<span class="na">match_header</span><span class="o">=</span><span class="s">From:/11@/</span>
</code></pre></div>
<p>This introduced the <code>XY_message</code> node to all configs, where XY is the number of
the phone.</p>
<h3>Adding identifier leads to working SMS</h3>
<p>Complete conversation when working.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># pjsip set history on</span>
...
<span class="c1"># pjsip show history</span>
No.<span class="w"> </span>Timestamp<span class="w"> </span><span class="o">(</span>Dir<span class="o">)</span><span class="w"> </span>Address<span class="w"> </span>SIP<span class="w"> </span><span class="nv">Message</span>
<span class="o">=====</span><span class="w"> </span><span class="o">==========</span><span class="w"> </span><span class="o">==============================</span><span class="w"> </span><span class="o">===================================</span>
<span class="m">00000</span><span class="w"> </span><span class="m">1555366967</span><span class="w"> </span>*<span class="w"> </span><<span class="o">==</span><span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>MESSAGE<span class="w"> </span>sip:*11@asterisk.my.net<span class="w"> </span>SIP/2.0
<span class="m">00001</span><span class="w"> </span><span class="m">1555366967</span><span class="w"> </span>*<span class="w"> </span><span class="o">==</span>><span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>SIP/2.0<span class="w"> </span><span class="m">401</span><span class="w"> </span>Unauthorized
<span class="m">00002</span><span class="w"> </span><span class="m">1555366967</span><span class="w"> </span>*<span class="w"> </span><<span class="o">==</span><span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>MESSAGE<span class="w"> </span>sip:*11@asterisk.my.net<span class="w"> </span>SIP/2.0
<span class="m">00003</span><span class="w"> </span><span class="m">1555366967</span><span class="w"> </span>*<span class="w"> </span><span class="o">==</span>><span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>SIP/2.0<span class="w"> </span><span class="m">415</span><span class="w"> </span>Unsupported<span class="w"> </span>Media<span class="w"> </span>Type
<span class="m">00004</span><span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>*<span class="w"> </span><<span class="o">==</span><span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>MESSAGE<span class="w"> </span>sip:*11@asterisk.my.net<span class="w"> </span>SIP/2.0
<span class="m">00005</span><span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>*<span class="w"> </span><span class="o">==</span>><span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>SIP/2.0<span class="w"> </span><span class="m">401</span><span class="w"> </span>Unauthorized
<span class="m">00006</span><span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>*<span class="w"> </span><<span class="o">==</span><span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>MESSAGE<span class="w"> </span>sip:*11@asterisk.my.net<span class="w"> </span>SIP/2.0
<span class="m">00007</span><span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>*<span class="w"> </span><span class="o">==</span>><span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>SIP/2.0<span class="w"> </span><span class="m">202</span><span class="w"> </span>Accepted
<span class="m">00008</span><span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>*<span class="w"> </span><span class="o">==</span>><span class="w"> </span><span class="m">10</span>.11.12.89:5062<span class="w"> </span>MESSAGE<span class="w"> </span>sip:11@10.11.12.89:5062<span class="w"> </span>SIP/2.0
<span class="m">00009</span><span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>*<span class="w"> </span><<span class="o">==</span><span class="w"> </span><span class="m">10</span>.11.12.89:5062<span class="w"> </span>SIP/2.0<span class="w"> </span><span class="m">200</span><span class="w"> </span>OK
<span class="c1"># pjsip show history entry 1</span>
<---<span class="w"> </span>History<span class="w"> </span>Entry<span class="w"> </span><span class="m">1</span><span class="w"> </span>Sent<span class="w"> </span>to<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>at<span class="w"> </span><span class="m">1555366967</span><span class="w"> </span>--->
SIP/2.0<span class="w"> </span><span class="m">401</span><span class="w"> </span>Unauthorized
Via:<span class="w"> </span>SIP/2.0/UDP<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="p">;</span><span class="nv">rport</span><span class="o">=</span><span class="m">5060</span><span class="p">;</span><span class="nv">received</span><span class="o">=</span><span class="m">10</span>.11.12.211<span class="p">;</span><span class="nv">branch</span><span class="o">=</span>z9hG4bK.Bn3J-uxme
Call-ID:<span class="w"> </span>zVm0LoNRCI
From:<span class="w"> </span><span class="s2">"21"</span><span class="w"> </span><sip:21@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>mcK7gvg3V
To:<span class="w"> </span><sip:*11@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>z9hG4bK.Bn3J-uxme
CSeq:<span class="w"> </span><span class="m">20</span><span class="w"> </span>MESSAGE
WWW-Authenticate:<span class="w"> </span>Digest<span class="w"> </span><span class="nv">realm</span><span class="o">=</span><span class="s2">"asterisk.my.net"</span>,nonce<span class="o">=</span><span class="s2">"***"</span>,opaque<span class="o">=</span><span class="s2">"***"</span>,algorithm<span class="o">=</span>md5,qop<span class="o">=</span><span class="s2">"auth"</span>
Server:<span class="w"> </span>Asterisk<span class="w"> </span>PBX<span class="w"> </span><span class="m">15</span>.x.y
Content-Length:<span class="w"> </span><span class="m">0</span>
<span class="c1"># pjsip show history entry 2</span>
<---<span class="w"> </span>History<span class="w"> </span>Entry<span class="w"> </span><span class="m">2</span><span class="w"> </span>Received<span class="w"> </span>from<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>at<span class="w"> </span><span class="m">1555366967</span><span class="w"> </span>--->
MESSAGE<span class="w"> </span>sip:*11@asterisk.my.net<span class="w"> </span>SIP/2.0
Via:<span class="w"> </span>SIP/2.0/UDP<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="p">;</span><span class="nv">rport</span><span class="o">=</span><span class="m">5060</span><span class="p">;</span><span class="nv">received</span><span class="o">=</span><span class="m">10</span>.11.12.211<span class="p">;</span><span class="nv">branch</span><span class="o">=</span>z9hG4bK.et~mbbgxr
From:<span class="w"> </span><span class="s2">"21"</span><span class="w"> </span><sip:21@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>mcK7gvg3V
To:<span class="w"> </span><sip:*11@asterisk.my.net>
CSeq:<span class="w"> </span><span class="m">21</span><span class="w"> </span>MESSAGE
Call-ID:<span class="w"> </span>zVm0LoNRCI
Max-Forwards:<span class="w"> </span><span class="m">70</span>
Supported:<span class="w"> </span>replaces,<span class="w"> </span>outbound
Content-Type:<span class="w"> </span>application/im-iscomposing+xml
Content-Length:<span class="w"> </span><span class="m">282</span>
Date:<span class="w"> </span>Mon,<span class="w"> </span><span class="m">15</span><span class="w"> </span>Apr<span class="w"> </span><span class="m">2019</span><span class="w"> </span><span class="m">22</span>:22:47<span class="w"> </span>GMT
User-Agent:<span class="w"> </span>Linphone<span class="w"> </span>Desktop
Authorization:<span class="w"> </span>Digest<span class="w"> </span><span class="nv">username</span><span class="o">=</span><span class="s2">"21"</span>,<span class="w"> </span><span class="nv">realm</span><span class="o">=</span><span class="s2">"asterisk.my.net"</span>,<span class="w"> </span><span class="nv">nonce</span><span class="o">=</span><span class="s2">"***"</span>,<span class="w"> </span><span class="nv">uri</span><span class="o">=</span><span class="s2">"sip:*11@asterisk.my.net"</span>,<span class="w"> </span><span class="nv">response</span><span class="o">=</span><span class="s2">"***"</span>,<span class="w"> </span><span class="nv">algorithm</span><span class="o">=</span>md5,<span class="w"> </span><span class="nv">cnonce</span><span class="o">=</span><span class="s2">"***"</span>,<span class="w"> </span><span class="nv">opaque</span><span class="o">=</span><span class="s2">"***"</span>,<span class="w"> </span><span class="nv">qop</span><span class="o">=</span>auth,<span class="w"> </span><span class="nv">nc</span><span class="o">=</span><span class="m">00000001</span>
Content-Type:<span class="w"> </span>application/im-iscomposing+xml
Content-Length:<span class="w"> </span><span class="m">282</span>
<?xml<span class="w"> </span><span class="nv">version</span><span class="o">=</span><span class="s2">"1.0"</span><span class="w"> </span><span class="nv">encoding</span><span class="o">=</span><span class="s2">"UTF-8"</span>?>
<isComposing<span class="w"> </span>xmlns:xsi<span class="o">=</span><span class="s2">"http://www.w3.org/2001/XMLSchema-instance"</span><span class="w"> </span>xsi:schemaLocation<span class="o">=</span><span class="s2">"urn:ietf:params:xml:ns:im-composing iscomposing.xsd"</span><span class="w"> </span><span class="nv">xmlns</span><span class="o">=</span><span class="s2">"urn:ietf:params:xml:ns:im-iscomposing"</span>><state>active</state><refresh>60</refresh></isComposing>
<span class="c1"># pjsip show history entry 3</span>
<---<span class="w"> </span>History<span class="w"> </span>Entry<span class="w"> </span><span class="m">3</span><span class="w"> </span>Sent<span class="w"> </span>to<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>at<span class="w"> </span><span class="m">1555366967</span><span class="w"> </span>--->
SIP/2.0<span class="w"> </span><span class="m">415</span><span class="w"> </span>Unsupported<span class="w"> </span>Media<span class="w"> </span>Type
Via:<span class="w"> </span>SIP/2.0/UDP<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="p">;</span><span class="nv">rport</span><span class="o">=</span><span class="m">5060</span><span class="p">;</span><span class="nv">received</span><span class="o">=</span><span class="m">10</span>.11.12.211<span class="p">;</span><span class="nv">branch</span><span class="o">=</span>z9hG4bK.et~mbbgxr
Call-ID:<span class="w"> </span>zVm0LoNRCI
From:<span class="w"> </span><span class="s2">"21"</span><span class="w"> </span><sip:21@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>mcK7gvg3V
To:<span class="w"> </span><sip:*11@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>z9hG4bK.et~mbbgxr
CSeq:<span class="w"> </span><span class="m">21</span><span class="w"> </span>MESSAGE
Server:<span class="w"> </span>Asterisk<span class="w"> </span>PBX<span class="w"> </span><span class="m">15</span>.x.y
Content-Length:<span class="w"> </span><span class="m">0</span>
<span class="c1"># pjsip show history entry 4</span>
<---<span class="w"> </span>History<span class="w"> </span>Entry<span class="w"> </span><span class="m">4</span><span class="w"> </span>Received<span class="w"> </span>from<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>at<span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>--->
MESSAGE<span class="w"> </span>sip:*11@asterisk.my.net<span class="w"> </span>SIP/2.0
Via:<span class="w"> </span>SIP/2.0/UDP<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="p">;</span><span class="nv">rport</span><span class="o">=</span><span class="m">5060</span><span class="p">;</span><span class="nv">received</span><span class="o">=</span><span class="m">10</span>.11.12.211<span class="p">;</span><span class="nv">branch</span><span class="o">=</span>z9hG4bK.OXdrC2BlC
From:<span class="w"> </span><span class="s2">"21"</span><span class="w"> </span><sip:21@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>T2noKmvzC
To:<span class="w"> </span><sip:*11@asterisk.my.net>
CSeq:<span class="w"> </span><span class="m">20</span><span class="w"> </span>MESSAGE
Call-ID:<span class="w"> </span>i4jsoh30d8
Max-Forwards:<span class="w"> </span><span class="m">70</span>
Supported:<span class="w"> </span>replaces,<span class="w"> </span>outbound
Content-Type:<span class="w"> </span>text/plain
Content-Length:<span class="w"> </span><span class="m">4</span>
Date:<span class="w"> </span>Mon,<span class="w"> </span><span class="m">15</span><span class="w"> </span>Apr<span class="w"> </span><span class="m">2019</span><span class="w"> </span><span class="m">22</span>:22:48<span class="w"> </span>GMT
User-Agent:<span class="w"> </span>Linphone<span class="w"> </span>Desktop
Content-Type:<span class="w"> </span>text/plain
Content-Length:<span class="w"> </span><span class="m">4</span>
<span class="nb">test</span>
<span class="c1"># pjsip show history entry 5</span>
<---<span class="w"> </span>History<span class="w"> </span>Entry<span class="w"> </span><span class="m">5</span><span class="w"> </span>Sent<span class="w"> </span>to<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>at<span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>--->
SIP/2.0<span class="w"> </span><span class="m">401</span><span class="w"> </span>Unauthorized
Via:<span class="w"> </span>SIP/2.0/UDP<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="p">;</span><span class="nv">rport</span><span class="o">=</span><span class="m">5060</span><span class="p">;</span><span class="nv">received</span><span class="o">=</span><span class="m">10</span>.11.12.211<span class="p">;</span><span class="nv">branch</span><span class="o">=</span>z9hG4bK.OXdrC2BlC
Call-ID:<span class="w"> </span>i4jsoh30d8
From:<span class="w"> </span><span class="s2">"21"</span><span class="w"> </span><sip:21@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>T2noKmvzC
To:<span class="w"> </span><sip:*11@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>z9hG4bK.OXdrC2BlC
CSeq:<span class="w"> </span><span class="m">20</span><span class="w"> </span>MESSAGE
WWW-Authenticate:<span class="w"> </span>Digest<span class="w"> </span><span class="nv">realm</span><span class="o">=</span><span class="s2">"asterisk.my.net"</span>,nonce<span class="o">=</span><span class="s2">"***"</span>,opaque<span class="o">=</span><span class="s2">"***"</span>,algorithm<span class="o">=</span>md5,qop<span class="o">=</span><span class="s2">"auth"</span>
Server:<span class="w"> </span>Asterisk<span class="w"> </span>PBX<span class="w"> </span><span class="m">15</span>.x.y
Content-Length:<span class="w"> </span><span class="m">0</span>
<span class="c1"># pjsip show history entry 6</span>
<---<span class="w"> </span>History<span class="w"> </span>Entry<span class="w"> </span><span class="m">6</span><span class="w"> </span>Received<span class="w"> </span>from<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>at<span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>--->
MESSAGE<span class="w"> </span>sip:*11@asterisk.my.net<span class="w"> </span>SIP/2.0
Via:<span class="w"> </span>SIP/2.0/UDP<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="p">;</span><span class="nv">rport</span><span class="o">=</span><span class="m">5060</span><span class="p">;</span><span class="nv">received</span><span class="o">=</span><span class="m">10</span>.11.12.211<span class="p">;</span><span class="nv">branch</span><span class="o">=</span>z9hG4bK.mrgpt9CoH
From:<span class="w"> </span><span class="s2">"21"</span><span class="w"> </span><sip:21@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>T2noKmvzC
To:<span class="w"> </span><sip:*11@asterisk.my.net>
CSeq:<span class="w"> </span><span class="m">21</span><span class="w"> </span>MESSAGE
Call-ID:<span class="w"> </span>i4jsoh30d8
Max-Forwards:<span class="w"> </span><span class="m">70</span>
Supported:<span class="w"> </span>replaces,<span class="w"> </span>outbound
Content-Type:<span class="w"> </span>text/plain
Content-Length:<span class="w"> </span><span class="m">4</span>
Date:<span class="w"> </span>Mon,<span class="w"> </span><span class="m">15</span><span class="w"> </span>Apr<span class="w"> </span><span class="m">2019</span><span class="w"> </span><span class="m">22</span>:22:48<span class="w"> </span>GMT
User-Agent:<span class="w"> </span>Linphone<span class="w"> </span>Desktop
Authorization:<span class="w"> </span>Digest<span class="w"> </span><span class="nv">username</span><span class="o">=</span><span class="s2">"21"</span>,<span class="w"> </span><span class="nv">realm</span><span class="o">=</span><span class="s2">"asterisk.my.net"</span>,<span class="w"> </span><span class="nv">nonce</span><span class="o">=</span><span class="s2">"***"</span>,<span class="w"> </span><span class="nv">uri</span><span class="o">=</span><span class="s2">"sip:*11@asterisk.my.net"</span>,<span class="w"> </span><span class="nv">response</span><span class="o">=</span><span class="s2">"***"</span>,<span class="w"> </span><span class="nv">algorithm</span><span class="o">=</span>md5,<span class="w"> </span><span class="nv">cnonce</span><span class="o">=</span><span class="s2">"***"</span>,<span class="w"> </span><span class="nv">opaque</span><span class="o">=</span><span class="s2">"***"</span>,<span class="w"> </span><span class="nv">qop</span><span class="o">=</span>auth,<span class="w"> </span><span class="nv">nc</span><span class="o">=</span><span class="m">00000001</span>
Content-Type:<span class="w"> </span>text/plain
Content-Length:<span class="w"> </span><span class="m">4</span>
<span class="nb">test</span>
<span class="c1"># pjsip show history entry 7</span>
<---<span class="w"> </span>History<span class="w"> </span>Entry<span class="w"> </span><span class="m">7</span><span class="w"> </span>Sent<span class="w"> </span>to<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="w"> </span>at<span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>--->
SIP/2.0<span class="w"> </span><span class="m">202</span><span class="w"> </span>Accepted
Via:<span class="w"> </span>SIP/2.0/UDP<span class="w"> </span><span class="m">10</span>.11.12.211:5060<span class="p">;</span><span class="nv">rport</span><span class="o">=</span><span class="m">5060</span><span class="p">;</span><span class="nv">received</span><span class="o">=</span><span class="m">10</span>.11.12.211<span class="p">;</span><span class="nv">branch</span><span class="o">=</span>z9hG4bK.mrgpt9CoH
Call-ID:<span class="w"> </span>i4jsoh30d8
From:<span class="w"> </span><span class="s2">"21"</span><span class="w"> </span><sip:21@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>T2noKmvzC
To:<span class="w"> </span><sip:*11@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>z9hG4bK.mrgpt9CoH
CSeq:<span class="w"> </span><span class="m">21</span><span class="w"> </span>MESSAGE
Server:<span class="w"> </span>Asterisk<span class="w"> </span>PBX<span class="w"> </span><span class="m">15</span>.x.y
Content-Length:<span class="w"> </span><span class="m">0</span>
<span class="c1"># pjsip show history entry 8</span>
<---<span class="w"> </span>History<span class="w"> </span>Entry<span class="w"> </span><span class="m">8</span><span class="w"> </span>Sent<span class="w"> </span>to<span class="w"> </span><span class="m">10</span>.11.12.89:5062<span class="w"> </span>at<span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>--->
MESSAGE<span class="w"> </span>sip:11@10.11.12.89:5062<span class="w"> </span>SIP/2.0
Via:<span class="w"> </span>SIP/2.0/UDP<span class="w"> </span><span class="m">10</span>.11.12.241:5060<span class="p">;</span>rport<span class="p">;</span><span class="nv">branch</span><span class="o">=</span>z9hG4bKPj91c83cc2-0cce-46ff-9c5c-c08727ca9376
From:<span class="w"> </span><sip:*21@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>80050dc3-95e3-4cf7-8e4e-739a526b89d9
To:<span class="w"> </span><sip:11@10.11.12.89>
Contact:<span class="w"> </span><sip:phone_11@10.11.12.241:5060>
Call-ID:<span class="w"> </span>63b9b56e-d07f-42c1-aaa2-5ef7b928897e
CSeq:<span class="w"> </span><span class="m">35588</span><span class="w"> </span>MESSAGE
Max-Forwards:<span class="w"> </span><span class="m">70</span>
User-Agent:<span class="w"> </span>Asterisk<span class="w"> </span>PBX<span class="w"> </span><span class="m">15</span>.x.y
Content-Type:<span class="w"> </span>text/plain
Content-Length:<span class="w"> </span><span class="m">4</span>
<span class="nb">test</span>
<span class="c1"># pjsip show history entry 9</span>
<---<span class="w"> </span>History<span class="w"> </span>Entry<span class="w"> </span><span class="m">9</span><span class="w"> </span>Received<span class="w"> </span>from<span class="w"> </span><span class="m">10</span>.11.12.89:5062<span class="w"> </span>at<span class="w"> </span><span class="m">1555366968</span><span class="w"> </span>--->
SIP/2.0<span class="w"> </span><span class="m">200</span><span class="w"> </span>OK
Via:<span class="w"> </span>SIP/2.0/UDP<span class="w"> </span><span class="m">10</span>.11.12.241:5060<span class="p">;</span>rport<span class="p">;</span><span class="nv">branch</span><span class="o">=</span>z9hG4bKPj91c83cc2-0cce-46ff-9c5c-c08727ca9376
From:<span class="w"> </span><sip:*21@asterisk.my.net><span class="p">;</span><span class="nv">tag</span><span class="o">=</span>80050dc3-95e3-4cf7-8e4e-739a526b89d9
To:<span class="w"> </span><sip:11@10.11.12.89><span class="p">;</span><span class="nv">tag</span><span class="o">=</span><span class="m">1461608579</span>
Call-ID:<span class="w"> </span>63b9b56e-d07f-42c1-aaa2-5ef7b928897e
CSeq:<span class="w"> </span><span class="m">35588</span><span class="w"> </span>MESSAGE
User-Agent:<span class="w"> </span>Yealink
Content-Length:<span class="w"> </span><span class="m">0</span>
Content-Length:<span class="w"> </span><span class="m">0</span>
</code></pre></div>
<h3>Route it</h3>
<p>One problem less is that after fixing the authentication asterisk automatically
receives the message and put's the data into the specified context. There you
can route it towards it's destination. Because I used <code>*</code> and <code>#</code> for internal
numbers I have to do some magic in oder to push the message correctly out.</p>
<div class="highlight"><pre><span></span><code><span class="k">[messages]</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,1,NoOp(SMS receiving dialplan invoked)</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,NoOp(To ${MESSAGE(to)})</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,NoOp(From ${MESSAGE(from)})</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,NoOp(Body ${MESSAGE(body)})</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,Set(ACTUALTO=${CUT(MESSAGE(to),@,1)})</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,Set(ME_1=${CUT(MESSAGE(from),< ,2)})</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,Set(ACTUALFROM=${CUT(ME_1,@,1)})</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,MessageSend(pjsip:phone_${ACTUALTO:7},*${ACTUALFROM:4}@asterisk.my.net)</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,NoOp(Send status is ${MESSAGE_SEND_STATUS})</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,GotoIf($["${MESSAGE_SEND_STATUS}" != "SUCCESS"]?sendfailedmsg)</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,Hangup()</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n(sendfailedmsg),Set(MESSAGE(body)="${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}] Your message to ${EXTEN} has failed. Retry later.")</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,MessageSend(pjsip:phone_${ACTUALFROM:4},ServiceCenter)</span>
<span class="na">exten</span><span class="w"> </span><span class="o">=</span><span class="s">> _.,n,Hangup()</span>
</code></pre></div>
<p>It still may happen that the message cannot be delivered. The success message
you receive at this point is not 100% certain. For example if a phone isn't
available at this moment. The message get's put into an delivery queue. This
is marked as success. If it does not make it out of the queue, it's silently
deleted.</p>
<p>Perhaps there is a way to put that also into an extension routing advice.</p>pjsip and the phones2019-03-27T01:00:00+01:002019-03-27T01:00:00+01:00Sven Ludwigtag:blog.r4w.de,2019-03-27:/pjsip-and-phones.html<p>How to connect ip-telephones with pjsip to an asterisk 15.x+</p><p>You have to have phones to enable people to call each other.</p>
<h3>Why to have more then one phone</h3>
<p>If you have multiple rooms, you may want to have multiple phones too. This is
not complicated in theorie, but can be complex in pjsip.</p>
<div class="highlight"><pre><span></span><code><span class="k">[phone_11]</span>
<span class="na">type</span><span class="o">=</span><span class="s">endpoint</span>
<span class="na">transport</span><span class="o">=</span><span class="s">transport-udp</span>
<span class="na">context</span><span class="o">=</span><span class="s">internalsip</span>
<span class="na">disallow</span><span class="o">=</span><span class="s">all</span>
<span class="na">allow</span><span class="o">=</span><span class="s">g722</span>
<span class="na">allow</span><span class="o">=</span><span class="s">alaw</span>
<span class="na">auth</span><span class="o">=</span><span class="s">auth-value11</span>
<span class="na">aors</span><span class="o">=</span><span class="s">11</span>
<span class="k">[auth-value11]</span>
<span class="na">type</span><span class="o">=</span><span class="s">auth</span>
<span class="na">auth_type</span><span class="o">=</span><span class="s">userpass</span>
<span class="na">password</span><span class="o">=</span><span class="s">11</span>
<span class="na">username</span><span class="o">=</span><span class="s">11</span>
<span class="na">realm</span><span class="o">=</span><span class="s">${YOUR_HOSTNAME}</span>
<span class="k">[11]</span>
<span class="na">type</span><span class="o">=</span><span class="s">aor</span>
<span class="na">max_contacts</span><span class="o">=</span><span class="s">1</span>
<span class="na">remove_existing</span><span class="o">=</span><span class="s">true</span>
<span class="k">[11]</span>
<span class="na">type</span><span class="o">=</span><span class="s">identify</span>
<span class="na">endpoint</span><span class="o">=</span><span class="s">phone_11</span>
<span class="na">match</span><span class="o">=</span><span class="s">${YOUR_NETWORK_WITH_MASK}</span>
</code></pre></div>
<p>After having this up and running the rest is clear. You simply have to copy
this section multiple times and with that you gain more phones.</p>
<p>NO. (No matching endpoint found, Failed to authenticate)</p>
<p>You and up with having one one. This is possible because this <code>identify</code>
directive seems to be exclusive. Only the first time you specify a match based
on a network, you can have a match. The 2nd and 3rd time it's never reached.</p>
<p>Also the <code>aors</code> seems to be relativly stable, so we only need one for all
phones.</p>
<p>NO.</p>
<p>You need one per phone.</p>
<p>In the Internet you find some people having found a solution to this using
<code>identify_by</code> in the <code>endpoint</code>, but this seemed to change nothing for me.
So I was searching for a solution and must say to the solutions</p>
<p>NO. </p>
<p>This switch almost did nothing noticable.</p>
<p>Obvious solution: Match only ips and never change them.</p>
<p>NO.</p>
<p>Draw back here is that your dhcp might change or you move the phones to a
seperated network.</p>
<h3>Dynamics</h3>
<p>Instead of adding all the ips to the configuration I used the <code>match_header</code> to
match with a regex on the Conect header in the registration. This makes it
dynamic and enabled more then one phone.</p>
<div class="highlight"><pre><span></span><code><span class="na">[phone_endpoint_macro](!)</span>
<span class="na">type</span><span class="o">=</span><span class="s">endpoint</span>
<span class="na">transport</span><span class="o">=</span><span class="s">transport-udp</span>
<span class="na">context</span><span class="o">=</span><span class="s">internalsip</span>
<span class="na">disallow</span><span class="o">=</span><span class="s">all</span>
<span class="na">allow</span><span class="o">=</span><span class="s">g722</span>
<span class="na">allow</span><span class="o">=</span><span class="s">alaw</span>
<span class="na">[phone_auth_macro](!)</span>
<span class="na">type</span><span class="o">=</span><span class="s">auth</span>
<span class="na">auth_type</span><span class="o">=</span><span class="s">userpass</span>
<span class="na">realm</span><span class="o">=</span><span class="s">${YOUR_HOSTNAME}</span>
<span class="c1">;==========================================================</span>
<span class="na">[phone_11](phone_endpoint_macro)</span>
<span class="na">auth</span><span class="o">=</span><span class="s">11</span>
<span class="na">aors</span><span class="o">=</span><span class="s">11</span>
<span class="na">[11](phone_auth_macro)</span>
<span class="na">password</span><span class="o">=</span><span class="s">11</span>
<span class="na">username</span><span class="o">=</span><span class="s">11</span>
<span class="k">[11]</span>
<span class="na">type</span><span class="o">=</span><span class="s">identify</span>
<span class="na">endpoint</span><span class="o">=</span><span class="s">phone_11</span>
<span class="na">match_header</span><span class="o">=</span><span class="s">Contact:/11@/</span>
<span class="k">[11_message]</span>
<span class="na">type</span><span class="o">=</span><span class="s">identify</span>
<span class="na">endpoint</span><span class="o">=</span><span class="s">phone_11</span>
<span class="na">match_header</span><span class="o">=</span><span class="s">From:/11@/</span>
<span class="k">[11]</span>
<span class="na">type</span><span class="o">=</span><span class="s">aor</span>
<span class="na">max_contacts</span><span class="o">=</span><span class="s">1</span>
<span class="na">remove_existing</span><span class="o">=</span><span class="s">true</span>
</code></pre></div>
<h4>Updates</h4>
<p>2019-04-16: adding <code>11_messages</code> identifier for <a href="/pjsip-and-phones-with-sms.html#pjsip-and-phones-with-sms">SMS handlig</a></p>Telekom, Asterisk and pjsip2019-03-26T07:33:07+01:002019-03-26T07:33:07+01:00Sven Ludwigtag:blog.r4w.de,2019-03-26:/tonline-asterisk-pjsip.html<p>How to connect an asterisk 1.15.x+ with pjsip to a Telekom all-ip connection (tel.t-online.de, t-ipnet.de)</p><p>Well, welcome to the 21st century and to the deep fall pit named
all-ip-connect.</p>
<h3>Everything just worked</h3>
<p>I was proud owner of a device, which is very common in Germany called FritzBOX,
which simply worked. It was kind of boring. This is how I decided to screw
myself deeply. I decided to do it by myself - 100%. This was a time consuming
idea to have.</p>
<p>In fact I had the change to update my Internet connection to unbelivable
250 MBIT down and 40 MBIT up. My FritzBOX wasn't able to handle this enourmous
connectivity.</p>
<p>So I decided to have even more problems and trouble with my own environment.</p>
<p>It was a no brainer to give up easiness and reliability and exchange it with
something open source and home brewn. Another brand then the stable Fritzbox
must be experienced. That's why this robust, working and never failing device
was exchanged by a Vigor 160 modem.</p>
<p>Suprisingly this worked out of the box. You cannot image the experience of
this speed. Again after 10 years, you can find corners in the Internet slower
then yourself.</p>
<h3>How ever wants to use phones anymore</h3>
<p>The first night of implementing the new solution had some fall pits. I tried to
put the FritzBox after the new internet connection as a normal client in the
network. This with only one responsibility. Handle the god damn phones.</p>
<p>It failed.</p>
<p>Somehow it didn't manage to get the SIP connection up an running. But who needs
a working phone anyway?</p>
<h3>Wasn't the web interface working yesterday</h3>
<p>The next days I tried to figure out what was wrong with the setup. I tried to
modify my settings to the Vigor web interface and it simply wasn't there
anymore.</p>
<p>I did usual testing and first configured ssh access to bypass the web
interface. But how to connect, if ssh fails on first try?</p>
<p>Add this to your ssh client configuration</p>
<div class="highlight"><pre><span></span><code>Host 192.168.x.y
User $YOUR_ADMIN_NAME
Ciphers 3des-cbc
KexAlgorithms +diffie-hellman-group1-sha1
</code></pre></div>
<p>You have to limit you connections almost to clear text encryption extended by
rot13 or similar. With that you can connect.</p>
<p>But than a lucky punsh safed my day. I hitted CTRL+W which closed my Chrome
and I used Firefox to reconnect to the Vigor webinterface. It worked. It seems
like the Vigor webinterface does not limit Chrome in the way it opens
connections. This overstuffs the webserver, which leads to the point where
the web interface if falling apart and does not work anymore. Firefox does
not kill it completly so it stays functional.</p>
<p>I have a strong guess how Vigor tests their web interface.</p>
<p>If you notice the content of web pages disappears, always try to use another
browser.</p>
<h3>Can you hear me</h3>
<p>After reading some entries in forums and reactivated what I personally have
experienced with Asterisk, I had a first configuration.</p>
<p>My PBX was able to register with Telekom sip servers, but outgoing servers
didn't work. I got refused (403 Forbidden).</p>
<p>Then incoming calles started to work, but with a flaw. I can hear the caller
but my complains about the complexity of the setup stayed unheared. The
simply didn't reach the other side. I cannot tell why and how my modem
predicted to drop or rearange this traffic, but it got lost on it's way. The
obvious solution was to pin down the outgoing ip address of the pbx to the
one, which is used for NAT.</p>
<p>This did the trick.</p>
<h3>The additional 10 seconds</h3>
<p>The newly introduced vdsl modem has a flaw in routing mode. It it's up some
queries. So the NAPTR record wasn't resolved. This added additional 10 seconds
to each outgoing SIP call.</p>
<p>This I didn't know, back than.</p>
<p>But as i digged through the Internet, i found a hint in a forum of my provider
claiming that DNS made issues for the installation.</p>
<p><a href="https://telekomhilft.telekom.de/t5/Telefonie-Internet/VOIP-SIP-Server-meldet-FORBIDDEN-Asterisk-DNS/m-p/2825311#M834603">https://telekomhilft.telekom.de/t5/Telefonie-Internet/VOIP-SIP-Server-meldet-FORBIDDEN-Asterisk-DNS/m-p/2825311#M834603</a></p>
<p>To keep "Christian" honored, even if the telephone company (again) restructure
their forum, here is the quote:</p>
<blockquote>
<p>So, kurz zur Rückmeldung. Wir haben das Problem gefunden.
Es handelt sich um ein DNS Problem in kombination der Telekom DNS Server und unserem DNSMASQ (auf OpenWRT).
Um es kurz zu machen, die Telekom DNS Server lösen den SIP Server anders auf als die öffentlichen SIP Server. Auch verschiedene Telekom DNS Server lösen die Adressen (tel.t-online.de) verschieden auf.
Scheint was mit dem Loadbalancing zu tun zu haben, ich kann schlecht nachvollziehen ob es sich um einen Bug oder ein Feature handelt.
Schlussendlich habe ich auf den Asterisk Servern einen bind-server installiert. Alternativ kann man auch einen externen DNS anstelle dem Router-DNS eintragen.</p>
<p>Läuft erstmal. Bei Interesse schick ich gern weitere Infos.</p>
<p>Danke für die Mühe.</p>
<p>MFG Christian</p>
</blockquote>
<p>He discovered the problem that if you do not use the upstream dns server, you
can have issues connection to the SIP servers on provider side.</p>
<p>This made me curious and I also looked into the exchanged DNS data and found
the query for an NAPTR record, which failed.</p>
<p>Bypassing my router isn't that problematic and so it was implemented fast and
now the calles are made without adding additional 10 seconds of timeoutness to
each and every call.</p>
<p>Ask your local dns server (or servers, if you have more than one) about this
NAPTR record. It shouldn't fail but may differ at your location.</p>
<div class="highlight"><pre><span></span><code><span class="err">#</span><span class="w"> </span><span class="nt">host</span><span class="w"> </span><span class="nt">-v</span><span class="w"> </span><span class="nt">-t</span><span class="w"> </span><span class="nt">naptr</span><span class="w"> </span><span class="nt">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span>
<span class="nt">Trying</span><span class="w"> </span><span class="s2">"tel.t-online.de"</span>
<span class="o">;;</span><span class="w"> </span><span class="nt">-</span><span class="o">>></span><span class="nt">HEADER</span><span class="o"><<</span><span class="nt">-</span><span class="w"> </span><span class="nt">opcode</span><span class="o">:</span><span class="w"> </span><span class="nt">QUERY</span><span class="o">,</span><span class="w"> </span><span class="nt">status</span><span class="o">:</span><span class="w"> </span><span class="nt">NOERROR</span><span class="o">,</span><span class="w"> </span><span class="nt">id</span><span class="o">:</span><span class="w"> </span><span class="nt">46684</span>
<span class="o">;;</span><span class="w"> </span><span class="nt">flags</span><span class="o">:</span><span class="w"> </span><span class="nt">qr</span><span class="w"> </span><span class="nt">rd</span><span class="w"> </span><span class="nt">ra</span><span class="o">;</span><span class="w"> </span><span class="nt">QUERY</span><span class="o">:</span><span class="w"> </span><span class="nt">1</span><span class="o">,</span><span class="w"> </span><span class="nt">ANSWER</span><span class="o">:</span><span class="w"> </span><span class="nt">3</span><span class="o">,</span><span class="w"> </span><span class="nt">AUTHORITY</span><span class="o">:</span><span class="w"> </span><span class="nt">0</span><span class="o">,</span><span class="w"> </span><span class="nt">ADDITIONAL</span><span class="o">:</span><span class="w"> </span><span class="nt">3</span>
<span class="o">;;</span><span class="w"> </span><span class="nt">QUESTION</span><span class="w"> </span><span class="nt">SECTION</span><span class="o">:</span>
<span class="o">;</span><span class="nt">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span><span class="w"> </span><span class="nt">IN</span><span class="w"> </span><span class="nt">NAPTR</span>
<span class="o">;;</span><span class="w"> </span><span class="nt">ANSWER</span><span class="w"> </span><span class="nt">SECTION</span><span class="o">:</span>
<span class="nt">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span><span class="w"> </span><span class="nt">5707</span><span class="w"> </span><span class="nt">IN</span><span class="w"> </span><span class="nt">NAPTR</span><span class="w"> </span><span class="nt">20</span><span class="w"> </span><span class="nt">0</span><span class="w"> </span><span class="s2">"s"</span><span class="w"> </span><span class="s2">"SIP+D2U"</span><span class="w"> </span><span class="s2">""</span><span class="w"> </span><span class="nt">_sip</span><span class="p">.</span><span class="nc">_udp</span><span class="p">.</span><span class="nc">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span>
<span class="nt">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span><span class="w"> </span><span class="nt">5707</span><span class="w"> </span><span class="nt">IN</span><span class="w"> </span><span class="nt">NAPTR</span><span class="w"> </span><span class="nt">30</span><span class="w"> </span><span class="nt">0</span><span class="w"> </span><span class="s2">"s"</span><span class="w"> </span><span class="s2">"SIP+D2T"</span><span class="w"> </span><span class="s2">""</span><span class="w"> </span><span class="nt">_sip</span><span class="p">.</span><span class="nc">_tcp</span><span class="p">.</span><span class="nc">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span>
<span class="nt">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span><span class="w"> </span><span class="nt">5707</span><span class="w"> </span><span class="nt">IN</span><span class="w"> </span><span class="nt">NAPTR</span><span class="w"> </span><span class="nt">10</span><span class="w"> </span><span class="nt">0</span><span class="w"> </span><span class="s2">"s"</span><span class="w"> </span><span class="s2">"SIPS+D2T"</span><span class="w"> </span><span class="s2">""</span><span class="w"> </span><span class="nt">_sips</span><span class="p">.</span><span class="nc">_tcp</span><span class="p">.</span><span class="nc">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span>
<span class="o">;;</span><span class="w"> </span><span class="nt">ADDITIONAL</span><span class="w"> </span><span class="nt">SECTION</span><span class="o">:</span>
<span class="nt">_sip</span><span class="p">.</span><span class="nc">_udp</span><span class="p">.</span><span class="nc">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span><span class="w"> </span><span class="nt">3060</span><span class="w"> </span><span class="nt">IN</span><span class="w"> </span><span class="nt">SRV</span><span class="w"> </span><span class="nt">10</span><span class="w"> </span><span class="nt">0</span><span class="w"> </span><span class="nt">5060</span><span class="w"> </span><span class="nt">b-epp-110</span><span class="p">.</span><span class="nc">edns</span><span class="p">.</span><span class="nc">t-ipnet</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span>
<span class="nt">_sip</span><span class="p">.</span><span class="nc">_udp</span><span class="p">.</span><span class="nc">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span><span class="w"> </span><span class="nt">3060</span><span class="w"> </span><span class="nt">IN</span><span class="w"> </span><span class="nt">SRV</span><span class="w"> </span><span class="nt">20</span><span class="w"> </span><span class="nt">0</span><span class="w"> </span><span class="nt">5060</span><span class="w"> </span><span class="nt">d-epp-110</span><span class="p">.</span><span class="nc">edns</span><span class="p">.</span><span class="nc">t-ipnet</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span>
<span class="nt">_sip</span><span class="p">.</span><span class="nc">_udp</span><span class="p">.</span><span class="nc">tel</span><span class="p">.</span><span class="nc">t-online</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span><span class="w"> </span><span class="nt">3060</span><span class="w"> </span><span class="nt">IN</span><span class="w"> </span><span class="nt">SRV</span><span class="w"> </span><span class="nt">30</span><span class="w"> </span><span class="nt">0</span><span class="w"> </span><span class="nt">5060</span><span class="w"> </span><span class="nt">h2-epp-110</span><span class="p">.</span><span class="nc">edns</span><span class="p">.</span><span class="nc">t-ipnet</span><span class="p">.</span><span class="nc">de</span><span class="o">.</span>
</code></pre></div>
<h3>Houston, we have a call</h3>
<p>It depends on where and how you dig for information. Some forums claim that
anonymous calling is possible, while others was you need to know the first name
of your maternal cousin and combine it with the atomic weight of your sisters
new spouse.</p>
<p>At the end it is unclear why some configuations work and others not, but with
accepting almost anything and with that only enabling half of the feature set
is a way of (wild guessing starts) backwards compatinility which drives you mad.</p>
<p>I had to implement auth using the T-Online account number and the dialup
password. A weird combination partially found in the providers Forum and
partially guessed. It may be different for you, because it may uses other
username/password combinations like your email credentials with T-Online. This
I didn't test or touched as I do not use email with my provider.</p>
<p>My working implemenation of Asterisk pjsip for T-Online sip in 2019.</p>
<div class="highlight"><pre><span></span><code><span class="k">[transport-udp]</span>
<span class="na">type</span><span class="o">=</span><span class="s">transport</span>
<span class="na">protocol</span><span class="o">=</span><span class="s">udp</span>
<span class="na">bind</span><span class="o">=</span><span class="s">${IP_ADDRESS_OF_ASTERISK}:5060</span>
<span class="na">local_net</span><span class="o">=</span><span class="s">${YOUR_NETWORK_WITH_MASK}</span>
<span class="na">external_media_address</span><span class="o">=</span><span class="s">${DYNDNS_OR_OUTGOING_IP}</span>
<span class="na">external_signaling_address</span><span class="o">=</span><span class="s">${DYNDNS_OR_OUTGOING_IP}</span>
<span class="k">[telekom_aor]</span>
<span class="na">type</span><span class="o">=</span><span class="s">aor</span>
<span class="na">contact</span><span class="o">=</span><span class="s">sip:tel.t-online.de</span>
<span class="na">[telekom_registration_makro](!)</span>
<span class="na">type</span><span class="o">=</span><span class="s">registration</span>
<span class="na">transport</span><span class="o">=</span><span class="s">transport-udp</span>
<span class="na">server_uri</span><span class="o">=</span><span class="s">sip:tel.t-online.de:5060</span>
<span class="na">retry_interval</span><span class="o">=</span><span class="s">60</span>
<span class="na">forbidden_retry_interval</span><span class="o">=</span><span class="s">600</span>
<span class="na">expiration</span><span class="o">=</span><span class="s">480</span>
<span class="na">auth_rejection_permanent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">false</span>
<span class="na">line</span><span class="o">=</span><span class="s">yes</span>
<span class="na">[telekom_auth_makro](!)</span>
<span class="na">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">auth</span>
<span class="na">auth_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">userpass</span>
<span class="na">password</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">${DIAL_IN_PASSWORD}:${TONLINE_USER_NO}-0001@t-online.de</span>
<span class="na">realm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">tel.t-online.de</span>
<span class="na">[telekom_endpoint_makro](!)</span>
<span class="na">type</span><span class="o">=</span><span class="s">endpoint</span>
<span class="na">transport</span><span class="o">=</span><span class="s">transport-udp</span>
<span class="na">context</span><span class="o">=</span><span class="s">telekom_in</span>
<span class="na">disallow</span><span class="o">=</span><span class="s">all</span>
<span class="na">allow</span><span class="o">=</span><span class="s">g722</span>
<span class="na">allow</span><span class="o">=</span><span class="s">alaw</span>
<span class="na">direct_media</span><span class="o">=</span><span class="s">no</span>
<span class="na">from_domain</span><span class="o">=</span><span class="s">tel.t-online.de</span>
<span class="na">force_rport</span><span class="o">=</span><span class="s">false</span>
<span class="na">aors</span><span class="o">=</span><span class="s">telekom_aor</span>
<span class="na">[telekom_${YOUR_NUMBER_NATIONAL_FORMAT}](telekom_registration_makro)</span>
<span class="na">outbound_auth</span><span class="o">=</span><span class="s">telekom__auth</span>
<span class="na">client_uri</span><span class="o">=</span><span class="s">sip:${YOUR_NUMBER_INTERNATIONAL_FORMAT}@tel.t-online.de</span>
<span class="na">contact_user</span><span class="o">=</span><span class="s">${YOUR_NUMBER_NATIONAL_FORMAT}</span>
<span class="na">endpoint</span><span class="o">=</span><span class="s">telekom_${YOUR_NUMBER_NATIONAL_FORMAT}_endpoint</span>
<span class="na">[telekom_${YOUR_NUMBER_NATIONAL_FORMAT}_auth](telekom_auth_makro)</span>
<span class="na">username</span><span class="o">=</span><span class="s">${YOUR_NUMBER_NATIONAL_FORMAT}</span>
<span class="na">[telekom_${YOUR_NUMBER_NATIONAL_FORMAT}_endpoint](telekom_endpoint_makro)</span>
<span class="na">outbound_auth</span><span class="o">=</span><span class="s">telekom_${YOUR_NUMBER_NATIONAL_FORMAT}_auth</span>
<span class="na">from_user</span><span class="o">=</span><span class="s">${YOUR_NUMBER_INTERNATIONAL_FORMAT}</span>
<span class="c1">; callerid=${YOUR_NUMBER_INTERNATIONAL_FORMAT} - this is wrong and causes all</span>
<span class="c1">; calls to originate from the</span>
<span class="c1">; incoming number which was</span>
<span class="c1">; dialed and not from the</span>
<span class="c1">; callerid called in.</span>
<span class="na">outbound_proxy</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">sip:${YOUR_NUMBER_INTERNATIONAL_FORMAT}@tel.t-online.de:5060\</span><span class="c1">;lr</span>
<span class="k">[acl]</span>
<span class="na">type</span><span class="o">=</span><span class="s">acl</span>
<span class="na">deny</span><span class="o">=</span><span class="s">0.0.0.0/0.0.0.0</span>
<span class="na">permit</span><span class="o">=</span><span class="s">127.0.0.0/8</span>
<span class="na">permit</span><span class="o">=</span><span class="s">217.0.0.0/13</span>
<span class="na">permit</span><span class="o">=</span><span class="s">${YOUR_NETWORK_WITH_MASK}</span>
</code></pre></div>
<table>
<thead>
<tr>
<th>Variable</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>IP_ADDRESS_OF_ASTERISK</td>
<td>Important if you have move than one ip address assigned to your pbx (#Can you hear me)</td>
</tr>
<tr>
<td>YOUR_NETWORK_WITH_MASK</td>
<td>192.168.x.0/24 or similar (can be specified multiple times)</td>
</tr>
<tr>
<td>DYNDNS_OR_OUTGOING_IP</td>
<td>if you have dyndns, use this name. If not you have to alter the ip after it changed on your dialup machine.</td>
</tr>
<tr>
<td>DIAL_IN_PASSWORD</td>
<td>The password you router knows.</td>
</tr>
<tr>
<td>TONLINE_USER_NO</td>
<td>The 2nd part of the username your router knows. $CONNECTIONID-$TONLINE_USER_NO-$USERNO</td>
</tr>
<tr>
<td>CONNECTIONID</td>
<td>You should know that one.</td>
</tr>
<tr>
<td>USERNO</td>
<td>Usually 0001</td>
</tr>
<tr>
<td>YOUR_NUMBER_NATIONAL_FORMAT</td>
<td>$LOCAL_PREFIX$NUMBER</td>
</tr>
<tr>
<td>YOUR_NUMBER_INTERNATIONAL_FORMAT</td>
<td>+$INTERNATIONAL_PREFIX$LOCAL_PREFIX_WITHOUT_LEADING_ZERO$NUMBER</td>
</tr>
<tr>
<td>LOCAL_PREFIX</td>
<td>040 for Hamburg as an example</td>
</tr>
<tr>
<td>LOCAL_PREFIX_WITHOUT_LEATING_ZERO</td>
<td>40 for Hamburg as an example</td>
</tr>
<tr>
<td>INTERNATIONAL_PREFIX</td>
<td>49 for Germany as an example</td>
</tr>
<tr>
<td>NUMBER</td>
<td>Sequence of digits somebody else has to type into his sip phone to call you if he is in the very same region(LOCAL_PREFIX)</td>
</tr>
</tbody>
</table>
<h3>Visitors</h3>
<p>After 2h of having an Asterisk running on port 5060, I had visitors from Iceland
with weird call out whiches. That's why this ACL is a good idea. It's also a
good idea to limit the external access to this system to whom may contact there.
Limiting it to the Telekom network is net perfekt, but better then nothing.</p>
<p>Please always remember that there is harm in what they named the Internet.</p>433 MHz revisited2014-09-14T12:00:00+02:002014-09-14T12:00:00+02:00Sven Ludwigtag:blog.r4w.de,2014-09-14:/433MHz-revisited.html<p>Another try to finalize the 433Mhz receiver and stabilze the source</p><p>Well, after this long time you may expect that i cracked the code. Sorry, but I
didn’t. I just wanted to update you with the current version of my sketch to
decode the weather sensor.</p>
<h3>Status</h3>
<p>The current status of the project is somehow revisited. I had some spar time
and wanted to test the sensor again. This time i referenced to the following
<a href="https://docs.google.com/document/d/121ZH3omAZsdhFi3GSB-YdnasMjIQSGIcaS7QW6KsACA/mobilebasic?pli=1">resource</a>,
because i’d like the idea to use interrupts to read the correct data.</p>
<h3>Code</h3>
<p>After i took a look into my old code and almost after the moment i had to admit
that it isn’t that good, i rewrote the whole thing from scratch. The main
difference is that i measure the time by calling “micros()” instead of using
the raw value read by “pulseIn()”. With this the values get more stable than
in the last try to decode the signal.</p>
<div class="highlight"><pre><span></span><code><span class="kt">unsigned</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">ntime</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">otime</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">signal</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="c1">//unsigned long garbage=0;</span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">init_seq</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">init_count</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">data_seq</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">data_count</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">stop_seq</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">finished</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">setup</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"go!"</span><span class="p">);</span>
<span class="w"> </span><span class="n">pinMode</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">INPUT</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">loop</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">LowVal</span><span class="o">=</span><span class="n">pulseIn</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">LOW</span><span class="p">);</span>
<span class="w"> </span><span class="n">ntime</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">micros</span><span class="p">();</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">LowVal</span><span class="o"><</span><span class="mi">300</span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ntime</span><span class="o">-</span><span class="n">otime</span><span class="p">;</span>
<span class="w"> </span><span class="n">otime</span><span class="o">=</span><span class="n">ntime</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">finished</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="mi">50</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="k">break</span><span class="p">;</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="n">buf</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
<span class="w"> </span><span class="c1">//Serial.print("\t");</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">();</span>
<span class="w"> </span><span class="n">finished</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">signal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">50000</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">60000</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">//Serial.println("Start 50000 found");</span>
<span class="w"> </span><span class="n">init_seq</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="n">init_count</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="n">data_seq</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="n">data_count</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="n">stop_seq</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="n">finished</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="c1">//Serial.print("Garbage 50k:");</span>
<span class="w"> </span><span class="c1">//Serial.println(garbage);</span>
<span class="w"> </span><span class="c1">//garbage=0;</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">signal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">200000</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Last signal after sequence</span>
<span class="w"> </span><span class="c1">//Serial.print("Garbage 200k:");</span>
<span class="w"> </span><span class="c1">//Serial.println(garbage);</span>
<span class="w"> </span><span class="c1">//garbage=0;</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">signal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">1800</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">1899</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">stop_seq</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Last stop bit</span>
<span class="w"> </span><span class="n">finished</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="n">stop_seq</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">init_seq</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">data_seq</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w"> </span><span class="c1">//garbage++;</span>
<span class="w"> </span><span class="c1">//Serial.print("RAW: ");</span>
<span class="w"> </span><span class="c1">//Serial.print(signal);</span>
<span class="w"> </span><span class="c1">//Serial.println();</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">init_seq</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">1800</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">1899</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">init_count</span><span class="o">++</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">9100</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">9199</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">init_count</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">//Serial.println("Start seq complete. Data seq start.");</span>
<span class="w"> </span><span class="n">data_seq</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="n">data_count</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="mi">50</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">init_seq</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="n">init_count</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">data_seq</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">data_count</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">49</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// buffer protect</span>
<span class="w"> </span><span class="n">data_seq</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="n">data_count</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">1800</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">1899</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// let's assume that this is 0</span>
<span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="n">data_count</span><span class="p">]</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">3600</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">3699</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// let's assume that this is 1</span>
<span class="w"> </span><span class="n">buf</span><span class="p">[</span><span class="n">data_count</span><span class="p">]</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">3400</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">signal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">3499</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// let's think, this is a stop bit mark - dunno why</span>
<span class="w"> </span><span class="n">data_seq</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="n">stop_seq</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">data_count</span><span class="o">++</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<p>As you see, this is the current development state. Perhaps i start using git or
something, that you can follow my changes other the time.</p>
<h3>Setup</h3>
<p>Currently i have the arduino running at an raspberry pi in order to get a long
term evaluation and much data. This will lead to a better understanding of how
this signal is generated.</p>
<h3>Strange output</h3>
<p>I found out that this shitty sensor does not send every time with the same bit
count. Somehow some bits get lost on the way. I have no real idea how this
happens, but i will try to build an antenna to optimize the receiving circuit a
bit.</p>
<h3>What’s next?</h3>
<p>Next update will “hopefully” include a working sketch and i will write down the
workflow again, that you can follow it to be more successful with decoding your
personal signals ;)</p>433 MHz with Arduino in some use cases2013-12-09T12:00:00+01:002013-12-09T12:00:00+01:00Sven Ludwigtag:blog.r4w.de,2013-12-09:/433MHz-in-some-use-cases.html<p>Investigation how to receive and understand 433Mhz signals starting from scratch.</p><h3>Introduction</h3>
<p>This time we’ll go in English, because I used many English blogs, forums and
docs to learn much things about Arduino. This article contains Arduino
sketches and Python code to analyse data gathered by the Arduino and send out
via serial port to your computer. You may find some interesting methods and
hints to get your 433 MHz device or even washing machine connected to the
Arduino. You properly be able to communicate with it. This is a fun project,
because reverse engineering is fun.</p>
<p>I was playing with my Arduino and some 433 MHz devices. I tried out many
libraries in order to communicate with several devices. My wireless switches
worked mostly out of the box. It was really funny to switch on and of the
lights in my living room. But then i remembered a old long forgotten problem
i noticed. My remote temperature sensor does run out of batteries very fast.
After placing fresh batteries in the device it will run some weeks. So,
there is the plan. As my family is used to look on the weather station to
get the latest outside temperature, I need to get the temperature there
without wasting to many batteries.</p>
<p>There is absolutely no guarantee that this will work for you and there is
especially no guarantee that this will not harm any device you are trying to
communicate with. Keep this in mind. You are on your own :)</p>
<h3>The Arduino</h3>
<p>The Arduino is an Atmel based prototype computer. They are cheap and come in
many variants to you. You can properbly buy one at your local hardware store.</p>
<p>ARDUINO IS AN OPEN-SOURCE ELECTRONICS PROTOTYPING PLATFORM BASED ON FLEXIBLE,
EASY-TO-USE HARDWARE AND SOFTWARE. IT’S INTENDED FOR ARTISTS, DESIGNERS,
HOBBYISTS AND ANYONE INTERESTED IN CREATING INTERACTIVE OBJECTS OR ENVIRONMENTS.</p>
<h3>The 433 MHz thingy</h3>
<p>Perhaps you also noticed, that you have many goods which communicate via
433 MHz. You might use receivers to wirelessly switch on lights or devices.
You might use an external temperature measuring device.</p>
<p>All of these devices communicate over 433 MHz channel which can transmit about
2400 bits/second.</p>
<p>In Region 1 (mostly the US) the frequency is at 915 MHz</p>
<p>There are many small boards you can order to get into this world of flowing
data. I first bought an board called RFM12-433. It is cheap but hard to
handle, as it is designed to hook onto another board. But i managed it.</p>
<p><img alt="RFM12" src="http://blog.r4w.de/d/2013-12-09_RFM12.jpg" title="RFM12"></p>
<p>But after the work was done, i figured out that the RF12 is not the best
board to use thins like wireless power switches and temperature sensors. This
is because these chips encapsulate the signal in a special und specific way.
They are great to communicate between multiple Arduinos, but for my approach
they failed.</p>
<p>I tried to find another cheap solution for my problem and i found the XD-RF-5V.
This board is more primitive, but this enables a lot more fun with this part.
Because you can use the Arduino to emulate the needed controller for almost
every protocol spoken out there.</p>
<p>There are many more of them out there, but others aren’t so cheap :-D</p>
<p>My work is now based in the XD-RF-5V.</p>
<h3>Plug’n’play</h3>
<p><img alt="Arduino with circuit" src="http://blog.r4w.de/d/2013-12-09_Arduino_with_circuit.jpg" title="Arduino with circuit"></p>
<p>The XD-RF-5V has 4 Pins. Their purpose is: VCC, DATA, DATA and Ground. Power
the thing up with 5V and connect one of the data pins to pin 2 of your Arduino.</p>
<h3>Libraries to use</h3>
<p>You can use libraries for the most of these devices. Thank god the Internet is
still running ;). I tried out the following ones:</p>
<ul>
<li><a href="https://code.google.com/p/rc-switch/">rc-switch</a> to control wireless
switches</li>
<li><a href="http://www.airspayce.com/mikem/arduino/">VirtualWire</a> to send and receive
data from these devices. This library has a more general approach.</li>
<li><a href="https://bitbucket.org/fuzzillogic/433mhzforarduino/wiki/Home">433 MHz for Arduino</a>
to control wireless switches and mangle data from wireless sensors</li>
<li><a href="http://jeelabs.org/jeelib">JeeLib</a> to control the RF12 and some other
things.</li>
</ul>
<h3>Where is the lib for my device</h3>
<p>When you are asking you this question, you properly bought a device which did
not spread widely. I did this by buying an clock with integrated temperature
sensor with an external sensor at Lidl. So – there we are. We have no knowledge
about the protocol and other things we will need sooner or later to implement
our own receiver for this device.</p>
<p><a href="http://www.lidl.de">Lidl</a> offers an <a href="http://www.lidl-service.com/">service webpage</a>
where you can find docs for products they sold. So I tried to get the original
documentation for this peace of hardware. But they have already forgotten that
they sold this device.</p>
<p>Without knowing who build this, you have no chance to guess which protocol
might be used for this. The conclusion for this is, that there is no
library for this device.</p>
<h3>How to implement a primitive logic analyser</h3>
<p>After my research for a library failed completely I had to search for a
different way to handle my remote temperature sensor. I found a nice <a href="http://forum.arduino.cc/index.php?topic=63045.msg458619#msg458619">thread
in a forum</a>,
which pointed out that i have to figure out some basics of the protocol spoken.</p>
<p>First thing to find out is what is the length of an impulse send out from the
remote temperature sensor. Therefor you have to upload a little sketch to your
Arduino.</p>
<h4>Impulse length detector sketch</h4>
<div class="highlight"><pre><span></span><code><span class="kt">void</span><span class="w"> </span><span class="nf">setup</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span>
<span class="w"> </span><span class="n">pinMode</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">INPUT</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">loop</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">LowVal</span><span class="o">=</span><span class="n">pulseIn</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">LOW</span><span class="p">);</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="n">LowVal</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div>
<p>This sketch constantly writes out all detected pulse lengths to the serial port
of the Arduino. The author of this post collected them and found the relevant
sequences. This was done manually.</p>
<p>The problem with the manual approach is that you have to to read through 10000
to 50000 lines of numbers to find the correct sequence. Here is an example for
the output.</p>
<h4>Numbers and more numbers</h4>
<div class="highlight"><pre><span></span><code><span class="mf">6319</span>
<span class="mf">586</span>
<span class="mf">1430</span>
<span class="mf">108</span>
<span class="mf">1082</span>
<span class="mf">1528</span>
<span class="mf">1188</span>
<span class="mf">783</span>
<span class="mf">3073</span>
<span class="mf">...</span>
<span class="mf">1</span>
<span class="mf">2</span>
<span class="mf">3</span>
<span class="mf">4</span>
<span class="mf">5</span>
<span class="mf">6</span>
<span class="mf">7</span>
<span class="mf">8</span>
<span class="mf">9</span>
<span class="mf">10</span>
<span class="mf">6319</span>
<span class="mf">586</span>
<span class="mf">1430</span>
<span class="mf">108</span>
<span class="mf">1082</span>
<span class="mf">1528</span>
<span class="mf">1188</span>
<span class="mf">783</span>
<span class="mf">3073</span>
<span class="mf">...</span>
</code></pre></div>
<p>After you started the sketch on the Arduino you get this output to the serial
console. You can copy it by unplugging the Arduino which stops the output. But
what if we want to sniff even more traffic. Perhaps to get signals from other
remote temperature sensors of your neighborhood. Then you need this little
python method.</p>
<h4>Python reads the Arduino output</h4>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">serial</span>
<span class="k">def</span> <span class="nf">receive</span><span class="p">(</span><span class="n">fn</span><span class="p">):</span>
<span class="n">f</span><span class="o">=</span><span class="nb">open</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span><span class="s1">'w'</span><span class="p">)</span>
<span class="n">ser</span> <span class="o">=</span> <span class="n">serial</span><span class="o">.</span><span class="n">Serial</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">115200</span><span class="p">)</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">ser</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">value</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'</span><span class="si">{0}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">ser</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">receive</span><span class="p">(</span><span class="s1">'433.log'</span><span class="p">)</span>
</code></pre></div>
<p>You can imagine that this is a tough job to find a sequence in such a huge
amount of data and you will need some kind of Rainman to do this. You must also
keep in mind that these numbers are not reliable. You cannot search for a
specific sequence, because it will not repeat exactly. This is caused by
corruption of the signal or other influences while generating these number with
the Arduino.</p>
<p>Because of all this, here is a python script which does the job.</p>
<h4>Python method to analyse the numbers</h4>
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">analyse</span><span class="p">(</span><span class="n">output_list</span><span class="p">,</span> <span class="n">start_pos</span><span class="p">,</span> <span class="n">stop_pos</span><span class="p">,</span> <span class="n">sequence_length_min</span><span class="p">,</span> <span class="n">sequence_length_max</span><span class="p">,</span> <span class="n">fault_tolerance</span><span class="p">,</span> <span class="n">garbage_level</span><span class="p">):</span>
<span class="k">if</span> <span class="n">stop_pos</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="n">stop_pos</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">output_list</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">equals_with_tolerance</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">):</span>
<span class="k">if</span> <span class="n">fault_tolerance</span> <span class="o"><</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">width</span><span class="o">=</span><span class="n">output_list</span><span class="p">[</span><span class="n">p1</span><span class="p">]</span><span class="o">*</span><span class="n">fault_tolerance</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">width</span><span class="o">=</span><span class="n">fault_tolerance</span>
<span class="k">return</span> <span class="n">output_list</span><span class="p">[</span><span class="n">p2</span><span class="p">]</span> <span class="o">></span> <span class="n">output_list</span><span class="p">[</span><span class="n">p1</span><span class="p">]</span><span class="o">-</span><span class="n">width</span> <span class="ow">and</span> \
<span class="n">output_list</span><span class="p">[</span><span class="n">p2</span><span class="p">]</span> <span class="o"><</span> <span class="n">output_list</span><span class="p">[</span><span class="n">p1</span><span class="p">]</span><span class="o">+</span><span class="n">width</span>
<span class="n">positions</span><span class="o">=</span><span class="p">[]</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">first_value</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">start_pos</span><span class="p">,</span> <span class="n">stop_pos</span><span class="p">):</span>
<span class="k">for</span> <span class="n">second_value</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">start_pos</span><span class="p">,</span> <span class="n">stop_pos</span><span class="p">):</span>
<span class="k">if</span> <span class="n">first_value</span> <span class="o">==</span> <span class="n">second_value</span><span class="p">:</span> <span class="k">continue</span>
<span class="k">if</span> <span class="n">output_list</span><span class="p">[</span><span class="n">first_value</span><span class="p">]</span> <span class="o"><</span> <span class="n">garbage_level</span><span class="p">:</span> <span class="k">continue</span>
<span class="k">if</span> <span class="n">output_list</span><span class="p">[</span><span class="n">second_value</span><span class="p">]</span> <span class="o"><</span> <span class="n">garbage_level</span><span class="p">:</span> <span class="k">continue</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">last_found</span><span class="o">=</span><span class="n">positions</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">last_found</span><span class="o">=</span><span class="kc">None</span>
<span class="k">if</span> <span class="n">last_found</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">first_value</span> <span class="o"><=</span> <span class="n">last_found</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="n">last_found</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">result</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">for</span> <span class="n">codelen</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">sequence_length_max</span><span class="p">):</span>
<span class="k">if</span> <span class="n">first_value</span> <span class="o">+</span> <span class="n">codelen</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="n">output_list</span><span class="p">):</span> <span class="k">break</span>
<span class="k">if</span> <span class="n">second_value</span> <span class="o">+</span> <span class="n">codelen</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="n">output_list</span><span class="p">):</span> <span class="k">break</span>
<span class="n">nresult</span><span class="o">=</span><span class="n">equals_with_tolerance</span><span class="p">(</span><span class="n">first_value</span><span class="o">+</span><span class="n">codelen</span><span class="p">,</span> <span class="n">second_value</span><span class="o">+</span><span class="n">codelen</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nresult</span> <span class="ow">is</span> <span class="kc">False</span><span class="p">:</span>
<span class="n">codelen</span><span class="o">-=</span><span class="mi">1</span>
<span class="k">if</span> <span class="n">codelen</span> <span class="o">>=</span> <span class="n">sequence_length_min</span><span class="p">:</span>
<span class="n">result</span><span class="o">=</span><span class="kc">True</span>
<span class="k">break</span>
<span class="k">if</span> <span class="n">result</span><span class="p">:</span>
<span class="n">positions</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">first_value</span><span class="p">,</span> <span class="n">second_value</span><span class="p">,</span> <span class="n">codelen</span><span class="p">))</span>
<span class="c1"># sys.stdout.write('\r{0}/{1} => {2}@{3} '.format(first_value, len(output_list), last_found, len(positions)))</span>
<span class="c1"># sys.stdout.flush()</span>
<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
<span class="nb">print</span>
<span class="k">return</span> <span class="n">positions</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">analyse</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s1">'433.log'</span><span class="p">)</span><span class="o">.</span><span class="n">readlines</span><span class="p">(),</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">12</span><span class="p">,</span><span class="mi">25</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span>
</code></pre></div>
<p>You may have to adapt these settings. The call of this method is very simple
and it takes about 5 minutes on a modern computer to complete. You can use
threads to increase the performance, but this wasn’t needed for my first try to
do this.</p>
<p>The method and its arguments: analyse(</p>
<ul>
<li>list of numbers</li>
<li>start position</li>
<li>stop position</li>
<li>minimal sequence length (mostly about 6)</li>
<li>maximal sequence length (is currently ignored)</li>
<li>fault tolerance (how much can the values differ from each other and being
handles as they match exactly)</li>
<li>the minimum pulse length we want to believe in(mostly 100µs is a great value
for this)</li>
</ul>
<p>)</p>
<p>The return value of this method is a list containing tuples of first position,
second position and code length found in the list of numbers.</p>
<h4>Output of the python analyser</h4>
<div class="highlight"><pre><span></span><code>[
(1234,3215,7),
(2456,5615,7),
(3645,7895,60),
(6345,8670,42),
...
]
</code></pre></div>
<p>This is also hard to read, so let’s write another method to get this more or
less human readable.</p>
<h4>Print out the position list</h4>
<div class="highlight"><pre><span></span><code><span class="k">def</span> <span class="nf">print_positions</span><span class="p">(</span><span class="n">output_list</span><span class="p">,</span> <span class="n">positions</span><span class="p">):</span>
<span class="k">for</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">,</span> <span class="n">codelen</span> <span class="ow">in</span> <span class="n">positions</span><span class="p">:</span>
<span class="nb">print</span> <span class="n">p1</span><span class="p">,</span><span class="n">p2</span><span class="p">,</span><span class="n">codelen</span>
<span class="nb">print</span> <span class="s2">"="</span><span class="o">*</span><span class="mi">40</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">codelen</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
<span class="nb">print</span> <span class="n">output_list</span><span class="p">[</span><span class="n">p1</span><span class="o">+</span><span class="n">i</span><span class="p">],</span>
<span class="nb">print</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">codelen</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
<span class="nb">print</span> <span class="n">output_list</span><span class="p">[</span><span class="n">p2</span><span class="o">+</span><span class="n">i</span><span class="p">],</span>
<span class="nb">print</span>
<span class="nb">print</span> <span class="s2">"*"</span><span class="o">*</span><span class="mi">40</span>
</code></pre></div>
<p>And this result can be used to go even further and implement a real parser for
this signal sequence.</p>
<h4>Human readable output</h4>
<div class="highlight"><pre><span></span><code><span class="mf">0</span><span class="w"> </span><span class="mf">23</span><span class="w"> </span><span class="mf">17</span>
<span class="o">========================================</span>
<span class="mf">295</span><span class="w"> </span><span class="mf">713</span><span class="w"> </span><span class="mf">99639</span><span class="w"> </span><span class="mf">14250</span><span class="w"> </span><span class="mf">629</span><span class="w"> </span><span class="mf">16</span><span class="w"> </span><span class="mf">1414</span><span class="w"> </span><span class="mf">2417</span><span class="w"> </span><span class="mf">384</span><span class="w"> </span><span class="mf">7293</span><span class="w"> </span><span class="mf">858</span><span class="w"> </span><span class="mf">250</span><span class="w"> </span><span class="mf">262</span><span class="w"> </span><span class="mf">1116</span><span class="w"> </span><span class="mf">562</span><span class="w"> </span><span class="mf">11745</span><span class="w"> </span><span class="mf">644</span><span class="w"> </span><span class="mf">5441</span>
<span class="mf">295</span><span class="w"> </span><span class="mf">713</span><span class="w"> </span><span class="mf">99639</span><span class="w"> </span><span class="mf">14250</span><span class="w"> </span><span class="mf">629</span><span class="w"> </span><span class="mf">16</span><span class="w"> </span><span class="mf">1414</span><span class="w"> </span><span class="mf">2417</span><span class="w"> </span><span class="mf">384</span><span class="w"> </span><span class="mf">7293</span><span class="w"> </span><span class="mf">858</span><span class="w"> </span><span class="mf">250</span><span class="w"> </span><span class="mf">262</span><span class="w"> </span><span class="mf">1116</span><span class="w"> </span><span class="mf">562</span><span class="w"> </span><span class="mf">11745</span><span class="w"> </span><span class="mf">644</span><span class="w"> </span><span class="mf">5441</span>
<span class="o">****************************************</span>
<span class="mf">1361</span><span class="w"> </span><span class="mf">6179</span><span class="w"> </span><span class="mf">172</span>
<span class="o">========================================</span>
<span class="mf">288</span><span class="w"> </span><span class="mf">293</span><span class="w"> </span><span class="mf">295</span><span class="w"> </span><span class="mf">292</span><span class="w"> </span><span class="mf">295</span><span class="w"> </span><span class="mf">301</span><span class="w"> </span><span class="mf">304</span><span class="w"> </span><span class="mf">7585</span><span class="w"> </span><span class="mf">2123</span><span class="w"> </span><span class="mf">2124</span><span class="w"> </span><span class="mf">2125</span><span class="w"> </span><span class="mf">2125</span><span class="w"> </span><span class="mf">308</span><span class="w"> </span><span class="mf">310</span><span class="w"> </span><span class="mf">2123</span><span class="w"> </span><span class="mf">310</span><span class="w"> </span><span class="mf">313</span><span class="w"> </span><span class="mf">2132</span><span class="w"> </span><span class="mf">2132</span><span class="w"> </span><span class="mf">2132</span><span class="w"> </span><span class="mf">2133</span><span class="w"> </span><span class="mf">2133</span><span class="w"> </span><span class="mf">2128</span><span class="w"> </span><span class="mf">2135</span><span class="w"> </span><span class="mf">2136</span><span class="w"> </span><span class="mf">2136</span><span class="w"> </span><span class="mf">318</span><span class="w"> </span><span class="mf">318</span><span class="w"> </span><span class="mf">2137</span><span class="w"> </span><span class="mf">2137</span><span class="w"> </span><span class="mf">2131</span><span class="w"> </span><span class="mf">2137</span><span class="w"> </span><span class="mf">319</span><span class="w"> </span><span class="mf">314</span><span class="w"> </span><span class="mf">2140</span><span class="w"> </span><span class="mf">321</span><span class="w"> </span><span class="mf">321</span><span class="w"> </span><span class="mf">2143</span><span class="w"> </span><span class="mf">2141</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">318</span><span class="w"> </span><span class="mf">2141</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">318</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">318</span><span class="w"> </span><span class="mf">321</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">329</span><span class="w"> </span><span class="mf">329</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">330</span><span class="w"> </span><span class="mf">1905</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">52990</span><span class="w"> </span><span class="mf">317</span><span class="w"> </span><span class="mf">309</span><span class="w"> </span><span class="mf">319</span><span class="w"> </span><span class="mf">319</span><span class="w"> </span><span class="mf">319</span><span class="w"> </span><span class="mf">314</span><span class="w"> </span><span class="mf">316</span><span class="w"> </span><span class="mf">7597</span><span class="w"> </span><span class="mf">2140</span><span class="w"> </span><span class="mf">2140</span><span class="w"> </span><span class="mf">2140</span><span class="w"> </span><span class="mf">2139</span><span class="w"> </span><span class="mf">314</span><span class="w"> </span><span class="mf">322</span><span class="w"> </span><span class="mf">2143</span><span class="w"> </span><span class="mf">317</span><span class="w"> </span><span class="mf">319</span><span class="w"> </span><span class="mf">2144</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2143</span><span class="w"> </span><span class="mf">2144</span><span class="w"> </span><span class="mf">2144</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2137</span><span class="w"> </span><span class="mf">2144</span><span class="w"> </span><span class="mf">2144</span><span class="w"> </span><span class="mf">319</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">327</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">330</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2143</span><span class="w"> </span><span class="mf">331</span><span class="w"> </span><span class="mf">331</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">333</span><span class="w"> </span><span class="mf">333</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">331</span><span class="w"> </span><span class="mf">334</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2153</span><span class="w"> </span><span class="mf">335</span><span class="w"> </span><span class="mf">329</span><span class="w"> </span><span class="mf">2154</span><span class="w"> </span><span class="mf">334</span><span class="w"> </span><span class="mf">337</span><span class="w"> </span><span class="mf">1913</span><span class="w"> </span><span class="mf">337</span><span class="w"> </span><span class="mf">52987</span><span class="w"> </span><span class="mf">318</span><span class="w"> </span><span class="mf">319</span><span class="w"> </span><span class="mf">321</span><span class="w"> </span><span class="mf">317</span><span class="w"> </span><span class="mf">322</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">325</span><span class="w"> </span><span class="mf">7608</span><span class="w"> </span><span class="mf">2136</span><span class="w"> </span><span class="mf">2143</span><span class="w"> </span><span class="mf">2141</span><span class="w"> </span><span class="mf">2144</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">325</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">327</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">2141</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">327</span><span class="w"> </span><span class="mf">322</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2143</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">327</span><span class="w"> </span><span class="mf">325</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">331</span><span class="w"> </span><span class="mf">334</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">325</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">335</span><span class="w"> </span><span class="mf">330</span><span class="w"> </span><span class="mf">2154</span><span class="w"> </span><span class="mf">2154</span><span class="w"> </span><span class="mf">330</span><span class="w"> </span><span class="mf">335</span><span class="w"> </span><span class="mf">2156</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">337</span><span class="w"> </span><span class="mf">338</span><span class="w"> </span><span class="mf">2156</span><span class="w"> </span><span class="mf">333</span><span class="w"> </span><span class="mf">339</span><span class="w"> </span><span class="mf">1913</span><span class="w"> </span><span class="mf">337</span>
<span class="mf">275</span><span class="w"> </span><span class="mf">287</span><span class="w"> </span><span class="mf">292</span><span class="w"> </span><span class="mf">295</span><span class="w"> </span><span class="mf">292</span><span class="w"> </span><span class="mf">300</span><span class="w"> </span><span class="mf">301</span><span class="w"> </span><span class="mf">7582</span><span class="w"> </span><span class="mf">2115</span><span class="w"> </span><span class="mf">2124</span><span class="w"> </span><span class="mf">2124</span><span class="w"> </span><span class="mf">2118</span><span class="w"> </span><span class="mf">305</span><span class="w"> </span><span class="mf">308</span><span class="w"> </span><span class="mf">2131</span><span class="w"> </span><span class="mf">310</span><span class="w"> </span><span class="mf">310</span><span class="w"> </span><span class="mf">2132</span><span class="w"> </span><span class="mf">2132</span><span class="w"> </span><span class="mf">2132</span><span class="w"> </span><span class="mf">2127</span><span class="w"> </span><span class="mf">2133</span><span class="w"> </span><span class="mf">2135</span><span class="w"> </span><span class="mf">2135</span><span class="w"> </span><span class="mf">2136</span><span class="w"> </span><span class="mf">2136</span><span class="w"> </span><span class="mf">317</span><span class="w"> </span><span class="mf">319</span><span class="w"> </span><span class="mf">2139</span><span class="w"> </span><span class="mf">2137</span><span class="w"> </span><span class="mf">2141</span><span class="w"> </span><span class="mf">2140</span><span class="w"> </span><span class="mf">322</span><span class="w"> </span><span class="mf">325</span><span class="w"> </span><span class="mf">2137</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">327</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">329</span><span class="w"> </span><span class="mf">331</span><span class="w"> </span><span class="mf">2144</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">330</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2150</span><span class="w"> </span><span class="mf">325</span><span class="w"> </span><span class="mf">333</span><span class="w"> </span><span class="mf">2153</span><span class="w"> </span><span class="mf">327</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">1910</span><span class="w"> </span><span class="mf">330</span><span class="w"> </span><span class="mf">52994</span><span class="w"> </span><span class="mf">316</span><span class="w"> </span><span class="mf">318</span><span class="w"> </span><span class="mf">312</span><span class="w"> </span><span class="mf">321</span><span class="w"> </span><span class="mf">319</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">317</span><span class="w"> </span><span class="mf">7601</span><span class="w"> </span><span class="mf">2141</span><span class="w"> </span><span class="mf">2143</span><span class="w"> </span><span class="mf">2141</span><span class="w"> </span><span class="mf">2143</span><span class="w"> </span><span class="mf">318</span><span class="w"> </span><span class="mf">321</span><span class="w"> </span><span class="mf">2144</span><span class="w"> </span><span class="mf">327</span><span class="w"> </span><span class="mf">321</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">325</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2150</span><span class="w"> </span><span class="mf">2150</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">327</span><span class="w"> </span><span class="mf">333</span><span class="w"> </span><span class="mf">2154</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">329</span><span class="w"> </span><span class="mf">2153</span><span class="w"> </span><span class="mf">2153</span><span class="w"> </span><span class="mf">335</span><span class="w"> </span><span class="mf">337</span><span class="w"> </span><span class="mf">2154</span><span class="w"> </span><span class="mf">330</span><span class="w"> </span><span class="mf">337</span><span class="w"> </span><span class="mf">2154</span><span class="w"> </span><span class="mf">2150</span><span class="w"> </span><span class="mf">337</span><span class="w"> </span><span class="mf">338</span><span class="w"> </span><span class="mf">2157</span><span class="w"> </span><span class="mf">2157</span><span class="w"> </span><span class="mf">339</span><span class="w"> </span><span class="mf">338</span><span class="w"> </span><span class="mf">2157</span><span class="w"> </span><span class="mf">340</span><span class="w"> </span><span class="mf">340</span><span class="w"> </span><span class="mf">1921</span><span class="w"> </span><span class="mf">340</span><span class="w"> </span><span class="mf">52995</span><span class="w"> </span><span class="mf">316</span><span class="w"> </span><span class="mf">317</span><span class="w"> </span><span class="mf">322</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">317</span><span class="w"> </span><span class="mf">325</span><span class="w"> </span><span class="mf">325</span><span class="w"> </span><span class="mf">7608</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2145</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">329</span><span class="w"> </span><span class="mf">327</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">329</span><span class="w"> </span><span class="mf">329</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">2150</span><span class="w"> </span><span class="mf">2144</span><span class="w"> </span><span class="mf">2150</span><span class="w"> </span><span class="mf">2150</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2150</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">331</span><span class="w"> </span><span class="mf">333</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">2153</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">333</span><span class="w"> </span><span class="mf">335</span><span class="w"> </span><span class="mf">2156</span><span class="w"> </span><span class="mf">334</span><span class="w"> </span><span class="mf">338</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2156</span><span class="w"> </span><span class="mf">338</span><span class="w"> </span><span class="mf">331</span><span class="w"> </span><span class="mf">2156</span><span class="w"> </span><span class="mf">335</span><span class="w"> </span><span class="mf">339</span><span class="w"> </span><span class="mf">2158</span><span class="w"> </span><span class="mf">2157</span><span class="w"> </span><span class="mf">337</span><span class="w"> </span><span class="mf">334</span><span class="w"> </span><span class="mf">2160</span><span class="w"> </span><span class="mf">2157</span><span class="w"> </span><span class="mf">331</span><span class="w"> </span><span class="mf">340</span><span class="w"> </span><span class="mf">2160</span><span class="w"> </span><span class="mf">333</span><span class="w"> </span><span class="mf">335</span><span class="w"> </span><span class="mf">1917</span><span class="w"> </span><span class="mf">335</span>
<span class="o">****************************************</span>
<span class="mf">...</span>
</code></pre></div>
<p>This result isn’t final, but prefiltered. This means you have to find the
correct values in here. But after looking on this data, you will find your
sequence soon.</p>
<h4>The sequence</h4>
<div class="highlight"><pre><span></span><code><span class="mf">52994</span><span class="w"> </span><span class="mf">316</span><span class="w"> </span><span class="mf">318</span><span class="w"> </span><span class="mf">312</span><span class="w"> </span><span class="mf">321</span><span class="w"> </span><span class="mf">319</span><span class="w"> </span><span class="mf">323</span><span class="w"> </span><span class="mf">317</span><span class="w"> </span><span class="mf">7601</span><span class="w"> </span><span class="mf">2141</span><span class="w"> </span><span class="mf">2143</span><span class="w"> </span><span class="mf">2141</span><span class="w"> </span><span class="mf">2143</span><span class="w"> </span><span class="mf">318</span><span class="w"> </span><span class="mf">321</span><span class="w"> </span><span class="mf">2144</span>
<span class="mf">327</span><span class="w"> </span><span class="mf">321</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2146</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2148</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">325</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">2149</span><span class="w"> </span><span class="mf">2150</span>
<span class="mf">2150</span><span class="w"> </span><span class="mf">2152</span><span class="w"> </span><span class="mf">327</span><span class="w"> </span><span class="mf">333</span><span class="w"> </span><span class="mf">2154</span><span class="w"> </span><span class="mf">326</span><span class="w"> </span><span class="mf">329</span><span class="w"> </span><span class="mf">2153</span><span class="w"> </span><span class="mf">2153</span><span class="w"> </span><span class="mf">335</span><span class="w"> </span><span class="mf">337</span><span class="w"> </span><span class="mf">2154</span><span class="w"> </span><span class="mf">330</span><span class="w"> </span><span class="mf">337</span><span class="w"> </span><span class="mf">2154</span><span class="w"> </span><span class="mf">2150</span>
<span class="mf">337</span><span class="w"> </span><span class="mf">338</span><span class="w"> </span><span class="mf">2157</span><span class="w"> </span><span class="mf">2157</span><span class="w"> </span><span class="mf">339</span><span class="w"> </span><span class="mf">338</span><span class="w"> </span><span class="mf">2157</span><span class="w"> </span><span class="mf">340</span><span class="w"> </span><span class="mf">340</span><span class="w"> </span><span class="mf">1921</span><span class="w"> </span><span class="mf">340</span>
</code></pre></div>
<p>As you see, the sequence starts with a long impulse, followed by six short
ones. Then we have got a quite long impulse. After these the data starts.
You can see two kinds of impulses, representing digital data(zeros and ones).
This is the time to guess, which impulse length represents what.</p>
<h4>Sequence fine tuning</h4>
<div class="highlight"><pre><span></span><code><span class="kt">void</span><span class="w"> </span><span class="nf">setup</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"go!"</span><span class="p">);</span>
<span class="w"> </span><span class="n">pinMode</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">INPUT</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">loop</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">LowVal</span><span class="o">=</span><span class="n">pulseIn</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">LOW</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">LowVal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">50000</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"3"</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">LowVal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">6000</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">8000</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"2"</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">LowVal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">1500</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">2500</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"1"</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">LowVal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">500</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"0"</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<p>This generates a long list of numbers. You should tune it until you only get
new output, when pressing the reset button at the remote temperature sensor.</p>
<h3>Sir, we found a sequence</h3>
<p>With this sequence you find in your data, you are able to write your own
sketch for your remote temperature sensor. For mine the following sketch
worked out well.</p>
<h4>Sketch to receive Lidl remote temperature sensor data</h4>
<div class="highlight"><pre><span></span><code><span class="n">boolean</span><span class="w"> </span><span class="n">start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="n">boolean</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="n">boolean</span><span class="w"> </span><span class="n">debug</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="kt">long</span><span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">9</span><span class="p">];</span>
<span class="kt">long</span><span class="w"> </span><span class="n">data_seq</span><span class="p">[</span><span class="mi">45</span><span class="p">];</span>
<span class="kt">int</span><span class="w"> </span><span class="n">readcount</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="n">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">setup</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">begin</span><span class="p">(</span><span class="mi">115200</span><span class="p">);</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"go!"</span><span class="p">);</span>
<span class="w"> </span><span class="n">pinMode</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">INPUT</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">loop</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">LowVal</span><span class="o">=</span><span class="n">pulseIn</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="n">LOW</span><span class="p">);</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="mi">200</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">30000</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span>
<span class="w"> </span><span class="n">start</span><span class="o">=</span><span class="nb">true</span><span class="p">;</span>
<span class="w"> </span><span class="n">readcount</span><span class="o">=</span><span class="mi">8</span><span class="p">;</span>
<span class="w"> </span><span class="n">pos</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">debug</span><span class="p">)</span><span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"Start bit found"</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">readcount</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">readcount</span><span class="o">--</span><span class="p">;</span>
<span class="w"> </span><span class="n">pos</span><span class="o">++</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">start</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">500</span><span class="p">)</span>
<span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">1000</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">3000</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">7250</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">7750</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span><span class="w"> </span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">9</span><span class="p">;</span>
<span class="w"> </span><span class="n">readcount</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">500</span><span class="p">)</span>
<span class="w"> </span><span class="n">data_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">1000</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">3000</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="n">data_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">500</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="mi">1000</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="n">data_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">5</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">3000</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">5000</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="n">data_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">6</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5000</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">7500</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="n">data_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">7</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">7500</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">LowVal</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">10000</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="n">data_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">8</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="n">data_seq</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">=</span><span class="mi">9</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">start</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">7</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">debug</span><span class="p">)</span><span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"Start seq found"</span><span class="p">);</span>
<span class="w"> </span><span class="n">start</span><span class="o">=</span><span class="nb">false</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="mi">9</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">data</span><span class="o">=</span><span class="nb">true</span><span class="p">;</span>
<span class="w"> </span><span class="n">readcount</span><span class="o">=</span><span class="mi">45</span><span class="p">;</span>
<span class="w"> </span><span class="n">pos</span><span class="o">=</span><span class="mi">-1</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">start</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">readcount</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">debug</span><span class="p">)</span><span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">(</span><span class="s">"Start seq not found"</span><span class="p">);</span>
<span class="w"> </span><span class="n">start</span><span class="o">=</span><span class="nb">false</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="mi">9</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">start_seq</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">readcount</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="mi">45</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="n">data_seq</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">Serial</span><span class="p">.</span><span class="n">println</span><span class="p">();</span>
<span class="w"> </span><span class="n">data</span><span class="o">=</span><span class="nb">false</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<p>Now we have sequences of bits which must be interpreted. For this we need the
original weather station in order to have the sequence translated.</p>
<p>Now you can watch the data transmitted from the remote temperature sensor. But
starring at a weather station is not as much fun as it seems. That’s why we
can use a webcam to make images...</p>
<p>Read more when the story continues :)</p>