#!/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
+
+ local cur=uci.cursor()
+
+ 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")
- 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")
+ 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
- mqtt_user = cur.get(config,"mqtt","user")
- mqtt_passwd = cur.get(config,"mqtt","password")
+ 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
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)
- else
+ capture("logger -t beaconmon \""..str.."\"")
+ print(str)
+ elseif logging=="syslog" then
+ capture("logger -t beaconmon \""..str.."\"")
+ elseif logging=="stdout" then
print(str)
end
end
function open_dump()
- run_command("/bin/kill `/usr/bin/pgrep btmon`")
- run_command("/bin/kill `/usr/bin/pgrep hcitool`")
+ run_command("/usr/bin/pkill btmon")
+ run_command("/usr/bin/pkill 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"))
+ run_command("hciconfig hci0 down")
+ run_command("hciconfig hci0 up")
+ f_null = assert(io.popen ("hcitool lescan --duplicates --passive"))
return f
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);
+ printLog("Pub "..path.." returned "..res);
return res
end
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
if not(type) then