Skip to main content

ser2sock

Pypi version

A single-threaded, multi serial line to TCP bridge server.

Can run under python 2.6 up to 3.x (tested 3.8).

Installation

From within your favorite python environment:

pip install ser2sock

Usage

ser2sock -c <configuration file>

Configuration

In order to provide flexibility, configuration is written in python.

The only requirement is to have a bridges member which consists of a sequence of bridges. A bridge is a dictionary with mandatory keys serial and tcp.

Example:

bridges = [
    {
        'serial': {'port': '/dev/ttyS0'},
        'tcp': {'address': ("0", 18500)}
    },
    {
        'serial': {'port': '/dev/ttyS1', 'baudrate': 19200},
        'tcp': {'address': ("0", 18501), 'no_delay': False}
    }
]
  • serial: port mandatory. Supports any keyword supported by serial.serial_for_url (or serial.Serial if serial_for_url does not exist
  • tcp: address mandatory (must be a pair bind host and port).
    • reuse_addr: (default: True) TCP reuse address
    • no_delay: (default: True) disable Nagle's algorithm
    • tos: (default: 0x10, meaning low delay) type of service.

tcp and serial helpers are automatically loaded to the config namespace. Here is the equivalent above config using helpers:

bridges = [
    [serial(port="/dev/ttyS0"), tcp(address=("0", 18500))],
    [serial(port="/dev/ttyS1", baudrate=19200),
     tcp(address=("0", 18501), no_delay=False)],
]

You are free to put any code in your python configuration file. Here is an example setting up logging:

import logging
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s %(levelname)s %(message)s'
)

bridges = [
    [serial(port="/dev/ttyS0"), tcp(address=("0", 18500))],
    [serial(port="/dev/ttyS1", baudrate=19200),
     tcp(address=("0", 18501), no_delay=False)],
]

Web UI

The active configuration can be changed online through a web UI.

To enable web you need to install the extra package:

$ pip install ser2sock[web]

...and enable the web app in the configuration with:

bridges = [...]

web = ':8000'

ser2sock should now be visible here.

You should see something like this:

web screenshot

Note that changes made with the web interface only affect the active ser2sock instance and never the original configuration file.

Tests

Tests should be performed within a python 3.5 or higher environment.

$ python setup.py test

running pytest
Searching for pytest-asyncio
Best match: pytest-asyncio 0.14.0
Processing pytest_asyncio-0.14.0-py3.7.egg

Using /home/tcoutinho/workspace/ser2sock/.eggs/pytest_asyncio-0.14.0-py3.7.egg
Searching for pytest-cov
Best match: pytest-cov 2.10.0
Processing pytest_cov-2.10.0-py3.7.egg

Using /home/tcoutinho/workspace/ser2sock/.eggs/pytest_cov-2.10.0-py3.7.egg
running egg_info
writing ser2sock.egg-info/PKG-INFO
writing dependency_links to ser2sock.egg-info/dependency_links.txt
writing entry points to ser2sock.egg-info/entry_points.txt
writing requirements to ser2sock.egg-info/requires.txt
writing top-level names to ser2sock.egg-info/top_level.txt
reading manifest file 'ser2sock.egg-info/SOURCES.txt'
writing manifest file 'ser2sock.egg-info/SOURCES.txt'
running build_ext
==================================== test session starts =====================================
platform linux -- Python 3.7.7, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 -- /home/tcoutinho/miniconda/envs/py37/bin/python
cachedir: .pytest_cache
rootdir: /home/tcoutinho/workspace/ser2sock, inifile: setup.cfg
plugins: cov-2.10.0, asyncio-0.14.0
collected 8 items

tests/test_ser2sock.py::test_load_config PASSED                                        [ 12%]
tests/test_ser2sock.py::test_web_server PASSED                                         [ 25%]
tests/test_ser2sock.py::test_server PASSED                                             [ 37%]
tests/test_ser2sock.py::test_server_no_serial PASSED                                   [ 50%]
tests/test_ser2sock.py::test_server_serial_close_after_success PASSED                  [ 62%]
tests/test_ser2sock.py::test_server_no_client PASSED                                   [ 75%]
tests/test_ser2sock.py::test_server_missing_argument PASSED                            [ 87%]
tests/test_ser2sock.py::test_2_clients_to_1_serial PASSED                              [100%]

----------- coverage: platform linux, python 3.7.7-final-0 -----------
Name                   Stmts   Miss  Cover
------------------------------------------
ser2sock/__init__.py       1      0   100%
ser2sock/server.py       321     56    83%
------------------------------------------
TOTAL                    322     56    83%
Coverage HTML written to dir htmlcov


================================== slowest 2 test durations ==================================
0.02s call     tests/test_ser2sock.py::test_server_no_client
0.02s setup    tests/test_ser2sock.py::test_web_server
===================================== 8 passed in 0.30s ======================================

That's all folks!

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ser2sock-4.1.2.tar.gz (11.3 kB view details)

Uploaded Source

File details

Details for the file ser2sock-4.1.2.tar.gz.

File metadata

  • Download URL: ser2sock-4.1.2.tar.gz
  • Upload date:
  • Size: 11.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.4

File hashes

Hashes for ser2sock-4.1.2.tar.gz
Algorithm Hash digest
SHA256 84562f8b9b30fa62b40355790b7e4631c73a33811dfe60c06a751c1ac1cc6aed
MD5 756616894a7d737362d2a9db0e877093
BLAKE2b-256 b409826c3b72e133073af8447c0a2a854f74dfbf645327931cb77f52b9176a43

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

4.1.2 This release

1 file

4.1.1

1 file

4.1.0

1 file

3.0.0

1 file

2.0.0

1 file

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page