初始化提交

This commit is contained in:
王立帮
2024-07-20 22:09:06 +08:00
commit c247dd07a6
6876 changed files with 2743096 additions and 0 deletions

View File

@@ -0,0 +1,78 @@
@echo off
setlocal EnableDelayedExpansion
REM === Edit these lines to match your need ===
set COMM_PORT=COM1
set COMM_BAUD=9600
set SERV_ADDR=blynk-cloud.com
set SERV_PORT=80
REM === Edit lines below only if absolutely sure what you're doing ===
rem Get command line options
set SCRIPTS_PATH=%~dp0
:loop
IF NOT "%1"=="" (
IF "%1"=="-c" set COMM_PORT=%2& SHIFT & SHIFT & GOTO :loop
IF "%1"=="-b" set COMM_BAUD=%2& SHIFT & SHIFT & GOTO :loop
IF "%1"=="-s" set SERV_ADDR=%2& SHIFT & SHIFT & GOTO :loop
IF "%1"=="-p" set SERV_PORT=%2& SHIFT & SHIFT & GOTO :loop
CALL :usage
GOTO :eof
)
rem Find ports
set PORTS=
for /f "tokens=4 delims=: " %%A in ('mode^|findstr "COM[0-9]*:"') do IF not [%%A] == [] set PORTS=!PORTS! %%A
set PORTS=!PORTS:~1!
rem Check port
rem Skip check if no ports at all - Windows bug?
if not "x%PORTS%"=="x~1" (
if "x!PORTS:%COMM_PORT%=!"=="x%PORTS%" (
echo %COMM_PORT% not found, or may be busy.
set /p COMM_PORT="Select serial port [ %PORTS% ]: "
)
)
rem Create exe
if not exist "%SCRIPTS_PATH%\com2tcp.exe" (
copy "%SCRIPTS_PATH%\com2tcp.bin" "%SCRIPTS_PATH%\com2tcp.exe" > NUL
)
rem Do the job
echo Connecting device at %COMM_PORT% to %SERV_ADDR%:%SERV_PORT%...
rem Try resetting board
rem mode %COMM_PORT%:%COMM_BAUD%,N,8,1 >nul
:restart
"%SCRIPTS_PATH%\com2tcp.exe" --baud %COMM_BAUD% --ignore-dsr \\.\%COMM_PORT% %SERV_ADDR% %SERV_PORT%
echo Reconnecting in 3s...
timeout /T 3
goto restart
goto:eof
:usage
echo.
echo. This script redirects serial communication to the server.
echo.
echo. You can specify port, baud rate, and server endpoint like this:
echo. blynk-ser.bat -c ^<serial port^> -b ^<baud^> -s ^<server^> -p ^<port^>
echo.
echo. The defaults are:
echo. -c /dev/ttyUSB0 (on Linux)
echo. COM1 (on Windows)
echo. /dev/tty.usbserial (on OSX)
echo. -b 9600
echo. -s blynk-cloud.com
echo. -p 80
echo.
echo. If the specified serial port is not found, it will ask to enter another one.
echo. The script also tries to reestablish connection if it was lost.
goto:eof

View File

@@ -0,0 +1,249 @@
#!/bin/bash
# Detect script path
pushd `dirname $0` > /dev/null
SCRIPTPATH=`pwd`
popd > /dev/null
# === Edit default options to match your need ===
FROM_TYPE="SER" # SER, TCP
TO_TYPE="SSL" # TCP, SSL
COMM_BAUD=9600
SERV_ADDR=blynk-cloud.com
SERV_PORT_SSL=443
SERV_PORT_TCP=80
LSTN_PORT=80
SRVR_CERT="$SCRIPTPATH/certs/server.crt"
CLNT_CERT="$SCRIPTPATH/certs/client.pem"
# === Edit the lines below only if absolutely sure what you're doing ===
usage="
This script redirects serial communication to the server.
You can specify port, baud rate, and server endpoint like this:
blynk-ser.sh -c <serial port> -b <baud rate> -s <server address> -p <server port>
The defaults are:
-c,--comm single available port (on Linux, OSX)
COM1 (on Windows)
-b,--baud 9600
-s,--server blynk-cloud.com
-p,--port 80
If the specified serial port is not found, it will ask to enter another one.
The script also tries to reestablish connection if it was lost.
"
avrdude_warn="Warning: avrdude is running
Avoid uploading sketches and running this script at the same time.
If you didn't run avrdude, maybe it just stuck. You can kill it using:
killall avrdude
"
function detect_conflicts {
# Detect if avrdude is running
if pgrep avrdude; then echo -n "$avrdude_warn"; fi
}
detect_conflicts
# Detect socat
if ! hash socat 2>/dev/null; then
echo "This script uses socat utility, but could not find it."
echo
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
echo " Try installing it using: sudo apt-get install socat"
elif [[ "$OSTYPE" == "darwin"* ]]; then
echo " Try installing it using: brew install socat"
fi
exit 1
fi
# Execute getopt
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
ARGS=$(getopt -o hf:c:b:l:t:s:p: -l "help,from:,comm:,baud:,listen:,to:,server:,port:,cert:" -n "blynk-gateway.sh" -- "$@");
elif [[ "$OSTYPE" == "darwin"* ]]; then
ARGS=$(getopt hf:c:b:l:t:s:p: $*);
fi
# Bad arguments
if [ $? -ne 0 ];
then
echo -n "$usage"
exit 1
fi
eval set -- "$ARGS";
while true; do
case "$1" in
-h|--help)
shift
echo -n "$usage"
exit 0
;;
####
-f|--from)
shift
if [ -n "$1" ]; then
FROM_TYPE=$1
shift
fi
;;
-c|--comm)
shift
if [ -n "$1" ]; then
COMM_PORT_USER=$1
shift
fi
;;
-b|--baud)
shift
if [ -n "$1" ]; then
COMM_BAUD=$1
shift
fi
;;
-l|--listen)
shift
if [ -n "$1" ]; then
LSTN_PORT=$1
shift
fi
;;
####
-t|--to)
shift
if [ -n "$1" ]; then
TO_TYPE=$1
shift
fi
;;
-s|--server)
shift
if [ -n "$1" ]; then
SERV_ADDR=$1
shift
fi
;;
-p|--port)
shift
if [ -n "$1" ]; then
SERV_PORT_SSL=$1
SERV_PORT_TCP=$1
shift
fi
;;
--cert)
shift
if [ -n "$1" ]; then
SRVR_CERT=$1
shift
fi
;;
####
--)
shift;
break;
;;
esac
done
# Construct command
GEN_ATTR="-d -d"
TCP_ATTR="nodelay" #,nonblock=1,rcvtimeo=1,sndtimeo=1
SER_ATTR="raw,echo=0,clocal=1,cs8,nonblock=1"
if [[ "$FROM_TYPE" == "SER" ]]; then
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
COMM_WCARD="/dev/ttyUSB* /dev/ttyACM*"
COMM_STTY="-F"
elif [[ "$OSTYPE" == "darwin"* ]]; then
COMM_WCARD="/dev/tty.usbserial* /dev/tty.usbmodem*"
COMM_STTY="-f"
else
echo "Can't detect OS type!"
exit 1
fi
COMM_FOUND=`ls $COMM_WCARD 2> /dev/null`
COMM_QTY=`printf "%s\n" $COMM_FOUND | wc -l`
if [[ ! "$COMM_PORT_USER" == "" ]]; then
COMM_PORT=$COMM_PORT_USER
elif [[ "$COMM_QTY" == "1" ]]; then
# Select single available port
COMM_PORT=$COMM_FOUND
else
# Ask for serial port interactively
echo "$COMM_QTY ports found. You can specify port manually using -c option"
echo -n "Select serial port [" $COMM_FOUND "]: "
read COMM_PORT
fi
if [ ! -e "$COMM_PORT" ]; then
echo "Can't find port: $COMM_PORT"
echo "Please specify port manually using -c option"
exit 1
fi
echo "Resetting device $COMM_PORT..."
stty $COMM_STTY $COMM_PORT hupcl
# Disable restarting
#stty $COMM_STTY $COMM_PORT -hupcl
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
FROM_ATTR="FILE:$COMM_PORT,$SER_ATTR,b$COMM_BAUD"
elif [[ "$OSTYPE" == "darwin"* ]]; then
FROM_ATTR="GOPEN:$COMM_PORT,$SER_ATTR,ixoff=0,ixon=0,ispeed=$COMM_BAUD,ospeed=$COMM_BAUD,crtscts=0"
fi
elif [[ "$FROM_TYPE" == "TCP" ]]; then
FROM_ATTR="TCP-LISTEN:$LSTN_PORT,reuseaddr,fork,$TCP_ATTR"
else
echo "$FROM_TYPE is not supported."
exit 1
fi
if [[ "$TO_TYPE" == "TCP" ]]; then
echo "Warning: Server connection may be insecure!"
TO_ATTR="TCP:$SERV_ADDR:$SERV_PORT_TCP,$TCP_ATTR"
elif [[ "$TO_TYPE" == "SSL" ]]; then
if [ -e "$SRVR_CERT" ]; then
TCP_ATTR="cafile=$SRVR_CERT,$TCP_ATTR"
else
echo "Warning: $SRVR_CERT not found. Skipping server verification (connection may be insecure)!"
TCP_ATTR="verify=0,$TCP_ATTR"
fi
if [ -e "$CLNT_CERT" ]; then
TCP_ATTR="cert=$CLNT_CERT,$TCP_ATTR"
fi
TO_ATTR="openssl-connect:$SERV_ADDR:$SERV_PORT_SSL,$TCP_ATTR"
elif [[ "$TO_TYPE" == "2WAY" ]]; then
echo "2WAY is not supported yet."
exit 1
else
echo "$TO_TYPE is not supported."
exit 1
fi
# Setup exit handler
trap "echo Exited!; exit;" SIGINT SIGTERM
echo [ Press Ctrl+C to exit ]
while [ 1 ]; do
echo Connecting: "$FROM_ATTR <-> $TO_ATTR"
socat $GEN_ATTR "$FROM_ATTR" "$TO_ATTR"
detect_conflicts
echo Reconnecting in 3s...
sleep 3
done

View File

@@ -0,0 +1,216 @@
#!/usr/bin/python
'''
examples:
Simple write operations:
python blynk_ctrl.py --token=909fa1... -dw 5 1
python blynk_ctrl.py --token=909fa1... -aw 9 134
python blynk_ctrl.py --token=909fa1... -vw 1 value
Simple read operations:
python blynk_ctrl.py --token=909fa1... -vr 3
Using named pins (like A1, supported by some boards):
python blynk_ctrl.py --token=909fa1... -dw A1 1
Multiple operations at once:
python blynk_ctrl.py --token=909fa1... -aw 9 100 -dw 8 123 -vw 9 hello
Sending arrays to virtual pins:
python blynk_ctrl.py --token=909fa1... -vw 1 "value 1" "value 2"
Do simple animations (delay commands):
python blynk_ctrl.py --token=909fa1... --delayAll=0.2 -aw 9 0 -aw 9 50 -aw 9 100 -aw 9 150 -aw 9 200 -aw 9 255
python blynk_ctrl.py --token=909fa1... -aw 9 10 --delay=0.5 -aw 9 50 --delay=2.0 -aw 9 100
Author: Volodymyr Shymanskyy
License: The MIT license
'''
import socket, struct
import sys, time
import argparse
import logging
parser = argparse.ArgumentParser(
formatter_class=argparse.RawTextHelpFormatter,
description = 'This script uses Bridge feature to control another device from the command line.',
epilog = __doc__
)
def opAction(op, expand=False, minargs=1):
class _action(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
if len(values) < minargs:
raise argparse.ArgumentError(self, "not enough parameters")
if expand:
pin = values[0]
for v in values[1:]:
namespace.ops.append([op, pin, v])
else:
namespace.ops.append([op]+values)
return _action
parser.add_argument('-t', '--token', action="store", dest='token', help='auth token of the controller')
parser.add_argument('-dw', '--digitalWrite', action=opAction('dw', True, 2), nargs='*', metavar=('PIN', 'VAL'))
parser.add_argument('-aw', '--analogWrite', action=opAction('aw', True, 2), nargs='*', metavar=('PIN', 'VAL'))
parser.add_argument('-vw', '--virtualWrite', action=opAction('vw', False, 2), nargs='*', metavar=('PIN', 'VAL'))
parser.add_argument('-dr', '--digitalRead', action=opAction('dr'), nargs=1, metavar='PIN')
parser.add_argument('-ar', '--analogRead', action=opAction('ar'), nargs=1, metavar='PIN')
parser.add_argument('-vr', '--virtualRead', action=opAction('vr'), nargs=1, metavar='PIN')
parser.add_argument('--delay', action=opAction('delay'), nargs=1, type=float, metavar='SECs')
parser.add_argument('--delayAll', action="store", dest='delayAll', type=float, metavar='SECs', help='delay between all operations')
parser.add_argument('-s', '--server', action='store', dest='server', help='server address or domain name')
parser.add_argument('-p', '--port', action="store", dest='port', type=int, help='server port')
parser.add_argument('--target', action="store", dest='target', metavar="TOKEN", help='auth token of the target device')
parser.add_argument('--dump', action="store_true", dest='dump', help='dump communication')
parser.set_defaults(
server='blynk-cloud.com',
port=80,
dump=False,
nodelay=True,
bridge=64,
ops = []
)
args = parser.parse_args()
#import pprint
#pprint.pprint(args)
#sys.exit()
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(message)s')
log = logging.getLogger("blynk_ctrl")
if not args.target and args.token:
args.target = args.token
if not args.token:
parser.error("token not specified!")
if args.dump:
log.setLevel(logging.DEBUG)
# Helpers
hdr = struct.Struct("!BHH")
class MsgType:
RSP = 0
LOGIN = 2
PING = 6
BRIDGE = 15
HW_SYNC = 16
HW_INFO = 17
HW = 20
class MsgStatus:
OK = 200
def compose(msg_type, *args):
# Convert params to string and join using \0
data = "\0".join(map(str, args))
msg_id = genMsgId()
msg_len = len(data)
log.debug(" < %2d,%2d,%2d : %s", msg_type, msg_id, msg_len, "=".join(map(str, args)))
return hdr.pack(msg_type, msg_id, msg_len) + data
static_msg_id = 0
def genMsgId():
global static_msg_id
static_msg_id += 1
return static_msg_id
def receive(sock, length):
d = []
l = 0
while l < length:
r = ''
try:
r = sock.recv(length-l)
except socket.timeout:
continue
if not r:
return ''
d.append(r)
l += len(r)
return ''.join(d)
# Main code
try:
conn = socket.create_connection((args.server, args.port), 3)
except:
log.error("Can't connect to %s:%d", args.server, args.port)
sys.exit(1)
if args.nodelay:
conn.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
# Authenticate
conn.sendall(compose(MsgType.LOGIN, args.token))
data = receive(conn, hdr.size)
if not data:
log.error("Login timeout")
sys.exit(1)
msg_type, msg_id, msg_status = hdr.unpack(data)
if msg_type != MsgType.RSP or msg_status != MsgStatus.OK:
log.error("Login failed: %d,%d,%d", msg_type, msg_id, msg_status)
sys.exit(1)
def do_read(cmd, pin):
conn.sendall(compose(MsgType.HW_SYNC, cmd, pin))
while True:
data = receive(conn, hdr.size)
if not data:
log.warning("Data read timeout")
sys.exit(1)
msg_type, msg_id, msg_len = hdr.unpack(data)
if msg_type == MsgType.RSP:
log.debug(" > %2d,%2d : status %2d", msg_type, msg_id, msg_len)
elif msg_type == MsgType.HW or msg_type == MsgType.BRIDGE:
data = receive(conn, msg_len).split("\0")
log.debug(" > %2d,%2d,%2d : %s", msg_type, msg_id, msg_len, "=".join(data))
if data[0] == cmd[0]+'w' and data[1] == pin:
data = data[2:]
if len(data) > 1:
print data
else:
print data[0]
break
for op in args.ops:
cmd = op[0]
op = op[1:]
if cmd == 'dw':
conn.sendall(compose(MsgType.BRIDGE, args.bridge, "i", args.target))
conn.sendall(compose(MsgType.BRIDGE, args.bridge, "dw", op[0], op[1]))
elif cmd == 'aw':
conn.sendall(compose(MsgType.BRIDGE, args.bridge, "i", args.target))
conn.sendall(compose(MsgType.BRIDGE, args.bridge, "aw", op[0], op[1]))
elif cmd == 'vw':
conn.sendall(compose(MsgType.BRIDGE, args.bridge, "i", args.target))
conn.sendall(compose(MsgType.BRIDGE, args.bridge, "vw", op[0], *op[1:]))
elif cmd == 'dr' or cmd == 'ar' or cmd == 'vr':
do_read(cmd, op[0])
elif cmd == 'delay':
time.sleep(op[0])
else:
log.warning("Wrong command:", cmd)
if args.delayAll:
time.sleep(args.delayAll)
# Finished
conn.close()

View File

@@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIID5TCCAs2gAwIBAgIJAIHSnb+cv4ECMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYD
VQQGEwJVQTENMAsGA1UECAwES3lpdjENMAsGA1UEBwwES3lpdjELMAkGA1UECgwC
SVQxEzARBgNVBAsMCkJseW5rIEluYy4xGDAWBgNVBAMMD2JseW5rLWNsb3VkLmNv
bTEfMB0GCSqGSIb3DQEJARYQZG1pdHJpeUBibHluay5jYzAeFw0xNjAzMTcxMTU4
MDdaFw0yMTAzMTYxMTU4MDdaMIGIMQswCQYDVQQGEwJVQTENMAsGA1UECAwES3lp
djENMAsGA1UEBwwES3lpdjELMAkGA1UECgwCSVQxEzARBgNVBAsMCkJseW5rIElu
Yy4xGDAWBgNVBAMMD2JseW5rLWNsb3VkLmNvbTEfMB0GCSqGSIb3DQEJARYQZG1p
dHJpeUBibHluay5jYzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALso
bhbXQuNlzYBFa9h9pd69n43yrGTL4Ba6k5Q1zDwY9HQbMdfC5ZfnCkqT7Zf+R5MO
RW0Q9nLsFNLJkwKnluRCYGyUES8NAmDLQBbZoVc8mv9K3mIgAQvGyY2LmKak5GSI
V0PC3x+iN03xU2774+Zi7DaQd7vTl/9RGk8McyHe/s5Ikbe14bzWcY9ZV4PKgCck
p1chbmLhSfGbT3v64sL8ZbIppQk57/JgsZMrVpjExvxQPZuJfWbtoypPfpYO+O8l
1szaMlTEPIZVMoYi9uE+DnOlhzJFn6Ac4FMrDzJXzMmCweSX3IxguvXALeKhUHQJ
+VP3G6Q3pkZRVKz+5XsCAwEAAaNQME4wHQYDVR0OBBYEFJtqtI62Io66cZgiTR5L
A5Tl5m+xMB8GA1UdIwQYMBaAFJtqtI62Io66cZgiTR5LA5Tl5m+xMAwGA1UdEwQF
MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAKphjtEOGs7oC3S87+AUgIw4gFNOuv+L
C98/l47OD6WtsqJKvCZ1lmKxY5aIro9FBPk8ktCOsbwEjE+nyr5wul+6CLFr+rnv
7OHYGwLpjoz+rZgYJiQ61E1m0AZ4y9Fyd+D90HW6247vrBXyEiUXOhN/oDDVfDQA
eqmNBx1OqWel81D3tA7zPMA7vUItyWcFIXNjOCP+POy7TMxZuhuPMh5bVu+/cthl
/Q9u/Z2lKl4CWV0Ivt2BtlN6iefva0e2AP/As+gfwjxrb0t11zSILLNJ+nxRIwg+
k4MGb1zihKbIXUzsjslONK4FY5rlQUSwKJgEAVF0ClxB4g6dECm0ckc=
-----END CERTIFICATE-----

Binary file not shown.