Exemple #1
0
def radio_status(ctx):
    """Get radio statistics.

    Returns: TxSuccessCnt, TxErrCnt, RxSuccessCnt, RxTimeOutCnt, RxErrCnt,
    Rssi, Snr.
    """
    lora = Rak811()
    (
        tx_success_cnt, tx_err_cnt,
        rx_success_cnt, rx_timeout_cnt, rx_err_cnt,
        rssi, snr
    ) = lora.radio_status
    if ctx.obj['VERBOSE']:
        click.echo('TxSuccessCnt: {}'.format(tx_success_cnt))
        click.echo('TxErrCnt: {}'.format(tx_err_cnt))
        click.echo('RxSuccessCnt: {}'.format(rx_success_cnt))
        click.echo('RxTimeOutCnt: {}'.format(rx_timeout_cnt))
        click.echo('RxErrCnt: {}'.format(rx_err_cnt))
        click.echo('RSSI: {}'.format(rssi))
        click.echo('SNR: {}'.format(snr))
    else:
        click.echo('{} {} {} {} {} {} {}'.format(
            tx_success_cnt, tx_err_cnt,
            rx_success_cnt, rx_timeout_cnt, rx_err_cnt,
            rssi, snr
        ))
    lora.close()
Exemple #2
0
def rx_stop(ctx):
    """Stop LoraP2P RX."""
    lora = Rak811()
    lora.rx_stop()
    if ctx.obj['VERBOSE']:
        click.echo('LoraP2P RX stopped.')
    lora.close()
Exemple #3
0
def clear_radio_status(ctx):
    """Clear radio statistics."""
    lora = Rak811()
    lora.clear_radio_status()
    if ctx.obj['VERBOSE']:
        click.echo('Radio statistics cleared.')
    lora.close()
Exemple #4
0
def sleep(ctx):
    """Enter sleep mode."""
    lora = Rak811()
    lora.sleep()
    if ctx.obj['VERBOSE']:
        click.echo('Sleeping')
    lora.close()
Exemple #5
0
def test_instantiate_params(mock_serial):
    """Test that Rak811 passes parameters passed to RackSerial."""
    port = '/dev/ttyAMA0'
    timeout = 5
    lora = Rak811(port=port, timeout=timeout)
    mock_serial.assert_called_once_with(port=port, timeout=timeout)
    lora.close()
Exemple #6
0
def rxc(ctx):
    """Set module in LoraP2P receive mode."""
    lora = Rak811()
    lora.rxc()
    if ctx.obj['VERBOSE']:
        click.echo('Module set in receive mode.')
    lora.close()
Exemple #7
0
def send(ctx, port, confirm, binary, data, json):
    """Send LoRaWan message and check for downlink."""
    if binary:
        try:
            data = bytes.fromhex(data)
        except ValueError:
            click.echo('Invalid binary data')
            return
    lora = Rak811()
    try:
        lora.send(data, confirm=confirm, port=port)
    except Rak811Error as e:
        print_exception(e)
        lora.close()
        return

    if ctx.obj['VERBOSE']:
        click.echo('Message sent.')
    if lora.nb_downlinks:
        downlink = lora.get_downlink()
        downlink['data'] = downlink['data'].hex()
        if json:
            click.echo(dumps(downlink, indent=4))
        elif ctx.obj['VERBOSE']:
            click.echo('Downlink received:')
            click.echo('Port: {}'.format(downlink['port']))
            if downlink['rssi']:
                click.echo('RSSI: {}'.format(downlink['rssi']))
                click.echo('SNR: {}'.format(downlink['snr']))
            click.echo('Data: {}'.format(downlink['data']))
        else:
            click.echo(downlink['data'])
    elif ctx.obj['VERBOSE']:
        click.echo('No downlink available.')
    lora.close()
Exemple #8
0
def test_rx(frequency):
    pass

    lora = Rak811()
    lora.hard_reset()
    lora.mode = Mode.LoRaP2P

    lora.rf_config = {'sf': 9, 'freq': frequency, 'pwr': 16}

    print('config created')
    wait = 30

    lora.rxc()

    while True:
        print(f'LoRa set to receive; waiting for {wait}s')

        lora.rx_get(wait)
        while lora.nb_downlinks > 0:
            message = lora.get_downlink()
            data = message['data']

            print(data)
            print(type(data))
            print('RSSI: {}, SNR: {}'.format(message['rssi'], message['snr']))
Exemple #9
0
def reload(ctx):
    """Set LoRaWan or LoRaP2P configurations to default."""
    lora = Rak811()
    lora.reload()
    if ctx.obj['VERBOSE']:
        click.echo('Configuration reloaded.')
    lora.close()
Exemple #10
0
def wake_up(ctx):
    """Wake up."""
    lora = Rak811()
    lora.wake_up()
    if ctx.obj['VERBOSE']:
        click.echo('Alive!')
    lora.close()
Exemple #11
0
def test_rak_rec_command():
    lora = Rak811()

    wait_time = 20

    lora.mode = Mode.LoRaP2P

    lora.rx_get(wait_time)
Exemple #12
0
def get_config(ctx, key):
    """Get LoraWan configuration."""
    lora = Rak811()
    try:
        click.echo(lora.get_config(key))
    except Rak811Error as e:
        print_exception(e)
    lora.close()
Exemple #13
0
def signal(ctx):
    """Get (RSSI,SNR) from latest received packet."""
    lora = Rak811()
    (rssi, snr) = lora.signal
    if ctx.obj['VERBOSE']:
        click.echo('RSSI: {0} - SNR: {1}'.format(rssi, snr))
    else:
        click.echo('{} {}'.format(rssi, snr))
    lora.close()
Exemple #14
0
def link_cnt(ctx):
    """Get up & downlink counters."""
    lora = Rak811()
    (uplink, downlink) = lora.link_cnt
    if ctx.obj['VERBOSE']:
        click.echo('Uplink: {0} - Downlink: {1}'.format(uplink, downlink))
    else:
        click.echo('{} {}'.format(uplink, downlink))
    lora.close()
Exemple #15
0
def join_abp(ctx):
    """Join the configured network in ABP mode."""
    lora = Rak811()
    try:
        lora.join_abp()
        if ctx.obj['VERBOSE']:
            click.echo('Joined in ABP mode')
    except Rak811Error as e:
        print_exception(e)
    lora.close()
Exemple #16
0
def test_instantiate_default(mock_serial):
    """Test that Rak811 can be instantiated.

    Check for basic initialisation and teardown of the RackSerial.
    """
    lora = Rak811()

    assert isinstance(lora._serial, Rak811Serial)
    mock_serial.assert_called_once_with()
    lora.close()
    mock_serial.return_value.close.assert_called_once()
Exemple #17
0
def hard_reset(ctx):
    """Hardware reset of the module.

    Hard reset should not be required in normal operation. It needs to be
    issued once after host boot, or module restart.
    """
    lora = Rak811()
    lora.hard_reset()
    if ctx.obj['VERBOSE']:
        click.echo('Hard reset complete')
    lora.close()
Exemple #18
0
def reset(ctx, reset_type):
    """Reset Module or LoRaWan stack."""
    lora = Rak811()
    if reset_type == 'module':
        lora.reset(Reset.Module)
    else:
        lora.reset(Reset.LoRa)
    if ctx.obj['VERBOSE']:
        click.echo('{0} reset complete.'.format(
            'Module' if reset_type == 'module' else 'LoRa'))
    lora.close()
Exemple #19
0
def band(ctx, band):
    """Get/Set LoRaWan region."""
    lora = Rak811()
    if band is None:
        click.echo(lora.band)
    else:
        band = band.upper()
        lora.band = band
        if ctx.obj['VERBOSE']:
            click.echo('LoRaWan region set to {0}.'.format(band))
    lora.close()
Exemple #20
0
def recv_ex(ctx, recv_ex):
    """RSSI & SNR report on receive."""
    lora = Rak811()
    if recv_ex is None:
        click.echo('Enabled' if lora.recv_ex == RecvEx.Enabled else 'Disabled')
    else:
        lora.recv_ex = (RecvEx.Enabled
                        if recv_ex == 'enable' else RecvEx.Disabled)
        if ctx.obj['VERBOSE']:
            click.echo('RSSI & SNR report on receive {0}.'.format(
                'Enabled' if recv_ex == 'enable' else 'Disabled'))
    lora.close()
Exemple #21
0
def dr(ctx, dr):
    """Get/Set next send data rate."""
    lora = Rak811()
    if dr is None:
        click.echo(lora.dr)
    else:
        try:
            lora.dr = dr
            if ctx.obj['VERBOSE']:
                click.echo('Data rate set to {0}.'.format(dr))
        except Rak811Error as e:
            print_exception(e)
    lora.close()
Exemple #22
0
def mode(ctx, mode):
    """Get/Set mode to LoRaWan or LoRaP2P."""
    lora = Rak811()
    if mode is None:
        click.echo('LoRaWan' if lora.mode == Mode.LoRaWan else 'LoRaP2P')
    else:
        mode = mode.lower()
        if mode == 'lorawan':
            lora.mode = Mode.LoRaWan
        else:
            lora.mode = Mode.LoRaP2P
        if ctx.obj['VERBOSE']:
            click.echo('Mode set to {0}.'.format(
                'LoRaWan' if mode == 'lorawan' else 'LoRaP2P'))
    lora.close()
Exemple #23
0
def set_config(ctx, key_values):
    """Set LoraWAN configuration.

    \b
    Arguments are specified as KEY=VALUE pairs, e.g.:
        set-config app_eui='APP_EUI' app_key='APP_KEY'
    """
    lora = Rak811()
    kv_args = dict(key_values)
    try:
        lora.set_config(**kv_args)
        if ctx.obj['VERBOSE']:
            click.echo('LoRaWan parameters set')
    except Rak811Error as e:
        print_exception(e)
    lora.close()
Exemple #24
0
def abp_info(ctx):
    """Get ABP info.

    When using OTAA, returns the necessary info to re-join in ABP mode. The
    following tuple is returned: (NetworkID, DevAddr, Nwkskey, Appskey)
    """
    lora = Rak811()
    (nwk_id, dev_addr, nwks_key, apps_key) = lora.abp_info
    if ctx.obj['VERBOSE']:
        click.echo('NwkId: {}'.format(nwk_id))
        click.echo('DevAddr: {}'.format(dev_addr))
        click.echo('Nwkskey: {}'.format(nwks_key))
        click.echo('Appskey: {}'.format(apps_key))
    else:
        click.echo('{} {} {} {}'.format(nwk_id, dev_addr, nwks_key, apps_key))
    lora.close()
Exemple #25
0
def txc(ctx, cnt, interval, binary, data):
    """Send LoRaP2P message."""
    if binary:
        try:
            data = bytes.fromhex(data)
        except ValueError:
            click.echo('Invalid binary data')
            return
    lora = Rak811()
    try:
        lora.txc(data, cnt=cnt, interval=interval)
    except Rak811Error as e:
        print_exception(e)
        lora.close()
        return

    if ctx.obj['VERBOSE']:
        click.echo('Message sent.')
    lora.close()
Exemple #26
0
def rf_config(ctx, key_values):
    """Get/Set LoraP2P configuration.

    \b
    Without argument, returns:
        frequency, sf, bw, cr, prlen, pwr

    \b
    Otherwhise set rf_config, Arguments are specified as KEY=VALUE pairs:
        freq: frequency in MHz (860.000-929.900)
        sf: strength factor (6-12)
        bw: bandwidth (0:125KHz, 1:250KHz, 2:500KHz)
        cr: coding rate (1:4/5, 2:4/6, 3:4/7, 4:4/8)
        prlen: preamble length default (8-65535)
        pwr: Tx power (5-20)
    E.g.: rf-config freq=860.100 sf=7 pwr=16

    """
    lora = Rak811()
    config = dict(key_values)
    if config == {}:
        # No parameters: returns rc_config
        config = lora.rf_config
        if ctx.obj['VERBOSE']:
            click.echo('Frequency: {}'.format(config['freq']))
            click.echo('SF: {}'.format(config['sf']))
            click.echo('BW: {}'.format(config['bw']))
            click.echo('CR: {}'.format(config['cr']))
            click.echo('PrLen: {}'.format(config['prlen']))
            click.echo('Power: {}'.format(config['pwr']))
        else:
            click.echo('{} {} {} {} {} {}'.format(
                config['freq'], config['sf'], config['bw'], config['cr'],
                config['prlen'], config['pwr']
            ))
    else:
        # At least a parameter, set rc_config
        lora.rf_config = config
        if ctx.obj['VERBOSE']:
            click.echo('rf_config set: ' + ', '.join('{}={}'.format(k, v) for
                                                     k, v in config.items()))

    lora.close()
Exemple #27
0
def rx_get(ctx, timeout, json):
    """Get LoraP2P message."""
    lora = Rak811()
    lora.rx_get(timeout)
    if lora.nb_downlinks:
        rx = lora.get_downlink()
        rx['data'] = rx['data'].hex()
        if json:
            click.echo(dumps(rx, indent=4))
        elif ctx.obj['VERBOSE']:
            click.echo('Message received:')
            if rx['rssi']:
                click.echo('RSSI: {}'.format(rx['rssi']))
                click.echo('SNR: {}'.format(rx['snr']))
            click.echo('Data: {}'.format(rx['data']))
        else:
            click.echo(rx['data'])
    elif ctx.obj['VERBOSE']:
        click.echo('No message available.')
    lora.close()
Exemple #28
0
def sen
    frame = LppFrame()
    frame.add_temperature(0, raw_temp)
    frame.add_humitidy(1, humidity)
    frame.add_pressure(2, pressure)
    frame.add_

    buffer = frame.bytes()

    #print(buffer)

    lora = Rak811()
    lora.hard_reset()
    lora.mode = Mode.LoRaWan
    lora.band = 'EU868'
    lora.set_config(app_eui='70B3D57ED001C921',
                app_key='55B77F583763DCFE02AC75DB77CDD4B1')
    lora.join_otaa()
    lora.dr = 5
    lora.send(bytes(buffer))
    lora.close()
Exemple #29
0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

SPDX-License-Identifier: Apache-2.0
"""
from random import randint
from sys import exit
from time import sleep

from rak811 import Mode, Rak811
from ttn_secrets import APP_EUI, APP_KEY

lora = Rak811()

# Most of the setup should happen only once...
print('Setup')
lora.hard_reset()
lora.mode = Mode.LoRaWan
lora.band = 'EU868'
lora.set_config(app_eui=APP_EUI, app_key=APP_KEY)

print('Joining')
lora.join_otaa()
# Note that DR is different from SF and depends on the region
# See: https://docs.exploratory.engineering/lora/dr_sf/
# Set Data Rate to 5 which is SF7/125kHz for EU868
lora.dr = 5
Exemple #30
0
def version(ctx):
    """Get module version."""
    lora = Rak811()
    click.echo(lora.version)
    lora.close()