rootfs_enc1v2_hi3520d_20230531

This commit is contained in:
Jan Koppe 2024-02-15 22:07:37 +01:00
parent 07336a7379
commit 877317826b
Signed by: thunfisch
GPG Key ID: BE935B0735A2129B
62 changed files with 3489 additions and 116 deletions

View File

@ -1,6 +1,7 @@
ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1f01", RUN+="/etc/udev/usb4g.sh" ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1f01", RUN+="/etc/udev/usb4g.sh"
ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="1a2b", RUN+="/etc/udev/usbWiFi.sh" ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="1a2b", RUN+="/etc/udev/usbWiFi.sh"
SUBSYSTEM=="net", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14db", KERNEL=="eth*", RUN+="/etc/udev/usbUp.sh %k" SUBSYSTEM=="net", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14db", KERNEL=="eth*", RUN+="/etc/udev/usbUp.sh %k"
SUBSYSTEM=="net", KERNEL=="usb*", RUN+="/etc/udev/usbUp.sh %k"
ACTION=="add", KERNEL=="sd*", SUBSYSTEM=="block", RUN+="/link/shell/mountUsb.sh" ACTION=="add", KERNEL=="sd*", SUBSYSTEM=="block", RUN+="/link/shell/mountUsb.sh"
ACTION=="remove",KERNEL=="sd*", SUBSYSTEM=="block", RUN+="/etc/udev/autounmount.sh" ACTION=="remove",KERNEL=="sd*", SUBSYSTEM=="block", RUN+="/etc/udev/autounmount.sh"

Binary file not shown.

BIN
rootfs/link/bin/Monitor Normal file

Binary file not shown.

Binary file not shown.

BIN
rootfs/link/bin/mqtt Normal file

Binary file not shown.

View File

@ -0,0 +1,314 @@
[
{
"id": 1,
"nameCH": "方案 1",
"nameEN": "project 1",
"used": true,
"btns": [
{
"icon": "fa-power-off",
"code": 3944021760,
"tapCH": "关闭 Hdmi/Vga",
"tapEN": "Close Hdmi/Vga",
"pressCH": "开启 Hdmi/Vga",
"pressEN": "Open Hdmi/Vga"
},
{
"icon": "fa-bars",
"code": 3960733440,
"tapCH": "开启 Hdmi/Vga",
"tapEN": "Open Hdmi/Vga",
"pressCH": "关闭 Hdmi/Vga",
"pressEN": "Close Hdmi/Vga"
},
{
"icon": "fa-caret-up",
"code": 4228120320,
"tapCH": "开启全平台推流",
"tapEN": "Stop Platform Push",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-down",
"code": 4244832000,
"tapCH": "关闭全平台推流",
"tapEN": "Stop Platform Push",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-left",
"code": 4044291840,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-right",
"code": 3843751680,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "my-ok",
"code": 4161273600,
"tapCH": "开启录制",
"tapEN": "Start Record",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-down",
"code": 2807627520,
"tapCH": "开启 Dhcp",
"tapEN": "Open Dhcp",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-clone",
"code": 2740780800,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-up",
"code": 4094426880,
"tapCH": "关闭 Dhcp",
"tapEN": "Close Dhcp",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-reply",
"code": 4261543680,
"tapCH": "关闭录制",
"tapEN": "Stop Record",
"pressCH": "重启机器",
"pressEN": "Restart"
},
{
"icon": "fa-home",
"code": 3075014400,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "恢复出厂设置",
"pressEN": "Factory Data Reset"
}
]
},
{
"id": 2,
"nameCH": "方案 2",
"nameEN": "project 2",
"used": false,
"btns": [
{
"icon": "fa-power-off",
"code": 3944021760,
"tapCH": "开启Mix直播",
"tapEN": "Start Mix Live",
"pressCH": "关闭Mix直播",
"pressEN": "Stop Mix Live"
},
{
"icon": "fa-bars",
"code": 3960733440,
"tapCH": "关闭全平台推流",
"tapEN": "Stop Platform Push",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-up",
"code": 4228120320,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-down",
"code": 4244832000,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-left",
"code": 4044291840,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-right",
"code": 3843751680,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "my-ok",
"code": 4161273600,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-down",
"code": 2807627520,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-clone",
"code": 2740780800,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-up",
"code": 4094426880,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-reply",
"code": 4261543680,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-home",
"code": 3075014400,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
}
]
},
{
"id": 3,
"nameCH": "方案 3",
"nameEN": "project 3",
"used": false,
"btns": [
{
"icon": "fa-power-off",
"code": 3944021760,
"tapCH": "开启Mix直播",
"tapEN": "Start Mix Live",
"pressCH": "关闭Mix直播",
"pressEN": "Stop Mix Live"
},
{
"icon": "fa-bars",
"code": 3960733440,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-up",
"code": 4228120320,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-down",
"code": 4244832000,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-left",
"code": 4044291840,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-right",
"code": 3843751680,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "my-ok",
"code": 4161273600,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-down",
"code": 2807627520,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-clone",
"code": 2740780800,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-up",
"code": 4094426880,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-reply",
"code": 4261543680,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-home",
"code": 3075014400,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
}
]
}
]

View File

@ -0,0 +1,92 @@
{
"mods1":[
{
"titleCH":"录播模块",
"titleEN":"Broadcast",
"func":[
{
"ch":"开启Mix直播",
"en":"Start Mix Live"
},
{
"ch":"关闭Mix直播",
"en":"Stop Mix Live"
},
{
"ch":"开启Mix推流",
"en":"Start Mix Push"
},
{
"ch":"关闭Mix推流",
"en":"Stop Mix Push"
},
{
"ch":"开启录制",
"en":"Start Record"
},
{
"ch":"关闭录制",
"en":"Stop Record"
},
{
"ch":"开启全平台推流",
"en":"Stop Platform Push"
},
{
"ch":"关闭全平台推流",
"en":"Stop Platform Push"
}
]
}
],
"mods2":[
{
"titleCH":"系统模块",
"titleEN":"Network",
"func":[
{
"ch":"开启 Dhcp",
"en":"Open Dhcp"
},
{
"ch":"关闭 Dhcp",
"en":"Close Dhcp"
},
{
"ch":"重启机器",
"en":"Restart"
},
{
"ch":"恢复出厂设置",
"en":"Factory Data Reset"
}
]
},
{
"titleCH":"输出模块",
"titleEN":"Output",
"func":[
{
"ch":"开启 Hdmi/Vga",
"en":"Open Hdmi/Vga"
},
{
"ch":"关闭 Hdmi/Vga",
"en":"Close Hdmi/Vga"
}
]
},
{
"titleCH":"",
"titleEN":"",
"func":[
{
"ch":"未启用",
"en":"None"
}
]
}
]
}

View File

@ -0,0 +1,86 @@
[
{
"btnId": 1,
"remoteCode": 3944021760,
"btnNameCN": "按键1",
"btnNameEN": "Button1",
"icon": "fa-power-off"
},
{
"btnId": 2,
"remoteCode": 3960733440,
"btnNameCN": "按键 2",
"btnNameEN": "Button 2",
"icon": "fa-bars"
},
{
"btnId": 3,
"remoteCode": 4228120320,
"btnNameCN": "按键 3",
"btnNameEN": "Button 3",
"icon": "fa-caret-up"
},
{
"btnId": 4,
"remoteCode": 4244832000,
"btnNameCN": "按键 4",
"btnNameEN": "Button 4",
"icon": "fa-caret-down"
},
{
"btnId": 5,
"remoteCode": 4044291840,
"btnNameCN": "按键 5",
"btnNameEN": "Button 5",
"icon": "fa-caret-left"
},
{
"btnId": 6,
"remoteCode": 3843751680,
"btnNameCN": "按键 6",
"btnNameEN": "Button 6",
"icon": "fa-caret-right"
},
{
"btnId": 7,
"remoteCode": 4161273600,
"btnNameCN": "按键 7",
"btnNameEN": "Button 7",
"icon": "my-ok"
},
{
"btnId": 8,
"remoteCode": 2807627520,
"btnNameCN": "按键 8",
"btnNameEN": "Button 8",
"icon": "fa-volume-down"
},
{
"btnId": 9,
"remoteCode": 2740780800,
"btnNameCN": "按键 9",
"btnNameEN": "Button 9",
"icon": "fa-clone"
},
{
"btnId": 10,
"remoteCode": 4094426880,
"btnNameCN": "按键 10",
"btnNameEN": "Button 10",
"icon": "fa-volume-up"
},
{
"btnId": 11,
"remoteCode": 4261543680,
"btnNameCN": "按键 11",
"btnNameEN": "Button 11",
"icon": "fa-reply"
},
{
"btnId": 12,
"remoteCode": 3075014400,
"btnNameCN": "按键 12",
"btnNameEN": "Button 12",
"icon": "fa-home"
}
]

View File

@ -1,4 +1,18 @@
[ [
{
"version": "2.2.0 build 20230531",
"logs": [
"全平台直播新增定时开启/关闭推流功能",
"优化部分机型Onvif PTZ功能",
"优化集成通信功能",
"优化设备内存占用",
"调整首页端口状态显示逻辑",
"修正roi设置功能",
"修正开启推流后,更改系统时间导致的推流时长显示不准确的问题",
"修正ENC1机型按键小概率不触发问题",
"支持全新基于互联网的微信小程序,不在依赖局域网,真正做到的随时随地查看"
]
},
{ {
"version": "2.1.0 build 20230426", "version": "2.1.0 build 20230426",
"logs": [ "logs": [

View File

@ -1,5 +1,5 @@
{ {
"app": "2.0.0 build 20220512_869", "app": "2.0.0 build 20220512_869",
"sdk": "2.0.0 build 20220518_20716", "sdk": "2.0.0 build 20220518_20716",
"sys": "2.1.0 build 20230426" "sys": "2.2.0 build 20230531"
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,4 @@
[
{"name":"GPIO0_0","addr":"12150000","offset": 0,"irq":89},
{"name":"GPIO0_1","addr":"12150000","offset": 1,"irq":89}
]

View File

@ -0,0 +1,63 @@
. /link/shell/util/hardware.sh
count=0
type=`jget gpio.type`
himmGPIO()
{
gpioName=`jget gpio.name`
gpioAddr=`jget gpio.addr`
eval "`jget gpio.mux` > /dev/null"
eval "`jget gpio.dir` > /dev/null"
echo "Init $gpioName($gpioAddr) done."
while [ true ]
do
ret=`himd.l $gpioAddr 1 | awk 'NR==4{print $2}'`
if [ "$ret" == "00000000" ]; then
count=$(($count+1))
echo "keyDown $count"
if [ "$count" == "5" ]; then
echo "reset default config"
/link/shell/reset.sh
fi
else
count=0
fi
sleep 1
done
}
sysfsGPIO()
{
gpioName=`jget gpio.name`
gpioIndex=`jget gpio.index`
eval "`jget gpio.mux` > /dev/null"
if [ ! -d "/sys/class/gpio/gpio$gpioIndex" ];then
echo $gpioIndex > /sys/class/gpio/export
fi
echo "in" > /sys/class/gpio/gpio$gpioIndex/direction
echo "Init $gpioName($gpioIndex) done."
while [ true ]
do
ret=`cat /sys/class/gpio/gpio$gpioIndex/value`
if [ "$ret" == "0" ]; then
count=$(($count+1))
echo "keyDown $count"
if [ "$count" == "5" ]; then
echo "reset default config"
/link/shell/reset.sh
fi
else
count=0
fi
sleep 1
done
}
if [ "$type" == "himm" ]; then
himmGPIO
elif [ "$type" == "sysfs" ]; then
sysfsGPIO
fi

View File

@ -0,0 +1,5 @@
while [ true ]
do
/link/bin/Monitor
sleep 1
done

Binary file not shown.

View File

@ -0,0 +1,314 @@
[
{
"id": 1,
"nameCH": "方案 1",
"nameEN": "project 1",
"used": true,
"btns": [
{
"icon": "fa-power-off",
"code": 3944021760,
"tapCH": "关闭 Hdmi/Vga",
"tapEN": "Close Hdmi/Vga",
"pressCH": "开启 Hdmi/Vga",
"pressEN": "Open Hdmi/Vga"
},
{
"icon": "fa-bars",
"code": 3960733440,
"tapCH": "开启 Hdmi/Vga",
"tapEN": "Open Hdmi/Vga",
"pressCH": "关闭 Hdmi/Vga",
"pressEN": "Close Hdmi/Vga"
},
{
"icon": "fa-caret-up",
"code": 4228120320,
"tapCH": "开启全平台推流",
"tapEN": "Stop Platform Push",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-down",
"code": 4244832000,
"tapCH": "关闭全平台推流",
"tapEN": "Stop Platform Push",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-left",
"code": 4044291840,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-right",
"code": 3843751680,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "my-ok",
"code": 4161273600,
"tapCH": "开启录制",
"tapEN": "Start Record",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-down",
"code": 2807627520,
"tapCH": "开启 Dhcp",
"tapEN": "Open Dhcp",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-clone",
"code": 2740780800,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-up",
"code": 4094426880,
"tapCH": "关闭 Dhcp",
"tapEN": "Close Dhcp",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-reply",
"code": 4261543680,
"tapCH": "关闭录制",
"tapEN": "Stop Record",
"pressCH": "重启机器",
"pressEN": "Restart"
},
{
"icon": "fa-home",
"code": 3075014400,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "恢复出厂设置",
"pressEN": "Factory Data Reset"
}
]
},
{
"id": 2,
"nameCH": "方案 2",
"nameEN": "project 2",
"used": false,
"btns": [
{
"icon": "fa-power-off",
"code": 3944021760,
"tapCH": "开启Mix直播",
"tapEN": "Start Mix Live",
"pressCH": "关闭Mix直播",
"pressEN": "Stop Mix Live"
},
{
"icon": "fa-bars",
"code": 3960733440,
"tapCH": "关闭全平台推流",
"tapEN": "Stop Platform Push",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-up",
"code": 4228120320,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-down",
"code": 4244832000,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-left",
"code": 4044291840,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-right",
"code": 3843751680,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "my-ok",
"code": 4161273600,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-down",
"code": 2807627520,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-clone",
"code": 2740780800,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-up",
"code": 4094426880,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-reply",
"code": 4261543680,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-home",
"code": 3075014400,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
}
]
},
{
"id": 3,
"nameCH": "方案 3",
"nameEN": "project 3",
"used": false,
"btns": [
{
"icon": "fa-power-off",
"code": 3944021760,
"tapCH": "开启Mix直播",
"tapEN": "Start Mix Live",
"pressCH": "关闭Mix直播",
"pressEN": "Stop Mix Live"
},
{
"icon": "fa-bars",
"code": 3960733440,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-up",
"code": 4228120320,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-down",
"code": 4244832000,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-left",
"code": 4044291840,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-caret-right",
"code": 3843751680,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "my-ok",
"code": 4161273600,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-down",
"code": 2807627520,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-clone",
"code": 2740780800,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-volume-up",
"code": 4094426880,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-reply",
"code": 4261543680,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
},
{
"icon": "fa-home",
"code": 3075014400,
"tapCH": "未启用",
"tapEN": "None",
"pressCH": "未启用",
"pressEN": "None"
}
]
}
]

View File

@ -0,0 +1,92 @@
{
"mods1":[
{
"titleCH":"录播模块",
"titleEN":"Broadcast",
"func":[
{
"ch":"开启Mix直播",
"en":"Start Mix Live"
},
{
"ch":"关闭Mix直播",
"en":"Stop Mix Live"
},
{
"ch":"开启Mix推流",
"en":"Start Mix Push"
},
{
"ch":"关闭Mix推流",
"en":"Stop Mix Push"
},
{
"ch":"开启录制",
"en":"Start Record"
},
{
"ch":"关闭录制",
"en":"Stop Record"
},
{
"ch":"开启全平台推流",
"en":"Stop Platform Push"
},
{
"ch":"关闭全平台推流",
"en":"Stop Platform Push"
}
]
}
],
"mods2":[
{
"titleCH":"系统模块",
"titleEN":"Network",
"func":[
{
"ch":"开启 Dhcp",
"en":"Open Dhcp"
},
{
"ch":"关闭 Dhcp",
"en":"Close Dhcp"
},
{
"ch":"重启机器",
"en":"Restart"
},
{
"ch":"恢复出厂设置",
"en":"Factory Data Reset"
}
]
},
{
"titleCH":"输出模块",
"titleEN":"Output",
"func":[
{
"ch":"开启 Hdmi/Vga",
"en":"Open Hdmi/Vga"
},
{
"ch":"关闭 Hdmi/Vga",
"en":"Close Hdmi/Vga"
}
]
},
{
"titleCH":"",
"titleEN":"",
"func":[
{
"ch":"未启用",
"en":"None"
}
]
}
]
}

View File

@ -0,0 +1,86 @@
[
{
"btnId": 1,
"remoteCode": 3944021760,
"btnNameCN": "按键1",
"btnNameEN": "Button1",
"icon": "fa-power-off"
},
{
"btnId": 2,
"remoteCode": 3960733440,
"btnNameCN": "按键 2",
"btnNameEN": "Button 2",
"icon": "fa-bars"
},
{
"btnId": 3,
"remoteCode": 4228120320,
"btnNameCN": "按键 3",
"btnNameEN": "Button 3",
"icon": "fa-caret-up"
},
{
"btnId": 4,
"remoteCode": 4244832000,
"btnNameCN": "按键 4",
"btnNameEN": "Button 4",
"icon": "fa-caret-down"
},
{
"btnId": 5,
"remoteCode": 4044291840,
"btnNameCN": "按键 5",
"btnNameEN": "Button 5",
"icon": "fa-caret-left"
},
{
"btnId": 6,
"remoteCode": 3843751680,
"btnNameCN": "按键 6",
"btnNameEN": "Button 6",
"icon": "fa-caret-right"
},
{
"btnId": 7,
"remoteCode": 4161273600,
"btnNameCN": "按键 7",
"btnNameEN": "Button 7",
"icon": "my-ok"
},
{
"btnId": 8,
"remoteCode": 2807627520,
"btnNameCN": "按键 8",
"btnNameEN": "Button 8",
"icon": "fa-volume-down"
},
{
"btnId": 9,
"remoteCode": 2740780800,
"btnNameCN": "按键 9",
"btnNameEN": "Button 9",
"icon": "fa-clone"
},
{
"btnId": 10,
"remoteCode": 4094426880,
"btnNameCN": "按键 10",
"btnNameEN": "Button 10",
"icon": "fa-volume-up"
},
{
"btnId": 11,
"remoteCode": 4261543680,
"btnNameCN": "按键 11",
"btnNameEN": "Button 11",
"icon": "fa-reply"
},
{
"btnId": 12,
"remoteCode": 3075014400,
"btnNameCN": "按键 12",
"btnNameEN": "Button 12",
"icon": "fa-home"
}
]

View File

@ -0,0 +1,5 @@
while [ true ]
do
/link/bin/Monitor
sleep 1
done

Binary file not shown.

View File

@ -9,3 +9,10 @@ if [ -f /link/shell/ptz.sh ] ;then
/link/shell/ptz.sh & /link/shell/ptz.sh &
fi fi
if [ -f /link/bin/mqtt ] ;then
/link/bin/mqtt &
fi
if [ -f /link/bin/Monitor ];then
/link/shell/monitor.sh &
fi

View File

@ -2,7 +2,7 @@
/link/shell/trans.sh & /link/shell/trans.sh &
while [ true ] while [ true ]
do do
pkill OLED pkill Monitor
/link/bin/Encoder /link/bin/Encoder
sleep 2 sleep 2
done done

View File

@ -16,9 +16,15 @@ umount_usb(){
umount_usb umount_usb
if [ $1 == "ext4" ];then if [ $1 == "ext4" ];then
echo -e "\ny" | mkfs.ext4 -T largefile /dev/sda1 if [ -b /dev/sda1 ];then
sleep 1 echo -e "\ny" | mkfs.ext4 -T largefile /dev/sda1
mount -t ext4 /dev/sda1 /root/usb sleep 1
mount -t ext4 /dev/sda1 /root/usb
elif [ -b /dev/mmcblk0p6 ];then
echo -e "\ny" | mkfs.ext4 -T largefile /dev/mmcblk0p6
sleep 1
mount -o rw,sync,barrier=0 /dev/mmcblk0p6 /root/usb
fi
else else
mkfs.vfat -F 32 /dev/sda1 mkfs.vfat -F 32 /dev/sda1
sleep 1 sleep 1

View File

@ -11,6 +11,17 @@ if [ -b /dev/mmcblk0p5 ]; then
fi fi
if [ -b /dev/mmcblk0p6 ]; then if [ -b /dev/mmcblk0p6 ]; then
/bin/mount -o rw,sync,barrier=0 /dev/mmcblk0p6 /root/usb /bin/mount -o rw,sync,barrier=0 /dev/mmcblk0p6 /root/usb
mnt=`df -h | grep /dev/mmcblk0p6 | wc -l`
if [ "$mnt" == "1" ] && [ ! -d /root/usb/lost+found ];then
umount -f /root/usb/
mnt=`df -h | grep /dev/mmcblk0p6 | wc -l`
if [ "$mnt" == "0" ];then
echo -e "\ny" | mkfs.ext4 -T largefile /dev/mmcblk0p6
if [ ! -b /dev/sda1 ];then
/bin/mount -o rw,sync,barrier=0 /dev/mmcblk0p6 /root/usb
fi
fi
fi
fi fi

View File

@ -22,6 +22,13 @@ if [ `jget nginx` == "true" ]; then
fi fi
if [ `jget crond` == "true" ]; then if [ `jget crond` == "true" ]; then
if [ ! -f /var/spool/cron/crontabs/root ];then
touch /var/spool/cron/crontabs/root
echo "" >> /var/spool/cron/crontabs/root
echo "" >> /var/spool/cron/crontabs/root
echo "" >> /var/spool/cron/crontabs/root
fi
chown -R root:root /var/spool
/usr/sbin/crond -d 8 /usr/sbin/crond -d 8
fi fi

View File

@ -0,0 +1,5 @@
while [ true ]
do
/link/bin/Monitor
sleep 1
done

View File

@ -1,6 +1,6 @@
if [ ! -z "$(ls -A /link/update)" ]; then if [ ! -z "$(ls -A /link/update)" ]; then
mv /link/update/* /link/update/update.tar mv /link/update/* /link/update/update.tar
tar -xf /link/update/update.tar -C / tar -xof /link/update/update.tar -C /
sleep 1 sleep 1
if [ -c "/dev/mtd1" ]; then if [ -c "/dev/mtd1" ]; then

View File

@ -303,9 +303,6 @@ include("head.php");
} }
function update() { function update() {
rpc( "enc.getSysState", null, function ( data ) { rpc( "enc.getSysState", null, function ( data ) {
try { try {
@ -356,10 +353,6 @@ include("head.php");
} }
for( var i = hdmi.length; i < $( ".hdmi" ).length; i++ ){
$( ".hdmi" ).eq( i ).hide();
}
for ( var i = 0; i < sdi.length; i++ ) { for ( var i = 0; i < sdi.length; i++ ) {
if ( sdi[ i ].avalible ) { if ( sdi[ i ].avalible ) {
$( ".sdi" ).eq( i ).removeClass( "disable" ); $( ".sdi" ).eq( i ).removeClass( "disable" );
@ -371,11 +364,6 @@ include("head.php");
} }
} }
for( var i = sdi.length; i < $( ".sdi" ).length; i++ ){
$( ".sdi" ).eq( i ).hide();
}
} ); } );
setTimeout( update, 3000 ); setTimeout( update, 3000 );

View File

@ -116,19 +116,65 @@ function setCron() {
if ( isset( $_POST[ 'day' ] ) && isset( $_POST[ 'time' ] ) ) { if ( isset( $_POST[ 'day' ] ) && isset( $_POST[ 'time' ] ) ) {
if ( $_POST[ 'day' ] == "x" ) if ( $_POST[ 'day' ] == "x" )
{ {
exec( 'echo "" | crontab -u root -' ); exec("sed -i '1s/.*/ /' /var/spool/cron/crontabs/root");
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
} }
else { else {
exec( 'echo "0 ' . $_POST[ 'time' ] . ' * * ' . $_POST[ 'day' ] . ' /link/shell/reboot.sh" | crontab -u root -' ); $cron = '0 ' . $_POST[ 'time' ] . ' * * ' . $_POST[ 'day' ];
exec("sed -i '1s/.*/".$cron." \/link\/shell\/reboot.sh/' /var/spool/cron/crontabs/root");
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron"); exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
} }
$result->result = "OK"; $result->result = "OK";
} else { } else {
$result->result = shell_exec( 'crontab -u root -l' ); $result->result = shell_exec( 'crontab -u root -l | grep /link/shell/reboot.sh' );
} }
} }
function setPushCron() {
global $result;
$start = $_POST['start'];
if ( isset( $start[ 'day' ] ) && isset( $start[ 'time' ] ) ) {
if ( $start[ 'day' ] == "x" )
{
exec("sed -i '2s/.*/ /' /var/spool/cron/crontabs/root");
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
}
else {
$tm = explode(":", $start[ 'time' ]);
$cron = intval($tm[1]).' ' . intval($tm[0]) . ' * * ' . $start[ 'day' ];
exec("sed -i '2s/.*/".$cron." \/usr\/php\/bin\/php \/link\/web\/link\/timer\/autoPush.php start/' /var/spool/cron/crontabs/root");
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
}
}
$stop = $_POST['stop'];
if ( isset( $stop[ 'day' ] ) && isset( $stop[ 'time' ] ) ) {
if ( $stop[ 'day' ] == "x" )
{
exec("sed -i '3s/.*/ /' /var/spool/cron/crontabs/root");
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
}
else {
$tm = explode(":", $stop[ 'time' ]);
$cron = intval($tm[1]).' ' . intval($tm[0]) . ' * * ' . $stop[ 'day' ];
exec("sed -i '3s/.*/".$cron." \/usr\/php\/bin\/php \/link\/web\/link\/timer\/autoPush.php stop/' /var/spool/cron/crontabs/root");
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
}
}
$result->result = "OK";
}
function getPushCron() {
global $result;
exec( "crontab -u root -l | grep '/link/web/link/timer/autoPush.php start'",$output1);
exec( "crontab -u root -l | grep '/link/web/link/timer/autoPush.php stop'",$output2);
$result->result = [
'start'=>$output1[0],
'stop'=>$output2[0]
];
}
function startHelp() { function startHelp() {
global $result; global $result;
global $hardware; global $hardware;

View File

@ -84,14 +84,22 @@ include("headhead.php");
<cn>H5 播放器</cn> <cn>H5 播放器</cn>
<en>H5 Player</en> <en>H5 Player</en>
</a></li> </a></li>
<li><a href="intercom.php"><i class="fa fa-headphones"></i>
<cn>集成通信</cn> <?php
<en>Intercom</en> if ($hardware["function"]["intercom"]) {
</a></li> ?>
<li><a href="intercom.php"><i class="fa fa-headphones"></i>
<cn>集成通信</cn>
<en>Intercom</en>
</a></li>
<?php
}
?>
<li><a href="explorer.php"><i class="fa fa-folder-open-o"></i> <li><a href="explorer.php"><i class="fa fa-folder-open-o"></i>
<cn>U盘助手</cn> <cn>U盘助手</cn>
<en>Usb Disk</en> <en>Usb Disk</en>
</a></li> </a></li>
<?php <?php
if ($hardware["function"]["serialport"]) { if ($hardware["function"]["serialport"]) {
?> ?>

View File

@ -433,7 +433,7 @@ include( "head.php" );
var intercom=res.intercom; var intercom=res.intercom;
var tally=res.tally; var tally=res.tally;
var ids=[]; var ids=[];
ids.push(myid); ids.push(Number(myid));
$("#did"+myid).addClass("alive"); $("#did"+myid).addClass("alive");
$("#did"+myid).parent().parent().find("h3").text(myname); $("#did"+myid).parent().parent().find("h3").text(myname);
if(res.talking) if(res.talking)
@ -444,7 +444,7 @@ include( "head.php" );
for(var i=0;i<intercom.length;i++) for(var i=0;i<intercom.length;i++)
{ {
var chn=intercom[i]; var chn=intercom[i];
ids.push(chn.id); ids.push(Number(chn.id));
$("#did"+chn.id).parent().parent().find("h3").text(chn.name); $("#did"+chn.id).parent().parent().find("h3").text(chn.name);
$("#did"+chn.id).addClass("alive"); $("#did"+chn.id).addClass("alive");
if(chn.talking) if(chn.talking)

View File

@ -90,6 +90,11 @@ function rpc5(func, params, callbak, usrdata) {
rpcc(func, params, callbak, usrdata, jsonrpc); rpcc(func, params, callbak, usrdata, jsonrpc);
} }
function rpc6(func, params, callbak, usrdata) {
var jsonrpc = new $.JsonRpcClient({ ajaxUrl: 'RPC6' });
rpcc(func, params, callbak, usrdata, jsonrpc);
}
function func(func, data, callbak) function func(func, data, callbak)
{ {
$.post("func.php?func="+func,data,callbak,"json"); $.post("func.php?func="+func,data,callbak,"json");

View File

@ -0,0 +1,614 @@
/**
* @fileoverview
* - Using the 'QRCode for Javascript library'
* - Fixed dataset of 'QRCode for Javascript library' for support full-spec.
* - this library has no dependencies.
*
* @author davidshimjs
* @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a>
* @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a>
*/
var QRCode;
(function () {
//---------------------------------------------------------------------
// QRCode for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
// http://www.opensource.org/licenses/mit-license.php
//
// The word "QR Code" is registered trademark of
// DENSO WAVE INCORPORATED
// http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//---------------------------------------------------------------------
function QR8bitByte(data) {
this.mode = QRMode.MODE_8BIT_BYTE;
this.data = data;
this.parsedData = [];
// Added to support UTF-8 Characters
for (var i = 0, l = this.data.length; i < l; i++) {
var byteArray = [];
var code = this.data.charCodeAt(i);
if (code > 0x10000) {
byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
byteArray[3] = 0x80 | (code & 0x3F);
} else if (code > 0x800) {
byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
byteArray[2] = 0x80 | (code & 0x3F);
} else if (code > 0x80) {
byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
byteArray[1] = 0x80 | (code & 0x3F);
} else {
byteArray[0] = code;
}
this.parsedData.push(byteArray);
}
this.parsedData = Array.prototype.concat.apply([], this.parsedData);
if (this.parsedData.length != this.data.length) {
this.parsedData.unshift(191);
this.parsedData.unshift(187);
this.parsedData.unshift(239);
}
}
QR8bitByte.prototype = {
getLength: function (buffer) {
return this.parsedData.length;
},
write: function (buffer) {
for (var i = 0, l = this.parsedData.length; i < l; i++) {
buffer.put(this.parsedData[i], 8);
}
}
};
function QRCodeModel(typeNumber, errorCorrectLevel) {
this.typeNumber = typeNumber;
this.errorCorrectLevel = errorCorrectLevel;
this.modules = null;
this.moduleCount = 0;
this.dataCache = null;
this.dataList = [];
}
QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);}
return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}}
this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);}
if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}
this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}
return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}}
return qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;}
this.modules[r][6]=(r%2==0);}
for(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;}
this.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;}
for(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}
for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}
for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}
this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);}
var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}
this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}
row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);}
var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;}
if(buffer.getLengthInBits()>totalDataCount*8){throw new Error("code length overflow. ("
+buffer.getLengthInBits()
+">"
+totalDataCount*8
+")");}
if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}
while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}
while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}
buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}
buffer.put(QRCodeModel.PAD1,8);}
return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];}
offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}}
var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;}
var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}}
for(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}}
return data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}
return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}
return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}
return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));}
return a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode);}}else{throw new Error("type:"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;}
for(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;}
if(r==0&&c==0){continue;}
if(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}}
if(sameCount>5){lostPoint+=(3+sameCount-5);}}}
for(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}}
for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}}
for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}}
var darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}}
var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error("glog("+n+")");}
return QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;}
while(n>=256){n-=255;}
return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;}
for(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];}
for(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;}
function QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+"/"+shift);}
var offset=0;while(offset<num.length&&num[offset]==0){offset++;}
this.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}}
QRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}}
return new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;}
var ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);}
for(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);}
return new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;}
QRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);}
var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}}
return list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;}
QRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}
if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}
this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];
function _isSupportCanvas() {
return typeof CanvasRenderingContext2D != "undefined";
}
// android 2.x doesn't support Data-URI spec
function _getAndroid() {
var android = false;
var sAgent = navigator.userAgent;
if (/android/i.test(sAgent)) { // android
android = true;
var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i);
if (aMat && aMat[1]) {
android = parseFloat(aMat[1]);
}
}
return android;
}
var svgDrawer = (function() {
var Drawing = function (el, htOption) {
this._el = el;
this._htOption = htOption;
};
Drawing.prototype.draw = function (oQRCode) {
var _htOption = this._htOption;
var _el = this._el;
var nCount = oQRCode.getModuleCount();
var nWidth = Math.floor(_htOption.width / nCount);
var nHeight = Math.floor(_htOption.height / nCount);
this.clear();
function makeSVG(tag, attrs) {
var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
for (var k in attrs)
if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]);
return el;
}
var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight});
svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
_el.appendChild(svg);
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"}));
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"}));
for (var row = 0; row < nCount; row++) {
for (var col = 0; col < nCount; col++) {
if (oQRCode.isDark(row, col)) {
var child = makeSVG("use", {"x": String(col), "y": String(row)});
child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template")
svg.appendChild(child);
}
}
}
};
Drawing.prototype.clear = function () {
while (this._el.hasChildNodes())
this._el.removeChild(this._el.lastChild);
};
return Drawing;
})();
var useSVG = document.documentElement.tagName.toLowerCase() === "svg";
// Drawing in DOM by using Table tag
var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () {
var Drawing = function (el, htOption) {
this._el = el;
this._htOption = htOption;
};
/**
* Draw the QRCode
*
* @param {QRCode} oQRCode
*/
Drawing.prototype.draw = function (oQRCode) {
var _htOption = this._htOption;
var _el = this._el;
var nCount = oQRCode.getModuleCount();
var nWidth = Math.floor(_htOption.width / nCount);
var nHeight = Math.floor(_htOption.height / nCount);
var aHTML = ['<table style="border:0;border-collapse:collapse;">'];
for (var row = 0; row < nCount; row++) {
aHTML.push('<tr>');
for (var col = 0; col < nCount; col++) {
aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';"></td>');
}
aHTML.push('</tr>');
}
aHTML.push('</table>');
_el.innerHTML = aHTML.join('');
// Fix the margin values as real size.
var elTable = _el.childNodes[0];
var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;
var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;
if (nLeftMarginTable > 0 && nTopMarginTable > 0) {
elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px";
}
};
/**
* Clear the QRCode
*/
Drawing.prototype.clear = function () {
this._el.innerHTML = '';
};
return Drawing;
})() : (function () { // Drawing in Canvas
function _onMakeImage() {
this._elImage.src = this._elCanvas.toDataURL("image/png");
this._elImage.style.display = "inline-block";
this._elCanvas.style.display = "none";
}
// Android 2.1 bug workaround
// http://code.google.com/p/android/issues/detail?id=5141
if (this._android && this._android <= 2.1) {
var factor = 1 / window.devicePixelRatio;
var drawImage = CanvasRenderingContext2D.prototype.drawImage;
CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {
if (("nodeName" in image) && /img/i.test(image.nodeName)) {
for (var i = arguments.length - 1; i >= 1; i--) {
arguments[i] = arguments[i] * factor;
}
} else if (typeof dw == "undefined") {
arguments[1] *= factor;
arguments[2] *= factor;
arguments[3] *= factor;
arguments[4] *= factor;
}
drawImage.apply(this, arguments);
};
}
/**
* Check whether the user's browser supports Data URI or not
*
* @private
* @param {Function} fSuccess Occurs if it supports Data URI
* @param {Function} fFail Occurs if it doesn't support Data URI
*/
function _safeSetDataURI(fSuccess, fFail) {
var self = this;
self._fFail = fFail;
self._fSuccess = fSuccess;
// Check it just once
if (self._bSupportDataURI === null) {
var el = document.createElement("img");
var fOnError = function() {
self._bSupportDataURI = false;
if (self._fFail) {
self._fFail.call(self);
}
};
var fOnSuccess = function() {
self._bSupportDataURI = true;
if (self._fSuccess) {
self._fSuccess.call(self);
}
};
el.onabort = fOnError;
el.onerror = fOnError;
el.onload = fOnSuccess;
el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
return;
} else if (self._bSupportDataURI === true && self._fSuccess) {
self._fSuccess.call(self);
} else if (self._bSupportDataURI === false && self._fFail) {
self._fFail.call(self);
}
};
/**
* Drawing QRCode by using canvas
*
* @constructor
* @param {HTMLElement} el
* @param {Object} htOption QRCode Options
*/
var Drawing = function (el, htOption) {
this._bIsPainted = false;
this._android = _getAndroid();
this._htOption = htOption;
this._elCanvas = document.createElement("canvas");
this._elCanvas.width = htOption.width;
this._elCanvas.height = htOption.height;
el.appendChild(this._elCanvas);
this._el = el;
this._oContext = this._elCanvas.getContext("2d");
this._bIsPainted = false;
this._elImage = document.createElement("img");
this._elImage.alt = "Scan me!";
this._elImage.style.display = "none";
this._el.appendChild(this._elImage);
this._bSupportDataURI = null;
};
/**
* Draw the QRCode
*
* @param {QRCode} oQRCode
*/
Drawing.prototype.draw = function (oQRCode) {
var _elImage = this._elImage;
var _oContext = this._oContext;
var _htOption = this._htOption;
var nCount = oQRCode.getModuleCount();
var nWidth = _htOption.width / nCount;
var nHeight = _htOption.height / nCount;
var nRoundedWidth = Math.round(nWidth);
var nRoundedHeight = Math.round(nHeight);
_elImage.style.display = "none";
this.clear();
for (var row = 0; row < nCount; row++) {
for (var col = 0; col < nCount; col++) {
var bIsDark = oQRCode.isDark(row, col);
var nLeft = col * nWidth;
var nTop = row * nHeight;
_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
_oContext.lineWidth = 1;
_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
_oContext.fillRect(nLeft, nTop, nWidth, nHeight);
// 안티 앨리어싱 방지 처리
_oContext.strokeRect(
Math.floor(nLeft) + 0.5,
Math.floor(nTop) + 0.5,
nRoundedWidth,
nRoundedHeight
);
_oContext.strokeRect(
Math.ceil(nLeft) - 0.5,
Math.ceil(nTop) - 0.5,
nRoundedWidth,
nRoundedHeight
);
}
}
this._bIsPainted = true;
};
/**
* Make the image from Canvas if the browser supports Data URI.
*/
Drawing.prototype.makeImage = function () {
if (this._bIsPainted) {
_safeSetDataURI.call(this, _onMakeImage);
}
};
/**
* Return whether the QRCode is painted or not
*
* @return {Boolean}
*/
Drawing.prototype.isPainted = function () {
return this._bIsPainted;
};
/**
* Clear the QRCode
*/
Drawing.prototype.clear = function () {
this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height);
this._bIsPainted = false;
};
/**
* @private
* @param {Number} nNumber
*/
Drawing.prototype.round = function (nNumber) {
if (!nNumber) {
return nNumber;
}
return Math.floor(nNumber * 1000) / 1000;
};
return Drawing;
})();
/**
* Get the type by string length
*
* @private
* @param {String} sText
* @param {Number} nCorrectLevel
* @return {Number} type
*/
function _getTypeNumber(sText, nCorrectLevel) {
var nType = 1;
var length = _getUTF8Length(sText);
for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
var nLimit = 0;
switch (nCorrectLevel) {
case QRErrorCorrectLevel.L :
nLimit = QRCodeLimitLength[i][0];
break;
case QRErrorCorrectLevel.M :
nLimit = QRCodeLimitLength[i][1];
break;
case QRErrorCorrectLevel.Q :
nLimit = QRCodeLimitLength[i][2];
break;
case QRErrorCorrectLevel.H :
nLimit = QRCodeLimitLength[i][3];
break;
}
if (length <= nLimit) {
break;
} else {
nType++;
}
}
if (nType > QRCodeLimitLength.length) {
throw new Error("Too long data");
}
return nType;
}
function _getUTF8Length(sText) {
var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');
return replacedText.length + (replacedText.length != sText ? 3 : 0);
}
/**
* @class QRCode
* @constructor
* @example
* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
*
* @example
* var oQRCode = new QRCode("test", {
* text : "http://naver.com",
* width : 128,
* height : 128
* });
*
* oQRCode.clear(); // Clear the QRCode.
* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
*
* @param {HTMLElement|String} el target element or 'id' attribute of element.
* @param {Object|String} vOption
* @param {String} vOption.text QRCode link data
* @param {Number} [vOption.width=256]
* @param {Number} [vOption.height=256]
* @param {String} [vOption.colorDark="#000000"]
* @param {String} [vOption.colorLight="#ffffff"]
* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H]
*/
QRCode = function (el, vOption) {
this._htOption = {
width : 256,
height : 256,
typeNumber : 4,
colorDark : "#000000",
colorLight : "#ffffff",
correctLevel : QRErrorCorrectLevel.H
};
if (typeof vOption === 'string') {
vOption = {
text : vOption
};
}
// Overwrites options
if (vOption) {
for (var i in vOption) {
this._htOption[i] = vOption[i];
}
}
if (typeof el == "string") {
el = document.getElementById(el);
}
if (this._htOption.useSVG) {
Drawing = svgDrawer;
}
this._android = _getAndroid();
this._el = el;
this._oQRCode = null;
this._oDrawing = new Drawing(this._el, this._htOption);
if (this._htOption.text) {
this.makeCode(this._htOption.text);
}
};
/**
* Make the QRCode
*
* @param {String} sText link data
*/
QRCode.prototype.makeCode = function (sText) {
this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);
this._oQRCode.addData(sText);
this._oQRCode.make();
this._el.title = sText;
this._oDrawing.draw(this._oQRCode);
this.makeImage();
};
/**
* Make the Image from Canvas element
* - It occurs automatically
* - Android below 3 doesn't support Data-URI spec.
*
* @private
*/
QRCode.prototype.makeImage = function () {
if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) {
this._oDrawing.makeImage();
}
};
/**
* Clear the QRCode
*/
QRCode.prototype.clear = function () {
this._oDrawing.clear();
};
/**
* @name QRCode.CorrectLevel
*/
QRCode.CorrectLevel = QRErrorCorrectLevel;
})();

View File

@ -0,0 +1,23 @@
<?php
namespace Link\Api;
use Link\Rpc\RpcClient;
class Push extends Verify
{
public function start_push(): string
{
$client = new RpcClient();
$client->start_push();
return $this->handleRet('','success','推流开启成功','start push successful');
}
public function stop_push(): string
{
$client = new RpcClient();
$client->stop_push();
return $this->handleRet('','success','推流停止成功','stop push successful');
}
}

View File

@ -165,7 +165,7 @@ class Client
* Returns the object handle (so you can chain method calls if you're into * Returns the object handle (so you can chain method calls if you're into
* that kinky stuff) * that kinky stuff)
*/ */
public function query($method, $arguments, &$response) public function query($method, $arguments, &$response = null)
{ {
$id = count($this->responses); $id = count($this->responses);
$this->responses[$id] = &$response; $this->responses[$id] = &$response;

View File

@ -0,0 +1,19 @@
<?php
$type = $argv[1];
if(empty($type))
exit();
if($type == "start")
$url = "http://127.0.0.1/link/push/start_push";
else
$url = "http://127.0.0.1/link/push/stop_push";
$opts = [
'http'=>[
'method'=>"POST"
]
];
$context = stream_context_create($opts);
$json = file_get_contents($url, false, $context);

View File

@ -1,10 +1,28 @@
<?php <?php
include( "head.php" ); include( "head.php" );
?> ?>
<link href="vendor/timepicker/css/bootstrap-timepicker.min.css" rel="stylesheet">
<style>
.hr-container {
position: relative;
display: inline-block;
width: 100%;
}
.hr-container .hr-text {
position: absolute;
top: 1px;
left: 50%;
transform: translateX(-50%);
background-color: #fff;
padding: 0 10px;
color: grey;
}
</style>
<div id="alert"></div> <div id="alert"></div>
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<div class="panel panel-default"> <div class="panel panel-default" style="margin-bottom: 15px;">
<div class="title"> <div class="title">
<h3 class="panel-title"> <h3 class="panel-title">
<cn>视频预览</cn> <cn>视频预览</cn>
@ -12,10 +30,30 @@ include( "head.php" );
<small><cn>推流后可见</cn><en>visible when pushing</en></small> <small><cn>推流后可见</cn><en>visible when pushing</en></small>
</h3> </h3>
</div> </div>
<div class="panel-body"> <div class="panel-body" style="padding: 20px 15px">
<video id="player" controls muted style="width:100%;height: 294px; background: #555;"></video> <video id="player" controls muted style="width:100%;height: 294px; background: #555;"></video>
</div> </div>
</div> </div>
<div id="recBar">
<div class="row">
<div class="col-sm-4 text-right" style="line-height: 34px;">
<strong id="time">[--:--]</strong>
</div>
<div class="col-sm-4 text-center">
<button type="button" id="start" class="btn btn-warning">
<i class="fa fa-video-camera"></i>
<cn>推流</cn>
<en>Push</en>
</button>
<button type="button" id="stop" class="btn btn-default disabled ">
<i class="fa fa-stop"></i>
<cn>停止</cn>
<en>Stop</en>
</button>
</div>
</div>
</div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<div class="panel panel-default" style="margin-bottom: 16px;"> <div class="panel panel-default" style="margin-bottom: 16px;">
@ -50,12 +88,81 @@ include( "head.php" );
</select> </select>
</div> </div>
</div> </div>
<div class="form-group"> <hr style="margin-top:10px; margin-bottom: 10px;"/>
<label class="col-md-3 col-sm-4 control-label"><cn>自动运行</cn><en>Autorun</en></label> <div class="form-group">
<div class="col-md-6 col-sm-8"> <label class="col-sm-3 control-label">
<input zcfg="autorun" type="checkbox" class="switch form-control"> <cn>定时开启</cn>
</div> <en>start time</en>
</div> </label>
<div class="col-sm-3">
<select id="start_push_day" class="selectpicker form-control">
<option cn="从不" en="never" value="x"></option>
<option cn="每天" en="everyday" value="*"></option>
<option cn="每周一" en="monday" value="1"></option>
<option cn="每周二" en="tuesday" value="2"></option>
<option cn="每周三" en="wednesday" value="3"></option>
<option cn="每周四" en="thursday" value="4"></option>
<option cn="每周五" en="friday" value="5"></option>
<option cn="每周六" en="saturday" value="6"></option>
<option cn="每周日" en="sunday" value="0"></option>
</select>
</div>
<div class="col-sm-3">
<div class="input-group bootstrap-timepicker timepicker">
<input id="start_push_time" type="text" class="form-control input-small">
<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">
<cn>定时结束</cn>
<en>start time</en>
</label>
<div class="col-sm-3">
<select id="stop_push_day" class="selectpicker form-control">
<option cn="从不" en="never" value="x"></option>
<option cn="每天" en="everyday" value="*"></option>
<option cn="每周一" en="monday" value="1"></option>
<option cn="每周二" en="tuesday" value="2"></option>
<option cn="每周三" en="wednesday" value="3"></option>
<option cn="每周四" en="thursday" value="4"></option>
<option cn="每周五" en="friday" value="5"></option>
<option cn="每周六" en="saturday" value="6"></option>
<option cn="每周日" en="sunday" value="0"></option>
</select>
</div>
<div class="col-sm-3">
<div class="input-group bootstrap-timepicker timepicker">
<input id="stop_push_time" type="text" class="form-control input-small">
<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span>
</div>
</div>
</div>
<div class="hr-container">
<hr style="margin-top:10px; margin-bottom: 15px;">
<span class="hr-text">OR</span>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">
<cn>开机启动</cn>
<en>auto push</en>
</label>
<div class="col-sm-6">
<select name="day" class="selectpicker form-control" zcfg="autorun">
<option cn="关闭" en="OFF" value="false"></option>
<option cn="开启" en="ON" value="true"></option>
</select>
</div>
</div>
<!-- <div class="form-group">-->
<!-- <label class="col-md-3 col-sm-4 control-label"><cn>自动运行</cn><en>Autorun</en></label>-->
<!-- <div class="col-md-6 col-sm-8">-->
<!-- <input zcfg="autorun" type="checkbox" class="switch form-control">-->
<!-- </div>-->
<!-- </div>-->
<hr style="margin-top:10px; margin-bottom: 10px;"/> <hr style="margin-top:10px; margin-bottom: 10px;"/>
<div class="form-group"> <div class="form-group">
<div class="text-center"> <div class="text-center">
@ -68,26 +175,6 @@ include( "head.php" );
</form> </form>
</div> </div>
</div> </div>
<div id="recBar">
<div class="row">
<div class="col-sm-4 text-right" style="line-height: 34px;">
<strong id="time">[--:--]</strong>
</div>
<div class="col-sm-4 text-center">
<button type="button" id="start" class="btn btn-warning">
<i class="fa fa-video-camera"></i>
<cn>推流</cn>
<en>Push</en>
</button>
<button type="button" id="stop" class="btn btn-default disabled ">
<i class="fa fa-stop"></i>
<cn>停止</cn>
<en>Stop</en>
</button>
</div>
</div>
</div>
</div> </div>
</div> </div>
@ -187,6 +274,7 @@ include( "head.php" );
<script language="javascript" src="js/flv.js" ></script> <script language="javascript" src="js/flv.js" ></script>
<script src="js/zcfg.js"></script> <script src="js/zcfg.js"></script>
<script src="vendor/switch/bootstrap-switch.js"></script> <script src="vendor/switch/bootstrap-switch.js"></script>
<script src="vendor/timepicker/js/bootstrap-timepicker.min.js"></script>
<script> <script>
$( function () { $( function () {
@ -197,6 +285,12 @@ include( "head.php" );
$.fn.bootstrapSwitch.defaults.onColor = 'warning'; $.fn.bootstrapSwitch.defaults.onColor = 'warning';
$( "#addEnable" ).bootstrapSwitch(); $( "#addEnable" ).bootstrapSwitch();
$("#start_push_time,#stop_push_time").timepicker({
minuteStep: 1,
defaultTime: "00:00",
showMeridian: false
});
var player=null; var player=null;
var playerLoad=false; var playerLoad=false;
@ -239,6 +333,7 @@ include( "head.php" );
$.getJSON( "config/config.json", function ( res ) { $.getJSON( "config/config.json", function ( res ) {
cfg = res; cfg = res;
$.getJSON( "config/push.json", function ( result ) { $.getJSON( "config/push.json", function ( result ) {
result.autorun += "";
config = result; config = result;
if(!config.hasOwnProperty("srcV_chn")) if(!config.hasOwnProperty("srcV_chn"))
config.srcV_chn = "main"; config.srcV_chn = "main";
@ -266,6 +361,34 @@ include( "head.php" );
} ); } );
} ); } );
func("getPushCron",[],function (res){
var start = res.result.start;
var lst1 = [];
if(start != null)
lst1 = start.split( " " )
if ( lst1.length != 8 ) {
$( '#start_push_time' ).val( '00:00' );
$( '#start_push_day' ).val( 'x' );
} else {
$( '#start_push_time' ).val( lst1[1]+":"+lst1[0]);
$( '#start_push_day' ).val( lst1[4] );
}
var stop = res.result.stop;
var lst2 = [];
if(stop != null)
lst2 = stop.split( " " );
if ( lst2.length != 8 ) {
$( '#stop_push_time' ).val( '00:00' );
$( '#stop_push_day' ).val( 'x' );
} else {
$( '#stop_push_time' ).val( lst2[1]+":"+lst2[0]);
$( '#stop_push_day' ).val( lst2[4] );
}
})
$("#srcV").change(function (){ $("#srcV").change(function (){
var chnId = $(this).val(); var chnId = $(this).val();
var lang = $.cookie("lang"); var lang = $.cookie("lang");
@ -410,11 +533,30 @@ include( "head.php" );
htmlAlert( "#alert", "danger", "<cn>保存设置失败,辅码流未开启</cn><en>Save config failed, sub stream is not enabled</en>", "", 2000 ); htmlAlert( "#alert", "danger", "<cn>保存设置失败,辅码流未开启</cn><en>Save config failed, sub stream is not enabled</en>", "", 2000 );
return; return;
} }
rpc( "push.update", [ JSON.stringify( config, null, 2 ) ], function ( res ) { rpc( "push.update", [ JSON.stringify( config, null, 2 ) ], function ( res ) {
if ( typeof ( res.error ) != "undefined" ) { if ( typeof ( res.error ) != "undefined" ) {
htmlAlert( "#alert", "danger", "<cn>保存设置失败</cn><en>Save config failed</en>", "", 2000 ); htmlAlert( "#alert", "danger", "<cn>保存设置失败</cn><en>Save config failed</en>", "", 2000 );
} else { } else {
htmlAlert( "#alert", "success", "<cn>保存设置成功</cn><en>Save config success</en>", "", 2000 );
var data = {
start:{
day:$("#start_push_day").val(),
time:$("#start_push_time").val()
},
stop:{
day:$("#stop_push_day").val(),
time:$("#stop_push_time").val()
}
}
func("setPushCron",data,function (res){
if ( res.result == "OK" ) {
htmlAlert( "#alert", "success", "<cn>保存设置成功</cn><en>Save config success</en>", "", 2000 );
} else {
htmlAlert( "#alert", "danger", "<cn>保存设置失败</cn><en>Save config failed</en>", "", 2000 );
}
})
} }
} ); } );
} }

View File

@ -361,9 +361,9 @@ include( "head.php" );
else else
config["used"] = false; config["used"] = false;
} }
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) { func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
if(res["result"] === "OK"){ if(res["result"] === "OK"){
rpc4("remote.updateConfig", [], function (data) { rpc6("remote.updateConfig", [], function (data) {
initFeatures(); initFeatures();
}); });
} }
@ -381,9 +381,9 @@ include( "head.php" );
}); });
$("#saveProject").click(function () { $("#saveProject").click(function () {
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) { func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
if(res["result"] === "OK"){ if(res["result"] === "OK"){
rpc4("remote.updateConfig", [], function (data) { rpc6("remote.updateConfig", [], function (data) {
htmlAlert("#alert", "success", "<cn>保存成功!</cn><en>Save success!</en>", "", 3000); htmlAlert("#alert", "success", "<cn>保存成功!</cn><en>Save success!</en>", "", 3000);
}); });
} }
@ -393,7 +393,7 @@ include( "head.php" );
$( function () { $( function () {
navIndex( 4 ); navIndex( 4 );
$.ajax({url:"/config/oled/remods.json",success:function(data){ $.ajax({url:"/config/misc/remote/remods.json",success:function(data){
features = data; features = data;
var mods3 = new Array(); var mods3 = new Array();
var func = new Array(); var func = new Array();
@ -426,7 +426,7 @@ include( "head.php" );
} }
} }
}}) }})
$.ajax({url:"/config/oled/remfea.json",success:function(data){ $.ajax({url:"/config/misc/remote/remfea.json",success:function(data){
feaArray = data; feaArray = data;
initFeatures(); initFeatures();
for(var i=0;i<feaArray.length;i++){ for(var i=0;i<feaArray.length;i++){

View File

@ -514,7 +514,7 @@ include( "head.php" );
btnArray[i].btnNameCN = "按键"+(i+1); btnArray[i].btnNameCN = "按键"+(i+1);
btnArray[i].btnNameEN = "Button"+(i+1); btnArray[i].btnNameEN = "Button"+(i+1);
} }
func("saveConfigFile",{path: "/config/oled/remote.json",data: JSON.stringify(btnArray,null,2)},function (res) { func("saveConfigFile",{path: "/config/misc/remote/remote.json",data: JSON.stringify(btnArray,null,2)},function (res) {
if(res["result"] === "OK"){ if(res["result"] === "OK"){
initRemoteBtns(); initRemoteBtns();
$('#infoModal').modal("hide"); $('#infoModal').modal("hide");
@ -522,7 +522,7 @@ include( "head.php" );
var config = feaArray[i]; var config = feaArray[i];
config["btns"].splice(index,1); config["btns"].splice(index,1);
} }
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) { func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
if(res["result"] === "OK") if(res["result"] === "OK")
initFeatures(); initFeatures();
}) })
@ -539,7 +539,7 @@ include( "head.php" );
icon:iconSelect, icon:iconSelect,
} }
btnArray.push(obj); btnArray.push(obj);
func("saveConfigFile",{path: "/config/oled/remote.json",data: JSON.stringify(btnArray,null,2)},function (res) { func("saveConfigFile",{path: "/config/misc/remote/remote.json",data: JSON.stringify(btnArray,null,2)},function (res) {
if(res["result"] === "OK"){ if(res["result"] === "OK"){
initRemoteBtns(); initRemoteBtns();
$('#myModal').modal("hide"); $('#myModal').modal("hide");
@ -555,7 +555,7 @@ include( "head.php" );
var config = feaArray[i]; var config = feaArray[i];
config["btns"].push(feaObj); config["btns"].push(feaObj);
} }
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) { func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
if(res["result"] === "OK") if(res["result"] === "OK")
initFeatures(); initFeatures();
}) })
@ -586,9 +586,9 @@ include( "head.php" );
else else
config["used"] = false; config["used"] = false;
} }
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) { func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
if(res["result"] === "OK"){ if(res["result"] === "OK"){
rpc4("remote.updateConfig", [], function (data) { rpc6("remote.updateConfig", [], function (data) {
initFeatures(); initFeatures();
}); });
} }
@ -606,9 +606,9 @@ include( "head.php" );
}); });
$("#saveProject").click(function () { $("#saveProject").click(function () {
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) { func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
if(res["result"] === "OK"){ if(res["result"] === "OK"){
rpc4("remote.updateConfig", [], function (data) { rpc6("remote.updateConfig", [], function (data) {
htmlAlert("#alert", "success", "<cn>保存成功!</cn><en>Save success!</en>", "", 3000); htmlAlert("#alert", "success", "<cn>保存成功!</cn><en>Save success!</en>", "", 3000);
}); });
} }
@ -648,10 +648,10 @@ include( "head.php" );
$( function () { $( function () {
navIndex( 4 ); navIndex( 4 );
$.ajax({url:"/config/oled/remote.json",success:function(data){ $.ajax({url:"/config/misc/remote/remote.json",success:function(data){
btnArray = data; btnArray = data;
initRemoteBtns(); initRemoteBtns();
$.ajax({url:"/config/oled/remods.json",success:function(data){ $.ajax({url:"/config/misc/remote/remods.json",success:function(data){
features = data; features = data;
var mods3 = new Array(); var mods3 = new Array();
var func = new Array(); var func = new Array();
@ -685,7 +685,7 @@ include( "head.php" );
} }
}}) }})
$.ajax({url:"/config/oled/remfea.json",success:function(data){ $.ajax({url:"/config/misc/remote/remfea.json",success:function(data){
feaArray = data; feaArray = data;
initFeatures(); initFeatures();
for(var i=0;i<feaArray.length;i++){ for(var i=0;i<feaArray.length;i++){

View File

@ -1,6 +1,7 @@
<?php <?php
include( "head.php" ); include( "head.php" );
?> ?>
<div id="alert"></div>
<div class="row" id="effect"> <div class="row" id="effect">
<div class="col-md-7"> <div class="col-md-7">
<div class="thumbnail" style="position: relative;"> <div class="thumbnail" style="position: relative;">
@ -231,10 +232,12 @@ include( "head.php" );
} }
function save() { function save() {
rpc( "enc.update", [ JSON.stringify( config, null, 2 ) ], function ( data ) { rpc( "enc.updateRoi", [ JSON.stringify( roiList, null, 2 ) ], function ( data ) {
if ( typeof ( data.error ) != "undefined" ) { if ( !data ) {
htmlAlert( "#alert", "danger", "<cn>保存设置失败!</cn><en>Save config failed!</en>", "", 2000 ); htmlAlert( "#alert", "danger", "<cn>保存设置失败!</cn><en>Save config failed!</en>", "", 2000 );
return;
} }
htmlAlert( "#alert", "success", "<cn>保存设置成功!</cn><en>Save config success!</en>", "", 2000 );
} ); } );
} }
</script> </script>

View File

@ -12,7 +12,7 @@ include( "head.php" );
</h3> </h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<form class="form-horizontal" id="trans" role="form"> <form class="form-horizontal" id="mqtt" role="form">
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label"> <label class="col-sm-2 control-label">
<cn>启用</cn> <cn>启用</cn>
@ -24,25 +24,27 @@ include( "head.php" );
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label"> <label class="col-sm-2 control-label">
<cn>设备名</cn> <cn>连接状态</cn>
<en>Device name</en> <en>Connect</en>
</label> </label>
<div class="col-sm-6"> <div class="col-sm-6 control-label" style="text-align: left;" id="connect">
<input zcfg="Name" type="text" class="form-control">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label"> <label class="col-sm-2 control-label">
<cn>绑定码</cn> <cn>设备名</cn>
<en>Bind code</en> <en>Device name</en>
</label> </label>
<div class="col-sm-6"> <div class="col-sm-6">
<input zcfg="DevBind" type="text" class="form-control"> <input zcfg="name" type="text" class="form-control">
</div> </div>
</div> </div>
<hr> <hr>
<div class="form-group"> <div class="text-center">
<button type="button" id="save" class=" save btn btn-warning col-sm-6 col-sm-offset-3"> <button type="button" id="bind" class="btn btn-warning " style="margin-right:20px;">
<cn>扫码绑定</cn><en>Bind</en>
</button>
<button type="button" id="save" class=" save btn btn-warning">
<cn>保存</cn><en>Save</en> <cn>保存</cn><en>Save</en>
</button> </button>
</div> </div>
@ -135,21 +137,51 @@ include( "head.php" );
</div> </div>
</div> </div>
<div class="modal fade" id="bindModal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">
<cn>扫一扫绑定设备</cn>
<en>Scan qrcode</en>
</h4>
</div>
<div class="modal-body">
<div id="qrcode" class="text-center"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">
<cn>关闭</cn>
<en>Close</en>
</button>
</div>
</div>
</div>
</div>
<script src="vendor/switch/bootstrap-switch.min.js"></script> <script src="vendor/switch/bootstrap-switch.min.js"></script>
<script src="js/zcfg.js"></script> <script src="js/zcfg.js"></script>
<script src="js/qrcode.js"></script>
<script> <script>
$( function () { $( function () {
navIndex( 5 ); navIndex( 5 );
$.fn.bootstrapSwitch.defaults.onColor = 'warning'; $.fn.bootstrapSwitch.defaults.onColor = 'warning';
var transCfg; var mqttCfg;
$.getJSON( "config/trans.json", function ( result ) { function initMqtt(){
transCfg = result; $.getJSON( "config/misc/mqtt.json", function ( result ) {
zcfg( "#trans", transCfg ); mqttCfg = result;
zcfg( "#mqtt", mqttCfg );
} ); } );
}
initMqtt();
//$( '#bindModal' ).modal( 'show' );
$( "#save" ).click( function ( e ) { $( "#save" ).click( function ( e ) {
rpc( "enc.setTrans", [ JSON.stringify( transCfg, null, 2 ) ], function ( data ) { rpc4( "mqtt.update", [ mqttCfg ], function ( data ) {
if ( typeof ( data.error ) != "undefined" ) { if ( typeof ( data.error ) != "undefined" ) {
htmlAlert( "#alert", "danger", "<cn>保存设置失败!</cn><en>Save config failed!</en>", "", 2000 ); htmlAlert( "#alert", "danger", "<cn>保存设置失败!</cn><en>Save config failed!</en>", "", 2000 );
} else { } else {
@ -158,6 +190,46 @@ include( "head.php" );
} ); } );
} ); } );
function getMqttState(){
rpc4( "mqtt.getMqttState", null, function ( data ) {
if(data.connected)
$("#connect").html('<cn>已连接</cn><en>connected</en>');
else
$("#connect").html('<cn>未连接</cn><en>not connected</en>');
} );
}
getMqttState();
setInterval(getMqttState,2000);
function checkBind(){
rpc4( "mqtt.bindOK", null, function ( data ) {
if(data)
{
$( '#bindModal' ).modal( 'hide' );
initMqtt();
}
else
setTimeout(() => {
checkBind();
}, 500);
});
}
$( "#bind" ).click( function ( e ) {
rpc4( "mqtt.startBind", null, function ( data ) {
console.log(data);
$("#qrcode").html("");
new QRCode(document.getElementById("qrcode"), data);
$( '#bindModal' ).modal( 'show' );
checkBind();
} );
} );
/* $.ajax( { /* $.ajax( {
url: "config/rproxy/ngrok_enable", url: "config/rproxy/ngrok_enable",
success: function ( data ) { success: function ( data ) {

View File

@ -894,7 +894,7 @@ else
else if(list[1]!=list[0]) else if(list[1]!=list[0])
return ":"+list[1]; return ":"+list[1];
else else
return ""; return list[0];
} }
function transURL(str) function transURL(str)
@ -918,19 +918,19 @@ else
} }
else{ else{
var port=getport(portCfg.http); var port=getport(portCfg.http);
url=url.replace("///","//"+ip+port+"/"); url=url.replace("///","//"+ip+":"+port+"/");
} }
} }
else if(url.indexOf("rtmp")==0){ else if(url.indexOf("rtmp")==0){
var port=getport(portCfg.rtmp); var port=getport(portCfg.rtmp);
url=url.replace("///","//"+ip+port+"/"); url=url.replace("///","//"+ip+":"+port+"/");
} }
else if(url.indexOf("rtsp")==0){ else if(url.indexOf("rtsp")==0){
var port=getport(portCfg.rtsp); var port=getport(portCfg.rtsp);
if(url.indexOf("@/") > 0) if(url.indexOf("@/") > 0)
url=url.replace("@/","@"+ip+port+"/"); url=url.replace("@/","@"+ip+":"+port+"/");
else else
url=url.replace("///","//"+ip+port+"/"); url=url.replace("///","//"+ip+":"+port+"/");
} }
else if(url.indexOf("srt")==0){ else if(url.indexOf("srt")==0){
url=url.replace("//:","//"+ip+":"); url=url.replace("//:","//"+ip+":");

View File

@ -11,7 +11,7 @@ if(file_exists('theme/theme-'.$theme.'.css')){?>
<?php }?> <?php }?>
<?php <?php
//echo '<pre>'; //echo '<pre>';
$page = substr($_SERVER['PHP_SELF'],strpos('/')+1); $page = substr($_SERVER['PHP_SELF'],strpos($_SERVER['PHP_SELF'],'/')+1);
$page = rtrim($page,'.php'); $page = rtrim($page,'.php');
//echo $page; //echo $page;
switch ($page) { switch ($page) {
@ -19,7 +19,7 @@ switch ($page) {
?> ?>
<?php <?php
break; break;
case 'encode': case 'encode':
// code...?> // code...?>
<style> <style>
@ -63,7 +63,7 @@ switch ($page) {
} }
</style> </style>
<script> <script>
$(document).ready(function(){ $(document).ready(function(){
  $('#tabNet a').append('<span class="tip"><span>Becasue the total CPU resource is limited, so if Encoder works in a full-load state(HDMI channels is encoding), please be cafreful to import the network stream and focus on CPU status.</span></span>');   $('#tabNet a').append('<span class="tip"><span>Becasue the total CPU resource is limited, so if Encoder works in a full-load state(HDMI channels is encoding), please be cafreful to import the network stream and focus on CPU status.</span></span>');
$('#tabNet').on('mouseleave mouseenter',function(){ $('#tabNet').on('mouseleave mouseenter',function(){
$('.tip',$(this)).toggleClass('ac') $('.tip',$(this)).toggleClass('ac')
@ -71,58 +71,58 @@ switch ($page) {
/*$('#tabNet').mouseleave(function(){ /*$('#tabNet').mouseleave(function(){
$('.tip',$(this)).removeClass('ac'); $('.tip',$(this)).removeClass('ac');
})*/ })*/
}); });
</script> </script>
<?php <?php
break; break;
case 'stream': case 'stream':
// code... // code...
break; break;
case 'overlay': case 'overlay':
// code... // code...
break; break;
case 'mix': case 'mix':
// code... // code...
break; break;
case 'monitor': case 'monitor':
// code... // code...
break; break;
case 'carousel': case 'carousel':
// code... // code...
break; break;
case 'sys': case 'sys':
// code... // code...
break; break;
case 'group': case 'group':
// code... // code...
break; break;
case 'client': case 'client':
// code... // code...
break; break;
case 'login': case 'login':
// code... // code...
/* /*
?> ?>
<style> <style>
</style> </style>
<script> <script>
$('body>div').attr('style','width: 400px; margin: 0 auto;'); $('body>div').attr('style','width: 400px; margin: 0 auto;');
var p = $('.panel'); var p = $('.panel');
p.addClass('loginform').attr('style',''); p.addClass('loginform').attr('style','');
$('.panel-body > .text-center').addClass('logo').append('<p>TBS 4K Encoder</p>'); $('.panel-body > .text-center').addClass('logo').append('<p>TBS 4K Encoder</p>');
$('img').attr('src','theme/logo.png') $('img').attr('src','theme/logo.png')
</script> </script>
<?php <?php
*/?> */?>
@ -136,7 +136,7 @@ switch ($page) {
</style> </style>
<?php <?php
break; break;
default: default:
// code... // code...
break; break;

View File

@ -158,7 +158,7 @@ if($hardware["function"]["button"])
}); });
$( "#saveBtn" ).click( function (){ $( "#saveBtn" ).click( function (){
rpc4( "oled.update", [ JSON.stringify( button, null, 2 ) ], function ( res ) { rpc6( "gpio.update", [ JSON.stringify( button, null, 2 ) ], function ( res ) {
if ( typeof ( res.error ) != "undefined" ) { if ( typeof ( res.error ) != "undefined" ) {
htmlAlert( "#alert", "danger", "<cn>保存设置失败</cn><en>Save config failed</en>", "", 2000 ); htmlAlert( "#alert", "danger", "<cn>保存设置失败</cn><en>Save config failed</en>", "", 2000 );
} else { } else {

View File

@ -0,0 +1,146 @@
/*!
* Timepicker Component for Twitter Bootstrap
*
* Copyright 2013 Joris de Wit
*
* Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
.bootstrap-timepicker {
position: relative;
}
.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu {
left: auto;
right: 0;
}
.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before {
left: auto;
right: 12px;
}
.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after {
left: auto;
right: 13px;
}
.bootstrap-timepicker .input-group-addon {
cursor: pointer;
}
.bootstrap-timepicker .input-group-addon i {
display: inline-block;
width: 16px;
height: 16px;
}
.bootstrap-timepicker-widget.dropdown-menu {
padding: 4px;
}
.bootstrap-timepicker-widget.dropdown-menu.open {
display: inline-block;
}
.bootstrap-timepicker-widget.dropdown-menu:before {
border-bottom: 7px solid rgba(0, 0, 0, 0.2);
border-left: 7px solid transparent;
border-right: 7px solid transparent;
content: "";
display: inline-block;
position: absolute;
}
.bootstrap-timepicker-widget.dropdown-menu:after {
border-bottom: 6px solid #FFFFFF;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
content: "";
display: inline-block;
position: absolute;
}
.bootstrap-timepicker-widget.timepicker-orient-left:before {
left: 6px;
}
.bootstrap-timepicker-widget.timepicker-orient-left:after {
left: 7px;
}
.bootstrap-timepicker-widget.timepicker-orient-right:before {
right: 6px;
}
.bootstrap-timepicker-widget.timepicker-orient-right:after {
right: 7px;
}
.bootstrap-timepicker-widget.timepicker-orient-top:before {
top: -7px;
}
.bootstrap-timepicker-widget.timepicker-orient-top:after {
top: -6px;
}
.bootstrap-timepicker-widget.timepicker-orient-bottom:before {
bottom: -7px;
border-bottom: 0;
border-top: 7px solid #999;
}
.bootstrap-timepicker-widget.timepicker-orient-bottom:after {
bottom: -6px;
border-bottom: 0;
border-top: 6px solid #ffffff;
}
.bootstrap-timepicker-widget a.btn,
.bootstrap-timepicker-widget input {
border-radius: 4px;
}
.bootstrap-timepicker-widget table {
width: 100%;
margin: 0;
}
.bootstrap-timepicker-widget table td {
text-align: center;
height: 30px;
margin: 0;
padding: 2px;
}
.bootstrap-timepicker-widget table td:not(.separator) {
min-width: 30px;
}
.bootstrap-timepicker-widget table td span {
width: 100%;
}
.bootstrap-timepicker-widget table td a {
border: 1px transparent solid;
width: 100%;
display: inline-block;
margin: 0;
padding: 8px 0;
outline: 0;
color: #333;
}
.bootstrap-timepicker-widget table td a:hover {
text-decoration: none;
background-color: #eee;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
border-color: #ddd;
}
.bootstrap-timepicker-widget table td a i {
margin-top: 2px;
font-size: 18px;
}
.bootstrap-timepicker-widget table td input {
width: 25px;
margin: 0;
text-align: center;
}
.bootstrap-timepicker-widget .modal-content {
padding: 4px;
}
@media (min-width: 767px) {
.bootstrap-timepicker-widget.modal {
width: 200px;
margin-left: -100px;
}
}
@media (max-width: 767px) {
.bootstrap-timepicker {
width: 100%;
}
.bootstrap-timepicker .dropdown-menu {
width: 100%;
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,6 @@
types { types {
text/inc inc;
text/html html htm shtml; text/html html htm shtml;
text/css css; text/css css;
text/xml xml; text/xml xml;

View File

@ -111,6 +111,8 @@ http {
location / { location / {
ssi on; ssi on;
ssi_silent_errors on;
ssi_types text/inc;
root /link/web; root /link/web;
index dashboard.php; index dashboard.php;
@ -143,6 +145,11 @@ http {
proxy_pass http://127.0.0.1:7010/RPC; proxy_pass http://127.0.0.1:7010/RPC;
proxy_max_temp_file_size 0m; proxy_max_temp_file_size 0m;
} }
location /RPC6 {
proxy_pass http://127.0.0.1:7020/RPC;
proxy_max_temp_file_size 0m;
}
location ~ /socket.io { location ~ /socket.io {
proxy_pass http://127.0.0.1:7857; proxy_pass http://127.0.0.1:7857;
@ -162,11 +169,15 @@ http {
location /hls/ { location /hls/ {
alias /tmp/hls/; alias /tmp/hls/;
add_header Cache-Control no-store;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With,content-type;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
} }
location /config/ { location /config/ {
alias /link/config/; alias /link/config/;
add_header Cache-Control no-store; add_header Cache-Control no-store;
add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With,content-type; add_header Access-Control-Allow-Headers X-Requested-With,content-type;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS; add_header Access-Control-Allow-Methods GET,POST,OPTIONS;

Binary file not shown.

View File

@ -0,0 +1 @@
libQt5Qmqtt.so.1.0.2

View File

@ -0,0 +1 @@
libQt5Qmqtt.so.1.0.2

View File

@ -0,0 +1 @@
libQt5Qmqtt.so.1.0.2

Binary file not shown.

View File

@ -0,0 +1,3 @@