ورود

View Full Version : فراخوانی داده از میکروتیک و مقایسه آنها



مهدی مرادی
شنبه 07 آبان 1401, 10:40 صبح
باسلام و احترام خدمت برنامه نویسان عزیز. بنده متاسفانه بصورت حرفه ای برنامه نویسی بلد نیستم. یه برنامه نوشتم که مقادیر رو از کاربر میگیره و به وسیله API به میکروتیک متصل میشه و تغییراتی که کاربر میخواد رو روی میکروتیک اعمال میکنه و در نهایت API رو میبنده. تو این مرحله میخوام برنامه بره و اطلاعات میکروتیک رو بگیره و بیاره و با مقادیری که کاربر میزنه مقایسه کنه و اگر مقادیر وارد شده متفاوت بود، تغییرات رو روی میکروتیک اعمال کنه. مثلا در مرحله اول، میخوام اسامی Interfaceهای میکروتیک رو بیاره و بهم نشون بده. تا اینجای برنامه که نوشتم میره و Count رو برابر با 3 قرار میده (مطابق تصویر) ولی نمیدونم چجوری باید اسامی این Interface هارو مثلا توی یه لیست کشویی یا ComboBox نمایش بده الان اطلاعات غلطی رو میاره برام نمایش میده در COM1. اگر عزیزان کمکم کنن واقعا ازشون ممنون میشم...
154130

SajjadKhati
شنبه 07 آبان 1401, 14:21 عصر
سلام
اگه منظورتون اینه که در آخر تصویری که نشون دادید ، مقدار identity را بجای 3 ، متن List<ITikReSentence> نشون میده ، بخاطر اینه که هر چند نوع این متغییرِ identity (یا هر چیزی که هست) را نشون ندادید ، اما از نوع List ای از ITikReSentence یا فرزندانشون هست .
اون 3 ای هم که نشون میده ، تعداد اعضای این کالکشن هست .


کالکشن هم مستقیما که در دستور کنسول نمایش داده نمیشه . باید پروپرتی مورد نظر اعضاشون را مشخص کنید که کدوم پروپرتی (یا فیلد و ...) از عضوِ این کالکشن از این را نشون بده .
در پروپرتیِ Items یا ItemsSource ئه ComboBox هم همینطوره . باید پروپرتی (یا پروپرتی های) مورد نظر از اعضای کالکشن را مشخص کنید .
مگر اینکه براش و در پروپرتیِ ItemTemplate اش مشخص کنید که چه پروپرتی از اعضای این کالکشن را نمایش بده .

مهدی مرادی
شنبه 07 آبان 1401, 16:33 عصر
سلام دوست عزیز. ممنونم که وقت گذاشتین و جوابمو دادین تشکر واقعا
اگر تو عکس اول که از نتیجه ارسال اطلاعات در کومبو باکس گذاشتیم ملاحظه کنید، 4 تا نتیجه داده که نوشته ApiReSentance.id=*1|name=ether1-moradi و...
من فقط میخوام قسمت name=ether1-moradi رو نشون بده
البته کلمه name رو هم نمیخوام. فقط مقداری از نام این Interface هارو میخوام بیاره و نمایش بده توی کومبو باکسم.
در واقع میخوام تو خط اول فقط بنویسه:
ether1-moradi
ether2
ether3
و...

SajjadKhati
شنبه 07 آبان 1401, 18:59 عصر
سلام دوست عزیز. ممنونم که وقت گذاشتین و جوابمو دادین تشکر واقعا
اگر تو عکس اول که از نتیجه ارسال اطلاعات در کومبو باکس گذاشتیم ملاحظه کنید، 4 تا نتیجه داده که نوشته ApiReSentance.id=*1|name=ether1-moradi و...
من فقط میخوام قسمت name=ether1-moradi رو نشون بده
البته کلمه name رو هم نمیخوام. فقط مقداری از نام این Interface هارو میخوام بیاره و نمایش بده توی کومبو باکسم.
در واقع میخوام تو خط اول فقط بنویسه:
ether1-moradi
ether2
ether3
و...

اول اینکه اینترفیس ها اصلا پیاده سازیِ اعضا و بدنه ای برای اعضاشون ندارن که بخواد ازش شی ساخته بشه تا بخواین اعضاش را استفاده کنید . بلکه شی از کلاس هایی که اون اینترفیس مورد نظر را پیاده سازی میکنه ، مورد استفاده قرار میگیره .

به قول تون خط اول در کمبوباکس ، کد را بصورت زیر نشون میده :

ApiReSentance.id=*1|name=ether1-moradi ...

چون اعضای کاکشنِ identity که از نوع ITikReSentence یا فرزندانشون هستن (چون من که با سلسله مراتب ارث بری ITikReSentence ، و نوع identity آشنا نیستم که دقیق چیه و از عکس بالا هم نمیشه چیزی تشخیص داد) ، در اون کلاس ، متد ToString اش ، اون طور بازنویسی شد .

شما یا باید کلاسی بسازید که از نوعی که اعضای identity هستن ، ارث بری کنه و در اون کلاس ، متد ToString را بصورت شخصی و هر طور که میخواید ، بازنویسی کنید و بعد ، نوع اعضای identity را این بار ، شی ای از کلاس جدیدتون در نظر بگیرید (یا متد ToString را بصورت Extension Method استفاده کنید) .

یا اینکه روش اصولی تر اینه که برای ComboBox تون ، یک ItemTemplate در نظر بگیرید (در این صورت ، عضو مورد نظرتون برای Binding ، باید پروپرتی باشه) .


یا اینکه نهایتا ، بجای خط زیر :



COM1.ItemsSource = identity;


در کد بالاتون ، بجاش ، از پروپرتیِ Items ئه ComboBox استفاده کنید و اون پروپرتی (یا فیلد و ...) از اعضای کالکشن identity را مستقیما توش بنویسید .
فرضا مقدار name ای که میگید را بنویسید . چون من که نمیدونم مقدار name ، در چه پروپرتی و یا عضوی ذخیره هست . نمیدونم آیا اسم اون عضو ، همین name هست یا نه . چون شما به کد دسترسی دارید و از اطلاعاتی که دادید ، مشخص نیست که مقدار اون ether1-moradi ای که گفتید ، با نامِ چه عضوی ذخیره هست .

اگه فرضا اون ITikReSentence تون ، شی مورد نظر باشه و عضوی که در اون مد نظر دارین ، عضوی بنام "name" باشه ، این طور میشه :



COM!.Items.Add(identity[0].name);


اون 0 هم ، ایندکس 0 ام از آرایه ی مورد نظر هست .

اما اگه شرایطِ Binding برای اعضای این کلاس مورد نظرتون مناسب هست (هم عضو مورد نظرتون ، پروپرتی باشه و هم اون کلاسِ کالکشن تون ، اینترفیس INotifyPropertyChanged را برای ایندکسر مورد نظر پیاده یازی میکنن . البته اگه زمانی که مقدار کالکشن تون تغییر میکنه ، براتون مهم باشه) ، بهتره بجای این کدها ، در xaml ، پروپرتی ItemsSource را Binding کنید . براش هم ItemTemplate بنویسید .

مهدی مرادی
یک شنبه 08 آبان 1401, 11:52 صبح
سلام مهندس جان؛ واقعا ممنونم بابت راهنمایی عالی که کردین منو. طبق دستورات شما داشتم پیش میرفتم که توضیحاتتون یه چیزی رو توی ذهنم آورد، اونم این بود که باید یه کاری کنم فقط دیتای مربوط به نام interfaceهارو برام بیاره که به این دستور توی میکروتیک رسیدم: /interface/print proplist=default-name
با این دستور فقط لیست interfaceهای میکروتیک رو لیست میکنه که جوابش این بود:
# DEFAULT-NAME
0 R ether1
1 R ether2
2 R ether3

حالا مشکل جدیدم اینه که وقتی میخوام این دستور رو توی کد بنویسم باید از دستور Connection.CreateParameter استفاده کنم و وقتی این دستور رو میزنم مقدار Count رو بهم صفر میده. ولی وقتی این دستور رو برمیدارم، بهم مقدار Count رو مقدار 3 میده. وقتی ام دستور رو کامل روبروی CreateCommand میزنم هم ارور میده و ازم این دستور رو قبول نمیکنه چون فاصله بین Print و proplist رو نمیفهمه. خیلی سخت شده. از صبح درگیرشم ولی هنوز نتونستم راهی براش پیدا کنم. این مورد رو بتونم حل کنم دیتایی که میاره برام کاملا همونیه که میخوام و مشکل کامل حل میشه، البته امیدوارم :لبخند::لبخند:
154138

SajjadKhati
یک شنبه 08 آبان 1401, 14:02 عصر
آها ، منظورتون از اینترفیس ، اینترفیسِ سی شارپ نیست . بلکه یه اصطلاحی در میکروتیک هست .
من که نه میدونم میکروتیک چیه و نه با کلاس و توابعش کار کردم . بنابراین کمک چندانی نمیتونم در مسئله ی پست قبلی تون کنم .
خودتون باید اسنادش را کامل بخونید و ببینید چجوری کار میکنه (که فکر کنم اسنادش در زیر باشه) :

GitHub - danikf/tik4net: Manage mikrotik routers with .NET C# code via ADO.NET like API or enjoy O/R mapper like highlevel api. (https://github.com/danikf/tik4net)

و

Manual:API - MikroTik Wiki (https://wiki.mikrotik.com/wiki/Manual:API)

=======

ولی ظاهرا شما از یه شی (شی connection)، در ورودیِ متدِ CreateCommand هم از همون شی استفاده کردید . البته این دلیل نمیشه ولی میگم حواستون به این قسمت هم باشه .
کلا طرز استفاده از کلاس های میکروتیک را خودتون باید پیگیری کنید .

مهدی مرادی
دوشنبه 09 آبان 1401, 15:16 عصر
سلام مهندس جان. بله منظورم اینترفیس میکروتیک هستش. یعنی نام اینترفیس های میکروتیک رو بهم نشون بده توی ComboBox. ببخشید اگه خوب توضیح ندادم و شمارو گیج کردم عزیزم.
بله سایت github رو خوندم و دقیقا همین صفحه رو هم دیدم ولی وقتی تیکه کد:

ITikCommand cmd = connection.CreateCommandAndParameters(@"/interface/print ?proplist=default-name
?#|");
میزنم نتیجه اطلاعات دیگه ای رو میاره برام. گرچه تعداد رو درست نشون میده ولی توی combobox اطلاعات دیگه ای رو میاره...
154142

SajjadKhati
دوشنبه 09 آبان 1401, 15:50 عصر
سلام مهندس جان. بله منظورم اینترفیس میکروتیک هستش. یعنی نام اینترفیس های میکروتیک رو بهم نشون بده توی ComboBox. ببخشید اگه خوب توضیح ندادم و شمارو گیج کردم عزیزم.
بله سایت github رو خوندم و دقیقا همین صفحه رو هم دیدم ولی وقتی تیکه کد:

ITikCommand cmd = connection.CreateCommandAndParameters(@"/interface/print ?proplist=default-name
?#|");
میزنم نتیجه اطلاعات دیگه ای رو میاره برام. گرچه تعداد رو درست نشون میده ولی توی combobox اطلاعات دیگه ای رو میاره...
154142

سلامی مجدد
شما چه در این کد (یا حتی کدهای پست های قبلی) ، روی خطی که متغییر identity مقدار میگیره ، یه break point بذارید و یه بار f10 را بزنید (تا کنترل ، به خطِ بعد از خطی که متغییر identity تعریف شده بود ، بره) و بعدش موس را روی متغییر identity ببرید . در این صورت کنار و در سمت چپ مقداری که برای identity نشون میده ، یه فِلِش هست (تا اینجا مثل عکس دوم در پست اول که گذاشته بودید) .
روی اون فِلِش کلیک کنید تا لیست اش باز بشه و در اونجا ببینید چه عضوی پیدا میکنید و آیا عضوی پیدا میکنید که مد نظرتون باشه؟


نهایتا اگه خواستید ، پروژه تون را اینجا بذارید تا شاید ببینم میتونم کمک کنم یا نه (نمیدونم بتونم کمکی کنم یا نه . چون هیچ آشنایی ای با میکروتیک ندارم و اصلا نمیدونم چیه و قضیه ی اینترفیس هاشم که گفتید ، نمیدونم) .
میکروتیک ، یه قطعه ی سخت افزاری هست؟ یعنی برای اجرای این برنامه تون ، نیاز به داشتن اون قطعه ی سخت افزاری هست؟

مهدی مرادی
سه شنبه 10 آبان 1401, 08:55 صبح
سلام وقت بخیر. بله مهندس جان میکروتیک یه چیزی مثل سوئیچ و روتر های سیسکو هستش ولی تفاوت های زیادی رو داره. منم میخوام براش به وسیله این برنامه Script بنویسم که کار حدود 30 دقیقه تا 4 ساعت رو تو یه لحظه خودش انجام بده و ایرادات کانفیگ کردن میکروتیک رو خودش پیدا کنه و اعمال کنه و در نهایت گزارش بده که چه تغییراتی رو اعمال کرده.
الان یه کد رو تصادفی زدم و اطلاعات نام میکروتیک رو آورد و توی combobox و TextBox آورد.
154143
مشکل اینجاست که وقتی میخوام دستور /interface/print proplist=default-name رو بزنم، چون proplist یه Parametr محسوب میشه، قبول نمیکنه این دستور رو پشت سر هم بنویسم. اگر فقط دستور interface/print رو بزنم، کار میکنه ولی کل اطلاعات interfaceهارو میاره که اصلا به درد من نمیخوره (همون عکس اولی که گذاشتم و کلی اطلاعات اضافی داشت). اگرم بخوام دستور رو به این شکل بنویسم، جواب خالی میاره و هیچی نمایش نمیده.

var cmd = connection.CreateCommand("/interface/print", connection.CreateParameter("proplist", "default-name")
);


var list = cmd.ExecuteList();

اگر کد رو هم اینجوری بزنم بازم جواب اطلاعات کامل اینترفیس هارو میاره برام که میشه مثل مدل اول که بازم به دردم نمیخوره این:

var cmd = connection.CreateCommandAndParameters(@"/interface/print ?proplist=default-name
?#|");


var list = cmd.ExecuteList();

گیر کردم سر اینکه دستور proplist=default-name رو چجوری بهش بگم تا فقط اطلاعات نام اینترفیس هارو بیاره برام...:افسرده::افسرده:

SajjadKhati
سه شنبه 10 آبان 1401, 13:14 عصر
چیزی که در پست قبلی گفتم را انجام بدید .
همچنین در اینترفیس (یا کلاس) ITikReSentence (کلا درون کلاسِ نوع متغییر identity) و همچنین در فرزندانش برید و ببینید چه اعضایی داره .

با تصادفی زدن کد که نمیشه کاری ازش پیش برد . اول باید مستنداتش را کامل بخونید و بعد کد بنویسید .