Форум » » Ламерские вопросы по работе c Simpl# » Ответить

Ламерские вопросы по работе c Simpl#

Вячеслав: Который раз пытаюсь начать работать с Simpl# но никак мне эта тема не дается. Сразу оговорюсь, опыт пока 0%. Прошу учесть в ответе. Решил вот начать не с написания своего модуля в VS, а для начала воспользоваться готовыми функциями библиотек или классов уж не знаю как правильно Crestron.SimplSharp (те которые как то мало понятно описаны по этой ссылке) На это натолкнула конструкция из хелпа: #CRESTRON_SIMPLSHARP_LIBRARY "LibraryName" - for referencing a SIMPL# Library provided by Crestron Я так понял, что используя эту конструкцию я могу подтянуть в программу simpl+ стандартную библиотеку SIMPL# и воспользоваться как то её функцией. Это так? Не совсем понятно что нужно в качестве "LibraryName" написать ? Пробовал названия классов из первой ссылки, компилятор посылает за файлом *.clz Подскажите пожалуйста, что не так. Неужели обязательно писать прокладку на VS чтоб получить clz? (зачем тогда такая конструкция заявлена, оставили бы только #USER_SIMPLSHARP_LIBRARY) Да и что я там должен публиковать, функции из стандартного класса? Если можно на примере любого стандартного класса реализующего любую понятную функцию объясните плиз. Хотел в общем то функционал https (Сервер или клиент если сервера нет) использовать

Ответов - 19

DmitriiP: Вячеслав пишет: (зачем тогда такая конструкция заявлена, оставили бы только #USER_SIMPLSHARP_LIBRARY) #CRESTRON_SIMPLSHARP_LIBRARY это крестроновские библеотеки которые берутся из Database (crssplus.dat) для крестроновских же модулей csp (вринципе в ней же). Вячеслав пишет: Я так понял, что используя эту конструкцию я могу подтянуть в программу simpl+ стандартную библиотеку SIMPL# и воспользоваться как то её функцией. Это так? нет. оно ничего не имеет общего с "готовыми функциями библиотек" Crestron.SimplSharp Вячеслав пишет: Подскажите пожалуйста, что не так. Неужели обязательно писать прокладку на VS чтоб получить clz? для clz только VS! только 2008! только с крестроновским sandbox'м (Crestron_Simpl_Sharp_Pro_x.xxx.xxx.xx.exe) clz генерирует крестроновский sandbox. это тупо zip архив с вашим .dll + библиотеки на которые он завязан. при компиляции он проверяет на разрешенные в песочнице классы, если всё хорошо: компилирует, сигнатурит, колдует, зипует. Вячеслав пишет: Не совсем понятно что нужно в качестве "LibraryName" написать ? #USER_SIMPLSHARP_LIBRARY LibraryName где LibraryName это полное название LibraryName.clz без разширения, путь если файл лежит в папке проекта ненужен, только название. #USER_SIMPLSHARP_LIBRARY "CP1251toUnicode" STRING_INPUT In_Unicode[255]; STRING_OUTPUT Out_CP1251; THREADSAFE Change In_Unicode { Out_CP1251 = StringEncode.UnicodeStringToCP1251String(In_Unicode); } CP1251toUnicode.clz using System; using System.Linq; using System.Text; using Crestron.SimplSharp; // For Basic SIMPL# Classes namespace CP1251toUnicode { public static class StringEncode { // Пару других классов public static string UnicodeStringToCP1251String(SimplSharpString UnicodeString) { byte[] b = UnicodeStringToCP1251ByteArray(UnicodeString.ToString()); return iso.GetString(b, 0, b.Length); } // Пару других классов } } P.S. До TCP сервера/клиента, ознакомьтесь с базовым функционалом ;)

Вячеслав: Спасибо DmitriiP. Правда я так и не понял, для чего же #CRESTRON_SIMPLSHARP_LIBRARY Смущает что в crssplus.dat нет ни одного файла с расширением clz. Думал крестрон туда ломится просто перебирая все возможные места нахождения файла clz. byte[] b = UnicodeStringToCP1251ByteArray(UnicodeString.ToString()); Конструкция для понимания пока просто жестока (( Особенно её часть UnicodeString.ToString() Вроде была параметрическая переменная, а используется как метод класса return iso.GetString(b, 0, b.Length); тоже та еще конструкция. Я бы не догадался ничего кроме return b написать (( Видимо надо справочник по c# листать. У меня при создании программы в VS почему то много подклассов заявленных Crestron.SimplSharpPro.... просто не выдает в подстановке. У меня что какой то не полный пакет SimplSharpPro ? Еще расстроился по поводу отсутствия HTTPS сервера, или он есть и доступен в базовых классах не от Crestron?

DmitriiP: 1) В crssplus.dat около 40 "ненужных вам" clz например amfmtuner, приглядитесь ;) 2) с UnicodeString.ToString() забейте это просто потому что на входе SimplSharpString а не простой String (работает и без этого, но я добавил) ;) 3) return iso.GetString(b, 0, b.Length); это тупо возврат байтового массива в полной 00-FF ASCII кодировке, iso определено в другом месте // Пару других классов 4) После создания нового Simpl#, сохраните, закройте студию, откройте по новому System не должно и не будет красным 5) SimplSharpPro для SimplSharpPro программ +библиотек под них, с Simpl+ совместим только SimplSharp P.S. На счёт HTTPS щас не скажу, клиент точно есть


olegny: Что именно вы подразумеваете под HTTPS сервером? HTTP сервер есть в системе как класс (IIS 6.0) и он же HTTPS если включем режим "SSL SELF" или "SSL CA" (ибо серверу требуется сертификат) Для программирования динамических страниц или веб-сервисов есть CWS (Crestron Web Scripting) - очень похож на ASP.NET в базовых классах. Другой способ это самому обрабатывать HTTP запросы в том числе и через SSL/TLS - Crestron.SimplSharp.CrestronSockets.SecureTCPServer Будут конкретные вопросы, обращайтесь! )) P.S. А вообще, лучше дождаться 4-й серии где, похоже, можно будет выйти из песочницы и делать все, что душе угодно из того, что умеет моно включая нормальный asp.net

Вячеслав: 1.Поясните, как обратиться к классу IIS 6.0 в программе VS? 2.Как включить упомянутые режимы "SSL SELF" или "SSL CA"? 3.Если использовать сертификат, то его можно будет разметить во внутренней флэш контроллера? OpenSSL вроде формирует сертификат и ключ. С ключом пока не понял, вроде должно 2 быть приватный и публичный, хотя эта достойна отдельного обсуждения, но без нее может и все труды напрасны. 4.(Crestron.SimplSharp.CrestronSockets.SecureTCPServer)Где же описание этого класса? Я так понимаю суслик есть но его не видно )) 5.Описание по Simpl# существует более подробное и полное чем по ссылке в 1 посте? Сами какой литературой пользуетесь для поиска нужного инструментария? 6.Где найти описание Crestron Web Scripting (в поисковике лишь упомянут скромной фразой, что его можно использовать в simpl#)? Как думаете HTTPS клиент (не самописный) пошлет куда подальше не получив данные по сертификату, если обрабатывать средствами Crestron.SimplSharp.CrestronSockets.SecureTCPServer? Мне пока и песочница - пустыня, только начинаю вникать в c#. Хотелось вот мотивировать себя нужным примером реализации обмена с HTTPS клиентом.

olegny: 1. Я прошу прощения насчет "класса". Это была фигура речи! )) IIS, конечно же, присутствует там в виде вервиса как обычно. Обратиться к нему напрямую из песочницы не получится... Можно разве что статические странички положить в HTML фолдер. 2. "SSL" это - консольная команда. Консоль это - либо тулбокс, либо SSH. У тулбокса наверняка есть и визуальный интерфейс ко всему этому, но я им практически не пользуюсь тем более, что в результате все это делается через те же консольные команды: набираете "SSL ?" и получаете краткую справку как и что. У Крестрона где-то есть документ по поводу секьюрити, где все это описано. Попробую найти как-нибудь. SSL SELF - самое простое, но бестолковое в смысле безопасности т.к. серфикат будет self-signed. Шифрование есть, а аутентификации сервера нет так, что кто-то может влезть между вами... :) SSL CA это уже по-взрослому. Сертификат настоящий и должен быть подписан CA (либо сторонним, либо вашим собственным). Для генерации самого сертификата и запроса на подпись есть команда "CreateCSR", но можно и свой готовый серт подсунуть системе... 3. Все правильно. OpenSSL может сделать все сам: - сгенерировать ваш сертификат - сгенерировать, если нужно, ваш собственный CA - подписать ваш сертификат приватным ключем CA - альтернативно последнему, вы можете отправить запрос на подпись своего сертификата стороннему CA (обычно за деньги) Команда CreateCSR предназначена заменить первый пункт выше, но вы можете "подсунуть" и готовый сертификат с приватным ключем системе в виде файлов. В любом случае все заканчивается командой "SSL CA" и сертификат хранится во внутреннем флеше, конечно же. Ваш сертификат это и есть ваш публичный ключ плюс всякие мета-данные подписанный приватным ключем CA. Приватный же ключ вашего сертификата в виде отдельного файла ханится в защищенном месте и/или в зашифрованном паролем виде. В случае CreateCSR команды, вы его никогда и не увидете. Есть вариант pfx файла, когда серт и его приватный ключ в одном и том же файле, но тогда последний, как правило, шифруется паролем. 4. Думаю вам стоит обновить include4.dat если вы понимаете о чем я... иными словами у вас похоже устаревший SDK. Суслик точно есть и я его вижу у себя... )) 5. Сложный вопрос. Возможно старшие товарищи помогут с литературой, ибо я никогда ничем не пользовался... чисто C#, XML-документация самих классов и common sense (как говорят наши заклятые друзья американцы). 6. Такая же ситуация и CWS. Я вообще не уверен, что описание как таковое существует. Здесь поможет знание основ ASP.NET ибо если посмотрите на базовые классы CWS, то они напоминают сильно урезанный ASP.NET. Проще разбираться на примерах. В сети где-то есть пример S# программы для CWS. Могу и я выложить куда-нибудь... Кто такой HTTPS клиент? Типа обычный браузер? Не пошлет, но спросит что делать... ) HTTPS сервиса (а точнее SSL/TLS соединения) без сертификата не бывает. Другое дело, что сертификат у сервера может быть "левый". Программым способом (пользуя тот же libCURL) это всегда можно игнорировать. Браузер же всегда можно "уговорить", что данный сертификат является "хорошим"... )) Вам точно нужен HTTP протокол-то? Однако если речь идет о веб-сервисах, например, то лучше все-таки смотреть в сторону CWS.

Вячеслав: olegny пишет: обновить include4.dat если вы понимаете о чем я Нет не понимаю. Скриншот описания классов сделан по упомянутой ссылке на сайте crestron click here. Никого локально описания, которое я мог бы обновить у меня пока нет. В хэлпе на SimplWindows я даже не подумал искать описание simpl#. VS отзывается на класс Crestron.SimplSharp.CrestronSockets.SecureTCPServer но команды придется выбирать по наитию. А хотелось бы описания, желательно с примерами кода. Потому что будет наверняка не все очевидно. посмотрите на базовые классы CWS Посмотреть где? ) Класс Crestron.SimplSharp.CrestronSockets.SecureTCPServer поддерживает команды управления сертификатами тоже? Еще раз спасибо за развернутый ответ

olegny: Судя по всему они не слишком торопятся обновлять свой онлайн хелп... ) Сразу оговорюсь, что с Simpl+ я работал мало и очень давно так, что как расширять оную функциональность с помощью S# знаю только теоретически. Но в теории да, пишете свои классы-обертки на S# с интерфейсом и функциональностью, необходимыми вашему S+ модулю. Здесь и далее речь идет о проекте "Simpl# Library" в VS 2008 с плагином SIMPL# от Крестрона. Как вариант можно играться в чистой SIMPL# Pro программе, чтобы не связываться с S+, а запускать ее как отдельно-стоящий app. Под "командами" класса видимо нужно понимать его методы? А там есть еще свойства и прочее... Когда вы объявляете переменную этого типа (класса), а потом собираетесь с ней что-то делать и ставите точку после имени, разве не вываливается весь список методов и свойств? Ну или кликните правой кнопкой на само имя (SecureTCPServer) класса и сходите в "Definition" - там все есть! Насчет CWS: в references вашего проекта надо добавить SimplSharpCWSHelperInterface и потом открыть его (правой кнопкой) в Object Browser. У SecureTCPServer есть метод SetServerCertificate и SetServerPrivateKey. Больше ничего особо и не надо...

Вячеслав: Что то я не понимаю как в методе SetServerCertificate подтянуть уже готовый сертификат не говоря уж про его генерацию, тот же вопрос по методу SetServerPrivateKey Error 1 The best overloaded method match for 'Crestron.SimplSharp.CrestronSockets.SecureTCPServer.SetServerCertificate(Crestron.SimplSharp.Cryptography.X509Certificates.X509Certificate)' has some invalid arguments Error 2 The best overloaded method match for 'Crestron.SimplSharp.CrestronSockets.SecureTCPServer.SetServerPrivateKey(byte[])' has some invalid arguments public class SSLserver { SecureTCPServer SecureServer = new SecureTCPServer(); public SSLserver() { SecureServer.SetServerPrivateKey(???); SecureServer.SetServerCertificate(???); } } Без примеров беда просто

olegny: Да уж... с примерами у них туговато, но поскольку все очень похоже на обычный .NET, то все можно вытащить из MSDN. К примеру, параметр типа X509Certificate это объект класса с конструктором из того же массива байтов, которые есть не что иное как сертификат в ASN.1/DER формате, который, в свою очередь - простой декодинг base64 строки из PEM фотмата, который можно сгенерить с помощью OpenSSL утилиты вместе с приватным ключем в таком же формате для SetServerPrivateKey. Проблема в том, что это скорее всего будет self-signed сертификат или с "самопальным" CA, что может вызвать проблему на стороне клиента, но все решаемо... )) Задавайте вопросы конкретные и последовательно, а то трудно писать тут целые лекции... ;)

Вячеслав: 1.Да вот я и пытаюсь конкретные. Как из файла на NVRAM подтянуть сертификат и ключ и подставить в описанные функции? Генерация была бы тоже интересна, но ее по моему не предусмотрели. У меня например файлы в формате *.pem (cert.pem key.pem) сгенерированные утилитой OpenSSL. Т.е. получается надо еще декодить из base64 Пытаюсь использовать string strKey = File.ReadToEnd("\\NVRAM\\key.pem", Encoding.ASCII); string strCert = File.ReadToEnd("\\NVRAM\\cert.pem", Encoding.ASCII); Но как потом к формату параметров SecureServer.SetServerPrivateKey(???); SecureServer.SetServerCertificate(???); привести не знаю. Работа с файлами в simpl# описана тоже никак. По описанию функций вообще не понять какой открывать можно двоичный файл. 2.А сервис понятный есть для транзита HTTPS в HTTP, так чтобы в текущей сессии можно было отвечать. Направили на IFTTT, но там просто триггеры типа Webhook не предусматривающий ответов (

olegny: 1.Ну уже легче, но все равно есть неопределенности: эти pem файлы с паролем (зашифрованные) или нет? Если нет, то все просто: Из строки, в которую вы считали ваши файлы, убираете строки типа ----- ... -----, оставшуюся часть деокодите из base64 и скармливаете её x509 классу. Вот пример декодирования: byte[] GetBytesFromPEM(string pemString, string section) { var header = String.Format("-----BEGIN {0}-----", section); var footer = String.Format("-----END {0}-----", section); var start = pemString.IndexOf(header, StringComparison.Ordinal) + header.Length; var end = pemString.IndexOf(footer, start, StringComparison.Ordinal) - start; if (start < 0 || end < 0) { return null; } return Convert.FromBase64String(pemString.Substring(start, end)); } То же самое делаете с private key, только подсовываете получивщиеся байты непосредственно SetServerPrivateKey методу. Вообще, получить DER файлы можно заранее с помощью того же OpenSSL и считывать их сразу в byte[]. Описание работы с файлами не требуется просто по той причине, что нужно знать обычный C#: FileStream -> Read или BinaryReader 2. Ничего не понял... Какого еще транзита? Что нужно делать?

Вячеслав: Чем дальше в лес тем больше функций. Что ж так все сложно то. 1. Я так понимаю GetBytesFromPEM(string pemString, string section) это функция типа byte[], которая делает какие то преобразования (видимо убирает? строки типа ----- ... -----) со строкой переданной через параметр pemStrig? 2. В параметр pemString видимо нужно подставить переменную strKey полученную из файла. Что за параметр section ? что я должен туда подставить? в итоге выполнив метод SecureServer.SetServerPrivateKey(GetBytesFromPEM(strKey,???)); //где ??? некий section но SecureServer.SetServerCertificate(???); по прежнему хочет переменную типа X509Certificate и функцию GetBytesFromPEM с форматом byte[] ему не скормить. Про транзит это была идея не вникать в тонкости шифрования, а воспользоваться "готовым" инструментом у которого на выходе расшифрованные данные . Предположим клиент по https отправляет некие шифрованные данные на сервер https (организованный на каком то интернет сервисе с правильными выданными удостоверяющим центром сертификатами), сервис пересылает полученные данные мне на crestron, я их обрабатываю и в пределах этой сессии хочу отправить ответ клиенту по обратному пути (который только в пределах этой сессии и существует). Сервер-сервис получает от Crestron ответ, шифрует его и передает клиенту отправившему запрос.

olegny: Ну, так не пойдет... )) У вас уровень уж совсем какой-то "ламерский" и не столько в Simpl#, сколько в программировании на C# (или в программировании вообще?) Эдак мне придется за вас тут весь код написать! ;) 1. Я же привел исходный код этой функции выше! Как можно после этого употреблять слова типа "видимо", "какие-то"? )) 2. Вы когда-нибудь открывали ваш PEM файл в текстовом редакторе? Если бы открыли, то увидели, что в вашем случае параметр section это "CERTIFICATE" потому, что строки выглядят как: -----BEGIN CERTIFICATE----- и -----END CERTIFICATE----- И это был только _пример_ подобной функции, а вы можете сделать все по-своему, ибо самое главное там в конце: Convert.FromBase64String() Как только вы получите byte[] своего сертификата, вы должны скормить его конструктору X509Certificate класса, т.е. в результате все это может выглядеть типа такого: SecureServer.SetServerCertificate(new X509Certificate(GetBytesFromPEM(strCert, "CERTIFICATE"))) SecureServer.SetServerPrivateKey(GetBytesFromPEM(strKey, "<посмотрите что у вас там в PEM файле! :-)>" Насчет транзита... даже не хочу комментировать! )) Это может иметь смысл разве что внутри вашей LAN, но и то в общем случае не рекомендуюется.

Вячеслав: Спасибо, за пояснения.

olegny: Да не за что! ))) Я старательно расставлял смайлики в тексте чтобы не показалось, что я типа это все серьезно... ;) В зависимости от того какая у вас задача и если это все для HTTP, то я настоятельно рекомендую посмотреть в сторону CWS, где гораздо проще делать простые web странички или сервисы. https (шифрование и сертификат) тогда будет "на совести" IIS сервера от микрософта. Обращайтесь если что!

Courag1k: Коллеги, подскажите Скачал модуль с маркета Samsung IP Demo v 1.3 https://applicationmarket.crestron.com/samsung-ip-demo-v1-3/ Решил добавить в вызов помимо Youtube и Netflix приложение Megogo. Для этого нужно править S#. Но даже без каких-либо изменений файла, при компиляции выдается ошибка: "undefined variable 'NAMESPACE'" Строка имеет вид: "namespace Crestron.RAD.Drivers.Displays;" Все родное, а вылазит ошибка. Куда смотреть?

olegny: Что-то я вообще ничего не понял. Чем вы это компилили и что это за строчка такая? Откуда там точка с запятой в конце или namespace в начале?

Courag1k: Компилил самим симпл + (видимо не правильно, впервые столкнулся с этим) А namespace и точка с запятой стояли там сразу (такой файл с маркета скачан был)



полная версия страницы