Git Product home page Git Product logo

gateway-rs's Introduction

Helium Gateway

ci

The Helium Gateway application is a service designed to run on Linux-based LoRaWAN gateways.

It's intended to run alongside a typical LoRa packet forwarder and to connect via Semtech's Gateway Messaging Protocol (GWMP, using JSON v1 or v2).

In turn, the Helium Gateway application does two things:

  • Periodically sends and witnesses Proof of Coverage beacons, which are reported to the Proof of Coverage ingest oracles
  • connects and routes packets to the Helium Packet Router
                                                                 +-----------+
+-----------+                       +------------+               |  Ingest   |
|           |                       |            |<--- gRPC ---->|  Service  |
|  packet   |<--- Semtech GWMP ---->|   Helium   |               +-----------+
| forwarder |       over UDP        |   Gateway  |               +-----------+
|           |                       |            |<--- gRPC ---->|  Helium   |
+-----------+                       +------------+               |  Router   |
                                                                 +-----------+

NOTE: A DIY Helium Gateway based hotspot is eligible for data rewards only. Proof of coverage rewards are only possible for approved maker hotspots.

Releases

The project builds binary compressed tar release files which are named after the crypto module used and the CPU architecture they were built for. For example, helium-gateway-1.0.0-aarch64-unknown-linux-gnu.tar.gz contains the helium_gateway executable with ecc608 support and its setttings.toml configuration file.

For versions using the ecc608, the crypto module name is not included in the file name. For TPM variants it is included, for example, helium-gateway-1.0.0-x86_64-tpm-debian-gnu.tar.gz

Releases are tagged using semantic versioning with a major.minor.patch form. An alpha/beta release tag may also be issued for early feature/bug development and testing. Makers are not required to pick up alpha/beta releases.

Linux Dependencies

This application requires a Linux-based environment for the following reasons:

  • tokio: the gateway-rs application, written in Rust, depends on Tokio for its runtime. Tokio binds to Linux interfaces such as epoll and kqeueue. It is technically possible to port Tokio to another OS or RTOS (this has been done for Windows), but it would be no simple undertaking.

Installing

If your supported LoRa gateway did not come with helium-gateway pre-installed, manual installation requires you to:

  1. Configure the packet forwarder on the gateway to forward to the helium-gateway application. This varies per gateway but the goal is to set the packet forwarder to forward to the (default) configured helium-gateway on 127.0.0.1 at udp port 1680

  2. Set up ssh acccess to the gateway. Depending on the gateway that may require going through a web interface, while others already have ssh configured.

  3. scp a downloaded and uncompressed release package for the supported platform to the gateway. e.g.

    scp helium_gateway settings.toml <gateway>:/tmp/
  4. ssh into the device and copy the application and configuaration into a suitable location using a command like:

    mkdir /etc/helium_gateway
    mv /tmp/settings.toml /etc/helium_gateway/
    mv /tmp/helium_gateway /usr/bin/
  5. Configure the logging method to use by updating the settings.toml file's [log] section with the logging method to use based on your system. Supported values are stdio or syslog. Note you may need to configure the syslog service on your device to accept the logs.

  6. Configure the region if required. The default region of the gateway is set to UNKNOWN, and fetched based on the asserted location of the gateway. Setting the region to a known region or caching the last fetched region and using the GW_REGION environment variable on startup will allow the gateway to use the correct region for uplinks immediately, while the region parameters are retrieved.

    The supported region values are listed in the region protobuf definition.

    NOTE: Due to TX power regulations, the gateway location needs to be asserted on the blockchain to be able to send downlinks.

  7. Start the service by either starting it manually or hooking it into the init.d, systemd, or equivalent system services for your platform. Consult your platform/linux on how best to do this.

    The startup command for the application is as follows. Note you will need to adjust the path to helium_gateway or the path to the settings file to use for the -c option.

    /usr/bin/helium_gateway -c /etc/helium_gateway/settings.toml server

If this command succeeds the logs on the gateway will show the service starting and the local packet forwarder client connecting to the gateway service.

Supported Targets

The following targets are being built. Adding a new target involves creating a pull request against this repository with the right cpu target tuple.

  • Review the open issues to see if it's already in progress. If not, file an issue. Note that new targets are developed and supported by Helium makers and Community members.
  • Join the #gateway-development channel on Helium Discord and work the the community to add target support.

Note that platforms will be tested much faster if you join the development process!

Target Products
mipsel-unknown-linux-musl ✅ CalDigit Light Hotspot
✅ ClodPi Light Hotspot ClodPi
RAK833 EVB Kit
RAK7258 (WisGate Edge Lite)
RAK7249 (WisGate Edge Max)
RAK7240 (WisGate Edge Prime)
✅ Smart Harvest Instruments Light Gateway
mips-unknown-linux-musl ✅ Dragino LPS8
❔ Dragino DLOS8
aarch64-unknown-linux-gnu ✅ Cotx gateways cotx
✅ Raspberry Pi 3 or 4 running Raspian / Raspberry Pi OS 64 bit or another 64 bit Debian-based Linux distro
arm-unknown-linux-gnueabihf ✅ Raspberry Pi 0 or 1 running Raspian / Raspberry Pi OS or another Debian-based Linux distro
armv5te-unknown-linux-musleabi ✅ CloudGate
✅ Multitech Conduit MTCDT (mLinux)
armv7-unknown-linux-musleabihf ✅ Kerlink Wirnet iFemtoCell Evolution
armv7-unknown-linux-gnueabihf ✅ ResIOT X gateways resiot
✅ Raspberry Pi 2, 3, or 4 running Raspian / Raspberry Pi OS or another Debian-based Linux distro
Kona Micro IoT Gateway
Kona Enterprise IoT Gateway
RisingHF RHF2S027 Light Hotspot
x86_64-unknown-linux-gnu ✅ Debian x86_64 (ecc608)
✅ LongAP
x86_64-tpm-debian-gnu ✅ Debian x86_64 (tpm)
✅ FreedomFi gateway

Building

Use one of the existing releases if you can, or build your own by hand using the instructions below.

If you want to support a new target, please consider submitting a PR to get the target as part of the supported matrix of gateway platforms!

  1. Install rust

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  2. Install cargo cross. The cross command allows for cross-compiling to hardware targets using a docker image.

    cargo install cross
  3. Build the application binary using the target triplet/profile from the supported targets. Note that debug builds may be to large to run on some targets.

    cross build --profile <target> --release build

    The resulting application binary is located in

    target/<target>/release/helium_gateway
    

    NOTE The target triplet and profile may not be the same. For example, the x86_64-tpm-debian-gnu profile uses the x86_64-unknown-linux-gnu target

Additional usage info

The Helium Gateway application can be configured to suit your hardware/software environment in a variety of ways - either from the command line or customizations to the settings.toml file or with environment variables. The following sections describe this functionality in more detail as well as more general information on how to use the application.

Settings file

The Helium Gateway application is configured using a TOML settings file. The released settings file can be found in the settings.toml file in this repo. Edit this file with specifics for your target platform and store it either at the default expected location/etc/helium_gateway/settings.tomlor at a custom location of your choosing. If you store the file in a non-default location you will need to pass the-cflag to thehelium_gateway application as shown below in the general usage section.

Using the ECC crypto chip

If your gateway is enabled with an ECC608 crypto chip which is set up correctly, you can configure helium_gateway to use the crypto chip for secure key storage and crypto operations.

To use in your settings.toml override the keypair setting to reflect the use of the ECC and specify the bus address and slot to use. For example:

keypair = "ecc://i2c-1:96?slot=0&network=mainnet"

will have helium_gateway use the ECC at the /dev/i2c-1 device driver location, use bus address 96 (which is hex 0x60), and slot 0 for its crypto operations. While marking the resulting key as a mainnet key. Bus address, slot and network are all optional parameters and default to the above values (only device driver location is required such as ecc://i2c-1).

Note that the file-based keypair will no longer be used once the ECC is configured for use.

See the gateway-mfr-rs repo for instructions on configuring, locking, and testing an ECC chip.

It is expected that most gateways will use the same key slot for the onboarding key and the keypair, however, this key is also configurable in the same way as the keypair:

onboarding = "ecc://i2c-1:96?slot=0"

The original helium miners use an onboarding key on slot 15:

onboarding = "ecc://i2c-1:96?slot=15"

Envrionment variables

Instead of editing parameters in the settings.toml file as described above, you can also use environment variables. The environment variable name will be the same name as the entries in the settings file in uppercase and prefixed with "GW_". For example, following on from the above example where we change the region using region = "EU868" in the settings file, setting an environment variable of GW_REGION="EU868" will override the region setting. If the settings are in one of the lower sections such as the [log] section then you need to also include that in the environment variable name such as GW_LOG_LEVEL.

The settings are loaded first from the settings.toml file, and then from environment variables and any duplicates are overridden in the order. Therefore, please note that if you have a setting in both locations, the environment variable will override the settings in the other two locations.

General usage info

Using the Helium Gateway application is pretty simple, and the vast majority of the information you will need to use it can be gleaned by using the --help flag which provides the following output:

Helium Light Gateway

USAGE:
    helium_gateway [FLAGS] [OPTIONS] <SUBCOMMAND>

FLAGS:
        --daemon     Daemonize the application
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -c <config>        Configuration file to use [default: /etc/helium_gateway/settings.toml]

SUBCOMMANDS:
    add       Construct an add gateway transaction for this gateway
    help      Prints this message or the help of the given subcommand(s)
    info      Info command. Retrieve all or a subset of information from the running service
    key       Commands on gateway keys
    server    Run the gateway service

As you can see, apart from the help command, there are four core subcommands that you can pass: add, key, server. The descriptions of what these subcommands do is shown in brief in the above help output, and are explained in more detail in the sections below.

The only option available is the config option using the -c flag. This tells the application where your configuration file is located and can be used as follows whilst passing any of the other commands such as server or add (default is /etc/helium_gateway/settings.toml):

./helium_gateway -c /location/of/config/file server

Lastly you can check the version, read the help information, or daemonize the application using the --version, --help and --daemon flags respectively.

Add gateway subcommand

As shown in the help output below, this subcommand is used to construct an add gateway transaction which can subsequently be used with the Helium Wallet application to onboard the gateway to the blockchain. More information on this process can be found on the docs article for Data Only Hotspots.

Construct an add gateway transaction for this gateway

USAGE:
helium_gateway add [OPTIONS] --owner <owner> --payer <payer>

FLAGS:
-h, --help Prints help information
-V, --version Prints version information

OPTIONS:
--mode <mode> The staking mode for adding the light gateway [default: dataonly]
--owner <owner> The target owner account of this gateway
--payer <payer> The account that will pay account for this addition

So for example, to construct a data-only add gateway transaction you would enter the following command at the terminal:

./helium_gateway add --owner WALLET_ADDRESS --payer WALLET_ADDRESS

You need to substitute WALLET_ADDRESS for the wallet address you will use for the owner of the hotspot and the payer of the transaction fees respectively...but please note that the --payer address must be the same as the one you will use to submit the transaction to the blockchain, or the transaction will fail.

The output of this command is a JSON object which looks like the following:

{
  "address": "11TL62V8NYvSTXmV5CZCjaucskvNR1Fdar1Pg4Hzmzk5tk2JBac",
  "fee": 65000,
  "mode": "dataonly",
  "owner": "14GWyFj9FjLHzoN3aX7Tq7PL6fEg4dfWPY8CrK8b9S5ZrcKDz6S",
  "payer": "14GWyFj9FjLHzoN3aX7Tq7PL6fEg4dfWPY8CrK8b9S5ZrcKDz6S",
  "staking fee": 1000000,
  "txn": "CrkBCiEBrlImpYLbJ0z0hw5b4g9isRyPrgbXs9X+RrJ4pJJc9MkSIQA7yIy7F+9oPYCTmDz+v782GMJ4AC+jM+VfjvUgAHflWSJGMEQCIGfugfLkXv23vJcfwPYjLlMyzYhKp+Rg8B2YKwnsDHaUAiASkdxUO4fdS33D7vyid8Tulizo9SLEL1lduyvda9YVRCohAa5SJqWC2ydM9IcOW+IPYrEcj64G17PV/kayeKSSXPTJOMCEPUDo+wM="
}

You can also pass a --mode flag followed by the hotspot type (dataonly | light | full) as shown below:

./helium_gateway add --owner WALLET_ADDRESS --payer WALLET_ADDRESS --mode light

The output of this command will be mostly the same as if you used the default dataonly however you will see that the mode has changed to "mode": "light", and the staking fee amount has changed to "staking fee": 4000000.

The txn field from the JSON object needs to be used as the input to the wallet command helium-wallet hotspot add when you subsequently want to add it to the blockchain. For example, using the above JSON object as an example, you would use the following command:

helium-wallet hotspots add CrkBCiEBrlImpYLbJ0z0hw5b4g9isRyPrgbXs9X+RrJ4pJJc9MkSIQA7yIy7F+9oPYCTmDz+v782GMJ4AC+jM+VfjvUgAHflWSJGMEQCIGfugfLkXv23vJcfwPYjLlMyzYhKp+Rg8B2YKwnsDHaUAiASkdxUO4fdS33D7vyid8Tulizo9SLEL1lduyvda9YVRCohAa5SJqWC2ydM9IcOW+IPYrEcj64G17PV/kayeKSSXPTJOMCEPUDo+wM=

Gateway keys subcommand

This subcommand can be used to get the address and animal name of the gateway from the keys file as shown in the help output below. Note that the helium_gateway server has to be running for this command to work.

Commands on gateway keys

USAGE:
    helium_gateway key <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    help    Prints this message or the help of the given subcommand(s)
    info    Commands on gateway keys

Using this is as simple as passing the following command in a terminal from wherever you installed the helium_gateway application:

./helium_gateway key info

The output of this is a JSON object containing the address and animal name of the hotspot as shown below:

{
  "address": "11TL62V8NYvSTXmV5CZCjaucskvNR1Fdar1Pg4Hzmzk5tk2JBac",
  "name": "wide-neon-kestrel"
}

Gateway server

The gateway server subcommand is used to start the gateway service on your device.

Run the gateway service

USAGE:
    helium_gateway server

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

Running it is as simple as:

./helium_gateway server

However as discussed above you can also pass the -c option to tell the service that you are using a different location for your config files:

./helium_gateway -c /location/of/config/file server

More docs and info

There is a wealth of further information on maker hotspot software on the Helium Docs site including information about the gRPC API that allows you to interact with the gateway via the maker app and other services over gRPC rather than via the command line options described above.

gateway-rs's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gateway-rs's Issues

RAK7240 - cache directory location issue

The cache directory on /etc/helium_gateway/cache is a problem on RAK7240
this is blocking the filesystem remount as read-only on restart apparently due to a too small free space on it.
Then is it impossible to save any change on the gateway settings

Improve curl requests errors handling

If the remote certificate is not considered as valid when using the add command, the following message is displayed:
Error: Decode(Json(Error("EOF while parsing a value", line: 1, column: 0)))

I would have expected a message like:
The remote certificate of https://.... is not valid

Programatically speaking, I guess the curl return code/output is not correctly interpreted in case of an error.

helium_gateway add fails with EOF while parsing a value

Hi,

I'm encountering a problem setting up my iStation as a light miner.

Background:
KerOS version 4.3.3_20200803132042
gateway-rs version helium-gateway-v1.0.0-alpha.19-klkgw.ipk

Issue:
Installation and starting the service went well.
But when adding the gateway to the network, calling the following command:
helium_gateway add --owner <walletCLI_address> --payer <walletCLI_address>
the command return
Error: Decode(Json(Error("EOF while parsing a value", line: 1, column: 0)))

I tried the add routine while the service is running and while the service is stopped, no difference.
The walletCLI_address has 1.2 HNT available an is the mainnet network with type ed25519

Any idea what is happening here?
Thanks.

Define settings definition strategy for device integration

There are 3 different actors of settings definition identfied so far, each willing to set part of the configuration:

  • the network provider : default gateways / routers
  • the gateway manufacturer : update strategy / logs / keypair location
  • the gateway user : region / alternative network / any other custom fancy change

Actually we have 4 different sources: default settings value in binary, default.toml, settings.toml, environment.

It would be good to define a strategy of what the purpose of each source is, or what manufacturers are supposed to use for their integration. This can be quite a mess with frequent app and os updates but it can also be very easy if it's well defined.

Proposition

As a manufacturer and integrator of such software, what generally provides the best flexibility/complexity ratio, is to have a config directory (as possible now) and use any .toml file in the directory with priority defined by alphabetically ordered file names (see https://developer-old.gnome.org/NetworkManager/stable/NetworkManager.conf.html for an example)

With that, we can define a convention for file names (no breaking change):

  • default.toml: overrides of binary default. Mostly doesn't exist. Can be defined to ensure config does not change over binary update if nedded
  • platform.toml (or gateway.toml, model.toml, anything starting with a char between d and s): manufacturer/platform specific settings
  • settings.toml: user settings

A custom integration could also define numeric prefix to make the priority more obvious.

failed to load source for dependency `p256`

Hi Sir,

I got error as below. object not found.

info: checking for self-updates
Updating git repository https://github.com/helium/elliptic-curves
error: failed to get p256 as a dependency of package helium-crypto v0.0.7 (https://github.com/helium/helium-crypto-rs?tag=v0.0.7#8041c2aa)
... which is depended on by gateway-rs v1.0.0-alpha.9 (/project)

Caused by:
failed to load source for dependency p256

Caused by:
Unable to update https://github.com/helium/elliptic-curves?branch=rg/compact#1c360bdd

Caused by:
object not found - no match for id (1c360bddb599db9af19ded0be493a79e7748bc1e); class=Odb (9); code=NotFound (-3)

no_response / timeout issue

Many users running gateway-rs often have to reboot their gateways because they've noticed their devices stop sending.

After tailing logs, it appears the gateway service stops and all uplinks fail. The only fix is to reboot the gateway.

join_request and join_accept works.

WARN ignoring uplink error

Getting the error below after setting everything up with my Dragino.

Fri Aug 27 20:16:18 2021 daemon.info helium_gateway[15688]: WARN ignoring uplink error: Service(Rpc(Status { code: Unknown, message: "no response", metadata: MetadataMap { headers: {"user-agent": "grpc-erlang/0.1.0", "content-type": "application/grpc+proto", "grpc-encoding": "identity"} } })), module: router

Version: helium_gateway 1.0.0-alpha.13

helium_gateway service does not run after auto upgrade

After auto-upgrading on a Dragino LPS8 (firmware lgw-5.4.1607519907) , the helium_gateway service is not started. This was observed upgrading from v1.0.0-alpha.8 to v1.0.0-alpha.9.

The following messages appear in the syslog showing that the upgrade occurs:

Tue May 18 15:30:33 2021 daemon.info helium_gateway[21893]: INFO downloading helium-gateway-v1.0.0-alpha.9-dragino.ipk, asset: helium-gateway-v1.0.0-alpha.9-dragino.ipk, module: updater
Tue May 18 15:30:35 2021 daemon.info helium_gateway[21893]: INFO installing helium-gateway-v1.0.0-alpha.9-dragino.ipk, asset: helium-gateway-v1.0.0-alpha.9-dragino.ipk, module: updater

It is clear that helium_gateway is not running as there are no other syslog entries from helium_gateway until it is restarted or system is rebooted. Furthermore, /etc/init.d/helium_gateway stop returns Command not found which is the message when trying to stop the service when not running.

And, the command helium_gateway --version shows helium_gateway 1.0.0-alpha.9.

Finally, a potentially related symptom is that the version number shown by opkg list-installed also is not updated and shows the version originally installed even after the upgrade.

Improvement : support docker container run for x86 systems

Using a docker container to run the gateway-rs on x86 system would be really great to allow runing mulitple gateway RS on the same machine.
That way we could massively migrate existing LoRaWan gateways to Helium network at low cost.

Any chance of cutting a new Alpha Release?

Would be nice to roll in the raspi_64 .deb package that got PR'ed in #73 , as well as other commits since Alpha 13.

We are also working on making a balena container for this, and it would be easier to pull in a Release than build from source in the Dockerfile :-)

Thanks!

WARN ignoring uplink error

I've setup a Dragino LPS8 as a Light-GW. But I can not see that my device (Dragino LGT92) connects to helium properly.

Release v1.0.0-alpha.8

Warning message

daemon.info helium_gateway[1710]:  WARN ignoring uplink error: Service(Rpc(Status { code: Unimplemented, message: "unknown service helium.router", metadata: MetadataMap { headers: {"content-type": "application/grpc", "trailer": "Grpc-Status", "trailer": "Grpc-Message", "trailer": "Grpc-Status-Details-Bin"} } })), module: router

Automatic Region Frequency Selection

In the current miner we're able to get the region from that to configure the radio module for the correct frequency plan.

While currently we have to specify the region in development for this, will a feature such as above be introduced for gateway-rs when hotspots can be onboarded?

Thanks

h2 protocol error: protocol error: received frame when stream half-closed

I've setup a Dragino LPS8 as a Light-GW. But I can not see that my device (Dragino LGT92) connects to helium properly.

Release v1.0.0-alpha.9

Warning message

daemon.info helium_gateway[xxxx]:  WARN ignoring uplink error: Service(Rpc(Status { code: Unknown, message: "h2 protocol error: protocol error: received frame when stream half-closed", metadata: MetadataMap { headers: {"user-agent": "grpc-erlang/0.1.0", "content-type": "application/grpc+proto", "grpc-encoding": "identity"} } })), module: router

RAK7258 error

Not sure why but i have that
way[1531]: INFO routing error: Service(Rpc(Status { code: Unknown, message: "h2 protocol error: protocol error: received frame when stream half-closed" })), module: router
Wed Apr 7 08:26:32 2021 daemon.info helium_gateway[1531]: INFO selected gateway, uri: http://18.216.219.228:8080/, public_key: 112AY1cJ9quokGVZL8uVQ9Jih1cHsji2VVoKApf2fVPBseHcRsg, module: router
Wed Apr 7 08:26:33 2021 daemon.info helium_gateway[1531]: INFO updated routing to height 793801, module: router

ignoring raw packet

Hi, new to here,

My hardware

  • gateway : RAK7258
  • firmware: helium-gateway-v1.0.0-alpha.9-ramips_24kec.ipk

Problem log

Wed Jun 23 22:49:55 2021 daemon.info helium_gateway[3245]:  INFO ignoring raw packet PushData(Packet { random_token: 26995, gateway_mac: MacAddress ...Wed Jun 23 22:49:55 2021 daemon.info helium_gateway[3245]:  INFO routing packet to: http://54.193.165.228:8080/, module: router
Wed Jun 23 22:50:00 2021 daemon.info helium_gateway[3245]:  INFO ignoring raw packet PullData(Packet { random_token: 20991, gateway_mac: MacAddress ...
Wed Jun 23 22:50:03 2021 daemon.info helium_gateway[3245]:  WARN ignoring uplink error: Service(Rpc(Status { code: Unknown, message: "no response", metadata: MetadataMap { headers: {"user-agent": "grpc-erlang/0.1.0", "content-type": "application/grpc+proto", "grpc-encoding": "identity"} } })), module: router
/etc/helium_gateway# ls
default.toml        key.bin             settings.toml-opkg
install_update      settings.toml

Question

I think UDP data is not forwarded normally. Does anyone know the reason?

There is a detail, I found that this is not automatically generated: /etc/helium_gateway/keypair.bin

Data-only gateway not transferring uplinks.

Apologies for the open-ended issue, I continue to try to collect information on this. Copying my notes here from Discord for issue tracking purposes.

Device: Dragino LPS-8
Gateway version: 1.0.0-alpha.17

  • Known device used for testing is provisioned on production console. Seeing packet delivery from neighboring hotspots. All Available packets are being purchased. Hotspot does not appear as 'late delivery' either.
  • Joins do come through, uplinks do not.
    • image
  • Gateway is added and asserted on-chain. Helium team should be able to view info here: https://discord.com/channels/404106811252408320/730426254888665219/889664157631279166
  • Gateway has never received HNT for data transfer it has done – something I've been trying to track down separately. Possibly related to this issue? By design.
  • Seeing a lot of received banner messages. Usually in a wave

logread immediately following boot:
unknown

routing error: *** os error 111

Hello,

I used RAK7243 raspiberry LoRa gateway , and I installed Release v1.0.0-alpha.13 deb package of gateway-rs , modified the ip to 127.0.0.1 and port to 1680 of global_config.json. After reboot, I met the problem as follows:

Jul 9 08:21:44 rak-gateway helium_gateway[1386]: selected gateway, module: router, uri: http://18.216.219.228:8080/, public_key: 112AY1cJ9quokGVZL8uVQ9Jih1cHsji2VVoKApf2fVPBseHcRsgA
Jul 9 08:21:44 rak-gateway helium_gateway[1386]: routing error: Service(Rpc(Status { code: Unknown, message: "transport error: error trying to connect: tcp connect error: Connection refused (os error 111)" })), module: router
Jul 9 08:21:45 rak-gateway helium_gateway[1386]: ignoring raw packet PullData(Packet { random_token: 51610, gateway_mac: MacAddress { bytes: [220, 166, 50, 255, 254, 39, 28, 63] } }), module: gateway

Could please tell me where is the problem is?

Dragino Gateway Model LG308

Alpha 9.0 was working fine but not Alpha 13.0 . You can add this model in the list. The firmware is the same as LPS8 and DLOS8.

Gateway shown as "offline", gateway-rs seems to work fine

I'm running latest gateway-rs on x86 Linux. Looking on logs, there are no issues:

  • it connects to gateways
  • it recieves and forwards data packets
Sep 17 18:55:35 homer helium_gateway[31772]: using new gateway, oui: 10, uri: http://18.202.29.208:8080/, public_key: 11YmZtwTPEuMSFGxze1x9TfDfGezN7vXevLu71iJe9FBbvNRAgk, module: router, uri: http://52.49.199.40:8080/, public_key: 11tk4zzbyfMPYYHYda255ACoqfYFVdrUSoCWrCYfn8BoyuYrERK
Sep 17 18:55:35 homer helium_gateway[31772]: using new gateway, oui: 1, uri: http://52.8.80.146:8080/, public_key: 112qB3YaH5bZkCnKA5uRH7tBtGNv2Y5B4smv1jsmvGUzgKT71QpE, module: router, uri: http://52.49.199.40:8080/, public_key: 11tk4zzbyfMPYYHYda255ACoqfYFVdrUSoCWrCYfn8BoyuYrERK
Sep 17 18:55:35 homer helium_gateway[31772]: using new gateway, oui: 9, uri: http://13.37.13.24:8080/, public_key: 11afuQSrmk52mgxLu91AdtDXbJ9wmqWBUxC3hvjejoXkxEZfPvY, module: router, uri: http://52.49.199.40:8080/, public_key: 11tk4zzbyfMPYYHYda255ACoqfYFVdrUSoCWrCYfn8BoyuYrERK
Sep 17 18:55:35 homer helium_gateway[31772]: using new gateway, oui: 6, uri: http://185.34.141.6:8080/, public_key: 11awcuSbVURPkXX3FbKC7KF6bgEPRZqqPzv1FTEYABMLttUr13E, module: router, uri: http://52.49.199.40:8080/, public_key: 11tk4zzbyfMPYYHYda255ACoqfYFVdrUSoCWrCYfn8BoyuYrERK
Sep 17 18:55:35 homer helium_gateway[31772]: using new gateway, oui: 13, uri: http://46.246.38.248:8080/, public_key: 115ZS5of9wsV3M5sH3mePp9NVnKayUXG7qT2W7Sn4KJLMzd3eMr, module: router, uri: http://52.49.199.40:8080/, public_key: 11tk4zzbyfMPYYHYda255ACoqfYFVdrUSoCWrCYfn8BoyuYrERK
Sep 17 18:55:35 homer helium_gateway[31772]: using new gateway, oui: 9, uri: http://44.238.156.97:8080/, public_key: 11w77YQLhgUt8HUJrMtntGGr97RyXmot1ofs5Ct2ELTmbFoYsQa, module: router, uri: http://52.49.199.40:8080/, public_key: 11tk4zzbyfMPYYHYda255ACoqfYFVdrUSoCWrCYfn8BoyuYrERK
Sep 17 18:55:35 homer helium_gateway[31772]: using new gateway, oui: 4, uri: http://54.193.165.228:8080/, public_key: 11263KvqW3GZPAvag5sQYtBJSjb25azSTSwoi5Tza9kboaLRxcsv, module: router, uri: http://52.49.199.40:8080/, public_key: 11tk4zzbyfMPYYHYda255ACoqfYFVdrUSoCWrCYfn8BoyuYrERK
Sep 17 18:55:35 homer helium_gateway[31772]: using new gateway, oui: 12, uri: http://54.219.236.122:8080/, public_key: 112ewJNEUfSg3Jvo276tMjzFC2JzmmZcJJ32CWz2fzYqbyCMMTe1, module: router, uri: http://52.49.199.40:8080/, public_key: 11tk4zzbyfMPYYHYda255ACoqfYFVdrUSoCWrCYfn8BoyuYrERK
Sep 17 18:55:35 homer helium_gateway[31772]: updated routing to height 1014980, module: dispatcher
Sep 17 18:55:36 homer helium_gateway[31772]: uplink @1311987764 us, 867.30 MHz, Ok(DataRate(SF7, BW125)), snr: -6.25, len: 28 from MacAddress(...), module: gateway

It is running like that since a few days. I have noticed, that my data-only hotspot (https://explorer.helium.com/hotspots/14CaNxiNCTUy7GfH6kRsKusmG2Dd7gX1VksnT3dVcE6qBvRkJ51) is displayed as offline in the explorer. Couple of weeks ago, when I was using older gateway-rs version, I've been able to see my hotspot correctly reported as online. I'm not sure if this issue regards gateway-rs, explorer or any other component in the system. If there's anything I could provide in order to poinpoint the issue, please let me know.

Gateway-rs suddently crash

The gateway rs crashed with the following error:

INFO uplink @2689132260 us, 867.90 MHz, Ok(DataRate(SF12, BW125)), snr: 2.25, len: 63 from MacAddress(34:36:32:38:24:00:00), module: gateway
thread 'main' panicked at '`at` split index (is 18446744073709551614) should be <= len (is 2)', library/alloc/src/vec/mod.rs:1879:13
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
/opt/gateway-rs/startScript.sh: line 38:    36 Aborted                 (core dumped) /usr/bin/helium_gateway -c ${TARGET_DIR} server

gateway-rs crashes on inbound packet

nc during a send:
"T{"rxpk":[{"chan":7,"codr":"4/5","data":"QEgAAEiAJS8CmwMUKTr7OghOxMmChZt2","datr":"SF10BW125","freq":905.300000,"lsnr":13.500000,"modu":"LORA","rfch":1,"rssi":-47,"size":24,"stat":1,"time":"2021-05-27T23:11:04.778146Z","tmst":205995437}]}12512(T{"rxpk":[{"chan":5,"codr":"4/5","data":"AMTpU5w4EUMV+3eBu3xBQDKxkIu0yuw=","datr":"SF10BW125","freq":904.900000,"lsnr":-8.250000,"modu":"LORA","rfch":1,"rssi":-103,"size":23,"stat":-1,"time":"2021-05-27T23:11:08.487752Z","tmst":209705180}]}X2512(T{"rxpk":[{"chan":7,"codr":"4/5","data":"AMTpU5w4ESMlynSC0XZBQKjU9km0xu4=","datr":"SF10BW125","freq":905.300000,"lsnr":13.250000,"modu":"LORA","rfch":1,"rssi":-49,"size":23,"stat":1,"time":"2021-05-27T23:11:08.489584Z","tmst":209707501}]}▒2512(T{"stat":{"ackr":0.000000,"dwnb":0,"rxfw":4,"rxnb":4,"rxok":3,"time":"2021-05-27 23:11:11 GMT","txnb":0}}Z2512(T{"rxpk":[{"chan":5,"codr":"4/5","data":"QAwAAEiBAAANAq0UPzfb","datr":"SF10BW125","freq":904.900000,"lsnr":13.250000,"modu":"LORA","rfch":1,"rssi":-62,"size":15,"stat":1,"time":"2021-05-27T23:11:13.917361Z","tmst":215135308}]}"

syslog entry from the send;
May 27 17:09:15 raspberrypi helium_gateway[1872]: routing packet to: http://54.193.165.228:8080/, module: router
May 27 17:09:15 raspberrypi helium_gateway[1872]: ignoring raw packet PushData(Packet { random_token: 397, gateway_mac: MacAddress { bytes: [50, 53, 49, 50, 40, 0, 84, 0] }, data: Data { rxpk: Some([V1(RxPkV1 { chan: 4, codr: _4_5, data: [0, 196, 233, 83, 156, 56, 17, 35, 37, 202, 116, 130, 209, 118, 65, 64, 168, 33, 228, 203, 25, 182, 164], datr: DataRate(SF10, BW125), freq: 904.7, lsnr: 10.5, modu: LORA, rfch: 1, rssi: -50, rssis: None, size: 23, stat: OK, tmst: 96444652 })]), stat: None } }), module: gateway
May 27 17:09:15 raspberrypi helium_gateway[1872]: thread 'main' panicked at 'index out of bounds: the len is 29 but the index is 29', /cargo/registry/src/github.com-1ecc6299db9ec823/xorf-0.7.0/src/xor16.rs:64:9
May 27 17:09:15 raspberrypi helium_gateway[1872]: note: run with RUST_BACKTRACE=1 environment variable to display a backtrace
May 27 17:09:15 raspberrypi systemd[1]: helium_gateway.service: Main process exited, code=killed, status=6/ABRT
May 27 17:09:15 raspberrypi systemd[1]: helium_gateway.service: Failed with result 'signal'.

cat settings.toml
listen_addr = "0.0.0.0:1680"

[log]
method = "syslog"
level = "info"
timestamp = false

[update]
platform = "raspi234"

forwarder is a mikrotik wAPLR9 on the local network.

I would like to see my data on Cayenne Dashboard.

I add Cayenne integration the same as I use TTN. Is the staging-console working with Cayenne right now?
I saw no_channel on my Integration message.
image
Live message is still red dot. It is not a green dot as I expect to see.

Do I miss something?

Data transfered too high

After upgrading to alpha-16 the hourly communications has jump over 100MB/h. This is impossible to support on LTE communication at a reasonable cost.

Oui 2 down - many connection refused

When an OUI is down (like oui 2 currenlty) the gateway rs is continuously trying to reconnect and is gets a lot of error messages.
After a certain number of trial the frequency of connection try could be reduced to limit the number of call / log entries / bandwidth consumed. Apparently we have a connection temptative on every uplink received.

LPS8 Malformed package

I keep getting the following error on my LPS8 while trying to set it up for the HNT gateway. The error is:

"pkg_init_from_file: Malformed package file helium-gateway-v1.0.0-alpha.9-dragino.ipk."

I have reset the LPS8 multiple times and tried installing using:

"opkg install /tmp/ helium-gateway-v1.0.0-alpha.9-dragino.ipk"

what am I doing wrong, and how do I fix this?

I have downloaded it using two different commands with the same result

"wget -O helium-gateway-v1.0.0-alpha.9-dragino.ipk https://github.com/helium/gateway-rs/releases"

"wget -O helium-gateway-v1.0.0-alpha.9-dragino.ipk https://github.com/helium/gateway-rs/releases/tag/v1.0.0-alpha.9"

Add support for Bobcat light gateway series

Hi,

We'd also want to add support for Bobcat light gateway series. Target: arm-openwrt-linux-muslgnueabi.

We tried to install klkgw ipk and it failed with;
root@OpenWrt-G220:~# opkg install helium-gateway-v1.0.0-alpha.13-klkgw.ipk
Unknown package 'helium_gateway'.
Collected errors:

  • pkg_hash_fetch_best_installation_candidate: Packages for helium_gateway found, but incompatible with the architectures configured
  • opkg_install_cmd: Cannot install package helium_gateway.
    root@OpenWrt-G220:~#

What's the next step for us to do? Thank you!

Raspberry Pi / Docker Support

Hia,

So I've been doing some basic work to get started with Gateway RS on our RPi based gateways.

Now I know that @shawaj did do a PR to package it as Debian packages at #17

However the PR is quite old, and I'm not now sure if it'd be better to instead target an alpine base which would be more compact.

What's kind of the route you'd want to go for these?

As alternatively looking into it, there's not neccesarily a need for a pre-compiled package as the docker container can compile the software in a build step and then copy it into the image that is deployed.

Then would you provide the container like the current miner, or would it be better for us to manage it?

Additionnal logs for debugging purpose

Improve debbuging by providing additionnal logs for:

  • Start listening on interface/port for packet forwarder communication (INFO)
  • Detected and used configuration file (DEBG)

Support for Raspberry Pi based (armhf) gateways

We are keen to building support for armhf (Raspberry Pi) based gateways via balenaCloud

Would your preference be for us to add a PR for a new package for armhf here? And can we package that release as a .deb instead of .ipk to save having to compile opkg for armhf. I guess it is pretty simple to convert .ipk to .deb in any case.

And then we can just add a dockerfile and balena.yml for auto-deployment using deploy with balena.

Running gateway-rs add command without curl returns a low-information error message

If curl is missing, the add command returns the following message:

Error: IO(Os { code: 2, kind: NotFound, message: "No such file or directory" })

I would expect an error message with a relation to curl, e.g. :

Error: IO(Os { code: 2, kind: NotFound, message: "curl: No such file or directory" })

Also, the README states:

curl: for fetching releases over SSL, curl is used. This was a simple way to use SSL without bloating the helium_gateway binary with additional libraries. Note that the updater may be disabled and thus this dependency may be removed.

But taht last sentence its not true as the add command requires it too.

x86 build?

Can I get either an x86 build for debian or instructions to build? I only find instructions to build the openwrt/ipkg file.

Problem processing helium traffic

On a gateway I was not able to receive Helium traffic, even if the gateway is receiving LoRaWan communication regularly. I did have to restart the gateway_rs service to restore the helium communications.
In the Logs during that period, I noticed:

Sep 24 19:05:42 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: uplink @3065586964 us, 867.30 MHz, Ok(DataRate(SF9, BW125)), snr: -10.8, len: 23 from MacAddress(
AC:1F:09:FF:FE:05:89), module: gateway
Sep 24 19:05:42 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: ignoring router dispatch error, module: dispatcher
Sep 24 19:05:42 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: uplink @3065791964 us, 868.10 MHz, Ok(DataRate(SF11, BW125)), snr: -10, len: 23 from MacAddress(A
C:1F:09:FF:FE:05:89), module: gateway
Sep 24 19:06:12 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: no update found, module: updater
Sep 24 19:06:29 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: uplink @3111993428 us, 867.30 MHz, Ok(DataRate(SF12, BW125)), snr: -14.5, len: 24 from MacAddress
(AC:1F:09:FF:FE:05:89), module: gateway
Sep 24 19:06:31 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: uplink @3114229356 us, 867.10 MHz, Ok(DataRate(SF12, BW125)), snr: -6, len: 18 from MacAddress(AC
:1F:09:FF:FE:05:89), module: gateway
Sep 24 19:06:47 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: uplink @3129986196 us, 867.50 MHz, Ok(DataRate(SF9, BW125)), snr: -9.3, len: 23 from MacAddress(A
C:1F:09:FF:FE:05:89), module: gateway
Sep 24 19:06:47 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: ignoring router dispatch error, module: dispatcher
Sep 24 19:07:04 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: uplink @3147841700 us, 867.30 MHz, Ok(DataRate(SF9, BW125)), snr: -8.3, len: 23 from MacAddress(A
C:1F:09:FF:FE:05:89), module: gateway
Sep 24 19:07:04 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: ignoring router dispatch error, module: dispatcher
Sep 24 19:07:07 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: uplink @3150565228 us, 867.10 MHz, Ok(DataRate(SF9, BW125)), snr: -6.3, len: 23 from MacAddress(A
C:1F:09:FF:FE:05:89), module: gateway
Sep 24 19:07:07 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: ignoring router dispatch error, module: dispatcher
Sep 24 19:07:12 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: uplink @3155733180 us, 867.10 MHz, Ok(DataRate(SF12, BW125)), snr: -3.8, len: 18 from MacAddress(
AC:1F:09:FF:FE:05:89), module: gateway
Sep 24 19:07:22 ubuntu-Standard-PC-i440FX-PIIX-1996 helium_gateway[139580]: uplink @3165747444 us, 867.50 MHz, Ok(DataRate(SF9, BW125)), snr: 3.3, len: 25 from MacAddress(AC
:1F:09:FF:FE:05:89), module: gateway

After restarting, the ignoring router dispatch error, has disappeared from the logs.
In the overall traffic, the frames with that message are corresponding to helium traffic.

Improve logging

Currently the uplink are logged the following way:

INFO uplink @1195622011 us, 867.10 MHz, Ok(DataRate(SF7, BW125)), snr: -11.25, len: 145 from MacAddress(31:33:30:37:39:00:00), module: gateway

it would be great to also get the RSSI in the log for statistics of coverage area, devaddr could also be nice for device statistics. I'm not sure MaxAddress is relevant as it should be a constant in case you want to reduce some other fields

support for non-numerical listen_addr

as we are running on balena, the inter-container networking is done using the container name, so for example we would use a listen address of packet-forwarder:1680 or similar rather than 127.0.0.1:1680 however when entering this it fails with the error message:

 helium-miner  Error: Config(invalid listen address "packet-forwarder:1680": invalid IP address syntax)

Is it possible to allow a text based listen address?

i can ping packet-forwarder successfully on the device so it resolves correctly, and if manually adding that IP address to the GW_LISTEN_ADDR env variable it works correctly, however that IP changes per device so is not a reliable way to run things.

Hardcode list of available "ohio2"s

As we spin up more instances of "ohio2"s, aka "validators", gateway-rs will need to decide which miner-api service to ask which router to use.

we will hardcode this list for now.

Dragino LG01-S - Cannot install package helium_gateway

Hello Everyone!

I have a Dragino LG01-S that does nothing and collects dust. While I wait for proper gateways to arrive, I thought I'd mess around with this gateway.

Any idea on how I could fix this?

"root@dragino-192e20:/tmp# opkg install helium-gateway-v1.0.0-alpha.6-dragino.ipk
Unknown package 'helium_gateway'.
Collected errors:

  • pkg_hash_fetch_best_installation_candidate: Packages for helium_gateway found, but incompatible with the architectures configured
  • opkg_install_cmd: Cannot install package helium_gateway."

Thanks!

Data only default DBI

After adding my data only hotspot I noticed the default DBI is going in as 12dbi for the antenna.

Whilst I know this doesn't really matter, I'd prefer to not be breaking the law on a public blockchain.

Thanks!

Offer releases for more platforms

What would it take to offer releases for more platforms? There are packaged releases for helium-gateway-v0.1.1-alpha.14-klkgw.ipk and helium-gateway-v0.1.1-alpha.14-ramips_24kec.ipk while there are four platforms supported.

Platform Target Products
[ramips_24kec] mipsel-unknown-linux-musl ✅ [RAK833] EVB Kit
✅ [RAK7258] (WisGate Edge Lite)
❔ [RAK7249] (WisGate Edge Max)
❔ [RAK7240] (WisGate Edge Prime)
klkgw armv7-unknown-linux-musleabih ✅ Kerlink [Wirnet iFemtoCell Evolution]
dragino mips-unknown-linux-musl ✅ Dragino [LPS8]
❔ Dragino [DLOS8]
mtcdt armv5te-unknown-linux-musleabi ✅ Multitech Conduit [MTCDT] (mLinux)

Downlink packet scheduled at 915 Frequency while configured for EU868

When a confirmed uplink packet from a device in the production console is received by the light-gateway the downlink packet is dropped by the gateway. ERROR: Packet REJECTED, unsupported frequency - 920900024 (min:863000000,max:870000000).
As a result, OTAA and downlink messages fail when the light-gateway is on.

Hard- and software

  • RAK7258
  • helium-gateway-v1.0.0-alpha.13-ramips_24kec.ipk

log

Thu Aug  5 10:29:16 2021 daemon.info helium_gateway[28881]:  INFO ignoring raw packet PullData(Packet { random_token: 12249, gateway_mac: MacAddress { bytes: [172, 31, 9, 255, 254, 4, 103, 135] } }), module: gateway
Thu Aug  5 10:29:21 2021 daemon.info helium_gateway[28881]:  INFO ignoring raw packet PushData(Packet { random_token: 1817, gateway_mac: MacAddress { bytes: [172, 31, 9, 255, 254, 4, 103, 135] }, data: Data { rxpk: Some([V1(RxPkV1 { chan: 7, codr: _4_5, data: [128, 92, 0, 0, 72, 0, 3, 0, 1, 186, 89, 113, 191, 214, 109, 249, 85, 170, 240, 205, 196, 90], datr: DataRate(SF7, BW125), freq: 867.9, lsnr: 9.0, modu: LORA, rfch: 0, rssi: -33, rssis: None, size: 22, stat: OK, tmst: 2543900188 })]), stat: None } }),Thu Aug  5 10:29:21 2021 daemon.info helium_gateway[28881]:  INFO routing packet to: http://52.8.80.146:8080/, module: router
Thu Aug  5 10:29:21 2021 daemon.info helium_gateway[28881]:  INFO ignoring raw packet PullData(Packet { random_token: 54575, gateway_mac: MacAddress { bytes: [172, 31, 9, 255, 254, 4, 103, 135] } }), module: gateway
Thu Aug  5 10:29:22 2021 user.err lora_pkt_fwd[29685]: ERROR: Packet REJECTED, unsupported frequency - 920900024 (min:863000000,max:870000000)
Thu Aug  5 10:29:22 2021 daemon.info helium_gateway[28881]:  INFO sending rx1 downlink Some(TxPk { imme: false, tmst: N(2544900188), tmms: None, freq: 920.9000244140625, rfch: 0, powe: 27, modu: LORA, datr: DataRate(SF7, BW500), codr: _4_5, fdev: None, ipol: true, prea: None, size: 12, data: [96, 92, 0, 0, 72, 32, 3, 0, 53, 90, 218, 12], ncrc: None }), module: gateway
Thu Aug  5 10:29:22 2021 daemon.info helium_gateway[28881]:  WARN ignoring rx1 downlink error: Ack(TX_FREQ), module: gateway
Thu Aug  5 10:29:22 2021 daemon.info helium_gateway[28881]:  INFO ignoring raw packet TxAck(Packet { random_token: 40611, gateway_mac: MacAddress { bytes: [172, 31, 9, 255, 254, 4, 103, 135] }, data: Some(TxPkNack { txpk_ack: SubTxPkAck { error: TX_FREQ } }) }), module: gateway

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.