<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="text">Programming, Electronics, RF</title>
  <updated>2026-03-17T19:23:50+02:00</updated>
  <generator uri="http://rohea.com" version="0.1">Blog Integration Feed Generator</generator>
  <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/"/>
  <link rel="self" type="application/atom+xml" href="https://teknokoodiradio.vuodatus.net/feeds/atom"/>
  <id>https://teknokoodiradio.vuodatus.net/</id>
  <author>
    <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
    <uri>https://teknokoodiradio.vuodatus.net/</uri>
  </author>
  <entry>
    <title type="html"><![CDATA[This blog has moved to a new location]]></title>
    <summary type="html"><![CDATA[<p>New location of this blog is<br /><a href="https://techcoderadio.blogspot.com" rel="nofollow">https://techcoderadio.blogspot.com</a></p>

<p> </p>]]></summary>
    <published>2025-03-09T19:00:00+02:00</published>
    <updated>2025-05-03T14:51:59+03:00</updated>
    <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/lue/2025/03/relocation-in-progress-1"/>
    <id>https://teknokoodiradio.vuodatus.net/lue/2025/03/relocation-in-progress-1</id>
    <author>
      <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
      <uri>https://teknokoodiradio.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Tachographs and more]]></title>
    <summary type="html"><![CDATA[<p>Tachograph BT. Apps for those can be found e.g. from Google Play Store. In some systems the default key = (abbreviation of the device manufacturer name) + number string?!</p>

<p><img alt="se1.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67cdc7f4e08b9ea721e1421a/se1.jpg" /></p>

<p> </p>

<p><img alt="se2.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67cdc7f9e08b9e7423e1421a/se2.jpg" /></p>

<p> </p>

<p> </p>

<p><img alt="se3.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67cdc7fee08b9e2422e1421b/se3.jpg" /></p>

<p><img alt="se-app.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67cdc804e08b9e6224e1421d/se-app.jpg" /></p>

<p> </p>

<p>BT device found near Gatsos.<br />
Food for thought: https://www.pemicro.com/partners/index.cfm?manufacturer_id=12</p>

<p><img alt="nrf5.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67cdc85de08b9ebd2ce14219/nrf5.jpg" /></p>

<p><img alt="nrf5-1.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67cdc864e08b9e362be14219/nrf5-1.jpg" /></p>

<p> </p>

<p><img alt="nrf5-2.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67cdc869e08b9ede21e1421b/nrf5-2.jpg" /></p>

<p><img alt="THRG.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67cdc86ee08b9eef21e1421b/THRG.jpg" /></p>

<p>DFU enabled devs there are many BT HW vendor update apps</p>

<p><img alt="dff.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67e03a00e08b9e7919f282e5/dff.jpg" /></p>]]></summary>
    <published>2025-03-09T18:39:00+02:00</published>
    <updated>2025-05-03T14:53:51+03:00</updated>
    <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/lue/2025/03/tachographs-and-more"/>
    <id>https://teknokoodiradio.vuodatus.net/lue/2025/03/tachographs-and-more</id>
    <author>
      <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
      <uri>https://teknokoodiradio.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[ActiveGPS exe]]></title>
    <summary type="html"><![CDATA[<p>By using DetectItEasy found commands</p>

<p>&amp;D<br />
&amp;J<br />
&amp;C01<br />
&amp;E<br />
&amp;F<br />
&amp;C33<br />
&amp;C67<br />
&amp;H<br />
&amp;I<br />
&amp;G<br />
&amp;H0020<br />
&amp;B<br />
&amp;E000000<br />
&amp;A</p>

<p>Map;http://www.adteknik.com/map.htm?lat=%lat%&amp;lng=%lon%&amp;r=%radius%<br />
7686    00136945    00537b45    Section(1)['.data']    09    A    MyMap.txt<br />
7687    00136957    00537b57    Section(1)['.data']    08    A    placemap<br />
7688    00136960    00537b60    Section(1)['.data']    07    A    loggmap<br />
7689    00136968    00537b68    Section(1)['.data']    07    A    map.txt<br />
7690    00136978    00537b78    Section(1)['.data']    08    A    placemap<br />
7691    00136981    00537b81    Section(1)['.data']    07    A    loggmap<br />
7692    00136989    00537b89    Section(1)['.data']    15    A    http://www.topgear.no<br />
7693    0013699f    00537b9f    Section(1)['.data']    16    A    http://www.adteknik.se<br />
7694    001369b6    00537bb6    Section(1)['.data']    08    A    Map2.txt<br />
7695    001369bf    00537bbf    Section(1)['.data']    07    A    Map.txt<br />
7696    001369c8    00537bc8    Section(1)['.data']    16    A    Temp00000000.ActiveGPS<br />
7697    001369df    00537bdf    Section(1)['.data']    0b    A    26 44 0D 0A<br />
7698    001369eb    00537beb    Section(1)['.data']    0d    A    ActiveGPS.OUT<br />
7699    00136a06    00537c06    Section(1)['.data']    14    A    _ActiveGps.ActiveGPS<br />
7700    00136a21    00537c21    Section(1)['.data']    0a    A    .ActiveGPS<br />
....</p>

<p>Inspecting with Wireshark (tcp port 20 || tcp port 21)</p>

<p><img alt="ws-ftp.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67b239c7e08b9e546d7011ef/ws-ftp.jpg" /></p>]]></summary>
    <published>2025-02-16T21:12:00+02:00</published>
    <updated>2025-05-03T14:54:09+03:00</updated>
    <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/lue/2025/02/activegps-exe"/>
    <id>https://teknokoodiradio.vuodatus.net/lue/2025/02/activegps-exe</id>
    <author>
      <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
      <uri>https://teknokoodiradio.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Some ActiveGPS PyMocking]]></title>
    <summary type="html"><![CDATA[<p>Far from complete. By using USB to serial converter + USB serial null modem adapter it is possbile to mimick more or less serial controlled devices without SW virtual serial ports. Wireshark used for analyzing USB serial traffic with ActiveGPS Windows software and my (really old) ActiveGPS device.</p>

<p><img alt="agps-scr.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/679296aee08b9ecc660bb626/agps-scr.jpg" /></p>

<p><img alt="pymock-scr.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/679296b7e08b9ed0660bb628/pymock-scr.jpg" /></p>

<p> </p>

<p>import serial</p>

<p>A = b'00'<br />
B = b'06036F72AD18F8BF4B07DA01120B3215AF00'<br />
C = b'0000'<br />
D = b'00'<br />
E = b'00'<br />
J = [<br />
     b'18F8BF4B07DA01120B3215AFFFFFFFFF',<br />
     b'409CA961000050124EF175426C73AE41',<br />
     b'14060D0907DB5B58421D474A4A00FFFF',<br />
     b'FFFFFFF133FB33FB33FA33FA33FA33FA',<br />
     b'33FA33FA33FA33FA33FA33FA33FA33FA',<br />
     b'33FA33FFFFFFFFFFFFFFFFFFFFFFFFFF',<br />
     b'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF',<br />
     b'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000',<br />
    ]</p>

<p>ser = serial.Serial('COM19', 9600, timeout=None)<br />
print("...")<br />
while True:<br />
    s = ser.readline()<br />
    if s[0:1] == b'\xff':<br />
        s = s[1:]<br />
    print('\r\nReceived ' + str(s))<br />
    if s == b'&amp;A\r\n':<br />
        print('\tSent ' + str(A))<br />
        ser.write(A)<br />
    elif s == b'&amp;B\r\n':<br />
        print('\tSent ' + str(B))<br />
        ser.write(B)<br />
    elif s == b'&amp;C01\r\n':<br />
        print('\tSent ' + str(C))<br />
        ser.write(C)<br />
    elif s == b'&amp;J\r\n':<br />
        for i in J:<br />
            print('\tSent ' + str(i))<br />
            ser.write(i)<br />
    elif s == '&amp;E000000\r\n':<br />
        print('\tSent ' + str(E))<br />
        ser.write(E)<br />
    elif s == '&amp;D\r\n':<br />
        print('\tSent ' + str(D))<br />
        ser.write(D)<br />
        break<br />
    else:<br />
        break<br />
    ser.flush()<br />
ser.close()<br />
print("Port closed")</p>

<p> </p>

<p> </p>]]></summary>
    <published>2025-01-23T21:25:00+02:00</published>
    <updated>2025-05-03T14:54:22+03:00</updated>
    <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/lue/2025/01/some-activegps-pymocking"/>
    <id>https://teknokoodiradio.vuodatus.net/lue/2025/01/some-activegps-pymocking</id>
    <author>
      <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
      <uri>https://teknokoodiradio.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[ActiveGPS firmware update process]]></title>
    <summary type="html"><![CDATA[<p>ActiveGPS MCU is PIC18F2455<br /><br />
&amp;A   start op<br />
&amp;B   device info<br />
&amp;J    read EEPROM content<br /><br />
Read FLASH content<br />
&amp;E000000<br />
&amp;F<br />
...<br />
&amp;F</p>

<p>Update firmware<br />
&amp;H0108<br />
&amp;G001 ... &amp;G00B</p>

<p><br />
Wireshark, export pcapng as plain text with data bytes</p>

<p>Frame 2178: 27 bytes on wire (216 bits), 27 bytes captured (216 bits) on interface \\.\USBPcap5, id 0</p>

<p>0000  1b 00 60 15 59 06 05 d4 ff ff 00 00 00 00 09 00   ..`.Y...........<br />
0010  00 05 00 01 00 83 03 00 00 00 00                  ...........</p>

<p>Frame 2179: 565 bytes on wire (4520 bits), 565 bytes captured (4520 bits) on interface \\.\USBPcap5, id 0</p>

<p>0000  1b 00 a0 58 bc 09 05 d4 ff ff 00 00 00 00 09 00   ...X............<br />
0010  00 05 00 01 00 03 03 1a 02 00 00 26 47 30 30 30   ...........&amp;G000<br />
0020  30 30 30 30 30</p>

<p> </p>

<p>Some Python code to extract &amp;G blocks<br /><br />
i = 0<br />
s = ""<br />
f = open('agps-ptext2.txt', 'r')<br />
fo = open("fwdata.hex", "w")<br />
lines = f.readlines()<br />
l = len(lines)<br />
while True:<br />
    s = str(lines[i]).strip()<br />
    if s.find('565 bytes on wire') &gt; -1:<br />
        i = i + 3<br />
        for p in range(35):<br />
            s = str(lines[i]).strip()<br />
            s = s.replace('.', '')<br />
            s = s.replace('&amp;G', '')<br />
            fo.write(s[56:])<br />
            i = i + 1<br />
    else:<br />
        i = i + 1<br />
    if i &gt;= l:<br />
        break<br />
fo.close()<br />
f.close()<br />
print("c")</p>

<p> </p>]]></summary>
    <published>2025-01-10T15:36:00+02:00</published>
    <updated>2025-05-03T14:54:37+03:00</updated>
    <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/lue/2025/01/activegps-firmware-update-process-1"/>
    <id>https://teknokoodiradio.vuodatus.net/lue/2025/01/activegps-firmware-update-process-1</id>
    <author>
      <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
      <uri>https://teknokoodiradio.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Python: Inspecting ActiveGPS]]></title>
    <summary type="html"><![CDATA[<p>Python + PySerial: Inspecting AD-Teknik ActiveGPS</p>

<p># show eeprom<br />
import serial</p>

<p>ser = serial.Serial('COM6', 9600, timeout=4)<br />
print("&amp;A")<br />
ser.write(b'&amp;A\r\n')<br />
b = ser.read(256)<br />
print(b)<br />
print("&amp;B")<br />
ser.write(b'&amp;B\r\n')<br />
b = ser.read(256)<br />
print(b)<br />
print("&amp;J")<br />
ser.write(b'&amp;J\r\n')<br />
b = ser.read(280)<br />
print(b)<br />
print("&amp;D")<br />
ser.write(b'&amp;D\r\n')<br />
b = ser.read(16)<br />
print(b)<br />
ser.close()</p>

<p><img alt="agps-eeprom.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67751d29e08b9ec864200ada/agps-eeprom.jpg" /></p>

<p> </p>

<p># show flash<br />
import serial</p>

<p>ser = serial.Serial('COM6', 9600, timeout=4)<br />
print("&amp;A")<br />
ser.write(b'&amp;A\r\n')<br />
b = ser.read(16)<br />
print(b)</p>

<p>print("&amp;B")<br />
ser.write(b'&amp;B\r\n')<br />
b = ser.read(256)<br />
print(b)</p>

<p>print("&amp;F")<br />
ser.write(b'&amp;F\r\n')<br />
b = ser.read(3072)<br />
print(b)<br />
ser.write(b'&amp;F\r\n')<br />
b = ser.read(3072)<br />
print(b)<br />
ser.write(b'&amp;F\r\n')<br />
b = ser.read(3072)<br />
print(b)<br />
ser.write(b'&amp;F\r\n')<br />
b = ser.read(3072)<br />
print(b)<br />
ser.write(b'&amp;F\r\n')<br />
b = ser.read(3072)<br />
print(b)</p>

<p><br />
print("&amp;D")<br />
ser.write(b'&amp;D\r\n')<br />
b = ser.read(8)<br />
print(b)</p>

<p>ser.close()</p>

<p><img alt="agps-flash.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67751d3ae08b9e695d200ada/agps-flash.jpg" /></p>

<p> </p>]]></summary>
    <published>2025-01-01T12:44:00+02:00</published>
    <updated>2025-05-03T14:55:05+03:00</updated>
    <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/lue/2025/01/python-inspecting-activegps"/>
    <id>https://teknokoodiradio.vuodatus.net/lue/2025/01/python-inspecting-activegps</id>
    <author>
      <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
      <uri>https://teknokoodiradio.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Bt mesh/sbus devices in shopping centres]]></title>
    <summary type="html"><![CDATA[<p><img alt="srm5.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67557a7de08b9e7720c6d9ef/srm5.jpg" /></p>

<p> </p>

<p><img alt="srm3.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67557a73e08b9ee920c6d9ec/srm3.jpg" /></p>

<p><img alt="srm2.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67557a6ee08b9e7120c6d9ea/srm2.jpg" /></p>

<p> </p>

<p><img alt="srm1.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67557a69e08b9eec15c6da18/srm1.jpg" /></p>

<p><img alt="TelinkSigMeshApp.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67557ad6e08b9ebd27c6d9e8/TelinkSigMeshApp.jpg" /><br />
TelinkSigMeshApp<br /><a href="https://wiki.telink-semi.cn/wiki/protocols/Bluetooth-Mesh/" rel="nofollow">https://wiki.telink-semi.cn/wiki/protocols/Bluetooth-Mesh/</a></p>

<p> </p>

<p><img alt="plejd1.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67557bf3e08b9eae36c6d9ee/plejd1.jpg" /><img alt="plejd2.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67557bf0e08b9e8536c6d9ec/plejd2.jpg" /></p>

<p> </p>

<p>A 5G outdoor gateway asking for pairing...<br /><img alt="bmodemcon.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/675f212ae08b9e1e061660e6/bmodemcon.jpg" /></p>

<p>ZTE Install helper ...<br /><img alt="zte-ih.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67640c27e08b9e31161660eb/zte-ih.jpg" /></p>]]></summary>
    <published>2024-12-08T13:25:00+02:00</published>
    <updated>2025-01-24T23:31:15+02:00</updated>
    <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/lue/2024/12/bt-mesh-sbus-devices-in-shopping-centres"/>
    <id>https://teknokoodiradio.vuodatus.net/lue/2024/12/bt-mesh-sbus-devices-in-shopping-centres</id>
    <author>
      <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
      <uri>https://teknokoodiradio.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[PySpecSDR win]]></title>
    <summary type="html"><![CDATA[<p><a href="https://github.com/xqtr/PySpecSDR" rel="nofollow">https://github.com/xqtr/PySpecSDR</a></p>

<p>Windows 10<br />
Python 3.12.7 - windows-curses does not work in Python 3.13</p>

<p>requirements.txt:<br />
numpy&gt;=1.20.0<br />
scipy&gt;=1.7.0<br />
sounddevice&gt;=0.4.1<br />
SoapySDR&gt;=0.8.0<br />
pyrtlsdr&gt;=0.2.91</p>

<p>Also have to install py modules setuptools &amp; windows-curses<br /><a href="https://pypi.org/project/windows-curses/#files" rel="nofollow">https://pypi.org/project/windows-curses/#files</a></p>

<p>Copy dll files librtlsdr and libusb-1.0 to e.g. folder where python.exe is located. Those files can be found e.g. from rtl_433<br /><a href="https://github.com/merbanan/rtl_433/releases" rel="nofollow">https://github.com/merbanan/rtl_433/releases</a></p>

<p>PySpecSDR does not start if run from Python IDLE (works from command line)<br />
    fd=_sys.__stdout__.fileno())<br />
AttributeError: 'NoneType' object has no attribute 'fileno'</p>

<p>One workaround probably is modify windows-curses code<br /><a href="https://docs.python.org/3/library/shutil.html#shutil.get_terminal_size" rel="nofollow">https://docs.python.org/3/library/shutil.html#shutil.get_terminal_size</a></p>

<p>To get rid of warning messages at PySpecSDR init when running it is comment out ''' ---- '''' comment block at the beginning of the code.</p>

<p> </p>

<p>#!/usr/bin/python3<br />
## ____        ____                  ____  ____  ____  <br />
##|  _ \ _   _/ ___| _ __   ___  ___/ ___||  _ \|  _ \<br />
##| |_) | | | \___ \| '_ \ / _ \/ __\___ \| | | | |_) |<br />
##|  __/| |_| |___) | |_) |  __/ (__ ___) | |_| |  _ &lt;<br />
##|_|    \__, |____/| .__/ \___|\___|____/|____/|_| \_\<br />
##       |___/      |_|                              <br />
.....</p>

<p> </p>

<p><img src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/674c7b44e08b9e851f2d5fe4/pyspecsdr.jpg" alt="pyspecsdr.jpg" /></p>

<p> </p>]]></summary>
    <published>2024-12-01T16:51:00+02:00</published>
    <updated>2024-12-01T17:09:31+02:00</updated>
    <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/lue/2024/12/pyspecsdr-win"/>
    <id>https://teknokoodiradio.vuodatus.net/lue/2024/12/pyspecsdr-win</id>
    <author>
      <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
      <uri>https://teknokoodiradio.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Bearmock Python 3 and virtual serial port mods]]></title>
    <summary type="html"><![CDATA[<p><a href="https://recon.cx/2013/slides/Recon2013-Gabriel%20Tremblay-Reversing%20P25%20Radios.pdf" rel="nofollow">https://recon.cx/2013/slides/Recon2013-Gabriel%20Tremblay-Reversing%20P25%20Radios.pdf</a></p>

<p>Hardware used: USB to serial adapter (Aten UC-232A) + USB serial null modem adapter (S6618, cheap device from eBay). Probably it would be quite easy to write Arduino code and use two Arduinos connected with software serial.</p>

<p>I modified this code <a href="https://github.com/gabtremblay/Bearmock" rel="nofollow">https://github.com/gabtremblay/Bearmock</a> to run in Python 3 (3.13, pyserial 3.5) and without com0com software virtual serial port.</p>

<p><img alt="usbnull-usbser.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/6733976ee08b9ea96b136911/usbnull-usbser.jpg" /></p>

<p><img alt="comports.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/6733976be08b9ea96b136905/comports.jpg" /></p>

<p> </p>

<p><img alt="bcvup-port-sel.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67339765e08b9eb569136903/bcvup-port-sel.jpg" /></p>

<p><img alt="py-output.jpg" src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/67339768e08b9e2569136905/py-output.jpg" /></p>

<p> </p>

<p>from time import sleep<br />
from serial import Serial</p>

<p>__MODEL = 'BCD296D'<br />
__PORT = 'COM21'<br />
__SPEED = 9600<br />
__TIMEOUT = 0  # non-blocking<br />
__READ_SLEEP_SECS = 0<br />
__OUT = 'decoded.s19'</p>

<p><br />
__ACTIONS = {<br />
    '\r': 'UNKNOWN COMMAND\r',  # Empty, just reply<br />
    '*SUM\r': 'CHECKSUM= DEADH\r',  # Fake checksum<br />
    '*SPD 1\r': 'SPEED 9600 bps\r',<br />
    '*SPD 2\r': 'SPEED 19200 bps\r',<br />
    '*SPD 3\r': 'SPEED 38400 bps\r',<br />
    '*SPD 4\r': 'SPEED 57600 bps\r',<br />
    '*SPD 5\r': 'SPEED 115200 bps\r',<br />
    '*PGL 11000000000\r': 'OK\r',<br />
    '*PGL 1000000000000000000\r': 'OK\r',<br />
    '*PGL 1100000\r': 'OK\r',<br />
    '*ULE\r': 'OK\r',<br />
    '*PRG\r': 'OK\r',<br />
    '*MDL\r': __MODEL + '\r',<br />
    '*FDP\r': 'FDP 3.\r',<br />
    '*REG\r': 'R 1\r',<br />
    '*APP\r': 'Version 3.00.00\r',<br />
    '*VER\r': 'Version 3.00.00\r',<br />
    '*SCB 1\r': 'SCB 1\r',<br />
    '*RTS F\r': 'RTS OFF\r',<br />
    '*MOD 1\r': 'MODE 1\r',<br />
    '*WWS N\r': 'WWS 0\r',<br />
    '*SUM 1 0\r': 'CHECKSUM= C68FH\r',<br />
    '*SUM 6 0\r': 'CHECKSUM= DEADH\r',<br />
}</p>

<p>if __name__ == "__main__":<br />
    try:<br />
        port = Serial(__PORT, __SPEED, timeout=__TIMEOUT, bytesize=8, parity='N', stopbits=1)<br />
    except Exception as ex:<br />
        print(ex)<br />
        exit()</p>

<p>    outfile = open(__OUT, 'wb')<br />
    <br />
    print("Reading port... " + __PORT)<br />
    readbuf = ''<br />
    while True:<br />
        try:<br />
            byte = port.read(1)<br />
            if len(byte) &gt; 0:<br />
                #num = int(byte.encode('hex'), 16) Python 2!<br />
                num = int.from_bytes(byte)<br />
                #print str(num) + ' (' + chr(num) + ')'<br />
                readbuf = ''.join([readbuf, chr(num)])<br />
                if num == 13:  # got a \r == EOL<br />
                    if readbuf[0:2] == 'S8':<br />
                        print("End of firmware (updater will crash ;)")<br />
                        readbuf = readbuf.replace('\x0d', '\x0d\x0a')<br />
                        outfile.write(readbuf.encode())<br />
                        outfile.close()<br />
                        port.close()<br />
                        exit()<br />
                    elif readbuf[0:2] == 'S0' or readbuf[0:2] == 'S2':<br />
                        readbuf = readbuf.replace('\x0d', '\x0d\x0a')<br />
                        outfile.write(readbuf.encode())<br />
                    else:<br />
                       <br />
                        print("Received command: ",)<br />
                        print(readbuf)</p>

<p>                        action = __ACTIONS.get(readbuf.strip(''))<br />
                        if not action:<br />
                            print("No corresponding action found")<br />
                        else:<br />
                            print("Sending: " + action + "\n")<br />
                            port.write(str.encode(__ACTIONS.get(readbuf.strip(' '))))<br />
                            if readbuf[0:4] == '*SPD':<br />
                                port.close()<br />
                                if readbuf[0:6] == '*SPD 1':<br />
                                    port.baudrate = 9600<br />
                                elif readbuf[0:6] == '*SPD 2':<br />
                                    port.baudrate = 19200<br />
                                elif readbuf[0:6] == '*SPD 3':<br />
                                    port.baudrate = 38400<br />
                                elif readbuf[0:6] == '*SPD 4':<br />
                                    port.baudrate = 57600<br />
                                elif readbuf[0:6] == '*SPD 5':<br />
                                    port.baudrate = 115200<br />
                                port.open()<br />
                        <br />
                    port.flush()                            <br />
                    readbuf = ''</p>

<p>        except Exception as ex:<br />
            print(ex)<br />
            exit()</p>

<p>        sleep(__READ_SLEEP_SECS)</p>

<p>    port.close()<br />
    outfile.close()</p>

<p> </p>

<p>A bit tuned actions ...</p>

<p><br />
__ACTIONS = {<br />
    '\r': 'UNKNOWN COMMAND\r',  # Empty, just reply<br />
    '*SUM\r': 'CHECKSUM= DEADH\r',  # Fake checksum<br />
    '*SPD 1\r': 'SPEED 9600 bps\r',<br />
    '*SPD 2\r': 'SPEED 19200 bps\r',<br />
    '*SPD 3\r': 'SPEED 38400 bps\r',<br />
    '*SPD 4\r': 'SPEED 57600 bps\r',<br />
    '*SPD 5\r': 'SPEED 115200 bps\r',<br />
    '*PGL 11000000000\r': 'OK\r',<br />
    '*PGL 1000000000000000000\r': 'OK\r',<br />
    '*PGL 1100000\r': 'OK\r',<br />
    '*PGL 110000000\r': 'OK\r',<br />
    '*ULE\r': 'OK\r',<br />
    '*PRG\r': 'OK\r',<br />
    '*MDL\r': __MODEL + '\r',<br />
    '*FDP\r': 'FDP 3.\r',<br />
    '*REG\r': 'R 1\r',<br />
    '*APP\r': 'Version 3.00.00\r',<br />
    '*VER\r': 'Version 3.00.00\r',<br />
    '*SCB 1\r': 'SCB 1\r',<br />
    '*SCB 2\r': 'SCB 2\r',<br />
    '*RTS F\r': 'RTS OFF\r',<br />
    '*MOD 1\r': 'MODE 1\r',<br />
    '*WWS N\r': 'WWS 0\r',<br />
    '*SUM 1 0\r': 'CHECKSUM= C68FH\r',<br />
    '*SUM 6 0\r': 'CHECKSUM= DEADH\r',<br />
    '*RMV\r': 'OK\r',<br />
    '*OFF\r': 'OK\r',<br />
}</p>

<p> </p>]]></summary>
    <published>2024-11-12T19:51:00+02:00</published>
    <updated>2024-11-18T13:48:14+02:00</updated>
    <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/lue/2024/11/bearmock-python-3-and-virtual-serial-port-mods"/>
    <id>https://teknokoodiradio.vuodatus.net/lue/2024/11/bearmock-python-3-and-virtual-serial-port-mods</id>
    <author>
      <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
      <uri>https://teknokoodiradio.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Blue locks and prts]]></title>
    <summary type="html"><![CDATA[<p>Open BT printers can be found occasionally</p>

<p><img src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/6725e5e2e08b9e4c4e07fc31/epsonprt.jpg" alt="epsonprt.jpg" /></p>

<p>TMUtil Android app.</p>

<p><img src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/6725e95de08b9ec06b07fc3e/TMutil.jpg" alt="TMutil.jpg" /></p>

<p> </p>

<p>RFID + BT system<br /><img src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/6725e962e08b9e8d6e07fc33/passtechdev.jpg" alt="passtechdev.jpg" /></p>

<p> </p>

<p>eSmartLock Android app. Bluetooth and NFC enabled. Free mode</p>

<p><img src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/6725e801e08b9e206407fc38/e-smartsync-settings.jpg" alt="e-smartsync-settings.jpg" /></p>

<p>NFC tools app or TagInfo app did not find any NFC devs.</p>

<p><img src="https://vuodatus.net/media/cache/normal/blog_content_image/normal/6725e805e08b9e736607fc32/e-smartsync-rfid-scan.jpg" alt="e-smartsync-rfid-scan.jpg" /></p>

<p> </p>

<p> </p>

<p> </p>]]></summary>
    <published>2024-11-02T10:40:00+02:00</published>
    <updated>2024-11-02T11:09:04+02:00</updated>
    <link rel="alternate" type="text/html" href="https://teknokoodiradio.vuodatus.net/lue/2024/11/blue-locks-and-prts"/>
    <id>https://teknokoodiradio.vuodatus.net/lue/2024/11/blue-locks-and-prts</id>
    <author>
      <name>OH1GIU - New location of this blog is https://techcoderadio.blogspot.com</name>
      <uri>https://teknokoodiradio.vuodatus.net/</uri>
    </author>
  </entry>
</feed>
