-
Alex57
-
-
Вне сайта
-
Живу я здесь
-
- Сообщений: 475
- Спасибо получено: 53
-
Репутация: 13
-
|
Предлагаю переименовать данный формум из "ИК преобразователи" в "ИК преобразователи и IP управление", поскольку темы очень близкие.
---
Итак, я добился управления своим любимым ТВ Samsung 2011 года (серия D) через IP через Fibaro HC2.
Работает:
- Выключить
- Mute
- Громкость +, -
- Каналы +, -
- Источник (эмуляция кнопки Source)
- ENTER.
Возможно что работают и другие кнопки, но мне и этого хватает.
Чтение для самостоятельного повторения моего пути:
forum.fibaro.com/viewtopic.php?t=1528
и
deneb.homedns.org/things/?p=232 (по правильным кодам кнопок)
Примерные шаги
1) Создаем в HC2 новое "виртуальное устройство". IP порт не заполняем.
В нем
2) основной цикл НЕ трогаем.
3) Рисуем сколько угодно и каких угодно кнопок.
4) в каждой кнопке говорим, что мы не шлем строки, а пишем LUA код (ниже приведен)
5) в каждой кнопке меняем на свой IP, и имя кнопки, которую эмулируем.
6) и наслаждаемся...
Тестировать код в HC2 можно прямо сразу (написал код - нажал кнопку, получил результат).
а в приложениях для Android - не забываем "обновить конфигурацию".
-- <configuration> --
tvIpAddress = "192.168.0.103"
tvPort = 55000
keycodestring = "KEY_PAUSE"
tvAuthString = string.char(0x00,0x14,0x00,0x69,0x70,0x68,0x6f,0x6e,0x65,0x2e,0x2e,0x69,0x61,0x70,0x70,0x2e,0x73,0x61,0x6d,0x73,0x75,0x6e,0x67,0x38,0x00,0x64,0x00,0x14,0x00,0x4d,0x54,0x6b,0x79,0x4c,0x6a,0x45,0x32,0x4f,0x43,0x34,0x77,0x4c,0x6a,0x45,0x78,0x4d,0x41,0x3d,0x3d,0x18,0x00,0x4e,0x45,0x4d,0x74,0x4e,0x7a,0x49,0x74,0x51,0x6a,0x6b,0x74,0x4e,0x44,0x4d,0x74,0x4d,0x6a,0x51,0x74,0x4f,0x45,0x49,0x3d,0x04,0x00,0x54,0x51,0x3d,0x3d)
-- </configuration> --
-- character table string
local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
-- encoding to base64
function enc(data)
return ((data:gsub('.', function(x)
local r,b='',x:byte()
for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
return r;
end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
if (#x < 6) then return '' end
local c=0
for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
return b:sub(c+1,c+1)
end)..({ '', '==', '=' })[#data%3+1])
end
-- helper function
function num2bytes(num)
local retStr=""
for i=1,2 do
retStr = retStr .. string.char(num%256)
num = math.floor(num/256)
end
return retStr
end
tcpSocket = Net.FTcpSocket(tvIpAddress, tvPort)
-- say hello to the TV ;)
bytes, errorCode = tcpSocket:write(tvAuthString)
keycodebase = string.char(0x00,0x13,0x00,0x69,0x70,0x68,0x6f,0x6e,0x65,0x2e,0x69,0x61,0x70,0x70,0x2e,0x73,0x61,0x6d,0x73,0x75,0x6e,0x67)
-- payload
payloadinit = string.char(0x00,0x00,0x00)
keycode = enc(keycodestring)
keycodesize = num2bytes(string.len(keycode))
payloadsize = num2bytes(string.len(payloadinit .. keycode ..keycodesize))
-- combining the message
message = keycodebase .. payloadsize .. payloadinit .. keycodesize .. keycode
-- sending keycode
bytes, errorCode2 = tcpSocket:write(message)
if errorCode == 0 and errorCode2 == 0
then
-- printing log under virtual device
fibaro:log("transfer OK: " .. keycodestring)
else
fibaro:log("transfer failed")
end
и еще большой плюс - нажатия кнопок можно вызывать из других сцен, даже из блоков (!). fibaro:call(34, "pressButton", "1")
|