mirror of
https://github.com/kawasaki/pyscrlink.git
synced 2025-09-06 17:50:20 +02:00
Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
e6d63a5c97 | ||
|
6f7da4f720 | ||
|
32da72492f | ||
|
1af4baa7d6 | ||
|
39587b497b | ||
|
f506bbcaab | ||
|
9265086b12 | ||
|
58a60c94db |
19
README.md
19
README.md
@@ -42,7 +42,7 @@ Linux distros:
|
|||||||
* elementary OS 5.1 Hera
|
* elementary OS 5.1 Hera
|
||||||
|
|
||||||
Browsers:
|
Browsers:
|
||||||
* FireFox
|
* Firefox
|
||||||
* Chromium
|
* Chromium
|
||||||
|
|
||||||
It was reported that pyscrlink (former bluepy-scratch-link) working with
|
It was reported that pyscrlink (former bluepy-scratch-link) working with
|
||||||
@@ -51,7 +51,7 @@ following devices and Linux distros.
|
|||||||
Devices:
|
Devices:
|
||||||
* LEGO Mindstorm EV3 by @chrisglencross
|
* LEGO Mindstorm EV3 by @chrisglencross
|
||||||
* LEGO WeDo by @zhaowe, @KingBBQ
|
* LEGO WeDo by @zhaowe, @KingBBQ
|
||||||
* LEGO Boost by @laurentchar, @miguev, @jacquesdt
|
* LEGO Boost and compatible devices by @laurentchar, @miguev, @jacquesdt, @n3storm
|
||||||
* Intelino Smart Train by @ErrorJan
|
* Intelino Smart Train by @ErrorJan
|
||||||
* toio by @shimodash
|
* toio by @shimodash
|
||||||
|
|
||||||
@@ -59,6 +59,7 @@ Linux distros:
|
|||||||
* Raspbian by @chrisglencross
|
* Raspbian by @chrisglencross
|
||||||
* Ubuntu 16.04 @jacquesdt
|
* Ubuntu 16.04 @jacquesdt
|
||||||
* Ubuntu Studio 20.04 @miguev
|
* Ubuntu Studio 20.04 @miguev
|
||||||
|
* Debian 11 @n3storm
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
@@ -87,7 +88,8 @@ Installation
|
|||||||
$ pip3 install pyscrlink
|
$ pip3 install pyscrlink
|
||||||
```
|
```
|
||||||
|
|
||||||
4. For Bluetooth Low Energy (BLE) devices, set bluepy-helper capability.
|
4. Set bluepy-helper capability.
|
||||||
|
This step is required for most of devices except LEGO Mindstorm EV3.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ bluepy_helper_cap
|
$ bluepy_helper_cap
|
||||||
@@ -159,6 +161,8 @@ Usage
|
|||||||
```sh
|
```sh
|
||||||
$ scratch_link
|
$ scratch_link
|
||||||
```
|
```
|
||||||
|
If your device is toio, add "-s 1" option to the scratch_link command. It
|
||||||
|
allows the toio Do Visual Programming to connect to toio automatically.
|
||||||
|
|
||||||
3. Connect scratch to the target device such as micro:bit or LEGO Mindstorms:
|
3. Connect scratch to the target device such as micro:bit or LEGO Mindstorms:
|
||||||
* Open FireFox or Chrome. (Make sure to run as the same user for scratch-link python script.)
|
* Open FireFox or Chrome. (Make sure to run as the same user for scratch-link python script.)
|
||||||
@@ -202,6 +206,15 @@ Please file issues to [GitHub issue tracker](https://github.com/kawasaki/pyscrli
|
|||||||
Releases
|
Releases
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
Release 0.2.4
|
||||||
|
|
||||||
|
* Added -s option to specify BLE scan duration
|
||||||
|
* Improved README.md
|
||||||
|
|
||||||
|
Release 0.2.3
|
||||||
|
|
||||||
|
* Fixed eternal loop caused by hostname resolve failure
|
||||||
|
|
||||||
Release 0.2.2
|
Release 0.2.2
|
||||||
|
|
||||||
* Supported multiple device connections for toio
|
* Supported multiple device connections for toio
|
||||||
|
@@ -8,12 +8,14 @@ import asyncio
|
|||||||
import pathlib
|
import pathlib
|
||||||
import ssl
|
import ssl
|
||||||
import websockets
|
import websockets
|
||||||
|
import socket
|
||||||
import json
|
import json
|
||||||
import base64
|
import base64
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
import signal
|
import signal
|
||||||
import traceback
|
import traceback
|
||||||
|
import argparse
|
||||||
|
|
||||||
# for Bluetooth (e.g. Lego EV3)
|
# for Bluetooth (e.g. Lego EV3)
|
||||||
import bluetooth
|
import bluetooth
|
||||||
@@ -42,6 +44,9 @@ logger.setLevel(logLevel)
|
|||||||
logger.addHandler(handler)
|
logger.addHandler(handler)
|
||||||
logger.propagate = False
|
logger.propagate = False
|
||||||
|
|
||||||
|
HOSTNAME="device-manager.scratch.mit.edu"
|
||||||
|
scan_seconds=10.0
|
||||||
|
|
||||||
class Session():
|
class Session():
|
||||||
"""Base class for BTSession and BLESession"""
|
"""Base class for BTSession and BLESession"""
|
||||||
def __init__(self, websocket, loop):
|
def __init__(self, websocket, loop):
|
||||||
@@ -492,6 +497,7 @@ class BLESession(Session):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def _scan_devices(self, params):
|
def _scan_devices(self, params):
|
||||||
|
global scan_seconds
|
||||||
if BLESession.nr_connected > 0:
|
if BLESession.nr_connected > 0:
|
||||||
return len(BLESession.found_devices) > 0
|
return len(BLESession.found_devices) > 0
|
||||||
found = False
|
found = False
|
||||||
@@ -502,7 +508,8 @@ class BLESession(Session):
|
|||||||
for i in range(self.MAX_SCANNER_IF):
|
for i in range(self.MAX_SCANNER_IF):
|
||||||
scanner = Scanner(iface=i)
|
scanner = Scanner(iface=i)
|
||||||
try:
|
try:
|
||||||
devices = scanner.scan(10.0)
|
logger.debug(f"start BLE scan: {scan_seconds} seconds")
|
||||||
|
devices = scanner.scan(scan_seconds)
|
||||||
for dev in devices:
|
for dev in devices:
|
||||||
if self.matches(dev, params['filters']):
|
if self.matches(dev, params['filters']):
|
||||||
BLESession.found_devices.append(dev)
|
BLESession.found_devices.append(dev)
|
||||||
@@ -715,18 +722,20 @@ def stack_trace():
|
|||||||
print(line)
|
print(line)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
opts = [opt for opt in sys.argv[1:] if opt.startswith("-")]
|
global scan_seconds
|
||||||
if "-h" in opts:
|
parser = argparse.ArgumentParser(description='start Scratch-link')
|
||||||
print((f"Usage: {sys.argv[0]} [OPTS]\n"
|
parser.add_argument('-d', '--debug', action='store_true',
|
||||||
"OPTS:\t-h Show this help.\n"
|
help='print debug messages')
|
||||||
"\t-d Print debug messages."
|
parser.add_argument('-s', '--scan_seconds', type=float, default=10.0,
|
||||||
))
|
help='specifiy duration to scan BLE devices in seconds')
|
||||||
sys.exit(1)
|
args = parser.parse_args()
|
||||||
elif "-d" in opts:
|
if args.debug:
|
||||||
print("Print debug messages")
|
print("Print debug messages")
|
||||||
logLevel = logging.DEBUG
|
logLevel = logging.DEBUG
|
||||||
handler.setLevel(logLevel)
|
handler.setLevel(logLevel)
|
||||||
logger.setLevel(logLevel)
|
logger.setLevel(logLevel)
|
||||||
|
scan_seconds = args.scan_seconds
|
||||||
|
logger.debug(f"set scan_seconds: {scan_seconds}")
|
||||||
|
|
||||||
# Prepare certificate of the WSS server
|
# Prepare certificate of the WSS server
|
||||||
gencert.prep_cert()
|
gencert.prep_cert()
|
||||||
@@ -738,7 +747,7 @@ def main():
|
|||||||
ssl_context.load_cert_chain(localhost_cer, localhost_key)
|
ssl_context.load_cert_chain(localhost_cer, localhost_key)
|
||||||
|
|
||||||
start_server = websockets.serve(
|
start_server = websockets.serve(
|
||||||
ws_handler, "device-manager.scratch.mit.edu", 20110, ssl=ssl_context
|
ws_handler, HOSTNAME, 20110, ssl=ssl_context
|
||||||
)
|
)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
@@ -749,7 +758,13 @@ def main():
|
|||||||
except KeyboardInterrupt as e:
|
except KeyboardInterrupt as e:
|
||||||
stack_trace()
|
stack_trace()
|
||||||
break
|
break
|
||||||
|
except socket.gaierror as e:
|
||||||
|
logger.error(f"{type(e).__name__}: {e}")
|
||||||
|
logger.info(f"Check internet connection to {HOSTNAME}. If not "
|
||||||
|
f"available, add '127.0.0.1 {HOSTNAME}' to /etc/hosts.")
|
||||||
|
break
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
logger.error(f"{type(e).__name__}: {e}")
|
||||||
logger.info("Restarting scratch-link...")
|
logger.info("Restarting scratch-link...")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
2
setup.py
2
setup.py
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
|
|||||||
|
|
||||||
setuptools.setup(
|
setuptools.setup(
|
||||||
name="pyscrlink",
|
name="pyscrlink",
|
||||||
version="0.2.2",
|
version="0.2.4",
|
||||||
author="Shin'ichiro Kawasaki",
|
author="Shin'ichiro Kawasaki",
|
||||||
author_email='kawasaki@juno.dti.ne.jp',
|
author_email='kawasaki@juno.dti.ne.jp',
|
||||||
description='Scratch-link for Linux with Python',
|
description='Scratch-link for Linux with Python',
|
||||||
|
Reference in New Issue
Block a user