OpenWrt_Luci_Lua/Mi_Lua/xiaoqiang/XQEquipment.lua
2015-05-09 18:48:46 +08:00

210 lines
7.0 KiB
Lua

module ("xiaoqiang.XQEquipment", package.seeall)
local XQFunction = require("xiaoqiang.common.XQFunction")
local XQConfigs = require("xiaoqiang.common.XQConfigs")
local LuciUtil = require("luci.util")
--[[
1,1 Broadlink Smart Control
1,2 Broadlink Smart Switch
2,1 Antscam
3,4 MiTV
3,5 MiBox
3,7 Infrared
3,8 MiWiFi-R1D
3,9 MiWiFi-R1CM
3,10 MiWiFi-R1CQ
3,11 MiWiFi-Tiny
]]--
local RULES = {
["B4430D"] = {
{
["from"] = "300000",
["to"] = "3FFFFF",
["company"] = "Broadlink Pty Ltd",
["icon"] = "device_list_intelligent.png",
["type"] = { ["c"] = 1, ["p"] = 1, ["n"] = "智能红外" },
["priority"] = 2
},
{
["from"] = "100000",
["to"] = "1FFFFF",
["company"] = "Broadlink Pty Ltd",
["icon"] = "device_list_intelligent_plugin.png",
["type"] = { ["c"] = 1, ["p"] = 2, ["n"] = "智能插座" },
["priority"] = 2
}
}
}
local NAME_RULES = {
{
["rule"] = "^mitv",
["company"] = "Xiaomi",
["icon"] = "device_mitv.png",
["type"] = { ["c"] = 3, ["p"] = 4, ["n"] = "小米电视" },
["priority"] = 1
},
{
["rule"] = "^mibox",
["company"] = "Xiaomi",
["icon"] = "device_mibox.png",
["type"] = { ["c"] = 3, ["p"] = 5, ["n"] = "小米盒子" },
["priority"] = 1
},
{
["rule"] = "^miwifi%-r1d",
["company"] = "Xiaomi",
["icon"] = "device_miwifi_r1d.png",
["type"] = { ["c"] = 3, ["p"] = 8, ["n"] = "小米路由器" },
["priority"] = 1
},
{
["rule"] = "^miwifi%-r1cm",
["company"] = "Xiaomi",
["icon"] = "device_miwifi_r1c.png",
["type"] = { ["c"] = 3, ["p"] = 9, ["n"] = "小米路由器mini" },
["priority"] = 1
},
{
["rule"] = "^miwifi%-r1cq",
["company"] = "Xiaomi",
["icon"] = "device_miwifi_r1c.png",
["type"] = { ["c"] = 3, ["p"] = 10, ["n"] = "小米路由器mini2" },
["priority"] = 1
},
{
["rule"] = "^miwifi%-tiny",
["company"] = "Xiaomi",
["icon"] = "device_mirouter_wifi.png",
["type"] = { ["c"] = 3, ["p"] = 11, ["n"] = "小米随身WiFi" },
["priority"] = 1
},
{
["rule"] = "^broadlink_sp2",
["company"] = "Broadlink Pty Ltd",
["icon"] = "device_list_intelligent_plugin.png",
["type"] = { ["c"] = 1, ["p"] = 2, ["n"] = "智能插座" },
["priority"] = 1
},
{
["rule"] = "^broadlink_rm2",
["company"] = "Broadlink Pty Ltd",
["icon"] = "device_list_intelligent.png",
["type"] = { ["c"] = 1, ["p"] = 1, ["n"] = "智能红外" },
["priority"] = 1
},
{
["rule"] = "^antscam",
["company"] = "云蚁",
["icon"] = "device_list_intelligent_camera.png",
["type"] = { ["c"] = 2, ["p"] = 6, ["n"] = "小蚁智能摄像机" },
["priority"] = 1
},
{
["rule"] = "^xiaomi%.ir",
["company"] = "Xiaomi",
["icon"] = "device_list_lq.png",
["type"] = { ["c"] = 3, ["p"] = 7, ["n"] = "智能红外" },
["priority"] = 1
},
{
["rule"] = "chuangmi%-plug",
["company"] = "Chuangmi",
["icon"] = "device_list_intelligent_plugin.png",
["type"] = { ["c"] = 3, ["p"] = 2, ["n"] = "智能插座" },
["priority"] = 1
}
}
function identifyDevice(mac, dhcpname)
local maciden
local dhcpiden
if not XQFunction.isStrNil(mac) then
mac = XQFunction.macFormat(mac)
local key = string.upper(string.sub(string.gsub(mac,":",""),1,6))
local tmac = mac:gsub(":","")
local rules = RULES[key]
if rules and type(rules) == "table" then
tmac = LuciUtil.split(tmac,key)[2]
if tmac then
tmac = tonumber(tmac,16)
for _, rule in ipairs(rules) do
local from = tonumber(rule.from,16)
local to = tonumber(rule.to,16)
if tmac >= from and tmac <= to then
maciden = {}
local dtype = {["c"] = 0, ["p"] = 0, ["n"] = ""}
local priority = 2
if rule["type"] then
dtype = rule["type"]
end
if rule.priority then
priority = tonumber(rule.priority)
end
maciden["name"] = rule.company
maciden["icon"] = rule.icon
maciden["type"] = dtype
maciden["priority"] = priority
end
end
end
else
local NixioFs = require("nixio.fs")
if not NixioFs.access(XQConfigs.OUI_FILEPATH) then
LuciUtil.exec("unzip -d /tmp".." "..XQConfigs.OUI_ZIP_FILEPATH)
end
if NixioFs.access(XQConfigs.OUI_FILEPATH) then
key = string.upper(string.sub(string.gsub(mac,":","-"),1,8))
local line = LuciUtil.trim(LuciUtil.exec("sed -n '/"..key.."/p' "..XQConfigs.OUI_FILEPATH))
if not XQFunction.isStrNil(line) then
local company = LuciUtil.trim(LuciUtil.split(line,key)[2])
local icon = company:match("ICON:(%S+)")
maciden = {}
if icon then
maciden["name"] = company:match("(.+)ICON:%S+") or ""
maciden["icon"] = icon
else
maciden["name"] = company
maciden["icon"] = ""
end
maciden["type"] = {["c"] = 0, ["p"] = 0, ["n"] = ""}
maciden["priority"] = 2
end
end
end
end
if not XQFunction.isStrNil(dhcpname) then
dhcpname = string.lower(dhcpname)
for _, rule in ipairs(NAME_RULES) do
if dhcpname:match(rule.rule) then
local dtype = {["c"] = 0, ["p"] = 0, ["n"] = ""}
local priority = 2
dhcpiden = {}
if rule["type"] then
dtype = rule["type"]
end
if rule.priority then
priority = tonumber(rule.priority)
end
dhcpiden["name"] = rule.company
dhcpiden["icon"] = rule.icon
dhcpiden["type"] = dtype
dhcpiden["priority"] = priority
break
end
end
end
if maciden and dhcpiden then
if maciden.priority < dhcpiden.priority then
return maciden
else
return dhcpiden
end
elseif not maciden and not dhcpiden then
return {["name"] = "", ["icon"] = "", ["type"] = {["c"] = 0, ["p"] = 0, ["n"] = ""}, ["priority"] = 2}
else
return maciden or dhcpiden
end
end