# pynimomodem
A Python implementation of the [Viasat](www.viasat.com)
NIMO modem interface for satellite IoT.
NIMO stands for **Non-IP Modem Orbcomm** waveform
and represents a family of low cost satellite data modems that use network
protocols developed by [ORBCOMM](www.orbcomm.com)
including [IsatData Pro](https://www.inmarsat.com/en/solutions-services/enterprise/services/isatdata-pro.html) and its successor, OGx.
These ORBCOMM protocols can operate over the Viasat L-band global network in
cooperation with a varietry of authorized Viasat IoT service partners, and
are intended for event-based remote data collection and device control.
Example NIMO modems available:
* [ORBCOMM ST2100](https://www.orbcomm.com/en/partners/iot-hardware/st-2100)
* [Quectel CC200A-LB](https://www.quectel.com/product/cc200a-lb-satellite-communication-module)
* [uBlox UBX-S52](https://content.u-blox.com/sites/default/files/documents/UBX-R52-S52_ProductSummary_UBX-19026227.pdf)
## Additional Information
* [API Documentation](https://inmarsat-enterprise.github.io/pynimomodem/)
> [!NOTE]
> Obsoletes/replaces the Inmarsat `idpmodem` project, when combined with the
> [`pynimcodec`](github.com/inmarsat-enterprise/pynimcodec) library.
## Installation
Example using pip, on a Linux-based platform including `PySerial` dependency:
```
pip install 'pynimomodem'
```
## Background
### Overview
*IsatData Pro* (**IDP**)is a store-and-forward satellite messaging technology
with flexible message sizes:
* up to 6400 bytes Mobile-Originated (aka **MO**, From-Terminal, *Return*)
* up to 10000 bytes Mobile-Terminated (aka **MT**, To-Terminal, *Forward*)
***Message***s are sent to or collected from a ***Mobile*** using its globally
unique *Mobile ID*,
transacted through a ***Mailbox*** that provides authentication, encryption and
data segregation for cloud-based or enterprise client applications via a
REST **Messaging API**.
Data sources and controls in the field are interfaced to a modem using a serial
interface with *AT commands* to send and receive messages, check network status,
and optionally use the built-in *Global Navigation Satellite System* (GNSS)
receiver to determine location-based information.
The first byte of the message is referred to as the
*Service Identification Number* (**SIN**) where values below 16 are reserved
for system use. SIN is intended to capture the concept of embedded
microservices used by an application.
The second byte of the message can optionally be defined as the
*Message Identifier Number* (**MIN**) intended to support remote operations
within each embedded microservice with defined binary formatting.
The MIN concept also supports the optional *Message Definition File* feature
allowing an XML file to be applied which presents a JSON-tagged message
structure on the network API.
### Modem Concept of Operation
1. Upon power-up or reset, the modem first acquires its location using
Global Navigation Satellite Systems (GNSS).
1. After getting its location, the modem tunes to the correct frequency, then
registers on the network. Once registered it can communicate on the
network.
1. MO messages are submitted by a microcontroller or IoT Edge device, which
then must monitor progress until the message is complete (either delivered or
timed out/failed due to blockage). Completed messages must be cleared from the
modem transmit queue by querying state(s) either periodically or when prompted
by the modem's event notification pin if configured.
1. MT messages that arrive are stored in the receive queue and the Edge device
queries for *New* MT messages periodically or when prompted by the modem's
event notification pin if configured.
1. Network acquisition status can also be queried using AT commands.
1. If the modem cannot find the target frequency it begins to search for other
frequencies from a configuration map in its non-volatile memory. It will cycle
through beam acquisition attempts for a period of time before falling back to
a globally-accessible *Bulletin Board* frequency where it may need to download
a new network configuration before re-attempting. Bulletin board downloads
typically take less than 15 minutes but can take longer in low signal or high
interference locations. A modem should not be powered off during Bulletin
Board download.
1. Prolonged obstruction of satellite signal will put the modem into *blockage*
state from which it will automatically try to recover based on an algorithm
influenced by its *power mode* setting.
Raw data
{
"_id": null,
"home_page": "https://github.com/inmarsat-enterprise/pynimomodem",
"name": "pynimomodem",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.9,<4.0",
"maintainer_email": "",
"keywords": "viasat,inmarsat,satellite,iot,idp,ogx,orbcomm",
"author": "geoffbrucepayne",
"author_email": "geoff.bruce-payne@inmarsat.com",
"download_url": "https://files.pythonhosted.org/packages/36/97/2743fa9201803d035c91a4bb43cc42aef09db5289ce19ba9ae5401c040ae/pynimomodem-0.4.16.tar.gz",
"platform": null,
"description": "# pynimomodem\n\nA Python implementation of the [Viasat](www.viasat.com)\nNIMO modem interface for satellite IoT.\n\nNIMO stands for **Non-IP Modem Orbcomm** waveform\nand represents a family of low cost satellite data modems that use network\nprotocols developed by [ORBCOMM](www.orbcomm.com)\nincluding [IsatData Pro](https://www.inmarsat.com/en/solutions-services/enterprise/services/isatdata-pro.html) and its successor, OGx.\n\nThese ORBCOMM protocols can operate over the Viasat L-band global network in\ncooperation with a varietry of authorized Viasat IoT service partners, and\nare intended for event-based remote data collection and device control.\n\nExample NIMO modems available:\n* [ORBCOMM ST2100](https://www.orbcomm.com/en/partners/iot-hardware/st-2100)\n* [Quectel CC200A-LB](https://www.quectel.com/product/cc200a-lb-satellite-communication-module)\n* [uBlox UBX-S52](https://content.u-blox.com/sites/default/files/documents/UBX-R52-S52_ProductSummary_UBX-19026227.pdf)\n\n## Additional Information\n\n* [API Documentation](https://inmarsat-enterprise.github.io/pynimomodem/)\n\n> [!NOTE]\n> Obsoletes/replaces the Inmarsat `idpmodem` project, when combined with the\n> [`pynimcodec`](github.com/inmarsat-enterprise/pynimcodec) library.\n\n## Installation\n\nExample using pip, on a Linux-based platform including `PySerial` dependency:\n```\npip install 'pynimomodem'\n```\n\n## Background\n\n### Overview\n\n*IsatData Pro* (**IDP**)is a store-and-forward satellite messaging technology\nwith flexible message sizes:\n\n* up to 6400 bytes Mobile-Originated (aka **MO**, From-Terminal, *Return*)\n* up to 10000 bytes Mobile-Terminated (aka **MT**, To-Terminal, *Forward*)\n\n***Message***s are sent to or collected from a ***Mobile*** using its globally\nunique *Mobile ID*,\ntransacted through a ***Mailbox*** that provides authentication, encryption and\ndata segregation for cloud-based or enterprise client applications via a\nREST **Messaging API**.\n\nData sources and controls in the field are interfaced to a modem using a serial\ninterface with *AT commands* to send and receive messages, check network status,\nand optionally use the built-in *Global Navigation Satellite System* (GNSS)\nreceiver to determine location-based information.\n\nThe first byte of the message is referred to as the\n*Service Identification Number* (**SIN**) where values below 16 are reserved\nfor system use. SIN is intended to capture the concept of embedded\nmicroservices used by an application.\n\nThe second byte of the message can optionally be defined as the\n*Message Identifier Number* (**MIN**) intended to support remote operations \nwithin each embedded microservice with defined binary formatting.\nThe MIN concept also supports the optional *Message Definition File* feature\nallowing an XML file to be applied which presents a JSON-tagged message\nstructure on the network API.\n\n### Modem Concept of Operation\n\n1. Upon power-up or reset, the modem first acquires its location using \nGlobal Navigation Satellite Systems (GNSS).\n1. After getting its location, the modem tunes to the correct frequency, then\nregisters on the network. Once registered it can communicate on the\nnetwork.\n1. MO messages are submitted by a microcontroller or IoT Edge device, which\nthen must monitor progress until the message is complete (either delivered or\ntimed out/failed due to blockage). Completed messages must be cleared from the\nmodem transmit queue by querying state(s) either periodically or when prompted\nby the modem's event notification pin if configured.\n1. MT messages that arrive are stored in the receive queue and the Edge device\nqueries for *New* MT messages periodically or when prompted by the modem's\nevent notification pin if configured.\n1. Network acquisition status can also be queried using AT commands.\n1. If the modem cannot find the target frequency it begins to search for other\nfrequencies from a configuration map in its non-volatile memory. It will cycle\nthrough beam acquisition attempts for a period of time before falling back to\na globally-accessible *Bulletin Board* frequency where it may need to download\na new network configuration before re-attempting. Bulletin board downloads\ntypically take less than 15 minutes but can take longer in low signal or high\ninterference locations. A modem should not be powered off during Bulletin\nBoard download.\n1. Prolonged obstruction of satellite signal will put the modem into *blockage*\nstate from which it will automatically try to recover based on an algorithm\ninfluenced by its *power mode* setting.",
"bugtrack_url": null,
"license": "Apache2.0",
"summary": "A Python implementation of Viasat's NIMO modem interface project.",
"version": "0.4.16",
"project_urls": {
"Homepage": "https://github.com/inmarsat-enterprise/pynimomodem",
"Repository": "https://github.com/inmarsat-enterprise/pynimomodem"
},
"split_keywords": [
"viasat",
"inmarsat",
"satellite",
"iot",
"idp",
"ogx",
"orbcomm"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "82f284e754d0ca2e93f4af8448bc216206148ce7615d9164ae7b45173230b28f",
"md5": "ef1e76817762d8621da41047285bca97",
"sha256": "79418a84512c4b13bbffb8afb90c9b7f37821270207152b620bdcf50caace8f7"
},
"downloads": -1,
"filename": "pynimomodem-0.4.16-py3-none-any.whl",
"has_sig": false,
"md5_digest": "ef1e76817762d8621da41047285bca97",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9,<4.0",
"size": 38577,
"upload_time": "2024-01-14T14:19:19",
"upload_time_iso_8601": "2024-01-14T14:19:19.615749Z",
"url": "https://files.pythonhosted.org/packages/82/f2/84e754d0ca2e93f4af8448bc216206148ce7615d9164ae7b45173230b28f/pynimomodem-0.4.16-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "36972743fa9201803d035c91a4bb43cc42aef09db5289ce19ba9ae5401c040ae",
"md5": "4392a2d9f43cde273996a62ddf9b4e0d",
"sha256": "4ac4f99b7d1d092b615f41aa56c645fb205693345917d079eaddeb1733c2135d"
},
"downloads": -1,
"filename": "pynimomodem-0.4.16.tar.gz",
"has_sig": false,
"md5_digest": "4392a2d9f43cde273996a62ddf9b4e0d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9,<4.0",
"size": 37788,
"upload_time": "2024-01-14T14:19:21",
"upload_time_iso_8601": "2024-01-14T14:19:21.406334Z",
"url": "https://files.pythonhosted.org/packages/36/97/2743fa9201803d035c91a4bb43cc42aef09db5289ce19ba9ae5401c040ae/pynimomodem-0.4.16.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-01-14 14:19:21",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "inmarsat-enterprise",
"github_project": "pynimomodem",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "pynimomodem"
}