#! /bin/expect log_user 0 set g_debug 0 set g_serial /dev/ttymxc3 proc debug {{d}} { global g_debug if { $g_debug != 0 } { puts $d } } proc rn4020_command {c} { set timeout 1 send "$c\r" expect { "AOK\r" { } timeout { puts "failed to execute command '$c'" exit 1 } } } proc rn4020_command_background {c} { send "$c\r" } proc rn4020_reboot {} { set timeout 1 send "R,1\r" expect { "Reboot\r" { } timeout { puts "failed to execute reboot command" exit 1 } } set timeout 5 expect { "CMD\r" { } timeout { puts "failed to waiting CMD console" exit 1 } } } proc add_record {id rssi txpower} { global g_beacons global g_rssis global g_txpowers dict set g_beacons $id $id dict set g_rssis $id $rssi dict set g_txpowers $id $txpower } proc remove_record {id} { global g_beacons global g_rssis global g_txpowers dict unset g_beacons $id dict unset g_rssis $id dict unset g_txpowers $id } proc clear_records {} { global g_beacons if { ! [info exists g_beacons] } { return } foreach key [dict keys $g_beacons] { remove_record $key } } proc display_records {} { global g_beacons global g_rssis global g_txpowers puts "==> all records" if { ! [info exists g_beacons] } { return } foreach key [dict keys $g_beacons] { puts "[dict get $g_beacons $key], [dict get $g_rssis $key], [dict get $g_txpowers $key]" } } proc passive_scan {t} { global g_scan_results if { [info exists g_scan_results] } { unset g_scan_results } puts "==> now scanning ($t sec)..." rn4020_command_background "F" set timeout $t expect_background { -re {([0-9A-F]+),([0-9]+),-([0-9A-F]+),Brcst:([0-9A-F]{48})([0-9A-F]+)\r} { set g_scan_results([array size g_scan_results]) $expect_out(0,string) } "AOK\r" { } } sleep $t rn4020_command_background "X" } proc display_scan_results {} { global g_scan_results puts "==> scan results" if { ! [info exists g_scan_results] } { return } for { set i 0 } { $i < [array size g_scan_results] } {incr i} { puts $g_scan_results($i) } } proc rn4020_parser {} { global g_scan_results set re {([0-9A-F]+),([0-9]+),-([0-9A-F]+),Brcst:([0-9A-F]{48})([0-9A-F]+)} for { set i 0 } { $i < [array size g_scan_results] } {incr i} { if {[regexp $re $g_scan_results($i) foo beacon type rssi uid txpower]} { #puts "beaconid: $beacon" #puts "rssi: [expr 0x$rssi]" #puts "txpower: [expr 0x$txpower]" add_record $beacon [expr 0x$rssi] [expr 0x$txpower] } } } proc do_callback {} { global g_beacons global g_rssis global g_txpowers global g_callback puts "==> do callback" if { ! [info exists g_beacons] } { return } foreach key [dict keys $g_beacons] { eval exec "$g_callback" "[dict get $g_beacons $key]" "[dict get $g_rssis $key]" "[dict get $g_txpowers $key]" } } # begin if {$argc != 1} { puts "Usage $argv0 callback" } set g_callback [lindex $argv 0] spawn tip -l $g_serial -s 115200 expect "Connected." rn4020_command "SF,1" rn4020_command "SS,C0000000" rn4020_command "SR,92000000" rn4020_reboot rn4020_command "J,1" while {true} { passive_scan 1 #display_scan_results rn4020_parser display_records do_callback clear_records } exit 0