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
end
function mqtt_pub(path,value)
- printLog("Pub "..path.." "..value)
- return mqtt_client:publish(path,value)
+ res=mqtt_client:publish(path,value)
+ printLog("Pub "..path.." "..value.." returned "..res);
+ return res
end
function process_packet(packet)
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)
+ printLog(details)
end
if not (type=="unknown") then
mqtt_path=string.gsub(mqtt_topic,"{(.-)}",
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_id)
+ mqtt_client:connect(mqtt_host,mqtt_port)
end
inp = open_dump()