- if packet:len()>1 then
-
- while packet:len()>2 do
- bytes[idx]=trim(packet:sub(1,3))
- idx=idx+1
- packet=packet:sub(4)
- end
- len = idx-1
-
- if bytes[1]=='04' and bytes[2]=='3E' then
- -- BLE Beacon?
- 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
- 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
- -- Standard UUID iBeacon
- type="ibeacon"
- local uuid1=bytes[j+6]..bytes[j+7]..bytes[j+8]..bytes[j+9]
- local uuid2=bytes[j+10]..bytes[j+11]
- local uuid3=bytes[j+12]..bytes[j+13]
- local uuid4=bytes[j+14]..bytes[j+15]
- local uuid5=bytes[j+16]..bytes[j+17]..bytes[j+18]..bytes[j+19]..bytes[j+20]..bytes[j+21]
- uuid=string.lower(uuid1..'-'..uuid2..'-'..uuid3..'-'..uuid4..'-'..uuid5)
- major=bytes[j+23]..bytes[j+22]
- minor=bytes[j+25]..bytes[j+24]
- 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..'/'
- else
- type='unknown'
- details=dump(bytes)
- printLog(details)
- end
- if mqtt_client then
- mqtt_path=string.gsub(mqtt_topic,"{(.-)}",
- function (name)
- if name=="type" then
- return mqtt_encode(type)
- elseif name=="details" then
- return mqtt_encode(details)
- else
- return '{'..name..'}'
- end
- end)
- mqtt_client:publish(mqtt_path,tx)
- end
+ if not (type=="unknown") then
+ mqtt_path=string.gsub(mqtt_topic,"{(.-)}",
+ function (name)
+ if name=="type" then
+ return mqtt_encode(type)
+ elseif name=="details" then
+ return mqtt_encode(details)
+ else
+ return '{'..name..'}'
+ end
+ end)
+
+ if not pcall(mqtt_pub,mqtt_path,dump(packet)) then
+ printLog('Reconnecting MQTT...')
+ mqtt_client:connect(mqtt_host,mqtt_port)