This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| app-notes:set-fixed-frame [2026/09/30 10:55] – [3. Additional information] gray | app-notes:set-fixed-frame [2026/09/30 15:05] (current) – [3. Additional information] gray | ||
|---|---|---|---|
| Line 142: | Line 142: | ||
| ~ $ vi / | ~ $ vi / | ||
| - | # Setting up a USB flash drive in the LXC container | + | # Setting up a USB drive in the LXC container |
| lxc.cgroup.devices.allow = c 188:1 rwm | lxc.cgroup.devices.allow = c 188:1 rwm | ||
| lxc.mount.entry = / | lxc.mount.entry = / | ||
| Line 156: | Line 156: | ||
| < | < | ||
| ~ $ lxc-attach guest0 | ~ $ lxc-attach guest0 | ||
| - | root@LXCNAME: | + | root@LXCNAME: |
| root@LXCNAME: | root@LXCNAME: | ||
| </ | </ | ||
| Line 359: | Line 359: | ||
| < | < | ||
| root@LXCNAME: | root@LXCNAME: | ||
| - | Setze gpsd.0.status=0 ... | + | Setze gpsd.1.status=0 ... |
| - | Versuch 1/2: rufe set_cfg_rate_neom8l.py | + | Versuch 1/2: call set_cfg_rate_neom8l.py |
| STDOUT: | STDOUT: | ||
| STDERR: 2026-09-30 10: | STDERR: 2026-09-30 10: | ||
| Line 368: | Line 368: | ||
| root@LXCNAME: | root@LXCNAME: | ||
| </ | </ | ||
| + | |||
| + | Then test the whole thing with a get script. | ||
| + | |||
| + | < | ||
| + | root@LXCNAME: | ||
| + | 2026-09-30 11: | ||
| + | 2026-09-30 11: | ||
| + | UBX-CFG-RATE cls:06 id:08 | ||
| + | measRate: 100 | ||
| + | navRate: 1 | ||
| + | timeRef: 0 | ||
| + | root@LXCNAME: | ||
| + | </ | ||
| + | |||
| ---- | ---- | ||
| Line 397: | Line 411: | ||
| rate_hz = int(sys.argv[1]) | rate_hz = int(sys.argv[1]) | ||
| if not (1 <= rate_hz <= 10): | if not (1 <= rate_hz <= 10): | ||
| - | raise ValueError | + | raise ValueErro |
| except ValueError: | except ValueError: | ||
| print(" | print(" | ||
| Line 421: | Line 435: | ||
| </ | </ | ||
| ++++ | ++++ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Download the '' | ||
| + | |||
| + | ++++show code| | ||
| + | <code – ssh_start.py> | ||
| + | # | ||
| + | """ | ||
| + | Establish an SSH connection (key-based) to the router, briefly disable gpsd | ||
| + | (wwanmd toggles the port from down to up, leaving it briefly free), and within that window | ||
| + | call set_cfg_rate_neom8l.py with the desired rate_hz value, and then | ||
| + | re-enable gpsd. | ||
| + | |||
| + | Calling the subroutine: | ||
| + | python3 run_set_rate.py < | ||
| + | """ | ||
| + | import paramiko | ||
| + | import subprocess | ||
| + | import time | ||
| + | import sys | ||
| + | |||
| + | HOST = " | ||
| + | PORT = 22 | ||
| + | USER = " | ||
| + | SSH_KEY_PATH = "/ | ||
| + | RETRY_COUNT = 2 # attempts | ||
| + | RETRY_DELAY = 0.5 # Seconds between attempts | ||
| + | |||
| + | |||
| + | def run_remote_command(client, | ||
| + | stdin, stdout, stderr = client.exec_command(cmd) | ||
| + | out = stdout.read().decode().strip() | ||
| + | err = stderr.read().decode().strip() | ||
| + | status = stdout.channel.recv_exit_status() | ||
| + | return status, out, err | ||
| + | |||
| + | |||
| + | def main(): | ||
| + | if len(sys.argv) != 2: | ||
| + | print(f" | ||
| + | sys.exit(1) | ||
| + | |||
| + | try: | ||
| + | rate_hz = int(sys.argv[1]) | ||
| + | if not (1 <= rate_hz <= 10): | ||
| + | raise ValueError | ||
| + | except ValueError: | ||
| + | print(" | ||
| + | sys.exit(1) | ||
| + | |||
| + | # Establish an SSH Connection to the Router '' | ||
| + | key = paramiko.RSAKey.from_private_key_file(SSH_KEY_PATH) | ||
| + | |||
| + | client = paramiko.SSHClient() | ||
| + | client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | ||
| + | client.connect(HOST, | ||
| + | |||
| + | try: | ||
| + | # Disable gpsd -> wwanmd toggles the port; it is open for a short time | ||
| + | print(" | ||
| + | run_remote_command(client, | ||
| + | |||
| + | success = False | ||
| + | for attempt in range(1, RETRY_COUNT + 1): | ||
| + | print(f" | ||
| + | result = subprocess.run( | ||
| + | [" | ||
| + | capture_output=True, | ||
| + | ) | ||
| + | print(" | ||
| + | if result.stderr: | ||
| + | print(" | ||
| + | |||
| + | if result.returncode == 0 and " | ||
| + | success = True | ||
| + | break | ||
| + | |||
| + | time.sleep(RETRY_DELAY) | ||
| + | |||
| + | if not success: | ||
| + | print(" | ||
| + | |||
| + | finally: | ||
| + | # Turn gpsd back on | ||
| + | print(" | ||
| + | run_remote_command(client, | ||
| + | client.close() | ||
| + | |||
| + | if __name__ == " | ||
| + | main() | ||
| + | </ | ||
| + | ++++ | ||
| + | |||
| + | ---- | ||
| + | Download the library '' | ||
| + | |||
| + | |||
| + | Program library '' | ||
| + | |||
| + | The password for downloading the library : '' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Download the '' | ||
| + | |||
| + | ++++show code| | ||
| + | <code – get_cfg_rate_neom8l.py> | ||
| + | # | ||
| + | """ | ||
| + | Retrieves the current UBX-CFG-RATE configuration (navigation rate) from the module | ||
| + | """ | ||
| + | import logging | ||
| + | |||
| + | from ubxlib.server_tty import GnssUBlox | ||
| + | from ubxlib.ubx_cfg_rate import UbxCfgRatePoll | ||
| + | |||
| + | FORMAT = ' | ||
| + | logging.basicConfig(format=FORMAT) | ||
| + | logger = logging.getLogger(' | ||
| + | logger.setLevel(logging.INFO) | ||
| + | |||
| + | ubx = GnssUBlox('/ | ||
| + | ubx.setup() | ||
| + | |||
| + | poll_msg = UbxCfgRatePoll() | ||
| + | response = ubx.poll(poll_msg) | ||
| + | print(response) | ||
| + | |||
| + | ubx.cleanup() | ||
| + | </ | ||
| + | ++++ | ||
| + | |||
| + | ---- | ||
| + | |||