BleuIO

BleuIO

  • Get Started
  • Buy Now
  • Manual
  • AT Commands
  • Help

›Scripts & Tutorials

Manual

  • How it works
  • How to use
  • Verbose Mode
  • Known Issues
  • Troubleshooting

Firmware Updates

    BleuIO Pro (SSD025)

    • Firmware Updates
    • Release History

    BleuIO (SSD005)

    • Firmware Updates
    • Release History of BleuIO (SSD005)

AT-Commands

  • List of AT Commands

BleuIO Libraries

  • JavaScript Library
  • Python Library

Scripts & Tutorials

  • Python: iBeacon
  • Python: Eddystone Beacon
  • Python: Scan
  • Python: Scan and Store
  • Python: SPS Script
  • Python: File transfer Script
  • Python: Repeater Script
  • Javascript: Google chrome.serial Beacon
  • C# Console App Example
  • C# WFA Example

Script using libraries

    Python library > v1.2.0

    • Custom Services example using Python library
    • Eddystone example using Python library
    • IBeacon example using Python library
    • Scan example using Python library
    • Scan and store example using Python library

    Python library < v1.2.0

    • Eddystone example using Python library
    • IBeacon example using Python library
    • Scan example using Python library
    • Scan and store example using Python library
    • SPS example using Python library
    • Security Example using Python library

    JS library

    • Eddystone example using Javascript library
    • IBeacon example using Javascript library
    • Scan example using Javascript library
    • Security Example using Javascript library
    • Get Device Distance

Projects

    Arduino

    • Arduino Example

    Beaglebone

    • Beaglebone Example

    Raspberry Pi

    • Raspberry PI into Beacon
    • Raspberry PI home automation

    Raspberry PI Pico

    • BleuIO integration (Part1)
    • BleuIO integration (Part2)
    • BleuIO integration (Part3)

    Renesas RA4M2

    • Signal Strength Monitoring
    • Real-Time CO2 monitor
    • Monitoring Air Quality

    STM32 Nucleo-144

    • Nucleo-144 board example
    • Smart Bulb Example

    M5Stack's CoreMP135

    • M5Stack's CoreMP135 board example

Build Your Own Firmware

  • Build Your Own Firmware
  • Advertising Example

More

  • Links
Order Now

BleuIO

$19.99

Buy Now

SPS Script

Introduction

In this tutorial, we're going to set up two dongles using Python script to send data back and forth.

Connect a dongle each into two computers that has Python installed.

Dongle

In short:

  1. One dongle will take on the Central role and the other will take on the Peripheral role.

  2. Then they will connect to each other.

  3. The Central dongle will then start off sending a message; "Echo".

  4. The Peripheral dongle will then receive the message and send it back to the Central dongle which in turn will receive it and send it back and so forth until the script is stopped.

For a quick setup, copy the following script and save it on your local directory. You can also get the source code from our GitHub page.

import serial
import time

target_dongle_mac_address = "[0]40:48:FD:E5:2D:05" # Change this to the peripheral's mac address.
your_com_port = 'COM14' # Change this to the com port your dongle is connected to.

# Global
connecting_to_dongle = True
counter = 0
msg = ""
latest_msg = ""
error_counter = 0

print("Connecting to dongle...")
# Trying to connect to dongle until connected. Make sure the port and baudrate is the same as your dongle.
# You can check in the device manager to see what port then right-click and choose properties then the Port Settings
# tab to see the other settings
while connecting_to_dongle:
    try:
        console = serial.Serial(
            port=your_com_port,
            baudrate=57600,
            parity="N",
            stopbits=1,
            bytesize=8,
            timeout=0
        )
        if console.is_open.__bool__():
            connecting_to_dongle = False
    except:
        print("Dongle not connected. Please reconnect Dongle.")
        time.sleep(5)

# This script will send data from one dongle to another which in turn will echo it back and forth between the dongles.
print("\n\nConnected to Dongle.\n")
print("\nWelcome to the Serial Port Service (SPS) example!\n\n")
print("\nRemember to setup the Peripheral dongle first so Central has something to connect to.\n\n")

# Python 2 users
# input = raw_input("Choose \n1) for Peripheral...
role_input = input("Choose: \n1) for Peripheral Role\n2) for Central role\n>> ")
while not (role_input == "1" or role_input == "2"):
    role_input = input("Please choose 1 or 2.\nChoose: \n1) for Peripheral Role \n2) for Central role\n>>  ")

connected = "0"
while 1 and console.is_open.__bool__():
    if role_input == "1":
        print("Starting advertising.")
        time.sleep(0.1)
        # Sends the commands to the dongle. Important to send the \r as that is the return-key.
        console.write(str.encode("AT+ADVSTART"))
        console.write('\r'.encode())
        while connected == "0":
            dongle_output = console.read(console.in_waiting)
            time.sleep(2)
            print("Awaiting connection to Central...")
            if not dongle_output.isspace():
                # We make sure it doesn't print the same message over and over again by resetting [out] to blankspace
                # after printing once and check for blankspace before print again
                print(dongle_output.decode())
                if dongle_output.__contains__(str.encode("\r\nCONNECTED.\r\n")):
                    # Opens Serial Stream
                    console.write(str.encode("AT+SPSSEND"))
                    console.write('\r'.encode())
                    connected = "1"
                    print("Connected!")
                dongle_output = " "
    elif role_input == "2":
        # This is what will be sent back and forth between the dongles.
        # You can change this message to whatever you like.
        msg = "Echo"
        # Sends the commands to the dongle. Important to send the \r as that is the return-key.
        console.write(str.encode("AT+CENTRAL"))
        console.write('\r'.encode())
        time.sleep(0.1)
        print("Putting dongle in Central role and trying to connect to other dongle.")
        while connected == "0":
            # Sends the commands to the dongle. Important to send the \r as that is the return-key.
            time.sleep(0.5)
            console.write(str.encode("AT+GAPCONNECT="))
            console.write(str.encode(target_dongle_mac_address))
            console.write('\r'.encode())
            dongle_output2 = console.read(console.in_waiting)
            time.sleep(2)
            print("Trying to connect to Peripheral...")
            if not dongle_output2.isspace():
                # We make sure it doesn't print the same message over and over again by resetting [out] to blankspace
                # after printing once and check for blankspace before print again
                print(dongle_output2.decode())
                if dongle_output2.decode().__contains__("CONNECTED."):
                    # Opens Serial Stream
                    console.write(str.encode("AT+SPSSEND"))
                    console.write('\r'.encode())
                    connected = "1"
                    print("Connected!")
                    time.sleep(2)
                    # We wait a bit then sends the starting msg to the other dongle.
                    console.write(str.encode(msg))
                    counter += 1
                dongle_output2 = " "
    while connected == "1":
        dongle_output3 = console.read(console.in_waiting)
        # Let's wait 2 seconds to make sure we have had a chance of receiving anything before proceeding
        time.sleep(2)
        if not dongle_output3.isspace():
            # Here we check if we receive a message.
            if dongle_output3.__contains__(str.encode("\r\n[Received]: ")):
                print(dongle_output3)
                # Sometimes some extra bytes will be sent along with the message that the decode() function can't handle
                # so we put it in a try-except block so that it wont crash the script. We also save the last message as
                # a fallback in case of error.
                try:
                    # Here we convert the msg to a string and strip it of all newlines and carriage returns.
                    msg = str(dongle_output3.decode("ascii"))
                    msg = msg.replace('[Received]: ', '')
                    msg = msg.replace("\r\n", "")
                    latest_msg = msg
                except:
                    # In case of an error we use the last received message instead and increment the error counter.
                    msg = latest_msg
                    error_counter += 1
                print("This is what we will send: " + msg)
                # Encodes the string msg than sends it back to the other dongle.
                console.write(str.encode(msg))
                counter += 1
                # Just a little counter to show how many messages we've sent.
                print(str(counter) + " message(s) sent. " + str(error_counter) + " error(s).")
                # In case we get disconnected from the other dongle we go back to the previous state of waiting for a
                # connection (Peripheral) / trying to reconnect (Central).
            if dongle_output3.__contains__(str.encode("\r\nDISCONNECTED.")):
                print("Disconnected!")
                # Send an Escape to abort stream.
                console.write(0x1B)
                connected = "0"
            dongle_output3 = ""
        msg = ""

Change the COM-port in the script on both computers to match the ones your dongles is actually connected to. For the one that will be set up as the Central dongle you will also need to change the target_dongle_mac_address variable to the MAC address of your Peripheral dongle. You can get the MAC address by scanning for the other dongle while it's advertising. To learn more about how to scan check out our scanning tutorial.

Open up the command prompt, on both computers, in the directory where the script is located. Start the script by typing

python sps_example.py

and press Enter.

You should now be prompted to enter 1 or 2 depending on what role the dongle should have. Set one as Peripheral and the other as Central. It is advisable to setup the Peripheral first as the Central will need someone to connect to.

You should now see in the terminal how the dongles send and recieve data to and from each other.

The script will run until you stop it.

And that is an example of how we can send data between two dongles. If you want to stop the script, you can simply press control C.

Full source also available on GitHub.

← Python: Scan and StorePython: File transfer Script →
  • Introduction

Support Request

If you have any queries or technical questions, please don't hesitate to send us a message. We will reply within 24 hours.

Message Sent!

Docs
ManualAT CommandsHelp
Community
YouTubeLinkedInFacebook
More
BleuIOSmart Sensor DevicesGitHub
Sales & Support
support@bleuio.comsales@bleuio.com
Copyright © 2025 BleuIO. A product of Smart Sensor Devices