2016-10-15 9 views
0

스크립트를 사용하여 here이 근처의 비컨을 Raspberry Pi로 탐지합니다. 스크립트 코드입니다근처의 비컨 및 MAC 주소 얻기

#!/bin/bash 
# iBeacon Scan by Radius Networks 

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\ 2A\ 02\ 01\ .{26}\ 02\ 01\ .{14}\ 02\ 15 ]]; then 
      UUID=`echo $packet | sed 's/^.\{69\}\(.\{47\}\).*$/\1/'` 
      MAJOR=`echo $packet | sed 's/^.\{117\}\(.\{5\}\).*$/\1/'` 
      MINOR=`echo $packet | sed 's/^.\{123\}\(.\{5\}\).*$/\1/'` 
      POWER=`echo $packet | sed 's/^.\{129\}\(.\{2\}\).*$/\1/'` 
      UUID=`echo $UUID | sed -e 's/\ //g' -e 's/^\(.\{8\}\)\(.\{4\}\)\(.\{4\}\)\(.\{4\}\)\(.\{12\}\)$/\1-\2-\3-\4-\5/'` 
      MAJOR=`echo $MAJOR | sed 's/\ //g'` 
      MAJOR=`echo "ibase=16; $MAJOR" | bc` 
      MINOR=`echo $MINOR | sed 's/\ //g'` 
      MINOR=`echo "ibase=16; $MINOR" | bc` 
      POWER=`echo "ibase=16; $POWER" | bc` 
      POWER=$[POWER - 256] 
      if [[ $2 == "-b" ]]; then 
     echo "$UUID $MAJOR $MINOR $POWER" 
      else 
      echo "UUID: $UUID MAJOR: $MAJOR MINOR: $MINOR POWER: $POWER" 
      fi 
     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 | ./$0 parse $1 
    fi 
fi 

스크립트가 잘 작동하고 UUID, Major, Minor 및 Power 값이 표시됩니다. 그러나 각 비콘의 MAC 주소를 얻고 싶습니다. 나는 스크립트 sudo hcitool lescan --duplicates에 사용되는 명령은 MAC 드레스 보여줘 때문에 가치가 있다는 것을 거의 확신하지만

echo "$UUID $MAJOR $MINOR $POWER" 

누군가를 수행이 라인에 추가 할 수 없습니다 것은하는 방법에 대한 아이디어가있다 가치 ?

답변

0

당신이 코드 줄에 그것을 할 수는

# parse line from 21 and 17 characters (including spaces), then remove the spaces 
REVERSE_MAC=`echo $packet | sed 's/^.\{21\}\(.\{17\}\).*$/\1/' | sed 's/\ //g'` 
# the MAC was reversed so I have to put it in order, always by 2 characters 
MAC=`echo "${REVERSE_MAC:10:2}:${REVERSE_MAC:8:2}:${REVERSE_MAC:6:2}:${REVERSE_MAC:4:2}:${REVERSE_MAC:2:2}:${REVERSE_MAC:0:2}"` 

그래서 전체 코드는 다음과 같습니다

#!/bin/bash 
# iBeacon Scan by Radius Networks 

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\ 2A\ 02\ 01\ .{26}\ 02\ 01\ .{14}\ 02\ 15 ]]; then 
      UUID=`echo $packet | sed 's/^.\{69\}\(.\{47\}\).*$/\1/'` 
      MAJOR=`echo $packet | sed 's/^.\{117\}\(.\{5\}\).*$/\1/'` 
      MINOR=`echo $packet | sed 's/^.\{123\}\(.\{5\}\).*$/\1/'` 
      POWER=`echo $packet | sed 's/^.\{129\}\(.\{2\}\).*$/\1/'` 
      UUID=`echo $UUID | sed -e 's/\ //g' -e 's/^\(.\{8\}\)\(.\{4\}\)\(.\{4\}\)\(.\{4\}\)\(.\{12\}\)$/\1-\2-\3-\4-\5/'` 
      MAJOR=`echo $MAJOR | sed 's/\ //g'` 
      MAJOR=`echo "ibase=16; $MAJOR" | bc` 
      MINOR=`echo $MINOR | sed 's/\ //g'` 
      MINOR=`echo "ibase=16; $MINOR" | bc` 
      POWER=`echo "ibase=16; $POWER" | bc` 
      POWER=$[POWER - 256] 
      # CAPTURE MAC ADDRESS 
      # parse line from 21 and 17 characters (including spaces), then remove the spaces 
      REVERSE_MAC=`echo $packet | sed 's/^.\{21\}\(.\{17\}\).*$/\1/' | sed 's/\ //g'` 
      # the MAC was reversed so I have to put it in order, always by 2 characters 
      MAC=`echo "${REVERSE_MAC:10:2}:${REVERSE_MAC:8:2}:${REVERSE_MAC:6:2}:${REVERSE_MAC:4:2}:${REVERSE_MAC:2:2}:${REVERSE_MAC:0:2}"` 
      if [[ $2 == "-b" ]]; then 
      echo "$UUID $MAJOR $MINOR $POWER" 
      else 
      echo "UUID: $UUID MAJOR: $MAJOR MINOR: $MINOR POWER: $POWER MAC: $MAC" 
      fi 
     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 | ./$0 parse $1 
    fi 
fi