AI時代的網站與手機App建置與開發Part13 - 建立支援預測股票價格的手機App
· 摘要
在上一篇文章中, 我們利用ML.NET建立了一個預測股票價格的機器學習模型, 並利用建立妥的機器學習模型製作了一個支援預測股票價格的Core MVC網站. 這篇文章中, 我們將要利用支援預測股票價格的機器學習模型建立能夠預測股票價格的手機App.
·
處理CORS安全保護問題
部署機器學習模型的Web API專案預設會啟用跨來源資源分享(Cross Origin Resource Sharing – CORS), 禁止和Web API專案不同來源的JavaScript程式呼叫, 如果要解除CORS安全保護, 可以編輯Web API專案根目錄的Program.cs, 於//Configure
app註解下方定義CORS的開放策略:
// Configure app
string MyAllowSpecificOrigins = "AllowOrigin";
builder.Services.AddCors(options
=> {
options.AddPolicy(
name: MyAllowSpecificOrigins,
policy => policy.WithOrigins("*").WithHeaders("*").WithMethods("*"));
});
請注意上述程式碼呼叫WithOrigins函式傳入*當做參數, 表示不限制任何JavaScript程式叫用Web API服務.
定義妥CORS開放策略後, 請於叫用app的Run函式前套用前述定妥的CORS開放策略, 就可以完成解除對JavaScript程式的CORS安全管制.
app.UseCors(MyAllowSpecificOrigins);
app.Run();
·
建立基於MAUI跨平台架構的手機APP專案
請啟動Visual Studio 2022, 執行[檔案 | 新增 | 專案]功能, 選擇建立[.NET MAUI應用程式]型態的專案, 如圖1所示:
圖1: 使用Visual Studio 2022建立[.NET MAUI應用程式]型態的專案的畫面
·
信賴ASP.NET Core HTTPS development certificate
ASP.NET Core Web API專案會使用開發憑証(Development
Certificate)讓Web API能夠支援用戶端使用HTTPS叫用Web API服務的功能, 但是開發憑証並未設定為被信任的憑証, 所以我們要先開啟[命令提示字元]程式, 執行下列的命令, 設定信任ASP.NET Core Web API專案使用的開發憑証:
dotnet dev-certs https --trust
·
建立HttpsClientHandlerService 類別
接下來請為專案加入以下名稱為HttpsClientHandlerService的類別, 負責設定執行在Android模擬器的MAUI手機程式和執行在iOS模擬器的MAUI手機程式信任本機電腦的自我簽署憑証:
public class HttpsClientHandlerService
{
public HttpMessageHandler
GetPlatformMessageHandler()
{
#if ANDROID
var handler = new Xamarin.Android.Net.AndroidMessageHandler();
handler.ServerCertificateCustomValidationCallback = (message,
cert, chain, errors) =>
{
if (cert != null &&
cert.Issuer.Equals("CN=localhost"))
return true;
return errors ==
System.Net.Security.SslPolicyErrors.None;
};
return handler;
#elif IOS
var handler = new
NSUrlSessionHandler
{
TrustOverrideForUrl = IsHttpsLocalhost
};
return handler;
#else
throw new
PlatformNotSupportedException("Only Android and iOS supported.");
#endif
}
#if IOS
public bool
IsHttpsLocalhost(NSUrlSessionHandler sender, string url, Security.SecTrust
trust)
{
if
(url.StartsWith("https://localhost"))
return true;
return false;
}
#endif
}
·
定義描述呼叫部署機器學習模型的Web API服務傳回的執行結果的類別
請參考[AI時代的網站與手機App建置與開發Part11 - 使用ML.NET預測股票的收盤價格]這篇文件提到由ML.NET程式庫產生的MLModel.consumption.cs檔案中的ModelOutput類別, 為專案加入以下的ModelOutput類別, 請注意不可以直接使用ML.NET程式庫生成的ModelOutput類別, 您必須將原先ModelOutput類別中的所有的屬性的第一個英文字元由原先的大寫英文字變更成小寫的英文字元, 例如將原有名稱為Date的屬性的名稱變更成date, 將原有名稱為Open的屬性的名稱變更成open, 以此類推, 編輯妥的ModelOutput類別如下:
public class ModelOutput
{
[ColumnName(@"Date")]
public float[] date { get; set; }
[ColumnName(@"Open")]
public float open { get; set; }
[ColumnName(@"High")]
public float high { get; set; }
[ColumnName(@"Low")]
public float low { get; set; }
[ColumnName(@"Last")]
public float last { get; set; }
[ColumnName(@"Close")]
public float close { get; set; }
[ColumnName(@"Total Trade
Quantity")]
public float total_Trade_Quantity { get; set; }
[ColumnName(@"Turnover
(Lacs)")]
public float turnover__Lacs_ { get; set; }
[ColumnName(@"Features")]
public float[] features { get; set; }
[ColumnName(@"Score")]
public float score { get; set; }
}
·
製作手機App預測股票價格的使用者介面
編輯MAUI手機App專案根目錄下的MainPage.xaml檔案, 將<ScrollView>的內容編輯成以下的樣子, 負責定義預測股票價格的使用者介面:
<ScrollView>
<VerticalStackLayout Padding="30,0"Spacing="25">
<Label Text="Date:"/>
<DatePicker x:Name="Date" Date="2018-09-27"></DatePicker>
<Label Text="Open:"/>
<Entry x:Name="Open" Text="234.55"></Entry>
<Label Text="High:"/>
<Entry x:Name="High" Text="236.8"></Entry>
<Label Text="Low:"/>
<Entry x:Name="Low" Text="231.1"></Entry>
<Label Text="Last:"/>
<Entry x:Name="Last" Text="233.8"></Entry>
<Label Text="Total_Trade_Quantity:"/>
<Entry x:Name="Total_Trade_Quantity" Text="5082859"></Entry>
<Label Text="Turnover__Lacs:"/>
<Entry x:Name="Turnover__Lacs" Text="11859.95"></Entry>
<Button x:Name="BtnPredict" Text="預測" Clicked="OnPredictClicked"
HorizontalOptions="Fill" />
</VerticalStackLayout>
</ScrollView>
· 處理手機App使用者按下輸入股票相關資訊表單下方的[預測]按鍵的事件
請為MainPage.xaml.cs類別加入以下的OnPredictClicked函式, 負責發送HTTP呼叫至Web API提供的機器學習服務(請注意在Android模擬器執行的手機程式必須使用10.0.2.2 IP位址呼叫佈署在本機電腦的Web API服務), 傳入股價的相關資料, 以預測股票價格結果:
private async void OnPredictClicked(object sender, EventArgs e)
{
//請注意下列的57603為佈署在本機電腦的Web
API服務使用的連接埠
string BaseAddress =
DeviceInfo.Platform == DevicePlatform.Android
? "https://10.0.2.2:
57603" : "https://localhost:
57603";
//叫用佈署在本機電腦的Web
API服務時請利用HttpsClientHandlerService建立HttpClient類別的物件
#if DEBUG
HttpsClientHandlerService handler = new HttpsClientHandlerService();
HttpClient Client = new
HttpClient(handler.GetPlatformMessageHandler());
#else
HttpClient Client = new
HttpClient();
#endif
object data = new //建立描述股票價格的相關資料
{
Date = Date.Date,
Open = Open.Text,
High = High.Text,
Low = Low.Text,
Last = Last.Text,
Total_Trade_Quantity
= Total_Trade_Quantity.Text,
Turnover__Lacs =
Turnover__Lacs.Text,
};
string Uri = $"{BaseAddress}/predict"; //欲呼叫的Web
API的端點
string strContent =
JsonSerializer.Serialize(data);
var content = new
StringContent(strContent, Encoding.UTF8, "application/json");
HttpResponseMessage
Response = await Client.PostAsync(Uri,
content);//發送呼叫
Response.EnsureSuccessStatusCode();
string Json = await
Response.Content.ReadAsStringAsync(); //讀取呼叫的結果
var Result =
JsonSerializer.Deserialize<ModelOutput>(Json);
float score = Result.score; //取得預測股票價格
await DisplayAlert("預測股價", $"{score}元", "關閉"); //顯示預測股票價格
}
·
執行手機App並送出股價相關資料以獲取預測的股票價格
請於Visual
Studio開發工具中使用F5功能鍵以DEBUG模式執行手機App專案, 因為我們的程式會於DEBUG模式利用HttpsClientHandlerService類別建立呼叫位於本機電腦的Web
API服務的HttpClient類別物件, 請注意手機App欲呼叫的Web API服務必須預先啟動, 叫用Web API服務的功能才會成功. 圖2所示即為手機App呼叫佈署機器學習模型的Web API服務的畫面:
圖2: 使用手機App提交股價相關資料以獲取預測的股票價格的畫面


留言
張貼留言