X-Git-Url: https://git.rvb.name/openhab-process.git/blobdiff_plain/dd22f2616ea394af68b81ce1872e9c00db50bbbb..e510b8ef776ca591d62fb19203e98e19d3d4fcda:/mqtt-bt/scan-beacons?ds=inline diff --git a/mqtt-bt/scan-beacons b/mqtt-bt/scan-beacons index 34de7dc..f91e59c 100644 --- a/mqtt-bt/scan-beacons +++ b/mqtt-bt/scan-beacons @@ -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()