From: Roman Bazalevskiy Date: Sun, 19 Mar 2017 19:15:40 +0000 (+0300) Subject: BLE beacon scan added (initial commit, still too many TODOs) X-Git-Url: https://git.rvb.name/openhab-process.git/commitdiff_plain/254111f3712b8ac6dceeffe2518340e8ada36888?ds=inline;hp=a2f5003eaf2c21902b091e12dd1a2c9fdbbe89b1 BLE beacon scan added (initial commit, still too many TODOs) --- diff --git a/mqtt-bt/scan-beacons b/mqtt-bt/scan-beacons new file mode 100644 index 0000000..747c295 --- /dev/null +++ b/mqtt-bt/scan-beacons @@ -0,0 +1,123 @@ +#!/usr/bin/env lua + +function run_command(cmd) + + local file = assert(io.popen(cmd, 'r')) + local output = file:read('*all') + file:close() + +end + +function open_dump() + + f = assert(io.popen ("hcidump --raw")) + run_command("kill `pgrep hcitool`") + run_command("hciconfig hci0 down") + run_command("hciconfig hci0 up") + f_null = assert(io.popen ("hcitool lescan --duplicates")) + + return f + +end + +function dump(o) + if type(o) == 'table' then + local s = '{ ' + for k,v in pairs(o) do + if type(k) ~= 'number' then k = '"'..k..'"' end +-- s = s .. '['..k..'] = ' .. dump(v) .. ',' + s = s .. dump(v) .. ',' + end + return s .. '} ' + else + return tostring(o) + end +end + +function trim(s) + return (s:gsub("^%s*(.-)%s*$", "%1")) +end + +function process_packet(packet) + + bytes={} + idx=1 + + if packet:len()>1 then + + while packet:len()>2 do + bytes[idx]=trim(packet:sub(1,3)) + idx=idx+1 + packet=packet:sub(4) + end + len = idx-1 + + if bytes[1]=='04' and bytes[2]=='3E' then + -- BLE Beacon? + type="" + mac=bytes[13]..':'..bytes[12]..':'..bytes[11]..':'..bytes[10]..':'..bytes[9]..':'..bytes[8] + flags=bytes[14] + power=tonumber("0x"..bytes[len-1])-256 + tx=tonumber("0x"..bytes[len])-256 + j = 15 + while j" then + line = trim(line:sub(2)) + end + + if not (lchr == " ") then + process_packet(packet) + packet = "" + end + + llen=line:len() + + if llen<59 then + packet = packet .. " " .. line + process_packet(packet) + packet="" + else + packet = packet .. " " .. line + end + + end + +end + +inp = open_dump() + +read_loop()