Лучшая музыка для работы — Synthwave
Сложно о простом
Лучшая музыка для работы — Synthwave
Code Snippet — очень удобная штука для автоматической генерации фрагментов кода в Visual Studio по коротким аббревиатурам.
например вводите в редакторе кода
cw
Нажимате два раза Tab, и получаете:
Console.WriteLine();
Очень упрощает труд наборщика 🙂
Как написать свой snippet. Краткий обзор:
Пишу, чтобы не забыть.
Протокол HDLC — канального уровня. Внутри информационного поля, содержит сообщения протокола DLMS\COSEM.
Литература:
HDLC (High-Level Data Link Control) — бит-ориентированный протокол
высокоуровневого управления каналом передачи данных, описанный в ISO/IEC 13239. Протокол имеет 2 подуровня:
Наш пациент — MAC (Media Access Control)
Flag — байт 0x7E открывает и закрывает каждый кадр. Источники утверждают, что если в поле Information встречается байт 0x7E, то он должен быть заменён на что-то другое. Я это не проверял.
Format определяет тип кадра, наличие сегментации кадров, длину кадра.
Бит S, установленный в «1», говорит о необходимости принять этот и последующие фреймы, как единый блок. В последнем фрейме блока бит S должен быть сброшен в «0».
Длина фрейма включает в себя все поля, кроме флагов.
Продолжение следует…
P.S. Я начал писать этот текст год назад, когда начал разбираться в HDLC, читая Green Book. Дописать не успел. Сейчас я всё забыл напрочь 🙂
Разбирайтесь сами.
P.P.S. Кто-то нафигачил хорошую статью по DLMS COSEM протоколу https://habr.com/ru/post/650579/
Bindning to self control dependency property
SelectedValue="{Binding Path=SelectedCulture, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
Допустим, что тебе нужно обратиться к электросчётчику, который умеет разговаривать на DLMS\COSEM. Чтобы понять основы смотри, например, синюю книгу. (можешь скачать её на рутрекере)
И спросил ты у счётчика, например, таблицу специальных дней (интерфейсный класс 11). И ответил тебе счётчик. В синей книге описан формат ответа:
array spec_day_entry spec_day_entry ::= structure { index: long-unsigned, specialday_date: octet-string, day_id: unsigned } Where: - specialday_date formatting follows the rules set in 4.1.6.1 for date; - the range of the day_id shall match the length of the bit-string exec_specdays in the related object of IC “Schedule”.
Что это значит?
array spec_day_entry
Ответ содержит array, внутри которого структуры spec_day_entry, формат структуры
spec_day_entry ::= structure { index: long-unsigned, specialday_date: octet-string, day_id: unsigned }
рамерность и прочее описание этих типов данных смотрите в той же синей книге.
Но это не всё. Смотрим на ответ счётчика:
01 0B 02 03 12 00 01 09 05 07 E2 01 01 FF 11 02 02 03 12 00 02 09 05 07 E2 01 02 FF 11 02 02 03 12 00 03 09 05 07 E2 01 03 FF 11 02 02 03 12 00 04 09 05 07 E2 01 14 FF 11 01 02 03 12 00 05 09 05 07 E2 02 0A FF 11 01 02 03 12 00 06 09 05 07 E2 02 17 FF 11 02 02 03 12 00 07 09 05 07 E2 03 08 FF 11 02 02 03 12 00 08 09 05 07 E2 03 09 FF 11 02 02 03 12 00 09 09 05 07 E2 05 01 FF 11 02 02 03 12 00 0A 09 05 07 E2 05 02 FF 11 02 02 03 12 00 0B 09 05 07 E2 05 09 FF 11 02
Для того чтобы объяснить на примере, разобью байты
01 0B 02 03 12 00 01 09 05 07 E2 01 01 FF 11 02 02 03 12 00 02 09 05 07 E2 01 02 FF 11 02 02 03 12 00 03 09 05 07 E2 01 03 FF 11 02 02 03 12 00 04 09 05 07 E2 01 14 FF 11 01
Объясняю:
//1 байт - тип данных (01 - это array) //2 байт в случае массива - это длина массива (0B - 11 элементов) 01 0B //далее идут элементы массива //02 - тип данных (структура) //03 - кол-во элементов струкруты (в нашем случае - три элемента (index, date, day_id) 02 03 //далее идут элементы структуры //12 - тип данных (unsigned long - так называется двухбайтное целое без знака) //00 01 - значение 12 00 01 //09 - тип данных (octet byte string - набор байтов (такой тип данных для даты)) //05 - длина octet byte string (5 байт) //07 E2 01 01 FF - сама байтовая строка. Нам нужно её интерпертировать как Date (формат описан в синей книге) 09 05 07 E2 01 01 FF //11 - тип данных unsigned (целое 8 бит без знака) //02 - значение 11 02 //и так далее... 02 03 12 00 02 09 05 07 E2 01 02 FF 11 02 02 03 12 00 03 09 05 07 E2 01 03 FF 11 02 02 03 12 00 04 09 05 07 E2 01 14 FF 11 01
RSSI (received signal strength indicator) — Показатель уровня принимаемого сигнала.
RSSI index (он же GSM singnal strength) — индекс уровня принимаемого сигнала. Может принимать значения:
RSSI index | RSSI in dBm |
0 | 113 dBm or less |
1 | 111 dBm |
2…30 | 109… 53 dBm |
31 | 51 dBm or greater |
99 | not known or not detectable |
(1) percentage = rssi * 100 / max_rssi
rssi — RSSI как индекс (от 0 до 31)
max_rssi = 31
percentage = процентный показатель уровня принимаемого сигнала
(2) dBm = 2 * rssi — 113
Подсмотрел здесь:
https://together.jolla.com/question/117679/how-can-one-retrieve-rxlev-dbm-signal-strength-value/
http://m2msupport.net/m2msupport/atcsq-signal-quality/
До окончательной старости осталось:
Штрип-тап-тирап
Тап-тарайра
Штриптаптушечки та-та
Шритптаптира. Штиптаптирап. Штриптарайра.
Потребовалось сделать регистрацию людей-участников на большое мероприятие. А точнее — сделать сбор контактов потенциальных участников и автоматической отправки им некой информации.
Для этого нужно собрать с каждого потенциального участника email (чтобы впоследствии добавить его в контактную базу) и тут же автоматически выслать человеку инструкцию по регистрации. Регистрацией занимается отдельный человек. Моя задача разместить на сайте форму, взять с каждого желающего имя и email. Заполнителю формы автоматически отправить email с некой информацией.
Для решения этой задачи хорошо подходят Гугл Формы. Гугл Формы позволяют создать любую форму, которую каждый может заполнить. А как отправить email, ведь такого функционала в Гугл Формах нет!? Функционала то нет, зато есть плагины. Молодцы.
Вот инструкция что нужно делать: https://www.labnol.org/internet/auto-confirmation-emails/28386/.
Вот сам плагин, написанный неким индусом. Спасибо ему.: https://chrome.google.com/webstore/detail/email-notifications-for-f/acknfdkglemcidajjmehljifccmflhkm.
Здесь много полезных скриптов для Google Forms: https://www.labnol.org/internet/google-scripts/28281/.
Вот что получилось: