Example #1
0
class SigFoxSender:
    def __init__(self):
        # init Sigfox for RCZ1 (Europe)
        self.sigfox = Sigfox(mode=Sigfox.SIGFOX, rcz=Sigfox.RCZ1)
        # create a Sigfox socket
        self.socket = socket.socket(socket.AF_SIGFOX, socket.SOCK_RAW)
        # make the socket blocking
        self.socket.setblocking(True)
        # configure it as uplink only
        self.socket.setsockopt(socket.SOL_SIGFOX, socket.SO_RX, False)
        print('SigFox socket created')
        print('MAC: {} - ID: {} - RSSI: {} - PAC: {}'.format(
            hexlify(self.sigfox.mac()).decode(),
            hexlify(self.sigfox.id()).decode(), self.sigfox.rssi(),
            hexlify(self.sigfox.pac()).decode()))

    def getSignalStrength(self):
        return self.sigfox.rssi()

    def transformValue(self, value):
        # divide by 10 (convention as high values are expected at some point):
        transformed = value / 10
        # cast value to int:
        transformed = int(transformed)
        # avoid negative values:
        transformed = 0 if (transformed < 0) else transformed
        # as we are packing the value in a single byte, make it 255 as max value:
        transformed = 255 if (transformed > 255) else transformed
        # return transformed value:
        return transformed

    def packMesageForSigFox(self, ozone, temperature, humidity):
        # casting floats to ints in values array (only ozone values):
        values = [self.transformValue(x) for x in ozone]
        # adding temperature and humidity to values array (casted to ints):
        values.append(int(temperature))
        values.append(int(humidity))
        # returning array packed for sigfox
        # sigfox custom grammar to use: ozone1::uint:8 ozone2::uint:8 ozone3::uint:8 ozone4::uint:8 ozone5::uint:8 ozone6::uint:8 ozone7::uint:8 ozone8::uint:8 ozone9::uint:8 ozone10::uint:8 temperature::uint:8 humidity::uint:8
        return struct.pack('B' * len(values), *values)
        # return struct.pack('>BBBBBBBBBB', ozone..., int(temperature), int(humidity))

    def sendMessage(self, message):
        return self.socket.send(message)

    def sendValues(self, ozone, temperature, humidity):
        res = self.sendMessage(
            self.packMesageForSigFox(ozone, temperature, humidity))
        return res
Example #2
0
sigfox = Sigfox(mode=Sigfox.SIGFOX, rcz=Sigfox.RCZ1)

# create a Sigfox socket
s = socket.socket(socket.AF_SIGFOX, socket.SOCK_RAW)

# make the socket blocking
s.setblocking(True)

# wait for a downlink after sending the uplink packet
s.setsockopt(socket.SOL_SIGFOX, socket.SO_RX, True)

# send some bytes
pycom.rgbled(0x7f7f00)  # yellow
try:
    s.send(bytes([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]))
    pycom.rgbled(0x007f00)  # green
    time.sleep(1)
except:
    pycom.rgbled(0x7f0000)  # red
    time.sleep(1)

received = s.recv(8)
print(received)
if received:
    pycom.rgbled(0x007f00)  # green
else:
    pycom.rgbled(0x7f0000)  # red
print(sigfox.rssi())
time.sleep(4)

s.close()
Example #3
0
    current_fragment['data'] = payload
    current_fragment['timeout'] = timeout
    current_fragment['downlink_enable'] = True
    current_fragment['ack_received'] = False
    current_fragment['fragment_size'] = len(payload)
    current_fragment['sending_start'] = 0
    try:
        pycom.rgbled(0x7700CC)  # purple
        print("Sending: {}".format(payload))
        current_fragment['sending_start'] = chrono.read()
        s.send(payload)
        response = s.recv(downlink_mtu)
        current_fragment['sending_end'] = chrono.read()
        current_fragment['send_time'] = current_fragment[
            'sending_end'] - current_fragment['sending_start']
        current_fragment['rssi'] = sigfox.rssi()
        print("response -> {}".format(response))
        decode_response = ''.join("{:08b}".format(int(byte))
                                  for byte in response)
        print('decode_response -> {}'.format(decode_response))
        current_fragment['ack'] = decode_response if decode_response else ""
        current_fragment['ack_received'] = True

    except OSError as e:
        current_fragment['sending_end'] = chrono.read()
        current_fragment['send_time'] = current_fragment[
            'sending_end'] - current_fragment['sending_start']
        current_fragment['rssi'] = sigfox.rssi()
        current_fragment['ack'] = ""
        current_fragment['ack_received'] = False
        print('Error number {}, {}'.format(e.args[0], e))
Example #4
0
    # Loop 0 to (config x 10),
    # config should be 100 as per test protocol,
    # this takes very long
    # config = 1 takes about 127 seconds
    # config = 5 takes about 624 seconds
    # it seems after 30 frames (ie config = 3), RSA finished the test
elif test == "DL - GFSK Receiver":
    print("NB: Test Mode TX-BPSK has to be executed just before this test.")
    # print("Run test_mode(BPSK) before GFSK ... ")
    # sigfox.test_mode( SFX_TEST_MODE_TX_BPSK, 3)
    # print("... done. Click on \"Start send GFSK\" in RSA now")
    # sleep(2)
    # print("Run test_mode(GFSK) ...")
    test_mode(SFX_TEST_MODE_RX_GFSK, 30)  # 30 seconds timeout
    # print("... done.")
    print("rssi", sigfox.rssi())

################################################################################
#######################      Network Emulator tests      #######################
################################################################################
elif test == "NE-Uplink":
    # print("a")
    # #send(bytes([1,2,3,4,5,6,7,8,9,0xa,0xb,0xc]))
    # send(bytes([7]))
    # print("b")
    r = machine.rng() & 0xff
    print("reconfiguring sigfox to use public key")
    sigfox.public_key(True)
    num_messages = 1
    for b in range(0, num_messages):
        x = utime.time()
Example #5
0
            t = x[0:4]
            z = x[4:6]
            rssi = x[6:8]
            # b'5f59ebe4' b'0000' b'ff75'
            # b'5f59ec42' b'0000' b'ff72'
            # TODO: how to convert
            print("received=",
                  hexlify(x),
                  " time=",
                  hexlify(t),
                  " zero=",
                  hexlify(z),
                  " rssi=",
                  hexlify(rssi),
                  sep='')
            print("rssi", sigfox.rssi())
            ct_recv += 1
        else:
            s.setsockopt(socket.SOL_SIGFOX, socket.SO_RX, False)  # uplink only
            m = i + bytes([0x01]) + g + r
            print("send", hexlify(m))
            s.send(m)
            pycom.rgbled(0x000011)
            ct_send += 1
    except Exception as e:
        pycom.rgbled(0x110000)
        print("failed", e)
        ct_fail += 1
    time.sleep(2)
    print("ct=", ct, "(send,recv,fail)=", ct_send, ct_recv, ct_fail)
Example #6
0
    signal_strength = -500  # default value
    if low_power_consumption_mode == 0:
        print("send strength test message")
    try:
        error_position = "send"
        sigfox_network.send(bytes([255, 255, 0]))

        error_position = "send2"
        if low_power_consumption_mode == 0:
            print("waiting for feedback message")

        error_position = "recv"
        sigfox_network.recv(32)

        error_position = "rssi"
        signal_strength = sigfox.rssi()

    except:
        # every error will stop strength test
        signal_strength = -500
        if low_power_consumption_mode == 0:
            print(
                "error while waiting for signal strength test (position=%s)" %
                (error_position))

    if low_power_consumption_mode == 0:
        print("received signal stregth: %s" % (str(signal_strength)))
    if signal_strength < rssi_dbm_limit:
        if low_power_consumption_mode == 0:
            print("ERROR: signal stregth below limit: %s < %s" %
                  (str(signal_strength), str(rssi_dbm_limit)))