mqtt_passwd = cur.get(config,"mqtt","password")
if mqtt_host and not mqtt_id then
- mqtt_id="beaconmon"
+ socket = require("socket")
+ posix = require("posix")
+ hostname = socket.dns.gethostname()
+ pid = posix.getpid()
+ mqtt_id="beaconmon-"..hostname.."-"..pid
end
if mqtt_host and not mqtt_port then
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"))
+ run_command("/bin/kill `/usr/bin/pgrep hcidump`")
+ run_command("/bin/kill `/usr/bin/pgrep hcitool`")
+ f = assert(io.popen ("/usr/bin/hcidump --raw"))
+ 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"))
return f
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) .. ','
+ s = s .. '['..k..'] = ' .. dump(v) .. ','
+-- s = s .. dump(v) .. ','
end
return s .. '} '
else
return (s:gsub("^%s*(.-)%s*$", "%1"))
end
+function mqtt_pub(path,value)
+ res=mqtt_client:publish(path,value)
+ printLog("Pub "..path.." "..value.." returned "..res);
+ return res
+end
+
function process_packet(packet)
local bytes={}
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
local j = 15
+ tx=tonumber("0x"..bytes[len])-256
while j<len-2 do
paysublen=tonumber('0x'..bytes[j])
- if bytes[j+1]=="FF" and bytes[j+2]=="4C" and bytes[j+3]=="00" and bytes[j+4]=="02" and bytes[j+5]=="15" then
+ if bytes[j+1]=="09" then
+ -- Standard name beacon
+ type="name"
+ name=""
+ for i=j+2,j+paysublen do
+ name=name..string.char(tonumber('0x'..bytes[i]))
+ end
+ printLog("name="..name)
+ elseif bytes[j+1]=="FF" and bytes[j+2]=="4C" and bytes[j+3]=="00" and bytes[j+4]=="02" and bytes[j+5]=="15" then
-- Standard UUID iBeacon
type="ibeacon"
local uuid1=bytes[j+6]..bytes[j+7]..bytes[j+8]..bytes[j+9]
uuid=string.lower(uuid1..'-'..uuid2..'-'..uuid3..'-'..uuid4..'-'..uuid5)
major=bytes[j+23]..bytes[j+22]
minor=bytes[j+25]..bytes[j+24]
+ power=tonumber("0x"..bytes[len-1])-256
end
j=j+1+paysublen
end
if type=="ibeacon" then
printLog(string.format("{type:'ibeacon',mac:'%s',uuid:'%s',major:'%s',minor:'%s',power:%d,tx:%d}",mac,uuid,major,minor,power,tx))
details=uuid..'/'..major..'/'..minor
+ elseif type=="name" then
+ printLog(string.format("{type:'ble',mac:'%s',name:'%s'}",mac,name))
+ details=name
else
type='unknown'
details=dump(bytes)
printLog(details)
end
- if mqtt_client then
- if not mqtt_client.connected then
- mqtt_client:connect(mqtt_id)
- end
+ if not (type=="unknown") then
mqtt_path=string.gsub(mqtt_topic,"{(.-)}",
function (name)
if name=="type" then
return '{'..name..'}'
end
end)
- mqtt_client:publish(mqtt_path,tx)
+
+ if not pcall(mqtt_pub,mqtt_path,tx) then
+ printLog('Reconnecting MQTT...')
+ mqtt_client:connect(mqtt_id)
+ end
+
end
end
end
for line in inp:lines() do
+ printLog('Received ' .. line);
+
lchr=line:sub(1,1)
line=trim(line)
getConfig(arg[1])
if mqtt_host then
- MQTT = require "paho.mqtt"
- mqtt_client = MQTT.client.create(mqtt_host, mqtt_port)
+ MQTT = require "mosquitto"
+ mqtt_client = MQTT.new(mqtt_id)
if mqtt_user then
- mqtt_client:auth(mqtt_user, mqtt_passwd)
+ mqtt_client:login_set(mqtt_user, mqtt_passwd)
end
+ mqtt_client:connect(mqtt_host,mqtt_port)
end
inp = open_dump()
+
read_loop()