"Умная" генерация ID клиента для обеспечения одновременной работы нескольких экземпля...
authorRoman Bazalevskiy <rvb@rvb.name>
Tue, 31 Oct 2017 06:05:43 +0000 (09:05 +0300)
committerRoman Bazalevskiy <rvb@rvb.name>
Tue, 31 Oct 2017 06:05:43 +0000 (09:05 +0300)
mqtt-bt/scan-beacons

index 34de7dc8f93830f9bafd074226a3c6fb8d2fc1e3..f91e59cfb5c3855e6ea8dfe0b1f44c14a10e5f38 100644 (file)
@@ -22,7 +22,11 @@ function getConfig(configname)
   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
@@ -77,7 +81,7 @@ function open_dump()
   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"))
+  f_null = assert(io.popen ("/usr/bin/hcitool lescan --duplicates --passive"))
 
   return f
 
@@ -102,8 +106,9 @@ function trim(s)
 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)
@@ -136,12 +141,19 @@ 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]
@@ -152,16 +164,20 @@ function process_packet(packet)
          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,"{(.-)}", 
@@ -192,6 +208,8 @@ function read_loop()
 
   for line in inp:lines() do
 
+    printLog('Received ' .. line);
+
     lchr=line:sub(1,1)
     line=trim(line)
 
@@ -221,12 +239,12 @@ end
 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()