View Full Version : انتخاب بخشی از کد ارسالی از میکروتیک
مهدی مرادی
یک شنبه 22 آبان 1401, 12:51 عصر
باسلام به مهندسین عزیز و گرامی. بنده کدی رو نوشتم که میره و تمامی اطلاعات مربوط به Interfaceهای میکروتیک رو برام میاره که در عکس بخشی از این کد مشخص هستش.
این کد در بخش Count قرار میگیره. میخواستم بدونم چجوری میتونم بخشی از این اطلاعاتی که میکروتیک ارسال کرده رو انتخاب و بصورت اتوماتیک مثلا در یک ComboBox قرار بدمشون. در اینجا مثلا میخوام فقط نام اینترفیس ها (که با مربع قرمز مشخص کردم) رو برام در یک Combobox قرار بده. ممنون میشم اگه عزیزان و اساتید کمکم کنن. با تشکر/
154189
SajjadKhati
یک شنبه 22 آبان 1401, 14:53 عصر
سلامی مجدد
اصلش بر اینه که مستقیما این اطلاعات را با ارسال دستورات میکروتیک بدست بیارید .
اما به هر حال وقتی این کار را نکردید ، در پست زیر راهنمایی کردم که جواب مناسب را ندادید :
https://barnamenevis.org/showthread.php?571788-%D9%81%D8%B1%D8%A7%D8%AE%D9%88%D8%A7%D9%86%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%D8%AA%DB%8C%DA%A9-%D9%88-%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-%D8%A2%D9%86%D9%87%D8%A7&p=2453933&viewfull=1#post2453933
وقتی نمیدونیم که اون متغییر list ، دقیقا از چه نوعی هست و چه اعضا و داده ها و اطلاعاتی توش هست ، نمیشه راهنمایی خاصی کرد .
بهتون هم گفتم اطلاعات و نوعش را بدست بیارید اما جواب مناسب را ندادید .
مهدی مرادی
دوشنبه 23 آبان 1401, 11:05 صبح
سلامی مجدد
اصلش بر اینه که مستقیما این اطلاعات را با ارسال دستورات میکروتیک بدست بیارید .
اما به هر حال وقتی این کار را نکردید ، در پست زیر راهنمایی کردم که جواب مناسب را ندادید :
https://barnamenevis.org/showthread.php?571788-%D9%81%D8%B1%D8%A7%D8%AE%D9%88%D8%A7%D9%86%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%D8%AA%DB%8C%DA%A9-%D9%88-%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-%D8%A2%D9%86%D9%87%D8%A7&p=2453933&viewfull=1#post2453933
وقتی نمیدونیم که اون متغییر list ، دقیقا از چه نوعی هست و چه اعضا و داده ها و اطلاعاتی توش هست ، نمیشه راهنمایی خاصی کرد .
بهتون هم گفتم اطلاعات و نوعش را بدست بیارید اما جواب مناسب را ندادید .
سلام مهندس جان. ببخشدی من الان دیدم. نمیدونم چرا پیام شمارو نمیاورد. برای همین مجبور شدم دوباره پست بذارم تا بلکه بتونم با شما صحبت کنم.
بله درست میفرمایید. من با دستورات خوده WPF تونستم MAC اینترفیس های میکروتیک رو بگیرم و این کار اشتباهه. من باید به وسیله دستورات میکروتیکی، بتونم اطلاعات مورد نظرم رو بگیرم و بیارم توی کمبو باکس نمایش بدم. ممنونم از راهنماییتون.
ولی واقعا کلافه شدم. همه جارو گشتم ولی هیچ چیزی پیدا نکردم که جوابی که میخوام رو بده بهم.
البته این سایت عالی بود برام ولی بازم چیزی که میخواستم رو نشد اجرا کنم. البته یه مورد نوشته که دقیقا همینی هست که من میخوام ولی وقتی این کد رو زدم برام کار نمیکنه.
https://forum.mikrotik.com/viewtopic.php?t=99954
در مورد مواردی که فرمودید. متغیر list همون اطلاعات مربوط به اینترفیس هارو داره ذخیره میکنه و میاره نمایش میده. همون مستطیل نارجی پایین صفحه عکس پست اولم. کل اطلاعات مربوط به اینترفیس میکروتیک رو میاره که به درد من نمیخوره این. چون من فقط نام اینترفیس (مستطیل قرمز) رنگ رو میخوام.
بازم از اینکه جوابتون رو ندادم ممنونم و واقعا لطف کردید که جوابمو دادین. تشکر از شما داداش گلم.
مهدی مرادی
دوشنبه 23 آبان 1401, 11:16 صبح
154197
وقتی این کد رو میزنم توی برنامم، این خروجی رو میده بهم:
154196
SajjadKhati
دوشنبه 23 آبان 1401, 14:07 عصر
سلام مهندس جان. ببخشدی من الان دیدم. نمیدونم چرا پیام شمارو نمیاورد. برای همین مجبور شدم دوباره پست بذارم تا بلکه بتونم با شما صحبت کنم.
بله درست میفرمایید. من با دستورات خوده WPF تونستم MAC اینترفیس های میکروتیک رو بگیرم و این کار اشتباهه. من باید به وسیله دستورات میکروتیکی، بتونم اطلاعات مورد نظرم رو بگیرم و بیارم توی کمبو باکس نمایش بدم. ممنونم از راهنماییتون.
ولی واقعا کلافه شدم. همه جارو گشتم ولی هیچ چیزی پیدا نکردم که جوابی که میخوام رو بده بهم.
البته این سایت عالی بود برام ولی بازم چیزی که میخواستم رو نشد اجرا کنم. البته یه مورد نوشته که دقیقا همینی هست که من میخوام ولی وقتی این کد رو زدم برام کار نمیکنه.
https://forum.mikrotik.com/viewtopic.php?t=99954
سلامی مجدد
ببینید ، من از دستورات میکروتیک چیزی نمیدونم .
در این باره اگه سئوال دارید که هیچ .
در مورد مواردی که فرمودید. متغیر list همون اطلاعات مربوط به اینترفیس هارو داره ذخیره میکنه و میاره نمایش میده. همون مستطیل نارجی پایین صفحه عکس پست اولم. کل اطلاعات مربوط به اینترفیس میکروتیک رو میاره که به درد من نمیخوره این. چون من فقط نام اینترفیس (مستطیل قرمز) رنگ رو میخوام.
بازم از اینکه جوابتون رو ندادم ممنونم و واقعا لطف کردید که جوابمو دادین. تشکر از شما داداش گلم.
میدونم اطلاعات مربوط به اینترفیس ها را ذخیره میکنه . این که مشخص هست .
منظورم اینه که کالکشن اش از چه نوعی هست و این کالکشن و مخصوصا آیتم هاش ، چه اعضایی دارن که ممکنه احیانا به دردتون بخوره؟
فرضا در چه عضوی از آیتم های این کالکشن ، اطلاعات مربوط به مقدار name (که در عکس اول ، حاشیه ی قرمز دورش کشیدین) را ذخیره میشه؟ یا اینکه شامل این اطلاعات میشه؟
و این اطلاعات ، به چه صورت و به چه نوعی ذخیره میشن (string هست یا نوع دیگه ای) ؟
فرضا در نوع List<T> (متغییر uiElementCollection در تصویر زیر) (بعد از پر شدن اش) ، break point که بذارید و فِلِشِ کنارش را بزنید ، علاوه بر لیست شدن آیتم هاش ، گزینه ی آخری بنام "Raw View" که در تصویر زیر با رنگ زرد مشخص هست را میاره که بعضی از اعضای کالکشن از جمله اعضای استاتیک و خصوصی اش را لیست میکنه .
https://barnamenevis.org/attachment.php?attachmentid=154198&stc=1
در متغییر list تون ، روی این گزینه اش (Raw View اش) برید و فِلِشِ کنارش را بزنید .
گزینه ای میاره بنام (Non-Public Member) (باز هم گزینه ی آخری هست) . روی این گزینه اش هم برید و فِلِشِ کنارش را بزنید .
گزینه ای بنام "_items" میاره که در جلوش ، نوعش نوشته . نوع این را بگید چیه؟
مهمتر اینکه در آیتم های مربوط به متغییر list تون برید . یعنی فِلِشِ کنارِ آیتم ها را کلیک کنید (مثل گزینه ی 0 و 1 و 2 در تصویر بالا که کنارشون فِلِش هست) و توی لیست اعضاش ببینید که آیا عضوی هست که همچین داده ای که مد نظر دارید (مقدار name در تصویر پست اول که قرمز کردید) ، در اون ذخیره شده باشه یا نه (تمام اعضای زیر مجموعه ی اعضای داخلی اش را هم ممکنه لازم باشه بگردید) .
اگه اطلاعات مورد نیازتون را پیدا نکردید ، (در همون صفحه ای که آیتم های داخل list را جستجو میکنید) بیاید به قسمت آخر و فِلِشِ کنار گزینه ی Non-Public Member را بزنید و در لیست این صفحه جستجو کنید که آیا عضوی هست که داده ی مد نظرتون را در اون ببینید یا نه؟ (دقت کنید که این Non-Public Member ، با اونی که قبلا گفتم ، فرق دارن چون اون برای شی مربوط به کلاس کالکشن بود و این مربوط به شی آیتم های مربوط به کلاس کالکشن هست) .
---------
نیاز به اطلاعات داره ولی شما به زور اطلاعات میدید یا قطره چکونی میدید . با ارسال عکس که نمیشه به سرعت مفهوم را منتقل کرد .
مهدی مرادی
سه شنبه 24 آبان 1401, 11:20 صبح
سلام مهندس جان. ببخشید من زیاد برنامه نویسی بلد نیستم و دارم شمارو اذیت میکنم شرمندم.
اوامری که فرمودید رو الان میگم خدمتتون و اگر خواستید مشکلی نیست که کد رو کامل تقدیمتون کنم عزیزم. فقط نمیدونم چجوری باید برسونم به دستتون و اینکه اجازه این کارو در اینجا دارم یا نه؟
در رابطه با مورد اول که فرمودید، فکر میکنم این عکس جواب شمارو بده عزیز (واقعا ممنونم که اینقدر کامل توضیح دادین. خیلی چیزا از این راهنماییتون یاد گرفتم): نوعش Int هستش
154205
مورد دوم در مورد اینکه آیا داده ای رو میده که بخوامش بله، الان دیدم که در هر کدوم از موارد 0 و 1 و 2 گزینه ای به نام Name وجود داره که دقیقا همون چیزیه که من میخوامش و اگر بتونم اینو بصورت جداگانه بیارمش توی کمبو باکسم، ماجرا درست میشه کاملا :قلب::قلب::قلب::قلب::قلب::قلب:: لب:
154206
SajjadKhati
سه شنبه 24 آبان 1401, 20:57 عصر
سلام
این رو تست کنید (در کد Window ای که Combobox هست و همچنین در Resource ئه این Window) :
<Window xmlns:MikrotikInterface="clr-namespace:tik4net.Objects.Interface">
<Window.Resources>
<DataTemplate x:Key="InterfaceEthernet_ItemTemplateKey"
DataType="{x:Type MikrotikInterface:InterfaceEthernet}">
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</DataTemplate>
</Window.Resources>
</Window>
در کد combobox :
<ComboBox ItemTemplate="{StaticResource InterfaceEthernet_ItemTemplateKey}"/>
در کد اول ، مقدار فضای نامِ xmlns:MikrotikInterface را چک کنید که درست باشه و کار کنه (که بر اساس کلاس InterfaceEthernet تون ممکنه تغییر کنه) .
همچنین ممکنه لازم بشه که در ادامه ی این دستور ، از پارامتر assembly استفاده کنید . یعنی فرضا اون دستور را به شکل زیر بنویسید :
xmlns:MikrotikInterface="clr-namespace:tik4net.Objects.Interface;assembly=Assem blyName"
که بجای AssemblyName در بالا ، نام اسمبلی (معمولا نام dll شاید اون هم بدون پسوند dll یا کتابخونه) را مینویسید .
همچنین دقت کنید فضای نام ای که در مقابل clr-namespace نوشتم هم درست باشه (یعنی مسیر tik4net.Objects.Interface ، به عنوان فضای نام ، درست باشه) .
دقت کنید که پروپرتی Name (ئه کلاس InterfaceEthernet) ، چون احتمالا خودش و این کلاس اش اینترفیس INotifyPropertyChanged را پیاده سازی نکرد ، اگه بار اول ، مقدار این پروپرتی تغییر کنه ، شاید این کد عمل کنه اما اگه اون اینترفیس را پیاده سازی نکرده باشه ، با تغییر مقدار این پروپرتی ، این Binding و در نتیجه کمبوباکس تون نمیتونه از تغییرش مطلع بشه و نمیتونه تغییر کنه .
مهدی مرادی
پنج شنبه 26 آبان 1401, 08:36 صبح
سلام
این رو تست کنید (در کد Window ای که Combobox هست و همچنین در Resource ئه این Window) :
<Window xmlns:MikrotikInterface="clr-namespace:tik4net.Objects.Interface">
<Window.Resources>
<DataTemplate x:Key="InterfaceEthernet_ItemTemplateKey"
DataType="{x:Type MikrotikInterface:InterfaceEthernet}">
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</DataTemplate>
</Window.Resources>
</Window>
در کد combobox :
<ComboBox ItemTemplate="{StaticResource InterfaceEthernet_ItemTemplateKey}"/>
در کد اول ، مقدار فضای نامِ xmlns:MikrotikInterface را چک کنید که درست باشه و کار کنه (که بر اساس کلاس InterfaceEthernet تون ممکنه تغییر کنه) .
همچنین ممکنه لازم بشه که در ادامه ی این دستور ، از پارامتر assembly استفاده کنید . یعنی فرضا اون دستور را به شکل زیر بنویسید :
xmlns:MikrotikInterface="clr-namespace:tik4net.Objects.Interface;assembly=Assem blyName"
که بجای AssemblyName در بالا ، نام اسمبلی (معمولا نام dll شاید اون هم بدون پسوند dll یا کتابخونه) را مینویسید .
همچنین دقت کنید فضای نام ای که در مقابل clr-namespace نوشتم هم درست باشه (یعنی مسیر tik4net.Objects.Interface ، به عنوان فضای نام ، درست باشه) .
دقت کنید که پروپرتی Name (ئه کلاس InterfaceEthernet) ، چون احتمالا خودش و این کلاس اش اینترفیس INotifyPropertyChanged را پیاده سازی نکرد ، اگه بار اول ، مقدار این پروپرتی تغییر کنه ، شاید این کد عمل کنه اما اگه اون اینترفیس را پیاده سازی نکرده باشه ، با تغییر مقدار این پروپرتی ، این Binding و در نتیجه کمبوباکس تون نمیتونه از تغییرش مطلع بشه و نمیتونه تغییر کنه .
سلام مهندس. ممنون که وقت گذاشتین ولی متاسفانه من اصلا نتونستم متوجه بشم چیکار باید بکنم؟ این اوامری که فرمودین رو انجام دادم ولی کلا خطا میده بهم و نمیدونم چیکار باید کنم؟
راستش من از یکی پرسیدم گفت باید این آیتم هارو یکی یکی بخونم و بعد بیام Name رو صدا بزنم. الان شمام اینکارو گفتین انجام بدم؟؟
امکان گرفتن Anydesk رو دارین عزیز؟
SajjadKhati
پنج شنبه 26 آبان 1401, 09:45 صبح
سلام مهندس. ممنون که وقت گذاشتین ولی متاسفانه من اصلا نتونستم متوجه بشم چیکار باید بکنم؟ این اوامری که فرمودین رو انجام دادم ولی کلا خطا میده بهم و نمیدونم چیکار باید کنم؟
سلامی مجدد
من دیگه چجوری بگم؟
کدش که آماده دادم .
کدی که نوشتید و اروری که میده را اینجا بذارید .
ضمنا ، اون متغییر list ای که از خروجیِ متدِ cmd.ExecuteScalar پر میشه ، و از متغییر list ، به عنوان ItemsSource استفاده میکنید ، بهتره که بجای این کار ، این متغییر را به عنوان پروپرتی (سراسری) تعریف کنید (البته توصیه میشه که این پروپرتی از نوع ObservableCollection باشه یا حداقل اینکه اینترفیس INotifyPropertyChanged را پیاده سازی کنید) و بعد ItemsSource ئه ComboBox را به این پروپرتی ، Binding کنید .
راستش من از یکی پرسیدم گفت باید این آیتم هارو یکی یکی بخونم و بعد بیام Name رو صدا بزنم. الان شمام اینکارو گفتین انجام بدم؟؟
امکان گرفتن Anydesk رو دارین عزیز؟
بله .
این که بدیهی هست .
در یه حلقه ، عضو Name در آیتم های آرایه ی list تون را به عنوان source اضافه کنید .
یعنی بجای COM1.ItemsSource = list در کدتون :
for(int index = 0; index < list.Count; index++)
{
COM1.Items.Add(list[index].Name);
}
اما این روش ، اصولی نیست (حداقل برای wpf که سیستم binding خوبی داره) .
مهدی مرادی
شنبه 28 آبان 1401, 10:55 صبح
سلامی مجدد
من دیگه چجوری بگم؟
کدش که آماده دادم .
کدی که نوشتید و اروری که میده را اینجا بذارید .
ضمنا ، اون متغییر list ای که از خروجیِ متدِ cmd.ExecuteScalar پر میشه ، و از متغییر list ، به عنوان ItemsSource استفاده میکنید ، بهتره که بجای این کار ، این متغییر را به عنوان پروپرتی (سراسری) تعریف کنید (البته توصیه میشه که این پروپرتی از نوع ObservableCollection باشه یا حداقل اینکه اینترفیس INotifyPropertyChanged را پیاده سازی کنید) و بعد ItemsSource ئه ComboBox را به این پروپرتی ، Binding کنید .
بله .
این که بدیهی هست .
در یه حلقه ، عضو Name در آیتم های آرایه ی list تون را به عنوان source اضافه کنید .
یعنی بجای COM1.ItemsSource = list در کدتون :
for(int index = 0; index < list.Count; index++)
{
COM1.Items.Add(list[index].Name);
}
اما این روش ، اصولی نیست (حداقل برای wpf که سیستم binding خوبی داره) .
سلام خوبین مهندس؟ کد رو میفرستم الان خدمتتون ولی تا وقتی یه میکروتیک نداشته باشین، بهتون جوابی نمیده چون باید بره و از یه میکروتیک اطلاعات اینترفیس هاشو برداره بیاره.
متاسفانه اینجا نتونستم بیارمش چون حجم فایلش چند کیلوبایت بیشتر میشد. لطفا از این لینک دانلودش کنین ممنون:
http://up44.ir/70sp2ade
SajjadKhati
شنبه 28 آبان 1401, 11:57 صبح
سلام خوبین مهندس؟ کد رو میفرستم الان خدمتتون ولی تا وقتی یه میکروتیک نداشته باشین، بهتون جوابی نمیده چون باید بره و از یه میکروتیک اطلاعات اینترفیس هاشو برداره بیاره.
متاسفانه اینجا نتونستم بیارمش چون حجم فایلش چند کیلوبایت بیشتر میشد. لطفا از این لینک دانلودش کنین ممنون:
http://up44.ir/70sp2ade
چه چیز را تست کنم وقتی کد COM1 تون هنوز اینه :
<ComboBox x:Name="COM1" HorizontalAlignment="Left" Margin="27,27,0,0" VerticalAlignment="Top" Width="389" IsSynchronizedWithCurrentItem="True"/>
اما من کد پست 7 را داده بودم؟
یا اینکه کد Button_Click تون اینه :
//COM1.ItemsSource = list;
اون هم توی کامنت هست ، اما کد پست 9 را داده بودم؟
ضمن اینکه من میکروتیک ندارم که نتیجه ی نهایی شو ببینم .
مهدی مرادی
دوشنبه 30 آبان 1401, 09:05 صبح
چه چیز را تست کنم وقتی کد COM1 تون هنوز اینه :
<ComboBox x:Name="COM1" HorizontalAlignment="Left" Margin="27,27,0,0" VerticalAlignment="Top" Width="389" IsSynchronizedWithCurrentItem="True"/>
اما من کد پست 7 را داده بودم؟
یا اینکه کد Button_Click تون اینه :
//COM1.ItemsSource = list;
اون هم توی کامنت هست ، اما کد پست 9 را داده بودم؟
ضمن اینکه من میکروتیک ندارم که نتیجه ی نهایی شو ببینم .
سلام مهندس جان. ببخشید من مرخصی بودم که دیر جواب شمارو دادم. خداروشکر این اوکی شد. با این کد جواب ها برام آورده شد.
try {
using (ITikConnection connection = ConnectionFactory.CreateConnection(TikConnectionTy pe.Api))
{
Debug.WriteLine("start");
connection.OnReadRow += Connection_OnReadRow;
connection.OnWriteRow += Connection_OnWriteRow;
connection.Open("192.168.1.25", "admin", "123456");
var cmd = connection.CreateCommandAndParameters("/interface/print");
var list = cmd.LoadList<InterfaceEthernet>();
COM1.Items.Clear();
foreach (var item in list)
{
COM1.Items.Add($"{item.Name} [{item.MacAddress}]");
}
Console.WriteLine("Identity: " + /*identity.GetResponseField("name")*/ list);
Debug.WriteLine("Count=" + list);
Console.WriteLine("Press ENTER");
Console.ReadLine();
Debug.WriteLine("end");
}
}
catch (Exception error)
{
Debug.WriteLine(error.Message);
}
و جوابش هم اینجوری میاد برام:
154236
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.