| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | #!/bin/bashDEFPORT=1001DEFTTY=/dev/ttyUSB0DEFBAUD=115200TRANSPORT=${1}FILESIZE=${2}IP=${3}PORT=${4:-$DEFPORT}TTY=${5:-$DEFTTY}BAUD=${6:-$DEFBAUD}SRCFILE=/dev/shm/data.dumpDSTFILE=/tmp/data.dump#Max size of supported UDP datagram size.#Higher size packets will be partially lost by application.MAXDGRAMMSIZE=512[[ -z $TRANSPORT ]] && { echo "No transport: [tcp|udp]"; exit 1; }[[ -z $IP ]] && { echo "No IP!"; exit 1; }[[ -z $FILESIZE ]] && { echo "No file size!"; exit 1; }trap abort INTfunction cleanup {    rm -rf $SRCFILE    rm -rf $DSTFILE    [[ -z $bg_proc ]] && exit 1    kill $bg_proc    wait $bg_proc 2>/dev/null    #kill $(jobs -pr)}function abort {    echo "Aborted!"    cleanup    exit 2}function setup {    echo "Transfer size: $FILESIZE"    #Check if port is available    [[ $TRANSPORT == "udp" ]] && NC_ARGS="-u"    nc -vz $NC_ARGS $IP $PORT        [[ $? != 0 ]] && { echo "Port $PORT is not available"; cleanup; exit 1; }    #Wait UDP port ping    [[ $TRANSPORT == "udp" ]] && sleep 1    stty -F $TTY $BAUD # -icanon    dd if=/dev/urandom of=$SRCFILE bs=$FILESIZE count=1 2>&1 &>/dev/null    md5_sent=$(md5sum $SRCFILE | cut -d$' ' -f1)    echo "Out MD5: $md5_sent"}function check_transfer {    md5_rcvd=$(md5sum $DSTFILE | cut -d$' ' -f1)    echo -e " In MD5: $md5_rcvd"    echo "$(stat -c%s $DSTFILE)/$(stat -c%s $SRCFILE) bytes received"    echo "--------------------------------------------"    [[ $md5_sent != $md5_rcvd ]] && { echo -e "Test failed, transferred file MD5 missmatch!\r\n"; cleanup; exit 1; }    echo -e "Test OK\r\n"}function test_serial2tcp {    setup    socat -u tcp:$IP:$PORT $DSTFILE &    bg_proc=$!    [[ -z $bg_proc ]] && { echo "Socat not started!"; cleanup; exit 1; }    socat -u "SYSTEM:dd if=$SRCFILE bs=$FILESIZE count=1" $TTY,raw    #Wait data to be transferred    sleep 1    check_transfer    cleanup}function test_serial2udp {    setup    #Send initial request    echo "." | nc -u $IP $PORT > $DSTFILE &    bg_proc=$!    [[ -z $bg_proc ]] && { echo "Socat not started!"; cleanup; exit 1; }    #Wait initial request transferred    sleep 1    socat -u "SYSTEM:dd if=$SRCFILE bs=$FILESIZE count=1" $TTY,raw    #Wait data to be transferred    sleep 1    check_transfer    cleanup}function test_tcp2serial {    setup    socat -u $TTY,raw $DSTFILE &    bg_proc=$!    [[ -z $bg_proc ]] && { echo "Socat not started!"; cleanup; exit 1; }    #socat -u "SYSTEM:dd if=$SRCFILE bs=$FILESIZE count=1" tcp:$IP:$PORT    dd if=$SRCFILE | nc $IP $PORT    #Wait data to be transferred    sleep 1    check_transfer    cleanup}function test_udp2serial {    setup    socat -u $TTY,raw $DSTFILE &    bg_proc=$!    [[ -z $bg_proc ]] && { echo "Socat not started!"; cleanup; exit 1; }    #Split data to the $MAXDGRAMMSIZE size blocks    socat -u -b$MAXDGRAMMSIZE "SYSTEM:dd if=$SRCFILE" udp:$IP:$PORT    #Wait data to be transferred    sleep 1    check_transfer    cleanup}if [[ $TRANSPORT == "tcp" ]]then    # Serial -> TCP    echo -e "\r\nSerial->TCP"    echo "============================================"    test_serial2tcp    # TCP -> Serial    echo -e "\r\nTCP->Serial"    echo "============================================"    test_tcp2serialfiif [[ $TRANSPORT == "udp" ]]then    # Serial -> UDP    echo -e "\r\nSerial->UDP"    echo "============================================"    test_serial2udp    # UDP -> Serial    echo -e "\r\nUDP->Serial"    echo "============================================"    test_udp2serialfiexit 0
 |