Вводная: Дана камера Dahua IPC-HFW1220SP. В веб-интерфейс не входит, telnet-ssh не доступны. IP по DHCP не получает (порт при этом поднимается, линк загорается). ИК-подсветка реагирует на смену света.
Решение: Решили для начала сбросить настройки, но вот тут то и ждала засада - официальная документация https://dahuawiki.com/images/1/1e/ResetIPCamera.pdf про эту модель молчит. Продавец говорит - отправляйте нам на замену. Но это долго.
Начали смотреть, в отличии от младшей модели 1020SP, на этой нет кнопки Reset (да, на младшей всё просто - нажали на кнопочку при включении - выждали 10 секунд и сбросилось).
Не буду вас утомлять - для сброса данной карты нужно снять крышку, снять ИК подсветку (но не отключать провод! Это важно). И замкнуть чем-нибудь тонким две площадки указанные на фото, на выключенной камере - затем подать питание, выждать 15 секунд и убрать замыкание. По сути это кнопка сброса, но не распаянная.
После сброса всё заработало штатно.
Ключевые слова: Dahua, HFW1220SP, factory settings, reset, default
PS: Эксперимент делался на свой страх и риск - было бы очень весело если бы это было питание для чего-либо :) И замкнули + и -. Так что будьте осторожнее делая это на других ревизиях или моделях - проверьте вначале мультиметром, что там не будет ничего.
вторник, 19 февраля 2019 г.
среда, 5 сентября 2018 г.
Доступ в интернет с эмулятора Windows Mobile 6 на Windows 10
Вводная: Есть ТСД, штука дорогая, защищённая, с мощными батареями и главное в наличии. "Покупать другие не предлагать". Разработка для них знакома и не представляет сложности. Все поставилось, но софт требует доступа к интернет-серверу (REST-api, все дела). А его нет! Проблема в том, что доступ к сети реализован через VirtualPC 2007, которая в Windows 10 не работают от слова вообще.
Но выход есть:
1. Ставим локальный прокси. Я рекомендую Fiddler https://www.telerik.com/fiddler
2. Запускать от админа, потом в меню Tools -> Options -> Connections
3. Обязательно указываем "Allow remote computers to connect"
4. Запускаем Microsoft Device Emulator Manager 9 (входит в состав Microsoft Device Emulator 3.0 https://www.microsoft.com/ru-ru/download/details.aspx?id=5352 )
5. Выбираем наш эмулятор и в контекстном меню выбираем Cradle
6. Должен открыться "Центр устройств Windows Mobile" https://www.microsoft.com/ru-ru/download/details.aspx?id=3182
7. В нём выбираем "Подключение без настройки устройства"
8. На эмуляторе Settings -> Connections -> Connections -> Edit my proxy server
9. Указываем Ip адрес компьютера на котором запущен Fiddler и дважды нажимаем OK
10. Пробуем выходить в интернет
PS: Минус у этого решения есть и достаточно серъёзный - это всё надо делать каждый раз после перезапуска компьютера. Но автоматизируется легко. AutoIt или на том-же C#.
PS2: Кстати при наличии лицензионного ключа на 2008 Professional пришлось ставить пиратскую. Мой серийник, честно купленный в 2010 году, все найденные дистрибутивы просто отказались принимать :(
Но выход есть:
1. Ставим локальный прокси. Я рекомендую Fiddler https://www.telerik.com/fiddler
2. Запускать от админа, потом в меню Tools -> Options -> Connections
3. Обязательно указываем "Allow remote computers to connect"
5. Выбираем наш эмулятор и в контекстном меню выбираем Cradle
6. Должен открыться "Центр устройств Windows Mobile" https://www.microsoft.com/ru-ru/download/details.aspx?id=3182
7. В нём выбираем "Подключение без настройки устройства"
8. На эмуляторе Settings -> Connections -> Connections -> Edit my proxy server
9. Указываем Ip адрес компьютера на котором запущен Fiddler и дважды нажимаем OK
10. Пробуем выходить в интернет
PS: Минус у этого решения есть и достаточно серъёзный - это всё надо делать каждый раз после перезапуска компьютера. Но автоматизируется легко. AutoIt или на том-же C#.
PS2: Кстати при наличии лицензионного ключа на 2008 Professional пришлось ставить пиратскую. Мой серийник, честно купленный в 2010 году, все найденные дистрибутивы просто отказались принимать :(
пятница, 3 августа 2018 г.
Битрикс - добавление в почтовый шаблон номера телефона
Вводная: Необходимо добавить номер телефона и адрес клиента в письмо от интернет-магазина битрикса (о новом заказе).
Решение:
1) Добавляем в /bitrix/php_interface/init.php код
2) Добавляем в почтовый шаблон ИМЯСАЙТА/bitrix/admin/message_admin.php
(я добавлял в шаблон "[SALE_NEW_ORDER] Новый заказ")
Должно получится как-то так
3) Результат
Решение:
1) Добавляем в /bitrix/php_interface/init.php код
<? AddEventHandler("sale", "OnOrderNewSendEmail", "ModifySaleMails"); function ModifySaleMails($orderID, &$eventName, &$arFields) { $arOrder = CSaleOrder::GetByID($orderID); $order_props = CSaleOrderPropsValue::GetOrderProps($orderID); $phone = ""; $address = ""; while ($arProps = $order_props->Fetch()){ if ($arProps["CODE"] == "PHONE"){ $phone = htmlspecialchars($arProps["VALUE"]);} if ($arProps["CODE"] == "ADDRESS"){ $address = htmlspecialchars($arProps["VALUE"]);} } if (!empty($arOrder["USER_DESCRIPTION"])){ $arFields["DESCRIPTION"] = $arOrder["USER_DESCRIPTION"];} //-- добавляем новые поля в массив результатов $arFields["PHONE"] = $phone; $arFields["ADDRESS"] = $address; } ?>
2) Добавляем в почтовый шаблон ИМЯСАЙТА/bitrix/admin/message_admin.php
(я добавлял в шаблон "[SALE_NEW_ORDER] Новый заказ")
Доставка по адресу: #ADDRESS#<br />
Ваш контактный телефон: #PHONE#<br />
Должно получится как-то так
3) Результат
воскресенье, 10 июня 2018 г.
Разбиение файла импорта 1С на сайт на части
Вводная: Есть хостинг, есть сайт у сайта есть импорт товаров из 1С. Из 1С УТ файлы выгружаются, через стандартный механизм обмена с web-сайтом.
Но скрипту импорта периодически не хватает памяти, чтобы загрузить всё. И падает с ошибкой. Было решено "разбивать" файлы на части по 1000 товаров. И загружать последовательно.
Решение:
Но скрипту импорта периодически не хватает памяти, чтобы загрузить всё. И падает с ошибкой. Было решено "разбивать" файлы на части по 1000 товаров. И загружать последовательно.
Решение:
Directory.EnumerateFiles(Environment.CurrentDirectory)
.Where(file => Path.GetFileName(file).StartsWith("output")).ToList()
.ForEach(File.Delete);
XDocument source = XDocument.Load("import.xml");
int iteration = 0;
while (iteration * 1000 < source.Descendants("Товар").Count())
{
XDocument xdoc = new XDocument(source);
var allElements = xdoc.Descendants("Товар").OrderBy(a => a.Element("Ид")?.Value);
var whatToLeave = xdoc
.Descendants("Товар")
.OrderBy(w => w.Element("Ид")?.Value)
.Skip(1000 * iteration).Take(1000);
allElements.Except(whatToLeave).ToList().ForEach(e => e.Remove());
iteration++;
xdoc.Save($"output{iteration}.xml");
}
среда, 17 января 2018 г.
Принтер HP P1102W не печатает через RDP
Вводная: Есть терминальный сервер - Windows 2008 R2 64 bit, стандартная редакция. И клиент - Windows 7 Pro, 32 бита. На клиенте установлен принтер HP P1102W. При подключении через RDP, принтер отказывается работать. Пробрасывается, но не печатает. На самом клиенте проблем с печатью нет.
Решение:
PS: Ещё в интернетах встречал совет поменять драйвера на XPS, но на них очень сильно начинала тормозить клиентская 1С в RDP сеансе. Но вам может быть поможет.
PS2: После каждого шага перезагружался.
Решение:
- Закрыть сеанс (именно выход из системы) и открыть заново - не помогло
- Перезагрузить клиент и сервер - не помогло
- Проверил корректность драйверов и ОДИНАКОВОСТЬ версии на клиенте и на сервере. Самое простое - и там, и там удаляем и ставим заново. Для сервера ставим и 32 битную версию, и 64 - не помогло
- Устанавливаем политику - запускаем gpedit.msc и по пути Computer Configuration -> Administrative templates -Windows Components -> Remote Desktop Services > Remote Desktop Session Host -> Printer Redirection отключаем опцию "Use Terminal Services Easy Print Driver First" - не помогло (но было странно, ОПЦИЯ НЕ ДЕЙСТВОВАЛА - в свойствах принтера всё равно оставался Easy Print Driver)
- Добавил ключ реестра UseUniversalPrinterDriverFirst по пути HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services тип REG_DWORD, создал его и установил в значение "4" ("3" - включен) - помогло и всё заработало.
PS: Ещё в интернетах встречал совет поменять драйвера на XPS, но на них очень сильно начинала тормозить клиентская 1С в RDP сеансе. Но вам может быть поможет.
PS2: После каждого шага перезагружался.
вторник, 16 января 2018 г.
Ежедневная смена пароля на роутере Mikrotik на пароль построенный по дате
Вводная: "Иван, у меня есть тривиальная задача для микротик. Мне нужно ежедневно в 12 часов ночи менять пароль на вай-фае на текущую дату без точек (16012017 например вот так). Я так думаю, что можно решить скриптом, но не знаю, честно говоря, с какой стороны к этой проблеме подойти"
Решение: Идею взял на http://kvas.livejournal.com/679174.html
:local wifiProfile wifiMyProfile
:local dateNow [/system clock get date];
:local dateNowDay [:pick $dateNow 4 6]
:local dateNowMonth [:pick $dateNow 0 3]
:local dateNowYear [:pick $dateNow 7 11]
:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
:set dateNowMonth ([:find $months $dateNowMonth -1 ] + 1)
:if ( $dateNowMonth < 10 ) do={
:set $dateNowMonth ("0"."$dateNowMonth");
};
:log info message="==== NOW DATE: day: $dateNowDay month: $dateNowMonth year: $dateNowYear"
:local newPassword ("$dateNowDay" . "$dateNowMonth" . "$dateNowYear");
:log info message="==== NEW PASSWORD: $newPassword"
/interface wireless security-profiles set [find name=$wifiProfile] wpa2-pre-shared-key=$newPassword
Всё это добавляется в System-Script и вызывается в 0:05 через шедулер.
Решение: Идею взял на http://kvas.livejournal.com/679174.html
:local wifiProfile wifiMyProfile
:local dateNow [/system clock get date];
:local dateNowDay [:pick $dateNow 4 6]
:local dateNowMonth [:pick $dateNow 0 3]
:local dateNowYear [:pick $dateNow 7 11]
:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
:set dateNowMonth ([:find $months $dateNowMonth -1 ] + 1)
:if ( $dateNowMonth < 10 ) do={
:set $dateNowMonth ("0"."$dateNowMonth");
};
:log info message="==== NOW DATE: day: $dateNowDay month: $dateNowMonth year: $dateNowYear"
:local newPassword ("$dateNowDay" . "$dateNowMonth" . "$dateNowYear");
:log info message="==== NEW PASSWORD: $newPassword"
/interface wireless security-profiles set [find name=$wifiProfile] wpa2-pre-shared-key=$newPassword
Всё это добавляется в System-Script и вызывается в 0:05 через шедулер.
понедельник, 15 января 2018 г.
Удаление папок по времени
Вводная: Делаю для себя небольшую систему резервного копирования. Задача - удалять старые папки-даты при добавлении новых. По алгоритму - оставляем только 15 последних папок, остальные удаляем.
Решение: На вход подаётся List класса BackupDirectoryInfo. Просто DirectoryInfo не используется, так как в качестве хранилища бэкапа используются и файловые ресурсы, и облачные хранилища. Если требуется использовать только папки на физическом диске, то можно обойтись одним DirectoryInfo.
Решение: На вход подаётся List класса BackupDirectoryInfo. Просто DirectoryInfo не используется, так как в качестве хранилища бэкапа используются и файловые ресурсы, и облачные хранилища. Если требуется использовать только папки на физическом диске, то можно обойтись одним DirectoryInfo.
public abstract class BackupDirectoryInfo
{
public string Name;
public string Path;
public DateTime CreatedTime;
public abstract void Delete();
}
private void DeleteOldFolder(List<BackupDirectoryInfo> dirs )
{
var orderedList = dirs.OrderByDescending(x => x.CreatedTime)
.Take(15);
var dirToDelete = dirs.Except(orderedList).ToList();
dirToDelete.ForEach(x => x.Delete() );
}
суббота, 30 декабря 2017 г.
Заполнить базу в MS SQL тестовыми данными
Вводная: сабж.
Решение:
USE [testBackup]
GO
DECLARE @count INT
SET @count = 1
WHILE @count <= 100000
BEGIN
INSERT INTO [dbo].[Table_1]
SELECT
CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) +
CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) +
CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) +
CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) +
CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) [Test]
SET @count += 1
END
GO
Ну и удаление
USE [testBackup];
GO
DELETE FROM [dbo].[Table_1];
GO
Решение:
USE [testBackup]
GO
DECLARE @count INT
SET @count = 1
WHILE @count <= 100000
BEGIN
INSERT INTO [dbo].[Table_1]
SELECT
CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) +
CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) +
CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) +
CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) +
CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) [Test]
SET @count += 1
END
GO
Ну и удаление
USE [testBackup];
GO
DELETE FROM [dbo].[Table_1];
GO
вторник, 19 декабря 2017 г.
C# - отправить монитор в сон
Вводная: Есть телевизор, он используется исключительно как монитор и подключен к компьютеру. Настроено автовыключение при пропадании сигнала и соответственно включение при его появлении. Но есть несколько моментов:
1) Если выключаешь не с пульта, а с кнопки на телевизоре, то при появлении сигнала сам не включается - надо обязательно опять её нажать вручную.
2) На компьютере настроен таймаут 15 минут - его менять не хотелось. А иногда ждать эти пятнадцать минут не хочется. А вставать за пультом, также не хочется. (к примеру когда вечером ложимся спать) - ну и пульт получается только для включения-выключения.
3) Компьютер не выключается никогда.
Решение: Была написана небольшая программа на C#, которая при запуске просто отправляет монитор в сон. Код -
Несколько примечаний -
1) Проект консольный, но "Output type" windows application - по этому никаких окон не появляется при запуске
2) Админских прав не требует
3) Никаких дополнительных библиотек не требует
1) Если выключаешь не с пульта, а с кнопки на телевизоре, то при появлении сигнала сам не включается - надо обязательно опять её нажать вручную.
2) На компьютере настроен таймаут 15 минут - его менять не хотелось. А иногда ждать эти пятнадцать минут не хочется. А вставать за пультом, также не хочется. (к примеру когда вечером ложимся спать) - ну и пульт получается только для включения-выключения.
3) Компьютер не выключается никогда.
Решение: Была написана небольшая программа на C#, которая при запуске просто отправляет монитор в сон. Код -
class Program { [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); static void Main() { var hwndBroadcast = (IntPtr)0xFFFF; var scMonitorpower = (IntPtr)0xF170; var wmSyscommand = 0x0112; SendMessage(hwndBroadcast, wmSyscommand, scMonitorpower, (IntPtr)2); } }
Несколько примечаний -
1) Проект консольный, но "Output type" windows application - по этому никаких окон не появляется при запуске
2) Админских прав не требует
3) Никаких дополнительных библиотек не требует
понедельник, 19 июня 2017 г.
Настройки IPTV для роутеров Mikrotik в сети TTK
Как настроить IPTV в ТТК.
1. ОЧЕНЬ рекомендую в случае использования IPTV подключать его проводом. Иначе эфир у вас будет мягко говоря засран. Далее рассматривается схема с двумя бриджами - bridgeEthernet и bridgeWifi (конечно можно и не создавать бриджи, а оперировать сразу интерфейсами, к примеру ether2 (остальные будует подключены по master-slave) и просто wlan1), но лучше рассматривать бридж, так как есть и 2011, и мультидиапозонные роутеры (где WiFi 2.4+5). У нас будет bridgeEthernet, так как телевизор подключен проводом.
2. Устанавливаем пакет multicast.
3.
/routing igmp-proxy interface
add interface=bridgeEthernet
add alternative-subnets=0.0.0.0/0 interface=ether1 upstream=yes
В качестве апстрима выбираем физический интерфес в который у нас приходит провод от провайдера -
есть два важных момента -
а) НИ В КОЕМ СЛУЧАЕ НЕ ПППОЕ!
б) ДОЛЖЕН БЫТЬ ОБЯЗАТЕЛЬНО НАЗНАЧЕН ЛЮБОЙ СТАТИЧЕСКИЙ АЙПИШНИК!!!
В качестве локального интерфейса выбираем нужный нам интерфейс в локальной сети. Здесь также есть нюанс - ОБЯЗАТЕЛЬНО НА ЭТОМ ИНТЕРФЕЙСЕ ДОЛЖЕН БЫТЬ НАЗНАЧЕН АЙПИШНИК!!!
То есть на обоих интерфейсах должны быть айпишники из домашних диапазонов (Из разных).
/ip address
add address=192.168.123.1/24 interface=bridgeEthernet network=192.168.123.0
add address=192.168.10.10/24 interface=ether1 network=192.168.10.0
Если IPTV нужен через WiFi - ОБЯЗАТЕЛЬНО включите MulticastHelper. Но старайтесь чтобы не потребовалось.
Также надо настроить параметры IGMP Proxy
/routing igmp-proxy
set query-interval=1m5s query-response-interval=5s quick-leave=yes
Всё. Можете проверять работу IPTV.
1. ОЧЕНЬ рекомендую в случае использования IPTV подключать его проводом. Иначе эфир у вас будет мягко говоря засран. Далее рассматривается схема с двумя бриджами - bridgeEthernet и bridgeWifi (конечно можно и не создавать бриджи, а оперировать сразу интерфейсами, к примеру ether2 (остальные будует подключены по master-slave) и просто wlan1), но лучше рассматривать бридж, так как есть и 2011, и мультидиапозонные роутеры (где WiFi 2.4+5). У нас будет bridgeEthernet, так как телевизор подключен проводом.
2. Устанавливаем пакет multicast.
3.
/routing igmp-proxy interface
add interface=bridgeEthernet
add alternative-subnets=0.0.0.0/0 interface=ether1 upstream=yes
В качестве апстрима выбираем физический интерфес в который у нас приходит провод от провайдера -
есть два важных момента -
а) НИ В КОЕМ СЛУЧАЕ НЕ ПППОЕ!
б) ДОЛЖЕН БЫТЬ ОБЯЗАТЕЛЬНО НАЗНАЧЕН ЛЮБОЙ СТАТИЧЕСКИЙ АЙПИШНИК!!!
В качестве локального интерфейса выбираем нужный нам интерфейс в локальной сети. Здесь также есть нюанс - ОБЯЗАТЕЛЬНО НА ЭТОМ ИНТЕРФЕЙСЕ ДОЛЖЕН БЫТЬ НАЗНАЧЕН АЙПИШНИК!!!
То есть на обоих интерфейсах должны быть айпишники из домашних диапазонов (Из разных).
/ip address
add address=192.168.123.1/24 interface=bridgeEthernet network=192.168.123.0
add address=192.168.10.10/24 interface=ether1 network=192.168.10.0
Если IPTV нужен через WiFi - ОБЯЗАТЕЛЬНО включите MulticastHelper. Но старайтесь чтобы не потребовалось.
Также надо настроить параметры IGMP Proxy
/routing igmp-proxy
set query-interval=1m5s query-response-interval=5s quick-leave=yes
Всё. Можете проверять работу IPTV.
Подписаться на:
Сообщения (Atom)





