nugetにあった
.NET MAUIでSSIDを指定して直接アクセスする方法、以前はこんな記事を書いてしまったけどnugetにあった。
前探したときは無かった気もするけど・・・
それはともかく試してみた
いつもニコニコ実験台ESP32
WifiアクセスポイントにはESP32になって貰った
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>
// https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiAccessPoint/WiFiAccessPoint.ino
const char *ssid = "nikoniko_jikkendai"; //!< SSID
const char *password = "yourPassword"; //!< パスワード
WiFiServer server(1999); //!< Wifiサーバー(port:1999)
/// @brief セットアップ
void setup()
{
Serial.begin(115200); //デバッガー向けシリアル
Serial.println();
Serial.println("初期化中...");
// アクセスポイントを設定
if (!WiFi.softAP(ssid, password))
{
log_e("アクセスポイントを設定できませんでした");
while (1)
;
}
IPAddress myIP = WiFi.softAPIP(); // IPアドレスを取得
Serial.print("AP IP address: ");
Serial.println(myIP);
server.begin(); // サーバーを開始
Serial.println("TCPサーバー開始");
}
/// @brief メインループ
void loop()
{
WiFiClient client = server.accept(); // リスナーの接続受入開始
if (client) // クライアントが接続している場合
{
Serial.println("クライアントが接続した");
while (client.connected())
{ // クライアントが接続している間ループ
if (client.available()) // 受信データ有り
{
String recvString = client.readString(); // バッファからデータを読み込む
recvString+="\n"; // 改行を追加
Serial.write(recvString.c_str()); // 受信データをシリアルに出力
client.write("氏ね"); // クライアントにデータを送信
}
delay(10); // 10ms待機
}
// close the connection:
client.stop();
Serial.println("切断されました");
}
else
{
sleep(1);
}
}
上記のソースでESP32はアクセスポイントになり、更にTCPサーバになって貰う
WifiManager.MAUI
そしてMAUI側はWifimanager.MAUIをインストールする
取説はこちら(github)
デモアプリ
githubのソースをクローンするとデモアプリがあるのでまずはそれで遊んでください。大体感覚は理解出来るようになると思います
まずはインストール
とは言えnugetで"WifiManager"と入れたら出てくるのでそれをインストールするだけ
インストール数がそれほど無いからまだみんな知らないのかなぁ
前回探したときも無かった気がするし
AndroidManifest.xml
マニフェストファイルはこんな感じ
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>
MauiTestWifiManager\Platforms\Android\MainActivity.cs
MainActivityに初期化ロジックを追加(Android以外は不要らしい)
デモアプリをコピペしてこんなコード
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
public static Context AppContext { get; private set; }
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
AppContext = ApplicationContext;
WifiNetworkService.Init(this);
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
重要なのはWifiNetworkService.Init(this);
()OnRequestPermissionsResult()は権限チェックのため
xamlファイル
ボタンとラベルを付けただけだけど・・・
<ScrollView>
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Label Text="Wi-Fi Managerテスト" FontSize="30" />
<!-- スキャン -->
<Button x:Name="CheckPermissionButtono" Text="スキャン" Clicked="CheckPermissionButtono_Clicked" />
<Label x:Name="ResultPermissionLabel" Text="" />
<!-- WIFI接続 -->
<Button x:Name="ConnectAccessPointButtn" Text="WIFI接続" Clicked="ConnectAccessPointButtn_Clicked" />
<Label x:Name="ResultAccessPoitLabel" Text="" />
<!-- TCP接続 -->
<Button x:Name="ConnectTcpButtn" Text="TCP接続" Clicked="ConnectTcpButtn_Clicked" IsEnabled="True" />
<Label x:Name="ResultTcpLabel" Text="" />
<!-- TCP送信 -->
<Button x:Name="SendButtn" Text="送信" Clicked="SendButtn_Clicked" IsEnabled="False"/>
<Editor x:Name="SendTextEditor" Text="おはよう" />
<Label x:Name="ResultTextLabel" Text="" />
</VerticalStackLayout>
</ScrollView>
xaml.csファイル
例えばWifiアクセスポイントに接続するだけならこんな感じ
/// <summary>
/// Wifiアクセスポイントに接続ボタンクリック
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void ConnectAccessPointButtn_Clicked(object sender, EventArgs e)
{
PermissionStatus status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
string? ssid = string.Empty;
if (status == PermissionStatus.Granted || DeviceInfo.Current.Platform == DevicePlatform.WinUI)
{
CrossWifiManager.Current.DisconnectWifi("esp32_apppoint");
var response = await CrossWifiManager.Current.ConnectWifi("nikoniko_jikkendai", "yourPassword");
var a = await CrossWifiManager.Current.GetNetworkInfo();
}
else
{
await DisplayAlert("No location permisson", "Please provide location permission", "OK");
}
Dispatcher.Dispatch(() =>
{
ResultAccessPoitLabel.Text = "Wifi接続";
ConnectTcpButtn.IsEnabled = true;
});
}
CrossWifiManager.Currentの下に色々メソッドがぶら下がっているのでそのうちのConnectWifi(ssid,password)メソッドを利用します
実験結果
最初は恐らく権限が足りないので付与するための画面が出てきます(これはWifiManagerの機能では無くPermissionStatus status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>()の実行結果
Wifiのアクセスポイントに接続するためにはLocation権限が「性格」の方じゃ無いとダメみたい(Androidの場合・・・iOSは知らん)
そうすると色々アクセスポイントの設定が表示されるので今回は"nikoniko_jikkendai"選択。
インターネットに繋がってるけど本当にこのまま接続するのかとか色々出てくるけどOKしてください
このアプリそのものは送信から受信までやっているのだけど成功しました
結論
これで自分の指定したWifiアクセスポイントに接続出来るようになりました。やったね。
ソースコード
面倒くさいのでソースコードをgithubに置いておきます
ESP32
ESP32はVisual Studio Code + Platform.ioでコーディングしています
Visual Studio
SSIDを使用したアクセスポイントへの接続からTCPソケットの接続、送信、受信までです。
アクセスポイントへの接続だけなら上の方でリンクしたWifiManagerの公式のソースコードをクローンしてデモアプリを試した方がいいかと
おしまい
コメント
コメントを投稿