Skip to content

Instantly share code, notes, and snippets.

@c0ze
Created October 28, 2015 10:07

Revisions

  1. c0ze created this gist Oct 28, 2015.
    84 changes: 84 additions & 0 deletions eddystone_scan.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,84 @@
    #!/bin/bash
    # Eddystone Scan by Arda Karaduman
    # Based on ibeacon_scan by radius networks
    # http://stackoverflow.com/questions/21733228/can-raspberrypi-with-ble-dongle-detect-ibeacons

    if [[ $1 == "parse" ]]; then
    packet=""
    capturing=""
    count=0
    while read line
    do
    count=$[count + 1]
    if [ "$capturing" ]; then
    if [[ $line =~ ^[0-9a-fA-F]{2}\ [0-9a-fA-F] ]]; then
    packet="$packet $line"
    else

    if [[ $packet =~ ^04\ 3E\ .{2}\ 02\ 01\ .{26}\ 02\ 01\ .{12} ]]; then
    # printf "$packet\n"

    TYPE=`echo $packet | sed 's/^.\{75\}\(.\{2\}\).*$/\1/'`

    POWER=`echo $packet | sed 's/^.\{78\}\(.\{2\}\).*$/\1/'`
    POWER=`echo "ibase=16; $POWER" | bc`
    POWER=$[POWER - 256]

    LEN=$[${#packet} - 2]
    RSSI=`echo $packet | sed "s/^.\{$LEN\}\(.\{2\}\).*$/\1/"`
    RSSI=`echo "ibase=16; $RSSI" | bc`
    RSSI=$[RSSI - 256]

    case "$TYPE" in
    00)
    TYPE=UID
    UUID=`echo $packet | sed 's/^.\{81\}\(.\{30\}\).*$/\1/'`
    INSTANCE=`echo $packet | sed 's/^.\{111\}\(.\{18\}\).*$/\1/'`

    echo "TYPE : $TYPE UUID : $UUID INSTANCE : $INSTANCE POWER : $POWER RSSI : $RSSI"
    ;;
    10)
    TYPE=URL
    SCHEME=`echo $packet | sed 's/^.\{81\}\(.\{2\}\).*$/\1/'`
    LEN=$[${#packet} - 86]
    URL=`echo $packet | sed "s/^.\{83\}\(.\{$LEN\}\).*$/\1/"`
    URL=`echo $URL | sed 's/ /\\\x/g'`
    URL="\\x$URL"
    URL=`echo -e $URL | awk '{printf "%s\n", $_}'`
    echo "TYPE : $TYPE SCHEME : $SCHEME URL : $URL POWER : $POWER RSSI : $RSSI"
    ;;
    20)
    TYPE=TLM
    VERSION=`echo $packet | sed 's/^.\{78\}\(.\{2\}\).*$/\1/'`
    BATTERY=`echo $packet | sed 's/^.\{81\}\(.\{5\}\).*$/\1/' | sed 's/ //g'`
    BATTERY=`echo "ibase=16; $BATTERY" | bc`
    TEMP=`echo $packet | sed 's/^.\{87\}\(.\{5\}\).*$/\1/' | sed 's/ //g'`
    TEMP=`echo "ibase=16; $TEMP" | bc`
    TEMP=`bc <<< "scale=2; $TEMP/256"`
    PCOUNT=`echo $packet | sed 's/^.\{93\}\(.\{11\}\).*$/\1/' | sed 's/ //g'`
    PCOUNT=`echo "ibase=16; $PCOUNT" | bc`
    TIME=`echo $packet | sed 's/^.\{105\}\(.\{11\}\).*$/\1/' | sed 's/ //g'`
    TIME=`echo "ibase=16; $TIME" | bc`

    echo "TYPE : $TYPE VERSION : $VERSION BATTERY : $BATTERY TEMP : $TEMP PCOUNT : $PCOUNT TIME : $TIME RSSI : $RSSI"
    ;;
    esac
    fi
    capturing=""
    packet=""
    fi
    fi

    if [ ! "$capturing" ]; then
    if [[ $line =~ ^\> ]]; then
    packet=`echo $line | sed 's/^>.\(.*$\)/\1/'`
    capturing=1
    fi
    fi
    done
    else
    sudo hcitool lescan --duplicates 1>/dev/null &
    if [ "$(pidof hcitool)" ]; then
    sudo hcidump --raw hci | ./$0 parse $1
    fi
    fi