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

.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の公式のソースコードをクローンしてデモアプリを試した方がいいかと

おしまい

コメント

このブログの人気の投稿

ImDiskの後継アプリのAIM toolkitを試してみた

ImDiskの開発辞めちゃったらしい というわけで、じゃあ後継ソフトはあるのかと思ったらあった 遅いと言われているけど・・・ とインストールしてみた ImDiskのこの間の結果はこちら 再びRAM DISK(ImDisk)   blog.mazepin-led.com    そして今回のAIM Toolkit なんか、無茶苦茶遅くなってるな 下手するとSSDの方が速いじゃん CPUの使用状態はこんな感じ PIO転送なところは変わって無さそう まあ、遅いからと言ってその速度が体感できるのかというと出来ないんだけどね と思ったところで、なんか設定変えてみたらどうなるのだろう Allocate Memory Dynamicallyというのは、メモリを必要に応じてってことだからと思って以前試したことがあったけど、なんかImDiskのときは不安定だったんだよな  AdvancedのとこにあるUse AWE Physical Memoryというのが良くわからないけど、チェックしてみたら速くなった おお、大分速くなった。なったけど・・・・なんで? これだとImDiskよりちょっと遅いくらいになるのか もしやQuickFormatととかでも変わるのか?と思ったけどそこまでやる気も無かったので放置。速くなるわけないよね。 後は圧縮とか、取り外しメディアとかだし。   最近の性能の良いSSDのおかげで RAM DISKというものの存在意義が薄れちゃったね まあそれでとにかく速度を稼ぎたいぜって人は SoftPerfect RamDiskでも使ってください 昔はPrimo Ramdisk使ってました。当時使ってたけどなかなか良かった。 当時SSD無茶苦茶高かったし。 今はほぼ無用になってしまったが・・・ 未だにスタンダード版は8GBまでなんだな キャッシュ領域にしたいなら大人しく余ってるSSDを使った方がいいんじゃ無いかって気がするけど  おしまい

QCC dongle proを買った→Windows11で接続までのみちのり

何があった  買ったけど最初の接続に手間取ったので そのメモ QuestyleのQCC dongle proを買ったのだけど、使っているイヤホンと接続できない なんでー? ペアリングしてるのに 説明書 説明書には外装のQRコードを読むように書いてあるのだけど そもそもpage not found 404になる   Windowsには・・・ ちゃんと  ヘッドホンのところには QCC Dongle Pro って出てるのよね しかし音が出ない つーか、新しいペアリングはどうやるのだ  スマホが必要でした 何だそりゃっていいたくなるがどうやらまず、スマホにQCC dongle Pro接続して専用アプリで ドングルとイヤホンをペアリングする必要があった 何だそりゃー Google PlayでQuestyleで検索かけるか こちら でまずはインストール そしてスマホにドングルを刺して、このアプリ内からイヤホンをペアリング そしてそのドングルをWindows11の空いてるUSB TYPE-Cポートに突き刺す   音が出た! やったね  結局音が良くなった?  どうなんだろうね 正直言ってよくわからん ただ、マイケルジャクソンのThe Jamのオープニングのガラスの割れる音は 今までよりも細かくパリパリ聞こえるようになったから効果はあったんだと思う それと遅延が少なくなった  finalのZE3000 SVというイヤホンを使っていたのだけど今までのただのUSBドングルで YouTubeを見てると明らかに音と画面のタイミングがずれてて、 Bluetoothイヤホンってこんなもんかと表他のだけどそれが亡くなったのはとても快適 LDACは遅延が酷いとか書いてあったからビビってたんだけどね(でも有線イヤホン使うと、あ、これが合ってる状態なんだってなるので遅延はあるみたい)   あと、たまにイヤホンと繋がらなくなるねぇ 相性問題というやつなのだろうか    今までのUSBドングルが捨てられない 最期に罠が一つ そりゃ無いぜって言いたくなるのが今までのUSBドングルが捨てられないこと このQCC dongle pro はWindowsからはイヤホンとして認識されるので他のBluetoo...

結局Alternative A2DP Driverにした

なぜならば 手持ちの安物のBluetoothドングルで使えたから QCC dongle pro を買ったのってこのドングルがあれば、イヤホンに LDAC 接続してスマホとのブルートゥース接続も出来ると思ったから ところが、このドングルはイヤホンと1対1で繋がってしまって、他の接続には一切使えない 今まで使ってた安物のドングルと2つも使うことになってしまった  ソフトウェア ドライバーを入れ替えればいいのであればそっちの方がいいや そう思ってドライバーを入れました  ドングル PCに刺さっているドングルは TP-Link Bluetooth 5.4 USB Adapter というやつ 1000円ちょっとで買えます Alternative A2DP Driver インストール AlternativeA2dpのオフィシャルページ AlternativeA2dpの説明など ダウンロードは下の方にある   www.bluetoothgoodies.com ↑このページの下の方にあります   後は他のアプリと同様にインストール   パラメータ調整 この画面で適当に自分のイヤホンにあった設定をして下さい finalの ZE3000 SV はaptには一切対応していないので迷うことなくLDACを選択しました 購入  気に入らなかったら削除しておしまい 気に入ったら購入しますが、Alternative A2DP Driverの右上をクリックすると購入が出てくるので 決済ページに飛んでいくので決済 私は PayPal で払いました  PayPalだと何も入力しなくても、PayPalのアカウントにメールで認証ファイルが送られてきます  ちなみに買ったのはAACサポート有りのバージョン $8. 99でした(無しだったら$5.99) 購入したライセンスの適用 購入したライセンスの適用を選択したら、ダイアログが出てくるのでメールで到着したファイルを選択するとライセンスが適用されます 下の方に今のビットレートとか出てくるからまあそれを参考に自分の設定を詰めていってくださいな エンコード品質はSQ(中)にしました HQ(高)だとたまに無音になるのだけど、結構マシンパワーあるはずなのだけどなぁ 不思議なのは...