スキップしてメイン コンテンツに移動

.NET MAUI でSSIDを指定してWifiのアクセスポイントに接続する

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"と入れたら出てくるのでそれをインストールするだけ
インストール数がそれほど無いからまだみんな知らないのかなぁ
前回探したときも無かった気がするし

WifiManagerのインストール(MAUI)

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)メソッドを利用します

実験結果

SSID権限

最初は恐らく権限が足りないので付与するための画面が出てきます(これはWifiManagerの機能では無くPermissionStatus status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>()の実行結果

Wifiのアクセスポイントに接続するためにはLocation権限が「性格」の方じゃ無いとダメみたい(Androidの場合・・・iOSは知らん)

Wifiの選択

 そうすると色々アクセスポイントの設定が表示されるので今回は"nikoniko_jikkendai"選択。
インターネットに繋がってるけど本当にこのまま接続するのかとか色々出てくるけどOKしてください
SSID接続結果

このアプリそのものは送信から受信までやっているのだけど成功しました

結論

これで自分の指定したWifiアクセスポイントに接続出来るようになりました。やったね。

ソースコード

面倒くさいのでソースコードをgithubに置いておきます

ESP32

ESP32はVisual Studio Code + Platform.ioでコーディングしています

Visual Studio

SSIDを使用したアクセスポイントへの接続からTCPソケットの接続、送信、受信までです。
アクセスポイントへの接続だけなら上の方でリンクしたWifiManagerの公式のソースコードをクローンしてデモアプリを試した方がいいかと

おしまい

コメント

このブログの人気の投稿

RAM DISKを使ってみた(使ったのはImDisk)

GWだし、まあちょっとラムディスクを入れてみました うちのPCはWindows11 使ったのはImDiskというRAM Disk。 まあ、この辺のインストールとかはあちこちで解説してる人がいるので適当にぐぐってくださいな で、とりあえずベンチマーク なかなかいいスピードだ で、大抵の人はブラウザのキャッシュをRAMディスクにするといいよ・・・と言うけど そもそもメインドライブがNVMeのSSDを使っている状態で、体感速度なんか上がらない(使い終わったキャッシュを再起動したら綺麗さっぱり捨て去ってくれるという利点はある)  うちで一番効果があるのは Adobe Audition というアプリ これが結構高速化する(キャッシュをちゃんとRAMディスクにしたら・・・だけど) ハイレゾ音源だと、1時間の音源が何かする度に4GBのファイルを作られてしまう なので、RAM DISKにすると、結構編集時間を短縮できる Premiere Rushも出力先をRam Diskにしておいて終わったら、SSDにコピーすると言う事をやるとかなりスピードアップになる 実はうちのPCは普段は99%のパワーで動作していて、CPUのターボブーストが掛からないようになっている 大体3.6GHz当たりで安定してるのだけど、これを100%にするとターボブースト機能がONになって一部のコアが4.5とか4.8GHzまで上がる まあ、毎回電源オプションをいじる事になるのだけどさ・・・ そうしてベンチを取ると こんな感じ とは言え、ブーストしてるからと行ってRam Diskのスピードの差を体感する事はさすがに無理 ・・・と言うかフォトショでもRAM DISKにしてよかった・・・と言うほど変わらない SSDの性能が上がってきたしもし次にPCを買い換えたらRAM DISKよりSSDの方が速いかもね  

.NET MAUI BLE(Bluetooth Low Energy)も上手く行った

2023/10/11更新 ↓こちらの記事で更新しれました。 .NET MAUI PLUGIN BLEがWindows(10/11)に対応してた Windows対応 イヤッッホォォォオオォオウ Bluetooth LE plugin for Xamarin &amp; MAUI がWindowsに対応してた~ nugetでver3.00をみんな早速ゲットだ。   ちなみにこちらはAndroid版のサンプルアプリ   GitHub...   [ブログカード風リンクタグ作成] ------------------------------------------------------------------------------ 昔、スマホとESP32の接続確認用に作ったプログラムをXamarinからMAUIに移植したら動いちゃった   まあ、ESP32からスマホへの一方通行なアプリなんだけど 面倒くさいので github に公開した 下手くそなコード書きやがってとか思われそう 「間違ってるぞこのやろう」というのを見つけたら教えてくれると嬉しいです 要素技術の調査はこれで完了かな

.NET MAUIでスプラッシュスクリーン Android12で地獄を見る

まずは起動するところから・・・・  スプラッシュスクリーンだぬ マイクロソフトのサイト 見てると簡単そう(実際簡単で細かい事を気にしなければsvgファイルを用意して1行だけ書き換えておしまい)   なんかプロジェクトファイルに自動で記述されるらしい よし、プロジェクト作った                     つーか、もうスプラッシュがあるんだけど・・・・ そして自作のsvgファイル くうっ・・・デザインセンスない・・・・   それはともかく、このSVGファイルを Resources\Images にドラッグ&ドラッグ プロジェクトを右クリックして「プロジェクトファイルの編集」 して、編集できるようになったプロジェクトファイルを 自分のプロジェクトファイルに書き換える <MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="168,168" /> ↓ <MauiSplashScreen Include="Resources\Splash\ splashtestmaui .svg" Color="#512BD4" BaseSize="168,168" />   とりあえずAndroidで実行 お、おう・・・・ まあ最初はこんなもんよね 最初に紹介したマイクロソフトのサイトでもBaseSizeを書き換えてくださいって言ってるし 言われたとおりに <MauiSplashScreen Include="Resources\Splash\splashtestmaui.svg" Color="#512BD4" BaseSize=" 320,600 " /> 書き換えてみると いい感じじゃーん じゃあアンドロイドのバージョン毎に試してみよう   Android 7 Android 11 Android 12 Android 13