<feed xmlns='http://www.w3.org/2005/Atom'>
<title>iot-contact/fw, branch binary-descriptors</title>
<subtitle>IoT device to check if doors and windows are closed or open</subtitle>
<id>https://cgit.xengineering.eu/iot-contact/atom?h=binary-descriptors</id>
<link rel='self' href='https://cgit.xengineering.eu/iot-contact/atom?h=binary-descriptors'/>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/'/>
<updated>2025-03-22T20:21:44Z</updated>
<entry>
<title>fw: firmware: Use binary descriptors for metadata</title>
<updated>2025-03-22T20:21:44Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-22T20:21:44Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=f4eccbe461f8c33144c72cfe2d533ecda4072d15'/>
<id>urn:sha1:f4eccbe461f8c33144c72cfe2d533ecda4072d15</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fw: firmware: Add app build version output</title>
<updated>2025-03-22T20:21:44Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-22T20:21:44Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=0c771fb52f864c867d2fcff795e4d3ebd8de1c7c'/>
<id>urn:sha1:0c771fb52f864c867d2fcff795e4d3ebd8de1c7c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fw: Remove empty main</title>
<updated>2025-03-22T20:21:44Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-22T20:21:44Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=9f2ce4cc9ba9ad45a7e88247f8c1fb0953717b0e'/>
<id>urn:sha1:9f2ce4cc9ba9ad45a7e88247f8c1fb0953717b0e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fw: Fix network configuration for simulation</title>
<updated>2025-03-21T21:48:27Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:48:27Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=566c63a67224844c2c7766526680a92d233b3cd0'/>
<id>urn:sha1:566c63a67224844c2c7766526680a92d233b3cd0</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fw: Use MCUboot bootloader for nucleo_f767zi</title>
<updated>2025-03-21T21:48:02Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:48:02Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=a398f3b7420525b11c31dadf07b0cd696f1f6d3c'/>
<id>urn:sha1:a398f3b7420525b11c31dadf07b0cd696f1f6d3c</id>
<content type='text'>
Using it for the native_sim board is not trivial. Thus it is first only
added for the Nucleo board.
</content>
</entry>
<entry>
<title>fw: Add mcuboot submodule</title>
<updated>2025-03-21T21:47:57Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:47:57Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=61238e93e2c5b3c672d3a55f6273bfd3615f05d7'/>
<id>urn:sha1:61238e93e2c5b3c672d3a55f6273bfd3615f05d7</id>
<content type='text'>
This provides the source code for the used bootloader.
</content>
</entry>
<entry>
<title>fw: nucleo: Allow custom my.conf configuration</title>
<updated>2025-03-21T21:47:17Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:47:17Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=fb24214660b60e97cc3b012fb0ac31d5a54e9e9e'/>
<id>urn:sha1:fb24214660b60e97cc3b012fb0ac31d5a54e9e9e</id>
<content type='text'>
This allows to set custom IPv6 addresses while there is not runtime
configuration.
</content>
</entry>
<entry>
<title>fw: network: Add Kconfig-based IPv6 ULA</title>
<updated>2025-03-21T21:41:45Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:41:45Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=3d28070910e3cf6ec5375e18cafbda0b7b22cfc8'/>
<id>urn:sha1:3d28070910e3cf6ec5375e18cafbda0b7b22cfc8</id>
<content type='text'>
Using Kconfig for now is a way to continue faster for now. Proper
runtime configuration should be added later.

The firmware in general should be fully usable without a DHCPv6 server
to not require central infrastructure.

While IPv6 link-local addresses provide static and unique addresses for
local communication and SLAAC provides global addresses there is still a
need for an additional static address.

For this there are basically two choices:

- global IPv6 prefixes
- IPv6 unique local addresses (ULAs)

ULAs are picked with this commit. They cannot be routed which makes
isolation from the internet independent of firewall rules adding
security.

Furthermore by picking them randomly they are in practise always unique.
This allows to assign them without a central IP network management and
allows to keep those addresses forever. Both great advantages over the
IPv4 192.168.0.0/16 and similar ranges.
</content>
</entry>
<entry>
<title>fw: network: Set custom hostname</title>
<updated>2025-03-21T21:41:35Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:41:35Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=3447721d20146ba0447ee9998838266619e4c789'/>
<id>urn:sha1:3447721d20146ba0447ee9998838266619e4c789</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fw: network: Rename from mac</title>
<updated>2025-03-21T21:40:53Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:40:53Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=7447a3875ea64b1fd45aaae850085b0cac5c8e50'/>
<id>urn:sha1:7447a3875ea64b1fd45aaae850085b0cac5c8e50</id>
<content type='text'>
The scope of the mac.{c,h} files was very small. Furthermore more
network related logic needs a place. Thus making the name more general
makes sense.
</content>
</entry>
<entry>
<title>fw: js: Add web frontend to display heartbeat</title>
<updated>2025-03-21T21:39:30Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:39:30Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=2ddf4682f4c11f4356b030b6474fb12fea55b8ea'/>
<id>urn:sha1:2ddf4682f4c11f4356b030b6474fb12fea55b8ea</id>
<content type='text'>
This makes it transparent to the user that there is an active connection
to the firmware. If the connection is broken the user notices that
quickly and can re-load the page.
</content>
</entry>
<entry>
<title>fw: ws: Add WebSocket interface</title>
<updated>2025-03-21T21:33:41Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:33:41Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=e042129eddeb06c9272a6544c67f9222c347ab10'/>
<id>urn:sha1:e042129eddeb06c9272a6544c67f9222c347ab10</id>
<content type='text'>
The primary interface for this firmware was so far HTTP. This protocol
is not suitable for small and bidirectional messages which are
time-critical.

If something like this needs to be implemented with HTTP the best
approach is likely long-polling which at least makes it possible for the
server / the firmware to send data to the client / user as reaction to
an event like a closed door sensor.

TCP would fix this issue and is a good choice. Nevertheless web clients
are not allowed to open TCP connections for security purposes.

Thus the WebSocket protocol was created to fill this gap.

To not duplicate the any effort the WebSocket API should be used for
small, time-critical messages for all clients (one with TCP support like
CLI tools as well as web clients).

HTTP is still kept to provide a web page but also for functionality
where HTTP is more suitable like firmware uploads.
</content>
</entry>
<entry>
<title>fw: zephyr: Add mbedtls module</title>
<updated>2025-03-21T21:33:33Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:33:33Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=58e8dd56e233f482dc0dbe0cb8f56ef3bab7b998'/>
<id>urn:sha1:58e8dd56e233f482dc0dbe0cb8f56ef3bab7b998</id>
<content type='text'>
This is required for upcoming WebSocket APIs.
</content>
</entry>
<entry>
<title>fw: heart: Add zbus-based heartbeat code</title>
<updated>2025-03-21T21:28:09Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:28:09Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=fb9bf2457dae53cd10a916c9beac6d292e28654a'/>
<id>urn:sha1:fb9bf2457dae53cd10a916c9beac6d292e28654a</id>
<content type='text'>
The heartbeat of the firmware might be used for multiple purposes. It
can trigger a blinking LED on the PCB, can be displayed in a client
program or might serve additional purposes.

Since at least display in client programs should be implemented and
multiple clients should be support in long term it improves the code
structure to use a zbus channel here to publish heartbeat messages in a
publish-subscribe pattern.

That way the publishing of the heartbeat message and the receiving by an
unknown number of observers is completely decoupled. A central trait of
the publish-subscribe pattern and an advantage for a modular code
structure.
</content>
</entry>
<entry>
<title>fw: http: Add /favicon.ico handler</title>
<updated>2025-03-21T21:26:19Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:26:19Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=61e108a0ae856b3e1c849482d0008f698d41db27'/>
<id>urn:sha1:61e108a0ae856b3e1c849482d0008f698d41db27</id>
<content type='text'>
Common browsers always request this URL. Not responding to it shows up
as an error.

To silence this error report the firmware just responds with HTTP 204 No
Content since a favicon is currently not available.
</content>
</entry>
<entry>
<title>fw: Add nucleo.sh</title>
<updated>2025-03-21T21:25:19Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:25:19Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=0ec1b2088df75e0bed587acdd25e00a69edf3556'/>
<id>urn:sha1:0ec1b2088df75e0bed587acdd25e00a69edf3556</id>
<content type='text'>
This script allows to easily:

- build for real hardware
- flash to the microcontroller
- open the Zephyr shell UART
</content>
</entry>
<entry>
<title>fw: html: Add missing license notice</title>
<updated>2025-03-21T21:25:16Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:25:16Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=690f38b8212b2638ec323d19869cc0c14487375e'/>
<id>urn:sha1:690f38b8212b2638ec323d19869cc0c14487375e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fw: html: Move HTML to src folder</title>
<updated>2025-03-21T21:24:27Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:24:27Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=dc146be244c8063971d7b769f35c8c9991cf144a'/>
<id>urn:sha1:dc146be244c8063971d7b769f35c8c9991cf144a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fw: http: Add HTML resource /</title>
<updated>2025-03-21T21:23:47Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:23:47Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=2430e8557685a8af292ae82ca11ec59acb365390'/>
<id>urn:sha1:2430e8557685a8af292ae82ca11ec59acb365390</id>
<content type='text'>
This provides the index HTML page.
</content>
</entry>
<entry>
<title>fw: syslog: Adjust log levels</title>
<updated>2025-03-21T21:23:32Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:23:32Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=b912c63ca9724a31f57226a44e87954e4fbd46c4'/>
<id>urn:sha1:b912c63ca9724a31f57226a44e87954e4fbd46c4</id>
<content type='text'>
This follows the pattern:

* ERR in error handler if statements
* DBG at top of each function and on demand
* INF at end of function
</content>
</entry>
<entry>
<title>fw: mac: Implement MAC address setting</title>
<updated>2025-03-21T21:22:51Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:22:51Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=07d694f3d21ffc1b69638b8732ffd630affc9768'/>
<id>urn:sha1:07d694f3d21ffc1b69638b8732ffd630affc9768</id>
<content type='text'>
The used MAC address is from an example range. Later it can easily be
combined with reading from a MAC-providing EEPROM chip to using a unique
hardware MAC on the device.
</content>
</entry>
<entry>
<title>fw: zephyr: Switch to latest release v4.1.0</title>
<updated>2025-03-21T21:18:24Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:18:24Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=b309e027582b656b8a6094e268b495173f30bde7'/>
<id>urn:sha1:b309e027582b656b8a6094e268b495173f30bde7</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fw: Use SLAAC for network configuration</title>
<updated>2025-03-21T21:15:46Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:15:46Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=fbed749cd316f1c9fe8dbe8a564b41f93cf0ac1f'/>
<id>urn:sha1:fbed749cd316f1c9fe8dbe8a564b41f93cf0ac1f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fw: syslog: Add static syslog logging</title>
<updated>2025-03-21T21:07:26Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:07:26Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=fcbd6ac3415d4a122d21b2e379ccf170620f45da'/>
<id>urn:sha1:fcbd6ac3415d4a122d21b2e379ccf170620f45da</id>
<content type='text'>
Network-based logging via the syslog protocol allows to log from many
IoT devices to a central log server.

This makes reading logs way easier. Choosing UDP removes the need for
logic keeping a state. Maybe dropped packages are acceptable for the use
case but should be rare anyway.
</content>
</entry>
<entry>
<title>fw: Add simulate-network.sh</title>
<updated>2025-03-21T21:01:32Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T21:01:32Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=5f457c4786b270f0918294b09f32c484f165e2ef'/>
<id>urn:sha1:5f457c4786b270f0918294b09f32c484f165e2ef</id>
<content type='text'>
This script can be called with root permissions and without any
arguments to provide a virtual network interface `zeth` and an IPv6
router advertisement daemon to provide a realistic network environment
without any hardware.
</content>
</entry>
<entry>
<title>fw: Switch to board native_sim/native/64</title>
<updated>2025-03-21T20:56:27Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T20:56:27Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=c72b621019ceb103033e289addbb448ad5f4e3b6'/>
<id>urn:sha1:c72b621019ceb103033e289addbb448ad5f4e3b6</id>
<content type='text'>
Using this board by default allows easier development since it compiles
to a Linux executable which can be executed with `./zephyr.exe`,
debugged with `gdb zephyr.exe` and has a virtual serial port for the
Zephyr shell.

Later the 32 bit version or even a QEMU variant should be used but the
64 bit variant is a low hanging fruit since the host libraries can be
used. This is not wanted but easy to accomplish.
</content>
</entry>
<entry>
<title>fw: Remove GPIO-based logic</title>
<updated>2025-03-21T20:52:38Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-03-21T20:52:38Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=f0561bc721f783487ebdd3cbd1424cf116d48712'/>
<id>urn:sha1:f0561bc721f783487ebdd3cbd1424cf116d48712</id>
<content type='text'>
This makes it easier to develop the whole network-related firmware parts
on a simulation board instead of hardware.

The nucleo_f767zi board has likely a hardware bug making Ethernet
sometimes fail. This is not suitable for development.
</content>
</entry>
<entry>
<title>fw: Update to Zephyr v4.0.0</title>
<updated>2025-02-23T10:26:26Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-02-23T10:26:26Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=ff74e7ca54dabf41720e9739ff59ba816e92cec9'/>
<id>urn:sha1:ff74e7ca54dabf41720e9739ff59ba816e92cec9</id>
<content type='text'>
This is the latest release of the Zephyr real-time operating system.
</content>
</entry>
<entry>
<title>Switch to a global CMake build</title>
<updated>2025-02-14T08:03:18Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-02-14T07:37:08Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=298cb131149f583ab986ee69901765c3dbcce674'/>
<id>urn:sha1:298cb131149f583ab986ee69901765c3dbcce674</id>
<content type='text'>
This allows to easily build everything from the repository root. For now
this only covers firmware but later electrical PCB and mechanical case
files can be added.
</content>
</entry>
<entry>
<title>fw: Do not track Python environment</title>
<updated>2025-02-14T07:57:16Z</updated>
<author>
<name>xengineering</name>
<email>me@xengineering.eu</email>
</author>
<published>2025-02-14T07:57:16Z</published>
<link rel='alternate' type='text/html' href='https://cgit.xengineering.eu/iot-contact/commit/?id=ee9106047c2128e8be07e754157c71c92a77a442'/>
<id>urn:sha1:ee9106047c2128e8be07e754157c71c92a77a442</id>
<content type='text'>
Tracking the Python environment with specific dependency versions does
not work well. Over time these versions disappear and are not anymore
installable via pip.

For now the alternative is to let the user setup the environment by
interpreting the error output during builds.

This is not convenient but the best which is currently possible.

This furthermore allows to install Python dependencies via the Linux
package manager. With that it is more ergonomic to build since the
Python environment does not have to be sourced.
</content>
</entry>
</feed>
