<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: jaymin93</title>
    <description>The latest articles on DEV Community by jaymin93 (@jaymin93).</description>
    <link>https://dev.to/jaymin93</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F607881%2F9f549796-12db-4c7a-92ee-4478a39d6ad9.png</url>
      <title>DEV Community: jaymin93</title>
      <link>https://dev.to/jaymin93</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jaymin93"/>
    <language>en</language>
    <item>
      <title>Plant Health evaluation using Raspberry Pi, Xamarin Forms App,Azure Function, Table,Storage, Key vault, Custom vision, Drone</title>
      <dc:creator>jaymin93</dc:creator>
      <pubDate>Mon, 31 Oct 2022 13:07:18 +0000</pubDate>
      <link>https://dev.to/jaymin93/plant-health-evaluation-using-raspberry-pi-xamarin-forms-appazure-function-tablestorage-key-vault-custom-vision-drone-4nn5</link>
      <guid>https://dev.to/jaymin93/plant-health-evaluation-using-raspberry-pi-xamarin-forms-appazure-function-tablestorage-key-vault-custom-vision-drone-4nn5</guid>
      <description>&lt;p&gt;&lt;strong&gt;- Problem Statement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To Maintain healthiness of the Plant in larger area of farm is really challenging, Farmers needs to keep an eye on the plants they grow whether it is not affected by insects or disease, it requires manual inspection of plants by multiple farm workers and navigate through entire area of farm and inspecting them manually which is taking down many days for the farm workers and this needs to be repeated periodically which is consuming lots of time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3og0ILgFOEXIL8Bsn6/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3og0ILgFOEXIL8Bsn6/giphy.gif" alt="busy farmer" width="400" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Solution/ Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This problem can be solved using Azure based solution where drone can capture images of elephant ear plant and identify if plant is affected by Insect or diseases using Azure Storage account which will hold the image captured by drone and it will be processed against the custom vision in which has trained images of healthy, and insect or diseases affected plants&lt;br&gt;
&lt;a href="https://i.giphy.com/media/5bivKwxhVzshNk2Rjw/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/5bivKwxhVzshNk2Rjw/giphy.gif" alt="busy farmer" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please refer &lt;strong&gt;Application flow&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A9t2BSHp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/afptcxxv5d2buy1a3rv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9t2BSHp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/afptcxxv5d2buy1a3rv6.png" alt="Image description" width="880" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;we will need following. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Subscription&lt;/strong&gt;: &lt;a href="https://azure.microsoft.com/en-us/free/"&gt;https://azure.microsoft.com/en-us/free/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.Net sdk 6.0&lt;/strong&gt; : - &lt;a href="https://dotnet.microsoft.com/en-us/download/dotnet/6.0"&gt;https://dotnet.microsoft.com/en-us/download/dotnet/6.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual Studio 2022&lt;/strong&gt;: - &lt;a href="https://visualstudio.microsoft.com/vs/community/"&gt;https://visualstudio.microsoft.com/vs/community/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visual Studio needs following workloads.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZzVXhgP0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fkx3ltxwbrzv54y8sx1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZzVXhgP0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fkx3ltxwbrzv54y8sx1g.png" alt="Image description" width="880" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Custom Vision&lt;/strong&gt;: -&lt;a href="https://www.customvision.ai/"&gt;https://www.customvision.ai/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YyCZR9YW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5lkul37r5bagapj5mmeg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YyCZR9YW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5lkul37r5bagapj5mmeg.png" alt="Image description" width="880" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yZ4_Mykd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/90dwmtbw3xo152wieze5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yZ4_Mykd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/90dwmtbw3xo152wieze5.png" alt="Image description" width="551" height="936"&gt;&lt;/a&gt;&lt;br&gt;
Click on create Project. Upload healthy and infected plant images and tag the uploaded images and perform the quick training.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aOHCKoGv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wlgl4g26bbwh6m76z9ev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aOHCKoGv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wlgl4g26bbwh6m76z9ev.png" alt="Image description" width="880" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Goto Performance Tab follow the steps and copy the url and key which will be used to access it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hTMcrppk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v8e8foizs54yusicir7a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hTMcrppk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v8e8foizs54yusicir7a.png" alt="Image description" width="880" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drone with Camera and GPS Module&lt;/strong&gt;:- Drone supported by Parrot SDK and having FTP Server , learn more here &lt;a href="https://www.parrot.com/"&gt;https://www.parrot.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please find the Github Link for the Project, you will need to enter correct Azure resources (e.g. storage , table , custom vision end point , ftp) values to run the Project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jaymin93/PlantHealthApp"&gt;https://github.com/jaymin93/PlantHealthApp&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-Technical Details and Implementation of solution&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://i.giphy.com/media/ZVik7pBtu9dNS/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ZVik7pBtu9dNS/giphy.gif" alt="busy farmer" width="480" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. PlantHealthConsoleApp&lt;/strong&gt; :- &lt;strong&gt;.net 6&lt;/strong&gt; Console App&lt;/p&gt;

&lt;p&gt;App will monitor Drone created FTP which will have images captured by Drone from farm, app will periodically check FTP server and images will be copied to destination directory from where it will be uploaded to &lt;strong&gt;Azure Storage as a Blob&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start Visual studio 2022 follow below steps&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jb6zxB1C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v1axlbebsgogn9cy1191.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jb6zxB1C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v1axlbebsgogn9cy1191.png" alt="Image description" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JpUy2JDD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9dnddkrnvkkren75zse.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JpUy2JDD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9dnddkrnvkkren75zse.png" alt="Image description" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please provide the Name and Path for the Project.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z4KFqVKg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zh4b4nigfa6x9cppcciy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z4KFqVKg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zh4b4nigfa6x9cppcciy.png" alt="Image description" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;.net 6 LTS&lt;/strong&gt; (For Production workloads LTS is highly recommended) Click on Create it will create Console Project. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IehqNaeB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ixdr4o8ruogvql117dq5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IehqNaeB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ixdr4o8ruogvql117dq5.png" alt="Image description" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once Project has created, we will need below Nuget Packages which can be added from the below option&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lqnRYOZ9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uje5ljaqsfe9q7ud4kfw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lqnRYOZ9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uje5ljaqsfe9q7ud4kfw.png" alt="Image description" width="880" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ekhkEFcT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hszzwprc4bl9t9hguvwn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ekhkEFcT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hszzwprc4bl9t9hguvwn.png" alt="Image description" width="880" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will connect to Ftp server created by drone and get the values from the &lt;strong&gt;&lt;em&gt;appsettings.json&lt;/em&gt;&lt;/strong&gt; e.g. blob storage uri , ftp information and Secret Identifier &lt;/p&gt;

&lt;p&gt;We will need Storage account and Azure keyvault Secret information for that go to &lt;a href="https://portal.azure.com/"&gt;https://portal.azure.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create new Storage account&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BWDDzfId--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iydelj43cty627sx9bks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BWDDzfId--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iydelj43cty627sx9bks.png" alt="Image description" width="880" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AJXdwfN2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ga3nh2ii3wq2om2zvjjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AJXdwfN2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ga3nh2ii3wq2om2zvjjl.png" alt="Image description" width="880" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;enter resource group name or select existing and add storage account name&lt;/p&gt;

&lt;p&gt;select review+create.&lt;/p&gt;

&lt;p&gt;Go to storage account you have created and select access key tab as below image&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kIqCpSS2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vwuztyejdh82znc75d3s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kIqCpSS2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vwuztyejdh82znc75d3s.png" alt="Image description" width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create Container&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oCCEMim1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ukqr4bifmret8s54saz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oCCEMim1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ukqr4bifmret8s54saz.png" alt="Image description" width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;KeyVault &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zo-BiJC8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7587wweld5496kr60ogm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zo-BiJC8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7587wweld5496kr60ogm.png" alt="Image description" width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please enter correct resource group name and keyvault name then click on review + create &lt;/p&gt;

&lt;p&gt;Navigate to keyvault and select Secret then Click on Generate Import&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--68DArnw2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3gx8eifitjp1oqywk43k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--68DArnw2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3gx8eifitjp1oqywk43k.png" alt="Image description" width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MS_QXffL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9cg2cswm33evgnkbsl0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MS_QXffL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9cg2cswm33evgnkbsl0d.png" alt="Image description" width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--psQqVmpN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ebdnurk0glybq4svqbjz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--psQqVmpN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ebdnurk0glybq4svqbjz.png" alt="Image description" width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please install nuget from the above menu by searching with the name.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Azure.Storage.Blobs&lt;br&gt;
Microsoft.Azure.KeyVault&lt;br&gt;
Microsoft.Azure.KeyVault.Models&lt;br&gt;
Microsoft.Extensions.Configuration&lt;br&gt;
Microsoft.Extensions.Hosting&lt;br&gt;
WinSCP&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Program.cs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using Azure.Storage.Blobs;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.KeyVault.Models;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using WinSCP;

namespace PlantHealthConsoleApp
{
    public class Program
    {
        private static IConfiguration? config;
        private static string? connectionstring;
        private static string? storageaccounturi;
        private static string? containername;
        private static string secretIdentifier = string.Empty;
        private static string imageDirPath = string.Empty;
        private static SecretBundle? secret;
        private static KeyVaultClient? client;
        private static System.Timers.Timer? timer;
        private static string imageProcessPath = string.Empty;

        public async static Task Main(string[] args)
        {
            HostBuilder builder = new HostBuilder();

            config = new ConfigurationBuilder()
             .AddJsonFile("appsettings.json", true, true)
             .Build();
            CheckForNewFileAdditionToDirectory();
            InitTimer();

            await builder.RunConsoleAsync();
        }
        private static void InitTimer()
        {
            timer ??= new System.Timers.Timer();
            timer.Enabled = true;
            timer.Interval = 60000;
            timer.Elapsed += Timermr_Elapsed;
        }

        private static void Timermr_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
        {
            GetFilesFromDronFTPServer(GetvaluesFromConfig("droneFtpUrl"), GetvaluesFromConfig("ftpUsername"), GetvaluesFromConfig("ftpPassword"), Convert.ToInt32(GetvaluesFromConfig("ftpport")));
        }

        private static void CheckForNewFileAdditionToDirectory()
        {
            imageDirPath = GetvaluesFromConfig("imageDirPath");
            FileSystemWatcher watcher = new()
            {
                Path = GetDirectoryForImageUpload()
            };
            watcher.Created += FileSystemWatcher_FileCreatedEvent;
            watcher.EnableRaisingEvents = true;
        }

        private static string GetDirectoryForImageUpload()
        {
            imageProcessPath = $"{Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), imageDirPath)}";
            Console.WriteLine($"path is {imageProcessPath}");
            CreateDirectoryIfNotExist(imageProcessPath);
            return imageProcessPath;
        }

        private static void CreateDirectoryIfNotExist(string DirectoryPath)
        {
            if (!Directory.Exists(DirectoryPath))
            {
                Directory.CreateDirectory(DirectoryPath);
            }
        }

        private static string GetvaluesFromConfig(string key)
        {
            if (!string.IsNullOrEmpty(key) &amp;amp;&amp;amp; config is not null)
            {
                return config[key];
            }
            return string.Empty;
        }

        private static void SetClientIDAndSecret()
        {
            TokenHelper.clientID ??= GetvaluesFromConfig("clientID");
            TokenHelper.clientSecret ??= GetvaluesFromConfig("clientSecret");
        }
        private async static void FileSystemWatcher_FileCreatedEvent(object sender, FileSystemEventArgs fileSystemEvent)
        {
            using (FileStream fileStream = new(fileSystemEvent.FullPath, FileMode.Open))
            {
                try
                {
                    storageaccounturi = GetvaluesFromConfig("storageaccounturi");
                    containername = GetvaluesFromConfig("containername");
                    secretIdentifier = GetvaluesFromConfig("secretIdentifier");
                    SetClientIDAndSecret();
                    client ??= new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(TokenHelper.GetAccessTokenAsync));
                    secret ??= await client.GetSecretAsync(secretIdentifier);
                    connectionstring ??= secret.Value;
                    if (!string.IsNullOrEmpty(fileSystemEvent.Name))
                    {
                        await UploadFileToAzureStorageAsync(connectionstring, fileSystemEvent.Name, containername, fileStream);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }

        private static async Task&amp;lt;bool&amp;gt; UploadFileToAzureStorageAsync(string connectionString, string fileName, string containerName, Stream fileStream)
        {
            BlobClient blobClient = new BlobClient(connectionString, containerName, fileName);
            await blobClient.UploadAsync(fileStream);
            Console.WriteLine($"file {fileName} uploaded successfully");
            return await Task.FromResult(true);
        }

        private static void GetFilesFromDronFTPServer(string droneFtpUrl, string ftpUsername, string ftpPassword, int ftpport)
        {
            try
            {
                imageProcessPath ??= GetDirectoryForImageUpload();
                SessionOptions sessionOptions = new SessionOptions
                {
                    Protocol = Protocol.Ftp,
                    HostName = droneFtpUrl,
                    UserName = ftpUsername,
                    Password = ftpPassword,
                    PortNumber = ftpport
                };
                using (Session session = new Session())
                {
                    string droneCapturedImagePath = "/home/prt85463/images";
                    session.Open(sessionOptions);
                    session.GetFiles(droneCapturedImagePath, imageProcessPath).Check();
                    session.RemoveFiles(droneCapturedImagePath);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add new class by selecting from Solution explorer.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FNBx_PJZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcliysliv9y1ddng908n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FNBx_PJZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcliysliv9y1ddng908n.png" alt="Image description" width="880" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This class will be used to Get AccessToken to connect to keyvault and Get secret values from it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ToeknHelper.cs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System.Diagnostics;

namespace PlantHealthConsoleApp
{
    public static class TokenHelper
    {
        public static string clientID;
        public static string clientSecret;
        public static async Task&amp;lt;string&amp;gt; GetAccessTokenAsync(string authority, string resource, string scope)
        {
            var context = new AuthenticationContext(authority);
            ClientCredential credential = new ClientCredential(clientID,clientSecret);
            AuthenticationResult result = await context.AcquireTokenAsync(resource, credential);
            Trace.WriteLine(result.AccessToken);
            if (result == null)
                throw new InvalidOperationException("Failed to obtain the JWT token");

            return result.AccessToken;
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click on solution explorer and Select below Option, this app will be executing on Rasbpian Linux arm 64 so same configuration will be selected to Publish it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xn2nf6tU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dq2b44c6wm87g4rjtk3h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xn2nf6tU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dq2b44c6wm87g4rjtk3h.png" alt="Image description" width="880" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the option select Target runtime Linux-arm64 and Deployment as self contained ,learn more here &lt;a href="https://learn.microsoft.com/en-us/dotnet/core/deploying/"&gt;https://learn.microsoft.com/en-us/dotnet/core/deploying/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VIUopSDJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/en2yuo2ffg319718xfcv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VIUopSDJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/en2yuo2ffg319718xfcv.png" alt="Image description" width="880" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once Published copy executables to Rabpian and follow set permission chmod +x filename and then use ./filename to execute application, learn more from here &lt;a href="https://learn.microsoft.com/en-us/dotnet/iot/deployment"&gt;https://learn.microsoft.com/en-us/dotnet/iot/deployment&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. PlantHealthApp&lt;/strong&gt; :- &lt;strong&gt;Azure Function Blob Trigger&lt;/strong&gt; with &lt;strong&gt;.net 6&lt;/strong&gt; as Target Framework. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JL4D5hie--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2e4zyg6oxgb1avc9nmhu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JL4D5hie--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2e4zyg6oxgb1avc9nmhu.png" alt="Image description" width="880" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eqE2avSv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f401eoetgeqsvefxysev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eqE2avSv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f401eoetgeqsvefxysev.png" alt="Image description" width="880" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V8eKJ47a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zi7h76q8rxde0zf6rw7t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V8eKJ47a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zi7h76q8rxde0zf6rw7t.png" alt="Image description" width="880" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Function will be triggered once there is new image uploaded by console app, which will be sent to &lt;strong&gt;Azure Custom Vision&lt;/strong&gt; for prediction if plant is affected by insect or dieses, details of the affected plant will be stored in &lt;strong&gt;Azure Table&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qqa_V5TI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ihzee0o33sg4axcbdgp5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qqa_V5TI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ihzee0o33sg4axcbdgp5.png" alt="Image description" width="880" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select Azure Function&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--70Ai8U7---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2eg4ik222sn5ywmxdws.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--70Ai8U7---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2eg4ik222sn5ywmxdws.png" alt="Image description" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dNUnZnTo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ewyk9e1wxsqhg3hxn6nc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dNUnZnTo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ewyk9e1wxsqhg3hxn6nc.png" alt="Image description" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dOffg7uc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wfqwk7vwbng292rwcdd8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dOffg7uc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wfqwk7vwbng292rwcdd8.png" alt="Image description" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7-AzUnoY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mj127no1bhxgfw3oiqor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7-AzUnoY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mj127no1bhxgfw3oiqor.png" alt="Image description" width="804" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TDjRnZ_b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0go1v5hksjofcr7dadq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TDjRnZ_b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0go1v5hksjofcr7dadq.png" alt="Image description" width="804" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Provide Connection string name and click on finish.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o54gUkvb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlk7391r91clubrzz12y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o54gUkvb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlk7391r91clubrzz12y.png" alt="Image description" width="804" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please install following nuget packages &lt;/p&gt;

&lt;p&gt;Azure.Security.KeyVault.Secrets&lt;br&gt;
Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction&lt;br&gt;
Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training&lt;br&gt;
Microsoft.Azure.KeyVault&lt;br&gt;
Microsoft.Azure.WebJobs.Extensions.Storage&lt;br&gt;
Microsoft.Identity.Client&lt;br&gt;
Microsoft.IdentityModel.Clients.ActiveDirectory&lt;br&gt;
RestSharp&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GetPlantHealth.cs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Table;
using Microsoft.WindowsAzure.Storage;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net;
using Microsoft.Azure.KeyVault;

namespace GetPlantHealthDetails
{
    public class GetPlantHealth
    {
        private static CloudStorageAccount storageAccount = null;
        private static CloudTableClient tableClient = null;
        private static CloudTable table = null;
        private static KeyVaultClient client = null;
        private static Microsoft.Azure.KeyVault.Models.SecretBundle connectionstring = null;
        private static string tableName = "PlantHealthAppTable";
        private static string secretIdentifier = "https://planthealthappsecret.vault.azure.net/secrets/storageAccountConnectionString/92f4ed20ff4041ae8b05303f7baf79f7";

        [FunctionName("GetPlantHealth")]
        public static async Task&amp;lt;IActionResult&amp;gt; Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
            ILogger log)
        {
            SetClientIDAndSecret();
            client ??= new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(TokenHelper.GetAccessTokenAsync));
            connectionstring ??= await client.GetSecretAsync(secretIdentifier);
            storageAccount ??= CloudStorageAccount.Parse(connectionstring.Value);
            tableClient ??= storageAccount.CreateCloudTableClient();
            table ??= tableClient.GetTableReference(tableName);

            string rowkey = req.Query["RowKey"];
            if (string.IsNullOrEmpty(rowkey))
            {
                return new OkObjectResult(await GetPlantHealthDeatilsAsync(log));
            }
            else
            {
                return new OkObjectResult(await UpdatePlantHealthDeatilsByRowkeyAsync(rowkey, log));
            }
        }

        private static async Task&amp;lt;List&amp;lt;PlantHealthDeatils&amp;gt;&amp;gt; GetPlantHealthDeatilsAsync(ILogger logger)
        {
            try
            {
                List&amp;lt;PlantHealthDeatils&amp;gt; plantHealthDeatilsList = new List&amp;lt;PlantHealthDeatils&amp;gt;();
                TableQuery&amp;lt;PlantHealthDeatils&amp;gt; query;
                query = new TableQuery&amp;lt;PlantHealthDeatils&amp;gt;().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, $"{tableName}"));
                TableContinuationToken token = null;
                do
                {
                    TableQuerySegment&amp;lt;PlantHealthDeatils&amp;gt; resultSegment = await table.ExecuteQuerySegmentedAsync(query, token).ConfigureAwait(false);
                    foreach (var entity in resultSegment.Results.OrderBy(x =&amp;gt; x.Pesticidesprayed))
                    {
                        PlantHealthDeatils details = new PlantHealthDeatils
                        {
                            longitude = entity.longitude,
                            ImageURL = entity.ImageURL,
                            latitude = entity.latitude,
                            Pesticidesprayed = entity.Pesticidesprayed,
                            CapturedTime = entity.CapturedTime,
                            RowKey = entity.RowKey,
                            ETag = entity.ETag,
                            PartitionKey = entity.PartitionKey
                        };
                        plantHealthDeatilsList.Add(details);
                    }
                } while (token != null);
                return plantHealthDeatilsList;
            }
            catch (Exception exp)
            {
                logger.LogError(exp, "Unable to GetPlantHealthDeatils");
                return default;
            }
        }

        private static async Task&amp;lt;HttpResponseMessage&amp;gt; UpdatePlantHealthDeatilsByRowkeyAsync(string rowkey, ILogger logger)
        {
            try
            {
                PlantHealthDeatils plantHealthDeatilsList = new PlantHealthDeatils();
                TableQuery&amp;lt;PlantHealthDeatils&amp;gt; query;
                query = new TableQuery&amp;lt;PlantHealthDeatils&amp;gt;().Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, $"{rowkey}"));
                TableContinuationToken token = null;

                TableQuerySegment&amp;lt;PlantHealthDeatils&amp;gt; resultSegment = await table.ExecuteQuerySegmentedAsync(query, token).ConfigureAwait(false);

                var plantdetail = resultSegment.Results.FirstOrDefault();
                plantdetail.Pesticidesprayed = true;
                var operation = TableOperation.Replace(plantdetail);
                await table.ExecuteAsync(operation);

                return new HttpResponseMessage(HttpStatusCode.NoContent);
            }
            catch (Exception exp)
            {
                logger.LogError(exp, "Unable to Update PlantHealthDeatils");
                return default;
            }
        }

        private static string GetEnviromentValue(string key)
        {
            return Environment.GetEnvironmentVariable(key);
        }

        private static void SetClientIDAndSecret()
        {
            TokenHelper.clientID ??= GetEnviromentValue("clientID");
            TokenHelper.clientSecret ??= GetEnviromentValue("clientSecret");
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add new class file as below &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TRSvELu---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3hos71icsqae8y9cikm0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TRSvELu---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3hos71icsqae8y9cikm0.png" alt="Image description" width="880" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PlantHealthDeatils.cs&lt;/strong&gt; this class will be inherited by TableEntity class that will be used to communicate as model class for the Azure Table , please notice parameterised constructor has two important arguments PartitionKey ,  RowKey&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using Microsoft.WindowsAzure.Storage.Table;
using System;

namespace GetPlantHealthDetails
{
    public class PlantHealthDeatils : TableEntity
    {
        public PlantHealthDeatils()
        {

        }
        public PlantHealthDeatils(string skey, string srow)
        {
            PartitionKey = skey;
            RowKey = srow;
        }
        public DateTime CapturedTime { get; set; }
        public string longitude { get; set; }
        public string latitude { get; set; }
        public string ImageURL { get; set; }
        public bool Pesticidesprayed { get; set; } = false;


    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Publishing to the Azure we will be creating Azure function &lt;/p&gt;

&lt;p&gt;Click review + create&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jsnWsyD6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/86xa8pht5vcdnfq3xc8k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jsnWsyD6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/86xa8pht5vcdnfq3xc8k.png" alt="Image description" width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once Azure function is created, we can deploy it to Azure &lt;/p&gt;

&lt;p&gt;From Visual Studio select below &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t_zJcVtK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/98meg8etfaklyvlv244r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t_zJcVtK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/98meg8etfaklyvlv244r.png" alt="Image description" width="880" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l1VsLV6D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/liie669sj0xy9x64do1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l1VsLV6D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/liie669sj0xy9x64do1k.png" alt="Image description" width="880" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--utAryegk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x59h1zyvzot4trpfkiws.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--utAryegk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x59h1zyvzot4trpfkiws.png" alt="Image description" width="880" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UA1bqT3s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ipf4amzu8476bdu4b6uh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UA1bqT3s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ipf4amzu8476bdu4b6uh.png" alt="Image description" width="880" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;local.settings.json contais key value pair for stoarge account url,custom vision and Table, this needs to be added to Azure function from Portal&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--guRnQxZ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ivsbruzult4eriqtqdw2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--guRnQxZ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ivsbruzult4eriqtqdw2.png" alt="Image description" width="880" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once Publish is successful, we can upload image to container and Blob Trigger will be executed, affected plant deatils will be stored in the Azure Table&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. GetPlantHealthDetails&lt;/strong&gt; :- &lt;strong&gt;Azure Function Http Trigger&lt;/strong&gt; with &lt;strong&gt;.net 6&lt;/strong&gt; as Target Framework. &lt;/p&gt;

&lt;p&gt;Function will retrieve data of the affected plant from Azure Table and will serve the response to the &lt;strong&gt;Xamarin Forms&lt;/strong&gt; Based App running on &lt;strong&gt;Windows, Android, Ios&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;rowkey based query string can be sent to Azure Function which will update the Pesticide spray status flag of particular record which can be done from the agricultural drone spraying pesticide.&lt;/p&gt;

&lt;p&gt;Add new Project of Azure function (please refer above screen shot),we will be adding Http Trigger Azure function Trigger Type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BbLYYYHu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p7tm9gmmuxlt3rmzylx2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BbLYYYHu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p7tm9gmmuxlt3rmzylx2.png" alt="Image description" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please install following nuget packages &lt;/p&gt;

&lt;p&gt;Azure.Identity&lt;br&gt;
Azure.Security.KeyVault.Secrets&lt;br&gt;
Microsoft.Azure.Functions.Extensions&lt;br&gt;
Microsoft.Azure.KeyVault&lt;br&gt;
Microsoft.Identity.Client&lt;br&gt;
Microsoft.IdentityModel.Clients.ActiveDirectory&lt;br&gt;
System.Configuration.ConfigurationManager&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GetPlantHealth.cs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Table;
using Microsoft.WindowsAzure.Storage;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net;
using Microsoft.Azure.KeyVault;

namespace GetPlantHealthDetails
{
    public class GetPlantHealth
    {
        private static CloudStorageAccount storageAccount = null;
        private static CloudTableClient tableClient = null;
        private static CloudTable table = null;
        private static KeyVaultClient client = null;
        private static Microsoft.Azure.KeyVault.Models.SecretBundle connectionstring = null;
        private static string tableName = "PlantHealthAppTable";
        private static string secretIdentifier = "https://planthealthappsecret.vault.azure.net/secrets/storageAccountConnectionString/92f4ed20ff4041ae8b05303f7baf79f7";

        [FunctionName("GetPlantHealth")]
        public static async Task&amp;lt;IActionResult&amp;gt; Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
            ILogger log)
        {
            SetClientIDAndSecret();
            client ??= new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(TokenHelper.GetAccessTokenAsync));
            connectionstring ??= await client.GetSecretAsync(secretIdentifier);
            storageAccount ??= CloudStorageAccount.Parse(connectionstring.Value);
            tableClient ??= storageAccount.CreateCloudTableClient();
            table ??= tableClient.GetTableReference(tableName);

            string rowkey = req.Query["RowKey"];
            if (string.IsNullOrEmpty(rowkey))
            {
                return new OkObjectResult(await GetPlantHealthDeatilsAsync(log));
            }
            else
            {
                return new OkObjectResult(await UpdatePlantHealthDeatilsByRowkeyAsync(rowkey, log));
            }
        }

        private static async Task&amp;lt;List&amp;lt;PlantHealthDeatils&amp;gt;&amp;gt; GetPlantHealthDeatilsAsync(ILogger logger)
        {
            try
            {
                List&amp;lt;PlantHealthDeatils&amp;gt; plantHealthDeatilsList = new List&amp;lt;PlantHealthDeatils&amp;gt;();
                TableQuery&amp;lt;PlantHealthDeatils&amp;gt; query;
                query = new TableQuery&amp;lt;PlantHealthDeatils&amp;gt;().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, $"{tableName}"));
                TableContinuationToken token = null;
                do
                {
                    TableQuerySegment&amp;lt;PlantHealthDeatils&amp;gt; resultSegment = await table.ExecuteQuerySegmentedAsync(query, token).ConfigureAwait(false);
                    foreach (var entity in resultSegment.Results.OrderBy(x =&amp;gt; x.Pesticidesprayed))
                    {
                        PlantHealthDeatils details = new PlantHealthDeatils
                        {
                            longitude = entity.longitude,
                            ImageURL = entity.ImageURL,
                            latitude = entity.latitude,
                            Pesticidesprayed = entity.Pesticidesprayed,
                            CapturedTime = entity.CapturedTime,
                            RowKey = entity.RowKey,
                            ETag = entity.ETag,
                            PartitionKey = entity.PartitionKey
                        };
                        plantHealthDeatilsList.Add(details);
                    }
                } while (token != null);
                return plantHealthDeatilsList;
            }
            catch (Exception exp)
            {
                logger.LogError(exp, "Unable to GetPlantHealthDeatils");
                return default;
            }
        }

        private static async Task&amp;lt;HttpResponseMessage&amp;gt; UpdatePlantHealthDeatilsByRowkeyAsync(string rowkey, ILogger logger)
        {
            try
            {
                PlantHealthDeatils plantHealthDeatilsList = new PlantHealthDeatils();
                TableQuery&amp;lt;PlantHealthDeatils&amp;gt; query;
                query = new TableQuery&amp;lt;PlantHealthDeatils&amp;gt;().Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, $"{rowkey}"));
                TableContinuationToken token = null;

                TableQuerySegment&amp;lt;PlantHealthDeatils&amp;gt; resultSegment = await table.ExecuteQuerySegmentedAsync(query, token).ConfigureAwait(false);

                var plantdetail = resultSegment.Results.FirstOrDefault();
                plantdetail.Pesticidesprayed = true;
                var operation = TableOperation.Replace(plantdetail);
                await table.ExecuteAsync(operation);

                return new HttpResponseMessage(HttpStatusCode.NoContent);
            }
            catch (Exception exp)
            {
                logger.LogError(exp, "Unable to Update PlantHealthDeatils");
                return default;
            }
        }

        private static string GetEnviromentValue(string key)
        {
            return Environment.GetEnvironmentVariable(key);
        }

        private static void SetClientIDAndSecret()
        {
            TokenHelper.clientID ??= GetEnviromentValue("clientID");
            TokenHelper.clientSecret ??= GetEnviromentValue("clientSecret");
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PlantHealthDeatils.cs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using Microsoft.WindowsAzure.Storage.Table;
using System;

namespace GetPlantHealthDetails
{
    public class PlantHealthDeatils : TableEntity
    {
        public PlantHealthDeatils()
        {

        }
        public PlantHealthDeatils(string skey, string srow)
        {
            PartitionKey = skey;
            RowKey = srow;
        }
        public DateTime CapturedTime { get; set; }
        public string longitude { get; set; }
        public string latitude { get; set; }
        public string ImageURL { get; set; }
        public bool Pesticidesprayed { get; set; } = false;

    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;local.settings.json contais the information for the clientID,clientSecret,tableName,secretIdentifier , this needs to be added to Azure function from Portal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--guRnQxZ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ivsbruzult4eriqtqdw2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--guRnQxZ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ivsbruzult4eriqtqdw2.png" alt="Image description" width="880" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For publish please follow the above Function Publish steps to Azure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. PlantHealthAppXam&lt;/strong&gt; :- &lt;strong&gt;Xamarin Forms&lt;/strong&gt; based &lt;strong&gt;Uwp , Android , Ios&lt;/strong&gt; app which will display information for the infected plants with images by querying the data to GetPlantHealthDetails ,as well as shows the Location on Map using the Longitude and Latitude &lt;strong&gt;Azure Function Http Trigger&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Use Add new Project(refer above screenshot) to solution and add Xamarin Forms Project&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EwucazRs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/te6df5qm5rvwc6zyajxx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EwucazRs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/te6df5qm5rvwc6zyajxx.png" alt="Image description" width="880" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give correct Name and location to it then click on Next select below option&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qxm0MmNH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w4cle3m2vcfuv7u02tv8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qxm0MmNH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w4cle3m2vcfuv7u02tv8.png" alt="Image description" width="760" height="570"&gt;&lt;/a&gt;&lt;br&gt;
Once Project is created you will see belows Projects added to solution &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vt0sOSEb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/enx1aoeomonr2gtl5kyd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vt0sOSEb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/enx1aoeomonr2gtl5kyd.png" alt="Image description" width="345" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Goto 1 st Project from the above image in view folder we will be updating views as below.&lt;/p&gt;

&lt;p&gt;Xamarin forms Project uses viewmodel and binding with MVVM , learn more from below link.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/xamarin/xamarin-forms/enterprise-application-patterns/mvvm"&gt;https://learn.microsoft.com/en-us/xamarin/xamarin-forms/enterprise-application-patterns/mvvm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ItemDetailPage.xaml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="PlantHealthAppXam.Views.ItemDetailPage"
             Title="{Binding Title}"&amp;gt;

    &amp;lt;StackLayout Spacing="20" Padding="15"&amp;gt;
        &amp;lt;Image Source="{Binding IMGURL}"&amp;gt;&amp;lt;/Image&amp;gt;
        &amp;lt;Button Text="Open Map" Command="{Binding OpenMapCommand}"&amp;gt;&amp;lt;/Button&amp;gt;
    &amp;lt;/StackLayout&amp;gt;
&amp;lt;/ContentPage&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ItemDetailPage.xaml.cs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using PlantHealthAppXam.ViewModels;
using System.ComponentModel;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;

namespace PlantHealthAppXam.Views
{
    public partial class ItemDetailPage : ContentPage
    {
        public ItemDetailPage()
        {
            InitializeComponent();
            BindingContext = new ItemDetailViewModel();
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ItemDetailViewModel.cs&lt;/strong&gt; in ViewModels folder&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using PlantHealthAppXam.Models;
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;

namespace PlantHealthAppXam.ViewModels
{
    [QueryProperty(nameof(IMGURL), nameof(IMGURL))]
    [QueryProperty(nameof(longitude), nameof(longitude))]
    [QueryProperty(nameof(latitude), nameof(latitude))]
    public class ItemDetailViewModel : BaseViewModel
    {
        private string imgurl;
        public Command OpenMapCommand { get; }
        public string longitude { get; set; }
        public string latitude { get; set; }

        public string Id { get; set; }

        public string IMGURL
        {
            get =&amp;gt; imgurl;
            set =&amp;gt; SetProperty(ref imgurl, value);
        }


        public ItemDetailViewModel()
        {
            OpenMapCommand = new Command(async () =&amp;gt; await OpenMapByLongitudeLatitude(longitude,latitude));
        }

        public async Task OpenMapByLongitudeLatitude(string Longitude, string Latitude)
        {
            var location = new Location(Convert.ToDouble(Longitude), Convert.ToDouble(Latitude));
            await Map.OpenAsync(location);
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ItemsPage.xaml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="PlantHealthAppXam.Views.ItemsPage"
             Title="{Binding Title}"
             xmlns:local="clr-namespace:PlantHealthAppXam.ViewModels"  
             xmlns:model="clr-namespace:PlantHealthAppXam.Models"  
             x:Name="BrowseItemsPage"&amp;gt;

    &amp;lt;ContentPage.ToolbarItems&amp;gt;
        &amp;lt;!--&amp;lt;ToolbarItem Text="Add" Command="{Binding AddItemCommand}" /&amp;gt;--&amp;gt;
    &amp;lt;/ContentPage.ToolbarItems&amp;gt;
    &amp;lt;!--
      x:DataType enables compiled bindings for better performance and compile time validation of binding expressions.
      https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/data-binding/compiled-bindings
    --&amp;gt;
    &amp;lt;RefreshView x:DataType="local:ItemsViewModel" Command="{Binding LoadItemsCommand}" IsRefreshing="{Binding IsBusy, Mode=TwoWay}"&amp;gt;
        &amp;lt;CollectionView x:Name="ItemsListView"
                ItemsSource="{Binding ItemsList}"
                SelectionMode="None"&amp;gt;
            &amp;lt;CollectionView.ItemTemplate&amp;gt;
                &amp;lt;DataTemplate&amp;gt;
                    &amp;lt;StackLayout Padding="10" Orientation="Horizontal" x:DataType="model:PlantHealthDeatils"&amp;gt;
                        &amp;lt;StackLayout Orientation="Vertical"&amp;gt;
                            &amp;lt;StackLayout Orientation="Horizontal"&amp;gt;
                                &amp;lt;Label FontAttributes="Bold" Text="Longitude :"&amp;gt;&amp;lt;/Label&amp;gt;
                                &amp;lt;Label Text="{Binding longitude}" 
                            LineBreakMode="NoWrap" 
                            Style="{DynamicResource ListItemDetailTextStyle}" 
                            FontSize="13" /&amp;gt;
                            &amp;lt;/StackLayout&amp;gt;
                            &amp;lt;StackLayout Orientation="Horizontal"&amp;gt;
                                &amp;lt;Label FontAttributes="Bold" Text="Latitude :"&amp;gt;&amp;lt;/Label&amp;gt;
                                &amp;lt;Label Text="{Binding latitude}" 
                            LineBreakMode="WordWrap" 
                            Style="{DynamicResource ListItemDetailTextStyle}"
                            FontSize="13" /&amp;gt;
                            &amp;lt;/StackLayout&amp;gt;
                            &amp;lt;StackLayout Orientation="Horizontal"&amp;gt;
                                &amp;lt;Label FontAttributes="Bold" Text="Captured Time :"&amp;gt;&amp;lt;/Label&amp;gt;
                                &amp;lt;Label Text="{Binding CapturedTime}" 
                            LineBreakMode="WordWrap" 
                            Style="{DynamicResource ListItemDetailTextStyle}"
                            FontSize="13" /&amp;gt;
                            &amp;lt;/StackLayout&amp;gt;
                            &amp;lt;StackLayout Orientation="Horizontal"&amp;gt;
                                &amp;lt;Label  FontAttributes="Bold" Text="Pesticide Sprayed :" Margin="0,5,0,0"&amp;gt;&amp;lt;/Label&amp;gt;
                                &amp;lt;CheckBox IsEnabled="False" IsChecked="{Binding Pesticidesprayed}" &amp;gt;&amp;lt;/CheckBox&amp;gt;
                            &amp;lt;/StackLayout&amp;gt;
                        &amp;lt;/StackLayout&amp;gt;
                        &amp;lt;Image Source="{Binding ImageURL}"  HorizontalOptions="EndAndExpand" HeightRequest="100" WidthRequest="100"&amp;gt;&amp;lt;/Image&amp;gt;
                        &amp;lt;StackLayout.GestureRecognizers&amp;gt;
                            &amp;lt;TapGestureRecognizer 
                                NumberOfTapsRequired="1"
                                Command="{Binding Source={RelativeSource AncestorType={x:Type local:ItemsViewModel}}, Path=ItemTapped}"     
                                CommandParameter="{Binding .}"&amp;gt;
                            &amp;lt;/TapGestureRecognizer&amp;gt;
                        &amp;lt;/StackLayout.GestureRecognizers&amp;gt;
                    &amp;lt;/StackLayout&amp;gt;
                &amp;lt;/DataTemplate&amp;gt;
            &amp;lt;/CollectionView.ItemTemplate&amp;gt;
        &amp;lt;/CollectionView&amp;gt;
    &amp;lt;/RefreshView&amp;gt;
&amp;lt;/ContentPage&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ItemsViewModel.cs&lt;/strong&gt; in ViewModels&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using Newtonsoft.Json;
using PlantHealthAppXam.Models;
using PlantHealthAppXam.Views;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Net.Http;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace PlantHealthAppXam.ViewModels
{
    public class ItemsViewModel : BaseViewModel
    {
        private PlantHealthDeatils _selectedItem;

        public ObservableCollection&amp;lt;PlantHealthDeatils&amp;gt; ItemsList { get; }
        public Command LoadItemsCommand { get; }
        public Command&amp;lt;PlantHealthDeatils&amp;gt; ItemTapped { get; }

        public ItemsViewModel()
        {
            Title = "Plant List";
            ItemsList = new ObservableCollection&amp;lt;PlantHealthDeatils&amp;gt;();
            LoadItemsCommand = new Command(async () =&amp;gt; await ExecuteLoadItemsCommand());

            ItemTapped = new Command&amp;lt;PlantHealthDeatils&amp;gt;(OnItemSelected);
        }

        async Task ExecuteLoadItemsCommand()
        {
            IsBusy = true;

            try
            {
                ItemsList.Clear();
                var items = await GetDataAsync().ConfigureAwait(false);
                foreach (var item in items)
                {
                    ItemsList.Add(item);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                IsBusy = false;
            }
        }

        public void OnAppearing()
        {
            IsBusy = true;
            SelectedItem = null;
        }

        public PlantHealthDeatils SelectedItem
        {
            get =&amp;gt; _selectedItem;
            set
            {
                SetProperty(ref _selectedItem, value);
                OnItemSelected(value);
            }
        }

        async void OnItemSelected(PlantHealthDeatils item)
        {
            if (item == null)
                return;

            // This will push the ItemDetailPage onto the navigation stack
            //Shell.Current.GoToAsync($"//home/bottomtab2?name={"Cat"}&amp;amp;test={"Dog"}");
            await Shell.Current.GoToAsync($"{nameof(ItemDetailPage)}?{nameof(ItemDetailViewModel.IMGURL)}={item.ImageURL}&amp;amp;{nameof(ItemDetailViewModel.longitude)}={item.longitude}&amp;amp;{nameof(ItemDetailViewModel.latitude)}={item.latitude}");
        }

        public async Task&amp;lt;List&amp;lt;PlantHealthDeatils&amp;gt;&amp;gt; GetDataAsync()
        {
            var client = new RestClient("https://getplanthealthdetails.azurewebsites.net/api/GetPlantHealth?code=Ffcqj7PbO68QaTg2zWRNN7yp76kyYXNr8YBC_qw-jUXSAzFuAIrvKw==");
            var request = new RestRequest();
            request.Method = Method.Get;
            var response = await client.ExecuteAsync(request);
            return JsonConvert.DeserializeObject&amp;lt;List&amp;lt;PlantHealthDeatils&amp;gt;&amp;gt;(response.Content.ToString());
        }

    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ItemsPage.xaml.cs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using PlantHealthAppXam.Models;
using PlantHealthAppXam.ViewModels;
using PlantHealthAppXam.Views;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace PlantHealthAppXam.Views
{
    public partial class ItemsPage : ContentPage
    {
        ItemsViewModel _viewModel;

        public ItemsPage()
        {
            InitializeComponent();

            BindingContext = _viewModel = new ItemsViewModel();
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            _viewModel.OnAppearing();
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PlantHealthDeatils.cs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text;

namespace PlantHealthAppXam.Models
{
    public class PlantHealthDeatils 
    {
        public PlantHealthDeatils()
        {

        }

        public DateTime CapturedTime { get; set; }

        public string longitude { get; set; }

        public string latitude { get; set; }
        public string ImageURL { get; set; }
        public bool Pesticidesprayed { get; set; } = false;
        public string ETag { get; set; }
        public string RowKey { get; set; }
        public string PartitionKey { get; set; }

    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;App running on Windows 11, Android, Ios&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wd3eeil4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9t324nv6j96lvlu0lco5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wd3eeil4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9t324nv6j96lvlu0lco5.png" alt="Image description" width="880" height="778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Challenges in implementing the solution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Raspbian (Linux distro) is case sensitive for file naming, I have used camel casing in file name AppSettings.json on windows it worked fine but on Linux it was null values so after debugging the app on Linux I came to know about it and used same casing later in file name to fix it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Business Benefit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Human efforts can be saved with the Azure based solution which will reduce the human efforts and increase revenue generation for farmers as farm workers can focus on another task. Using agriculture drones using longitude and latitude we can spray pesticide to selected area.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azurefunctions</category>
    </item>
    <item>
      <title>Protect Farm from Wild Animal using Azure cognitive services Custom Vision, Azure Functions, 
 Table, .Net 5 , Xamarin App   </title>
      <dc:creator>jaymin93</dc:creator>
      <pubDate>Sat, 03 Apr 2021 07:07:29 +0000</pubDate>
      <link>https://dev.to/jaymin93/protect-farm-from-wild-animal-using-azure-cognitive-services-custom-vision-azure-functions-table-net-5-xamarin-app-jgd</link>
      <guid>https://dev.to/jaymin93/protect-farm-from-wild-animal-using-azure-cognitive-services-custom-vision-azure-functions-table-net-5-xamarin-app-jgd</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Problem statement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Farmers are facing real challenges with the Crop attacked by Wild Animals , Most of the times Monkeys are biggest threat or Problem for them since once they attack on farm they eat and damage crop and causes them huge loss of ready crop and fruits that cost them financially loss.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/cniLSyUjXMfUxebWE7/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/cniLSyUjXMfUxebWE7/giphy.gif" alt="sad farmer" width="350px" height="auto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even in some case many farmers has left farming and switch to other business due to frequent attack of monkeys and financially loss.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/9CVVIhIUfCExy/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/9CVVIhIUfCExy/giphy.gif" alt="monkey omg" width="350px" height="auto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;refer link below for same kind of issues farmer facing in real life&lt;/p&gt;

&lt;p&gt;&lt;a href="https://english.mathrubhumi.com/agriculture/agri-news/these-farmers-of-puralimala-valley-gave-up-farming--1.4645479"&gt;https://english.mathrubhumi.com/agriculture/agri-news/these-farmers-of-puralimala-valley-gave-up-farming--1.4645479&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.downtoearth.org.in/coverage/wildlife-biodiversity/out-of-control-why-monkeys-are-a-menace-50817"&gt;https://www.downtoearth.org.in/coverage/wildlife-biodiversity/out-of-control-why-monkeys-are-a-menace-50817&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://indianexpress.com/article/india/india-news-india/man-vs-monkey-how-farmers-are-grappling-with-losses-that-have-hit-himachals-economy/"&gt;https://indianexpress.com/article/india/india-news-india/man-vs-monkey-how-farmers-are-grappling-with-losses-that-have-hit-himachals-economy/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This incident of monkey attacked farm happened to my relative and costed them huge financially loss due to Monkey's 25-30 group attack on his farm , I came to know via the conversation with him , he also told that they could have took the action and make them run away from farm if somebody was aware that monkey group has attacked to Farm . &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3o6Mbj2w67HnPQKgcE/source.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3o6Mbj2w67HnPQKgcE/source.gif" alt="here is my idea" width="350px" height="auto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So to solve out this real world Problem idea came into my mind as I was using many azure services already. &lt;br&gt;
Azure cognitive services Custom Vision can help me here to identity the entrance of monkey from the captured image of farm and I can take preventive action against the entrance of Monkey by Playing Lion roar sound  also alerting farmers for the incident which is effective solution and can help to protect farm.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/d2Z9QYzA2aidiWn6/giphy.gif" alt="here is my idea" width="350px" height="auto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;👩‍🌾Protect Farmer 🐵 &lt;/b&gt; is application developed using the &lt;b&gt;Azure cognitive services Custom Vision , Azure Functions with Blob Trigger, Azure Table , .Net 5 Console App, Xamarin App  (UWP ,Android , Ios )&lt;/b&gt; to display captured image of farm with presence of Monkey existence and take preventive action.&lt;/p&gt;

&lt;p&gt;Here is the Link of working App , Just Enter correct storage account table , storage and custom vision resource value to run it &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jaymin93/PtrotectFarm"&gt;https://github.com/jaymin93/PtrotectFarm&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explanation of the concepts applied&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Application Flow &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--49EinuKi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xcbu9tij59jcj1d666nz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--49EinuKi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xcbu9tij59jcj1d666nz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Protect Farmer has 3 Solutions &lt;/p&gt;

&lt;p&gt;1 &lt;b&gt;.Net 5 Console App &lt;/b&gt;:- which will monitor for new captured images from CCTV or Surveillance camera , once it has new image captured it will upload to &lt;b&gt;Azure Blob Storage&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Also .net 5 Console App will help to &lt;b&gt; play lion roar sound&lt;/b&gt; once it has retrieved the monkey detection&lt;/p&gt;

&lt;p&gt;2  &lt;b&gt;Azure Function Blob Trigger &lt;/b&gt; :- Azure Function with Blob Trigger , it will be triggered once new image uploaded to blob storage.&lt;/p&gt;

&lt;p&gt;It will be sent to  &lt;b&gt;Azure cognitive services Custom vision &lt;/b&gt;&lt;br&gt;
for identifying the existence of Monkey in the captured image&lt;/p&gt;

&lt;p&gt;If Monkey existence found in captured image Azure Function will insert details to &lt;b&gt; Azure Table&lt;/b&gt; along with &lt;b&gt; Lion roar playing sound status&lt;/b&gt; updated to Azure Table&lt;/p&gt;

&lt;p&gt;3 &lt;b&gt; Xamarin App - UWP , Android , Ios &lt;/b&gt; :- Xamarin App display's Captured image that let's review farmer the Monkey existence with Result from &lt;b&gt; Azure cognitive services Custom Vision stored in Azure Table &lt;/b&gt; also controls the Lion Roar Sound&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/ukMiDlCmdv2og/source.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ukMiDlCmdv2og/source.gif" alt="show me a code" width="350px" height="auto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's dive in to the code and how to build each solution.&lt;/p&gt;

&lt;p&gt;what you need is &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Visual Studio 2019&lt;/b&gt; :- get visual studio 2019 &lt;br&gt;
&lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;https://visualstudio.microsoft.com/downloads/&lt;/a&gt;&lt;br&gt;
there is community edition which is free.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Azure Account &lt;/b&gt; :- you can get azure account from here &lt;/p&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/free/"&gt;https://azure.microsoft.com/en-us/free/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And there is 25 services which are always free , if you are student Microsoft offers 100 USD credits as detailed here&lt;br&gt;
Get 100 USD Student Credit&lt;/p&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/free/students/"&gt;https://azure.microsoft.com/en-us/free/students/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt; .Net 5 SDK &lt;/b&gt; :- get .Net 5 SDK Here &lt;a href="https://dotnet.microsoft.com/download/dotnet/5.0"&gt;https://dotnet.microsoft.com/download/dotnet/5.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt; Xamarin and Azure Function workload for visual studio&lt;/b&gt; :- Please install workloads shown in red box as part of your visual studio 2019 installation&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fbSkccSD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c715yaufongkvqa5ia7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fbSkccSD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c715yaufongkvqa5ia7s.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b9iqkAt7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zcb5nlzm9vrmkb9xub21.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b9iqkAt7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zcb5nlzm9vrmkb9xub21.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Building .NET 5 Console App&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Start Visual Studio 2019, Click on Create New Project as shown in red box&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A0kUr6q5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u55wbge5734ga00fsb44.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A0kUr6q5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u55wbge5734ga00fsb44.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;click on start new project &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--56ekIp8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dscavfmvhq0s99hy7f2o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--56ekIp8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dscavfmvhq0s99hy7f2o.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next screen will ask you for project name and directory please select directory and provide name PtrotectFarmByWildAnimal, once it has been created go to Program.cs and replace with following code&lt;/p&gt;

&lt;p&gt;And Intsall following Nuget Packages as below&lt;/p&gt;

&lt;p&gt;Nuget packages from tools  -&amp;gt; Nuget package manager -&amp;gt; Manage Nuget for solution&lt;/p&gt;

&lt;p&gt;Azure.Storage.Blobs;&lt;br&gt;
Microsoft.Extensions.Configuration;&lt;br&gt;
Microsoft.Extensions.Hosting;&lt;br&gt;
Microsoft.WindowsAzure.Storage;&lt;br&gt;
Microsoft.WindowsAzure.Storage.Table;&lt;/p&gt;

&lt;p&gt;In App settings it requires connectionstring , storageaccounturi , containername which can be retrieved from the azure blob storage account .&lt;/p&gt;

&lt;p&gt;To create Azure Storage Account go to &lt;a href="https://portal.azure.com/"&gt;https://portal.azure.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D42bQf6E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvaggehqyfhgu9vxqhx7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D42bQf6E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvaggehqyfhgu9vxqhx7.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ehc6FIpW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jplh5aztct07cvs8ag4g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ehc6FIpW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jplh5aztct07cvs8ag4g.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;enter resource group name or select existing and add storage account name&lt;/p&gt;

&lt;p&gt;click on networking ,  data protection , advance , tags keep default selection and click on review and create button , once storage account is created it will be displayed in storage account list .&lt;/p&gt;

&lt;p&gt;Go to storage account you have created and select access key tab as below image&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Uv70QTz8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gca43rmc4hehx1iwih5w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Uv70QTz8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gca43rmc4hehx1iwih5w.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;then click on show key and from there you can get connection string , &lt;/p&gt;

&lt;p&gt;go to storage explorer preview and create new blob container , notice container name and storage account uri and set correct values in appsetting.json&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A-PoKAqb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/19gna4c3jaq48zskwnne.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A-PoKAqb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/19gna4c3jaq48zskwnne.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Program.cs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using Azure.Storage.Blobs;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
using ProtectFarm.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Timers;
using System.Linq;
using System.Linq.Expressions;
using System.Diagnostics;
using System.Media;
using System.Linq.Expressions;

namespace ProtectFarmers
{
    class Program
    {
        static IConfiguration config;

        internal static string TableName = "helpfarmer";

        const string status = "status";

        private const string playsound = "playing";

        private const string stopsound = "stopped";


        public static string CurrentSoundPlayingStatus
        {
            get; set;
        }

        public static string connectionstring { get; set; }

        public static string storageaccounturi { get; set; }

        public static string containername { get; set; }

        public static Timer tmr;

        public static SoundPlayer soundPlayer;

        public static object obj = new object();

        public async static Task Main(string[] args)
        {
            HostBuilder builder = new HostBuilder();

            config = new ConfigurationBuilder()
             .AddJsonFile("appsettings.json", true, true)
             .Build();

            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();

//set correct directory path as needed.
            fileSystemWatcher.Path = "G:\\cameradir";
            fileSystemWatcher.Created += FileSystemWatcher_Created;
            fileSystemWatcher.EnableRaisingEvents = true;
            await builder.RunConsoleAsync();
        }

        private async static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
        {
            using (FileStream fileStream = new FileStream(e.FullPath, FileMode.Open))
            {
                connectionstring = config["connectionstring"];
                storageaccounturi = config["storageaccounturi"];
                containername = config["containername"];

                await UploadFileToAzureStorageAsync(fileStream, storageaccounturi, connectionstring, containername, DateTime.Now.ToString("dd-MM-yyyy-HH-mm-ss") + e.Name);
            }

            if (tmr == null)
            {
                tmr = new Timer();
                tmr.Enabled = true;
                tmr.Interval = 15000;
                tmr.Elapsed += Tmr_Elapsed;
            }
        }

        private async static void Tmr_Elapsed(object sender, ElapsedEventArgs e)
        {
            await GetCurrentSoundPlayingStatusAsync(connectionstring);


            if (CurrentSoundPlayingStatus == playsound)
            {
                lock (obj)
                {
                    PlayLionRoarSound(true);
                }
            }
            else
            {
                lock (obj)
                {
                    PlayLionRoarSound(false);
                }
                tmr.Enabled = false;
                tmr.Elapsed -= Tmr_Elapsed;
            }

        }


        public static void PlayLionRoarSound(bool play)
        {
            if (soundPlayer == null)
            {

                soundPlayer = new SoundPlayer($"{System.Reflection.Assembly.GetEntryAssembly().Location.Replace("PtrotectFarmByWildAnimal.dll", "lionroar.wav")}");
            }
            if (play)
            {
                soundPlayer.PlayLooping();
                Console.WriteLine($"{DateTime.Now.ToString("dd-MM-yyy-HH-mm-ss")} Playing lion roar sound");

            }
            else if (play == false)
            {
                soundPlayer.Stop();
                Console.WriteLine($"{DateTime.Now.ToString("dd-MM-yyy-HH-mm-ss")} Stopped lion roar sound");

            }
        }


        public static async Task GetCurrentSoundPlayingStatusAsync(string connectionstring)
        {
            try
            {
                CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionstring);

                CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

                CloudTable _linkTable = tableClient.GetTableReference(TableName);

                ManorMonkeyDeatails manorMonkeyDeatails = new ManorMonkeyDeatails();

                TableQuery&amp;lt;ManorMonkeyDeatails&amp;gt; query = new TableQuery&amp;lt;ManorMonkeyDeatails&amp;gt;().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, status));


                TableContinuationToken token = null;
                do
                {
                    TableQuerySegment&amp;lt;ManorMonkeyDeatails&amp;gt; resultSegment = await _linkTable.ExecuteQuerySegmentedAsync(query, token).ConfigureAwait(false);
                    token = resultSegment.ContinuationToken;

                    manorMonkeyDeatails = resultSegment.Results.FirstOrDefault();


                    CurrentSoundPlayingStatus = manorMonkeyDeatails.SoundPlayingStatus;


                } while (token != null);


            }
            catch (Exception exp)
            {
                Debug.Write(exp);

            }
        }


        public static async Task&amp;lt;bool&amp;gt; UploadFileToAzureStorageAsync(Stream filestream, string storageaccounturi, string connectionstring, string containername, string filename)
        {
            Uri bloburi = new Uri($"{storageaccounturi}/{containername}/{filename}");
            BlobClient blobClient = new BlobClient(connectionstring, containername, filename);
            await blobClient.UploadAsync(filestream);
            return await Task.FromResult(true);
        }

    }
}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building Azure Function Server less app&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Azure Function &lt;/b&gt;:- Azure Functions is a server less solution that allows you to write less code, maintain less infrastructure, and save on costs. Instead of worrying about deploying and maintaining servers, the cloud infrastructure provides all the up-to-date resources needed to keep your applications running.&lt;/p&gt;

&lt;p&gt;You focus on the pieces of code that matter most to you, and Azure Functions handles the rest.&lt;/p&gt;

&lt;p&gt;Learn more  &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Blob Trigger function will execute the code once blob is uploaded to specified storage account's container while creating function we will supply correct values to it as below steps.&lt;/p&gt;

&lt;p&gt;now go to solution explorer in visual studio click on solution and add new project&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fzw_GDWc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p9andkjmacqckitg73td.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fzw_GDWc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p9andkjmacqckitg73td.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cy5XotzA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7xs3iv3io8xqk216hnsq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cy5XotzA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7xs3iv3io8xqk216hnsq.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;it will ask for the name of project enter custom vision then click on create &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DQ4DT4rf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3kdngk9sjh3f80s6ktj8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DQ4DT4rf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3kdngk9sjh3f80s6ktj8.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;then click on browse and select azure storage account you created&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B5-jfPOx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/21foo29ya71iubyds3r9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B5-jfPOx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/21foo29ya71iubyds3r9.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;then enter the name of connection string "cn" and path of container "sample-item" we have created  replace with actual values you have&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PxGrc1zB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pow9wo8aa36lqheae9po.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PxGrc1zB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pow9wo8aa36lqheae9po.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;click on create &lt;/p&gt;

&lt;p&gt;and replace the code with below code generated by Azure function&lt;br&gt;
also install below Nuget packages from tools  -&amp;gt; Nuget package manager -&amp;gt; Manage Nuget for solution&lt;/p&gt;

&lt;p&gt;Microsoft.Azure.WebJobs;&lt;br&gt;
Microsoft.Extensions.Logging;&lt;br&gt;
Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction;&lt;br&gt;
Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training;&lt;br&gt;
Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models;&lt;br&gt;
Microsoft.WindowsAzure.Storage;&lt;br&gt;
Microsoft.WindowsAzure.Storage.Table;&lt;/p&gt;

&lt;p&gt;ManOrMonkeyFunc.cs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using System;
using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
using System.Net.Http;
using System.Diagnostics;

namespace IdentifyManOrMonkeyCustomVision
{
    public static class ManOrMonkeyFunc
    {

        private static string trainingEndpoint = "enter api end point";
        private static string trainingKey = "enter key here";

        private static string predictionEndpoint = "enter api end point";
        private static string predictionKey = "enter key here";


        private static string publishedModelName = "Iteration1";

        private static string StorageAccountURIWithConatinerName = "enter storage account uri with containername";

        private static string ProjectGUID = "enter project guid";

        private static string ManTagname = "man";

        private static string MonkeyTagname = "monkey";

        private static string TableName = "helpfarmer";

        private const string playsound = "playing";

        private const string status = "status";

        private static TimeZoneInfo INDIAN_ZONE = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");

        static ManorMonkeyDeatails CurrentManorMonkeyDeatails;


        static CloudStorageAccount storageAccount = CloudStorageAccount.Parse("enter connection string here");

        static CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

        static CloudTable table = tableClient.GetTableReference(TableName);


        [FunctionName("ManOrMonkeyFunc")]
        public async static Task Run([BlobTrigger("manormonkey/{name}", Connection = "AzureWebJobsStorage")] Stream myBlob, string name, ILogger log)
        {

            CustomVisionTrainingClient trainingApi = AuthTraining(trainingEndpoint, trainingKey);
            CustomVisionPredictionClient predictionApi = AuthPrediction(predictionEndpoint, predictionKey);

            Project project = GetExistingProject(trainingApi);

            var response = await TestManORMonkeyPrediction(predictionApi, project, $"{StorageAccountURIWithConatinerName}{name}");

            if (response.monkey &amp;gt; response.man)
            {
                await InsertIncidentgDeatilsTOAzureTable($"Please review recent image looks like monkeys are entering into the farm probability is {response.monkey:P1}", $"{StorageAccountURIWithConatinerName}{name}", log);

                await InsertIncidentgDeatilsTOAzureTable(string.Empty, string.Empty, log, true);
            }

        }




        public static async Task&amp;lt;bool&amp;gt; InsertIncidentgDeatilsTOAzureTable(string message, string imageurl, ILogger log, bool insertstatus = false)
        {
            try
            {


                ManorMonkeyDeatails details= null;

                if (insertstatus)
                {
                    await GetCurrentSoundPlayingStatusAsync();

                    CurrentManorMonkeyDeatails.SoundPlayingStatus = playsound;

                    CurrentManorMonkeyDeatails.IncidentTime = DateTime.Now;

                    TableOperation updateoperation = TableOperation.Replace(CurrentManorMonkeyDeatails);
                }
                else
                {

                    details = new ManorMonkeyDeatails($"{TableName}", $"{TableName}{DateTime.Now:dd-MM-yyyy-HH-mm-ss}");

                    details.IncidentTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, INDIAN_ZONE);

                    details.Message = message;
                    details.ImageURL = imageurl;
                }



                TableOperation tblops = null;

                TableResult operationresult = null;

                if (insertstatus)
                {
                    tblops = TableOperation.Replace(CurrentManorMonkeyDeatails);

                    operationresult = await table.ExecuteAsync(tblops);
                }
                else
                {
                    tblops = TableOperation.Insert(details);

                    operationresult = await table.ExecuteAsync(tblops);

                }

                var sts = operationresult.HttpStatusCode;

                return true;
            }
            catch (Exception ex)
            {
                log.LogError(ex.ToString());
                return default;
            }
        }



        public static async Task GetCurrentSoundPlayingStatusAsync()
        {
            try
            {
                TableQuery&amp;lt;ManorMonkeyDeatails&amp;gt; query;




                query = new TableQuery&amp;lt;ManorMonkeyDeatails&amp;gt;().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, status));


                TableContinuationToken token = null;
                do
                {
                    TableQuerySegment&amp;lt;ManorMonkeyDeatails&amp;gt; resultSegment = await table.ExecuteQuerySegmentedAsync(query, token).ConfigureAwait(false);
                    token = resultSegment.ContinuationToken;

                    CurrentManorMonkeyDeatails = resultSegment.Results.FirstOrDefault();


                } while (token != null);



            }
            catch (Exception exp)
            {
                Debug.Write(exp);

            }
        }

        private static CustomVisionTrainingClient AuthTraining(string endpoint, string trainingKey)
        {

            CustomVisionTrainingClient trainingApi = new CustomVisionTrainingClient(new Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.ApiKeyServiceClientCredentials(trainingKey))
            {
                Endpoint = endpoint
            };
            return trainingApi;
        }
        private static CustomVisionPredictionClient AuthPrediction(string endpoint, string predictionKey)
        {

            CustomVisionPredictionClient predictionApi = new CustomVisionPredictionClient(new Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.ApiKeyServiceClientCredentials(predictionKey))
            {
                Endpoint = endpoint
            };
            return predictionApi;
        }


        private static Project GetExistingProject(CustomVisionTrainingClient trainingApi)
        {
            return trainingApi.GetProject(Guid.Parse(ProjectGUID));
        }

        private async static Task&amp;lt;(double man, double monkey)&amp;gt; TestManORMonkeyPrediction(CustomVisionPredictionClient predictionApi, Project project, string bloburi)
        {

            Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.Models.ImageUrl imageUrl = new Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.Models.ImageUrl(bloburi);
            var result = await predictionApi.ClassifyImageUrlAsync(project.Id, publishedModelName, imageUrl);

            double manprob = result.Predictions.Where(x =&amp;gt; x.TagName == ManTagname).FirstOrDefault().Probability;

            double monkeyprob = result.Predictions.Where(x =&amp;gt; x.TagName == MonkeyTagname).FirstOrDefault().Probability;

            return (manprob, monkeyprob);

        }

    }
}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ManorMonkeyDeatails.cs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using System;
using Microsoft.WindowsAzure.Storage.Table;

namespace IdentifyManOrMonkeyCustomVision
{
    public class ManorMonkeyDeatails : TableEntity
    {
        public ManorMonkeyDeatails()
        {

        }
        public ManorMonkeyDeatails(string skey, string srow)
        {
            this.PartitionKey = skey;
            this.RowKey = srow;
        }
        public DateTime IncidentTime { get; set; }

        public string Message { get; set; }

        public string ImageURL { get; set; }

        public string SoundPlayingStatus { get; set; }

    }
}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;b&gt;Xamarin&lt;/b&gt;:- Xamarin is an open-source platform for building modern and performant applications for iOS, Android, and Windows with .NET. Xamarin is an abstraction layer that manages communication of shared code with underlying platform code. Xamarin runs in a managed environment that provides conveniences such as memory allocation and garbage collection.&lt;/p&gt;

&lt;p&gt;More details for Xamarin can be found here &lt;a href="https://docs.microsoft.com/en-us/xamarin/get-started/what-is-xamarin"&gt;Learn More about Xamarin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on solution the click on new project as below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kdGjAGwL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7snqo0kfiy0e81bpydyq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kdGjAGwL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7snqo0kfiy0e81bpydyq.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TBDafOWo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/00k4tt3hfbuqae66uovw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TBDafOWo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/00k4tt3hfbuqae66uovw.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;then enter project name as ProtectFarm&lt;/p&gt;

&lt;p&gt;and select below shown Tabbed Option&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9JZdH2le--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fa4gbkmt9g78m07joqpv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9JZdH2le--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fa4gbkmt9g78m07joqpv.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on create&lt;/p&gt;

&lt;p&gt;once it is created go to Views folder and delete existing views right click and add new content view name ProtectFarm.xaml&lt;/p&gt;

&lt;p&gt;ProtectFarm.xaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ProtectFarm.Views.ProtectFarmPage"
             xmlns:vm="clr-namespace:ProtectFarm.ViewModels"
             Title="{Binding Title}"&amp;gt;

    &amp;lt;ContentPage.BindingContext&amp;gt;
        &amp;lt;vm:ProtectFarmViewModel /&amp;gt;
    &amp;lt;/ContentPage.BindingContext&amp;gt;

    &amp;lt;ContentPage.Resources&amp;gt;
        &amp;lt;ResourceDictionary&amp;gt;
            &amp;lt;Color x:Key="Accent"&amp;gt;#96d1ff&amp;lt;/Color&amp;gt;
        &amp;lt;/ResourceDictionary&amp;gt;
    &amp;lt;/ContentPage.Resources&amp;gt;
    &amp;lt;Grid&amp;gt;
        &amp;lt;Grid.RowDefinitions&amp;gt;
            &amp;lt;RowDefinition Height="Auto" /&amp;gt;
            &amp;lt;RowDefinition Height="*" /&amp;gt;
        &amp;lt;/Grid.RowDefinitions&amp;gt;
        &amp;lt;StackLayout BackgroundColor="{StaticResource Accent}" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"&amp;gt;
            &amp;lt;StackLayout Orientation="Horizontal" Padding="10" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"&amp;gt;

                &amp;lt;Label Text="Sound Status" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"&amp;gt;&amp;lt;/Label&amp;gt;

                &amp;lt;Label Text="{Binding CurrentSoundPlayingStatus}" HorizontalOptions="FillAndExpand"  VerticalOptions="FillAndExpand"  &amp;gt;&amp;lt;/Label&amp;gt;


                &amp;lt;Label Text="Update Time" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"&amp;gt;&amp;lt;/Label&amp;gt;

                &amp;lt;Label Text="{Binding IncidentDateTime}" HorizontalOptions="FillAndExpand"  VerticalOptions="FillAndExpand" &amp;gt;&amp;lt;/Label&amp;gt;

            &amp;lt;/StackLayout&amp;gt;
        &amp;lt;/StackLayout&amp;gt;
        &amp;lt;ScrollView Grid.Row="1"&amp;gt;
            &amp;lt;StackLayout Orientation="Vertical" Margin="0,20,0,0" Padding="10" Spacing="10"&amp;gt;


                &amp;lt;StackLayout  Orientation="Horizontal"&amp;gt;

                    &amp;lt;Button Text="Play Sound" x:Name="startsound" 
                        Command="{Binding PlaySoundCommand}"
                        BackgroundColor="{StaticResource Accent}"
                        TextColor="White"  HorizontalOptions="FillAndExpand"&amp;gt;&amp;lt;/Button&amp;gt;

                    &amp;lt;Button Text="Stop Sound" x:Name="stopdound" 
                        Command="{Binding StopSoundCommand}"
                        BackgroundColor="{StaticResource Accent}" 
                        TextColor="White"  HorizontalOptions="FillAndExpand"&amp;gt;&amp;lt;/Button&amp;gt;

                &amp;lt;/StackLayout&amp;gt;

            &amp;lt;/StackLayout&amp;gt;
        &amp;lt;/ScrollView&amp;gt;
    &amp;lt;/Grid&amp;gt;
&amp;lt;/ContentPage&amp;gt;





&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ItemsPage.xaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ProtectFarm.Views.ItemsPage"
             Title="{Binding Title}"
             xmlns:local="clr-namespace:ProtectFarm.ViewModels"  
             xmlns:model="clr-namespace:ProtectFarm.Models"  
             x:Name="BrowseItemsPage"&amp;gt;

    &amp;lt;ContentPage.ToolbarItems&amp;gt;
        &amp;lt;!--&amp;lt;ToolbarItem Text="Add" Command="{Binding AddItemCommand}" /&amp;gt;--&amp;gt;
    &amp;lt;/ContentPage.ToolbarItems&amp;gt;
    &amp;lt;!--
      x:DataType enables compiled bindings for better performance and compile time validation of binding expressions.
      https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/data-binding/compiled-bindings
    --&amp;gt;
    &amp;lt;RefreshView x:DataType="local:ItemsViewModel" Command="{Binding LoadItemsCommand}" IsRefreshing="{Binding IsBusy, Mode=TwoWay}"&amp;gt;
        &amp;lt;CollectionView x:Name="ItemsListView"
                ItemsSource="{Binding Items}"
                SelectionMode="None"&amp;gt;
            &amp;lt;CollectionView.ItemTemplate&amp;gt;
                &amp;lt;DataTemplate&amp;gt;
                    &amp;lt;StackLayout Padding="10" Orientation="Horizontal" x:DataType="model:ManorMonkeyDeatails"&amp;gt;
                        &amp;lt;StackLayout Orientation="Vertical"&amp;gt;
                        &amp;lt;Label Text="{Binding IncidentTime}" 
                            LineBreakMode="NoWrap" 
                            Style="{DynamicResource ListItemTextStyle}" 
                            FontSize="16" /&amp;gt;
                        &amp;lt;Label Text="{Binding Message}" 
                            LineBreakMode="WordWrap" WidthRequest="375"
                            Style="{DynamicResource ListItemDetailTextStyle}"
                            FontSize="13" /&amp;gt;
                        &amp;lt;/StackLayout&amp;gt;
                        &amp;lt;Image Source="{Binding ImageURL}"  HorizontalOptions="EndAndExpand" HeightRequest="100" WidthRequest="100"&amp;gt;&amp;lt;/Image&amp;gt;
                        &amp;lt;StackLayout.GestureRecognizers&amp;gt;
                            &amp;lt;TapGestureRecognizer 
                                NumberOfTapsRequired="1"
                                Command="{Binding Source={RelativeSource AncestorType={x:Type local:ItemsViewModel}}, Path=ItemTapped}"     
                                CommandParameter="{Binding .}"&amp;gt;
                            &amp;lt;/TapGestureRecognizer&amp;gt;
                        &amp;lt;/StackLayout.GestureRecognizers&amp;gt;
                    &amp;lt;/StackLayout&amp;gt;
                &amp;lt;/DataTemplate&amp;gt;
            &amp;lt;/CollectionView.ItemTemplate&amp;gt;
        &amp;lt;/CollectionView&amp;gt;
    &amp;lt;/RefreshView&amp;gt;
&amp;lt;/ContentPage&amp;gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ItemDetailPage.xaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;
&amp;lt;ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ProtectFarm.Views.ItemDetailPage"
             Title="{Binding Title}"&amp;gt;

    &amp;lt;StackLayout Spacing="20" Padding="15"&amp;gt;
        &amp;lt;Image Source="{Binding IMGURL}" HeightRequest="250" WidthRequest="250" &amp;gt;&amp;lt;/Image&amp;gt;
    &amp;lt;/StackLayout&amp;gt;

&amp;lt;/ContentPage&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;go to ViewModels from solution explorer and add new viewmodel class as below&lt;/p&gt;

&lt;p&gt;ProtectFarmViewModel.cs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Essentials;
using Xamarin.Forms;
using System.Linq;
using System.Linq.Expressions;
using ProtectFarm.Models;

namespace ProtectFarm.ViewModels
{
    public class ProtectFarmViewModel : BaseViewModel
    {

        private string curretstatus;

        public string CurrentSoundPlayingStatus
        {
            get =&amp;gt; curretstatus;
            set =&amp;gt; SetProperty(ref curretstatus, value);
        }


        private DateTime incdt;

        public DateTime IncidentDateTime
        {
            get =&amp;gt; incdt;
            set =&amp;gt; SetProperty(ref incdt, value);
        }

        const string status = "status";

        private const string playsound = "playing";

        private const string stopsound = "stopped";

        public ProtectFarmViewModel()
        {
            Title = "Protect Farm";
            PlaySoundCommand = new Command(async () =&amp;gt; await UpdateSoundPlayingStatustoAzureTable(playsound).ConfigureAwait(false));
            StopSoundCommand = new Command(async () =&amp;gt; await UpdateSoundPlayingStatustoAzureTable(stopsound).ConfigureAwait(false));

            Task.Run(async () =&amp;gt; await GetCurrentSoundPlayingStatusAsync().ConfigureAwait(false));
        }

        public ICommand PlaySoundCommand { get; }

        public ICommand StopSoundCommand { get; }



        public async Task GetCurrentSoundPlayingStatusAsync()
        {
            try
            {
                TableQuery&amp;lt;ManorMonkeyDeatails&amp;gt; query;


                query = new TableQuery&amp;lt;ManorMonkeyDeatails&amp;gt;().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, status));


                TableContinuationToken token = null;
                do
                {
                    TableQuerySegment&amp;lt;ManorMonkeyDeatails&amp;gt; resultSegment = await _linkTable.ExecuteQuerySegmentedAsync(query, token).ConfigureAwait(false);
                    token = resultSegment.ContinuationToken;

                    manorMonkeyDeatails = resultSegment.Results.FirstOrDefault();


                    CurrentSoundPlayingStatus = manorMonkeyDeatails.SoundPlayingStatus;
                    IncidentDateTime = manorMonkeyDeatails.IncidentTime;

                } while (token != null);

            }
            catch (Exception exp)
            {
                Debug.Write(exp);

            }
        }


        public async Task UpdateSoundPlayingStatustoAzureTable(string command)
        {
            if (manorMonkeyDeatails == null)
            {
                await GetCurrentSoundPlayingStatusAsync().ConfigureAwait(false);
            }

            manorMonkeyDeatails.SoundPlayingStatus = command;

            manorMonkeyDeatails.IncidentTime = DateTime.Now;

            TableOperation updateoperation = TableOperation.Replace(manorMonkeyDeatails);

            var insertoperationresult = await _linkTable.ExecuteAsync(updateoperation);

            CurrentSoundPlayingStatus = command;

        }

    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ItemsViewModel.cs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using Microsoft.WindowsAzure.Storage.Table;
using ProtectFarm.Models;
using ProtectFarm.Views;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace ProtectFarm.ViewModels
{
    public class ItemsViewModel : BaseViewModel
    {

        private string imgurl;

        public string ImgURL
        {
            get =&amp;gt; imgurl;
            set =&amp;gt; SetProperty(ref imgurl, value);
        }


        private string msg;

        public string MSG
        {
            get =&amp;gt; msg;
            set =&amp;gt; SetProperty(ref msg, value);
        }



        private DateTime     incdt;

        public DateTime Incident
        {
            get =&amp;gt; incdt;
            set =&amp;gt; SetProperty(ref incdt, value);
        }




        private ManorMonkeyDeatails _selectedItem;

        public ObservableCollection&amp;lt;ManorMonkeyDeatails&amp;gt; Items { get; }
        public Command LoadItemsCommand { get; }
        public Command AddItemCommand { get; }
        public Command&amp;lt;ManorMonkeyDeatails&amp;gt; ItemTapped { get; }

        public ItemsViewModel()
        {
            Title = "History";
            Items = new ObservableCollection&amp;lt;ManorMonkeyDeatails&amp;gt;();
            LoadItemsCommand = new Command(async () =&amp;gt; await ExecuteLoadItemsCommand());

            ItemTapped = new Command&amp;lt;ManorMonkeyDeatails&amp;gt;(OnItemSelected);

            //AddItemCommand = new Command(OnAddItem);
        }

        async Task ExecuteLoadItemsCommand()
        {
            IsBusy = true;

            try
            {
                Items.Clear();
                var items = await GetHistoryAsync().ConfigureAwait(false);
                foreach (var item in items)
                {
                    Items.Add(item);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                IsBusy = false;
            }
        }

        public void OnAppearing()
        {
            IsBusy = true;
            SelectedItem = null;
        }

        public ManorMonkeyDeatails SelectedItem
        {
            get =&amp;gt; _selectedItem;
            set
            {
                SetProperty(ref _selectedItem, value);
                OnItemSelected(value);
            }
        }



        async void OnItemSelected(ManorMonkeyDeatails item)
        {
            if (item == null)
                return;

            // This will push the ItemDetailPage onto the navigation stack
            await Shell.Current.GoToAsync($"{nameof(ItemDetailPage)}?{nameof(ItemDetailViewModel.IMGURL)}={item.ImageURL}");
        }



        public async Task&amp;lt;List&amp;lt;ManorMonkeyDeatails&amp;gt;&amp;gt; GetHistoryAsync()
        {
            try
            {
                List&amp;lt;ManorMonkeyDeatails&amp;gt; manorMonkeyDeatailslist = new List&amp;lt;ManorMonkeyDeatails&amp;gt;();

                TableQuery&amp;lt;ManorMonkeyDeatails&amp;gt; query;


                query = new TableQuery&amp;lt;ManorMonkeyDeatails&amp;gt;().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, $"{TableName}"));


                TableContinuationToken token = null;
                do
                {
                    TableQuerySegment&amp;lt;ManorMonkeyDeatails&amp;gt; resultSegment = await _linkTable.ExecuteQuerySegmentedAsync(query, token).ConfigureAwait(false);
                    token = resultSegment.ContinuationToken;

                    foreach (var entity in resultSegment.Results)
                    {
                        ManorMonkeyDeatails details = new ManorMonkeyDeatails
                        {
                            IncidentTime = entity.IncidentTime,
                            ImageURL = entity.ImageURL,
                            Message = entity.Message

                        };

                        manorMonkeyDeatailslist.Add(details);
                    }
                } while (token != null);


                return manorMonkeyDeatailslist;

            }
            catch (Exception exp)
            {
                Debug.Write(exp);
                return default;
            }
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ItemDetailViewModel.cs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using ProtectFarm.Models;
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace ProtectFarm.ViewModels
{
    [QueryProperty(nameof(IMGURL), nameof(IMGURL))]
    public class ItemDetailViewModel : BaseViewModel
    {

        private string imgurl;

        public string Id { get; set; }

        public string IMGURL
        {
            get =&amp;gt; imgurl;
            set =&amp;gt; SetProperty(ref imgurl, value);
        }

    }
}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BaseViewModel.cs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
using ProtectFarm.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Xamarin.Forms;

namespace ProtectFarm.ViewModels
{
    public class BaseViewModel : INotifyPropertyChanged
    {
        internal static string TableName = "helpfarmer";


        //please enter correct values from azure portal
        internal static CloudStorageAccount storageAccount = CloudStorageAccount.Parse("enter connection string here");

        internal static CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

        internal static CloudTable _linkTable = tableClient.GetTableReference(TableName);

        internal static ManorMonkeyDeatails manorMonkeyDeatails = new ManorMonkeyDeatails();



        bool isBusy = false;
        public bool IsBusy
        {
            get { return isBusy; }
            set { SetProperty(ref isBusy, value); }
        }

        string title = string.Empty;
        public string Title
        {
            get { return title; }
            set { SetProperty(ref title, value); }
        }

        protected bool SetProperty&amp;lt;T&amp;gt;(ref T backingStore, T value,
            [CallerMemberName] string propertyName = "",
            Action onChanged = null)
        {
            if (EqualityComparer&amp;lt;T&amp;gt;.Default.Equals(backingStore, value))
                return false;

            backingStore = value;
            onChanged?.Invoke();
            OnPropertyChanged(propertyName);
            return true;
        }

        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            var changed = PropertyChanged;
            if (changed == null)
                return;

            changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AppShell.xaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;Shell xmlns="http://xamarin.com/schemas/2014/forms" 
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:local="clr-namespace:ProtectFarm.Views"
       Title="ProtectFarm"
       x:Class="ProtectFarm.AppShell"&amp;gt;

    &amp;lt;!--
        The overall app visual hierarchy is defined here, along with navigation.

        https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/shell/
    --&amp;gt;

    &amp;lt;Shell.Resources&amp;gt;
        &amp;lt;ResourceDictionary&amp;gt;
            &amp;lt;Style x:Key="BaseStyle" TargetType="Element"&amp;gt;
                &amp;lt;Setter Property="Shell.BackgroundColor" Value="{StaticResource Primary}" /&amp;gt;
                &amp;lt;Setter Property="Shell.ForegroundColor" Value="White" /&amp;gt;
                &amp;lt;Setter Property="Shell.TitleColor" Value="White" /&amp;gt;
                &amp;lt;Setter Property="Shell.DisabledColor" Value="#B4FFFFFF" /&amp;gt;
                &amp;lt;Setter Property="Shell.UnselectedColor" Value="#95FFFFFF" /&amp;gt;
                &amp;lt;Setter Property="Shell.TabBarBackgroundColor" Value="{StaticResource Primary}" /&amp;gt;
                &amp;lt;Setter Property="Shell.TabBarForegroundColor" Value="White"/&amp;gt;
                &amp;lt;Setter Property="Shell.TabBarUnselectedColor" Value="#95FFFFFF"/&amp;gt;
                &amp;lt;Setter Property="Shell.TabBarTitleColor" Value="White"/&amp;gt;
            &amp;lt;/Style&amp;gt;
            &amp;lt;Style TargetType="TabBar" BasedOn="{StaticResource BaseStyle}" /&amp;gt;
            &amp;lt;Style TargetType="FlyoutItem" BasedOn="{StaticResource BaseStyle}" /&amp;gt;
        &amp;lt;/ResourceDictionary&amp;gt;
    &amp;lt;/Shell.Resources&amp;gt;

    &amp;lt;TabBar&amp;gt;
        &amp;lt;ShellContent Title="Protect Farm" Icon="icon_about.png"  ContentTemplate="{DataTemplate local:ProtectFarmPage}" /&amp;gt;
        &amp;lt;ShellContent Title="History" Icon="icon_feed.png" ContentTemplate="{DataTemplate local:ItemsPage}" /&amp;gt;
    &amp;lt;/TabBar&amp;gt;

    &amp;lt;!--
        If you would like to navigate to this content you can do so by calling
        await Shell.Current.GoToAsync("//LoginPage");
    --&amp;gt;



&amp;lt;/Shell&amp;gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also last but no least I have used &lt;b&gt;Azure custom vision&lt;/b&gt; to build the app which can be accessed from the &lt;a href="https://www.customvision.ai/"&gt;https://www.customvision.ai/&lt;/a&gt; with active azure subscription&lt;/p&gt;

&lt;p&gt;We have to sign in with Microsoft account with azure subscription then click on new project&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LDHkEkAy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6kro5s803z8a1gt5jyx2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LDHkEkAy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6kro5s803z8a1gt5jyx2.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;we need to enter the resource details on web page and have select &lt;b&gt;General (compact) which allow us to export our prediction project to Tensorflow, CoreML, ONNX model which we can use once project training has been completed and we can extend our model to offline scenario as well device running with android , ios to process our images to make prediction &lt;/b&gt; &lt;/p&gt;

&lt;p&gt;on the webpage we need to add tag here i added man and monkey as 2 tags and trained project using around 20 images per tag and ran quick training then published the project&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uUiCtu0O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fhpyrirs14tz8yfh6h26.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uUiCtu0O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fhpyrirs14tz8yfh6h26.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;it has 3 tab we can upload image and set tag on each image from webpage it self after upload then we can click on train image.&lt;/p&gt;

&lt;p&gt;Once Training has completed we can get Prediction url from Performance Tab which is used in Azure Function Project. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--833mkGIL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ob2vy5lb4d4e159fw8bz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--833mkGIL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ob2vy5lb4d4e159fw8bz.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please see video in Live action &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ovf45SnUp_E"&gt;https://www.youtube.com/watch?v=ovf45SnUp_E&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks a lot  :) to read my story .&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
