X-Git-Url: https://git.rvb.name/openhab-process.git/blobdiff_plain/b0a27fd834d3d715bef0947357fe908c3cad5ad7..HEAD:/mqtt-bt/scan-beacons?ds=sidebyside diff --git a/mqtt-bt/scan-beacons b/mqtt-bt/scan-beacons index 4f2a01c..5512aa9 100644 --- a/mqtt-bt/scan-beacons +++ b/mqtt-bt/scan-beacons @@ -1,32 +1,65 @@ #!/usr/bin/lua json = require("json") +socket = require("socket") function getConfig(configname) - local uci=require("uci") - local cur=uci.cursor() + local status,uci = pcall(require,"uci") + local config - if configname then - config=configname - else - config="beacon" - end - logging = cur.get(config,"logging","enabled") + if status then + + if configname then + config=configname + else + config="beacon" + end - mqtt_host = cur.get(config,"mqtt","host") - mqtt_port = cur.get(config,"mqtt","port") - mqtt_id = cur.get(config,"mqtt","id") - mqtt_topic = cur.get(config,"mqtt","topic") + local cur=uci.cursor() - mqtt_user = cur.get(config,"mqtt","user") - mqtt_passwd = cur.get(config,"mqtt","password") + logging = cur.get(config,"logging","enabled") + + mqtt_host = cur.get(config,"mqtt","host") + mqtt_port = cur.get(config,"mqtt","port") + mqtt_id = cur.get(config,"mqtt","id") + mqtt_topic = cur.get(config,"mqtt","topic") + + mqtt_user = cur.get(config,"mqtt","user") + mqtt_passwd = cur.get(config,"mqtt","password") + + else + + local status,ini = pcall(require,"ini") + if not status then + os.exit(1) + end + + if configname then + config=configname + else + config="/etc/beacon.ini" + end + local cur=ini.parse_file(config) + + logging = cur["logging"]["enabled"] + + mqtt_host = cur["mqtt"]["host"] + mqtt_port = cur["mqtt"]["port"] + mqtt_id = cur["mqtt"]["id"] + mqtt_topic = cur["mqtt"]["topic"] + + mqtt_user = cur["mqtt"]["user"] + mqtt_passwd = cur["mqtt"]["password"] + + end + + hostname = socket.dns.gethostname() if mqtt_host and not mqtt_id then socket = require("socket") posix = require("posix") - hostname = socket.dns.gethostname() pid = posix.getpid() mqtt_id="beaconmon-"..hostname.."-"..pid end @@ -55,14 +88,16 @@ end function mqtt_encode(str) if (str) then str = string.gsub (str, "\n", "") + str = string.gsub (str, ":", "-") str = string.gsub (str, "/", "-") + str = string.gsub (str, " ", "_") end return str end function printLog(str) if logging=="yes" then - capture("logger -t beaconmon "..str) + capture("logger -t beaconmon \""..str.."\"") else print(str) end @@ -78,12 +113,10 @@ end function open_dump() - run_command("/bin/kill `/usr/bin/pgrep btmon`") - run_command("/bin/kill `/usr/bin/pgrep hcitool`") - f = assert(io.popen ("/usr/bin/stdbuf -o0 /usr/bin/btmon")) - run_command("/usr/bin/hciconfig hci0 down") - run_command("/usr/bin/hciconfig hci0 up") - f_null = assert(io.popen ("/usr/bin/hcitool lescan --duplicates --passive")) + f = assert(io.popen ("/usr/bin/btmon")) + run_command("hciconfig hci0 down") + run_command("hciconfig hci0 up") + f_null = assert(io.popen ("hcitool lescan --duplicates")) return f @@ -97,9 +130,13 @@ function trim(s) return (s:gsub("^%s*(.-)%s*$", "%1")) end +local function starts_with(str, start) + return str:sub(1, #start) == start +end + function mqtt_pub(path,value) - res=mqtt_client:publish(path,value) - printLog("Pub "..path.." "..value.." returned "..res); + res=mqtt_client:publish(path,value,0,false) + printLog("Pub "..path.." returned "..res); return res end @@ -111,18 +148,24 @@ function process_packet(packet) local type local name + packet['origin'] = hostname + mac = packet['Address'] - uuid = packet['uuid'] + uuid = packet['UUID'] type = packet['Type'] name = packet['Name (complete)'] - if type=='iBeacon' then + if type and starts_with(type,'iBeacon') then details=uuid elseif name then - type="name" + if not(type) then + type="name" + end details=name else - type='unknown' + if not type then + type='unknown' + end details=mac end @@ -140,7 +183,7 @@ function process_packet(packet) if not pcall(mqtt_pub,mqtt_path,dump(packet)) then printLog('Reconnecting MQTT...') - mqtt_client:connect(mqtt_id) + mqtt_client:connect(mqtt_host,mqtt_port) end end @@ -185,15 +228,21 @@ function read_loop() value=split(value)[1] end packet[name]=value + elseif #t==1 and name then + if not(packet[name..'.list']) then + packet[name..'.list']={} + end + table.insert(packet[name..'.list'],(trim(t[1]))) end end if starts(str,'> HCI Event: LE Meta Event (0x3e)') then inbound=true + name=nil elseif starts(str,'RSSI:') then inbound=false process_packet(packet) - packet={} + packet={} end end