Избегаем "залипания" последнего сообщения в MQTT.
[openhab-process.git] / mqtt-bt / scan-beacons
index 17e553308c15a067544f4b337a62603469215b39..5512aa9a009aa3c03531ba19c217c41687e0e5a3 100644 (file)
@@ -1,32 +1,65 @@
 #!/usr/bin/lua
 
 json = require("json")
 #!/usr/bin/lua
 
 json = require("json")
+socket = require("socket")
 
 function getConfig(configname)
 
 
 function getConfig(configname)
 
-  local uci=require("uci")
-  local cur=uci.cursor()
+  local status,uci = pcall(require,"uci")
+
   local config
   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()
 
 
-  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")
+    logging = cur.get(config,"logging","enabled") 
 
 
-  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")
+  
+    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")
   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
     pid = posix.getpid()
     mqtt_id="beaconmon-"..hostname.."-"..pid
   end
@@ -64,7 +97,7 @@ end
 
 function printLog(str)
   if logging=="yes" then
 
 function printLog(str)
   if logging=="yes" then
-    capture("logger -t beaconmon "..str)
+    capture("logger -t beaconmon \""..str.."\"")
   else 
     print(str)  
   end 
   else 
     print(str)  
   end 
@@ -80,12 +113,10 @@ end
 
 function open_dump()
 
 
 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
 
 
   return f
 
@@ -99,9 +130,13 @@ function trim(s)
   return (s:gsub("^%s*(.-)%s*$", "%1"))
 end
 
   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)
 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
 
   return res
 end
 
@@ -113,12 +148,14 @@ function process_packet(packet)
   local type
   local name
 
   local type
   local name
 
+  packet['origin'] = hostname
+
   mac = packet['Address']
   mac = packet['Address']
-  uuid = packet['uuid']
+  uuid = packet['UUID']
   type = packet['Type']
   name = packet['Name (complete)']
 
   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
     details=uuid
   elseif name then
     if not(type) then
@@ -146,7 +183,7 @@ function process_packet(packet)
         
     if not pcall(mqtt_pub,mqtt_path,dump(packet)) then
       printLog('Reconnecting MQTT...')
         
     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
     end
 
   end