コード例 #1
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #2
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
def rx_stop(ctx):
    """Stop LoraP2P RX."""
    lora = Rak811()
    lora.rx_stop()
    if ctx.obj['VERBOSE']:
        click.echo('LoraP2P RX stopped.')
    lora.close()
コード例 #3
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #4
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
def sleep(ctx):
    """Enter sleep mode."""
    lora = Rak811()
    lora.sleep()
    if ctx.obj['VERBOSE']:
        click.echo('Sleeping')
    lora.close()
コード例 #5
0
ファイル: test_rak811.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #6
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #7
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #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']))
コード例 #9
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
def reload(ctx):
    """Set LoRaWan or LoRaP2P configurations to default."""
    lora = Rak811()
    lora.reload()
    if ctx.obj['VERBOSE']:
        click.echo('Configuration reloaded.')
    lora.close()
コード例 #10
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
def wake_up(ctx):
    """Wake up."""
    lora = Rak811()
    lora.wake_up()
    if ctx.obj['VERBOSE']:
        click.echo('Alive!')
    lora.close()
コード例 #11
0
ファイル: test_terra_rak.py プロジェクト: newtoncn/pyrak811
def test_rak_rec_command():
    lora = Rak811()

    wait_time = 20

    lora.mode = Mode.LoRaP2P

    lora.rx_get(wait_time)
コード例 #12
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #13
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #14
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #15
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #16
0
ファイル: test_rak811.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #17
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #18
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #19
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #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()
コード例 #21
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #22
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #23
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #24
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #25
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #26
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #27
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
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()
コード例 #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()
コード例 #29
0
ファイル: otaa.py プロジェクト: thrinithomas/pyrak811
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
コード例 #30
0
ファイル: cli.py プロジェクト: thrinithomas/pyrak811
def version(ctx):
    """Get module version."""
    lora = Rak811()
    click.echo(lora.version)
    lora.close()