<Wi-Fi機能の利用方法> Raspberry Pi Pico Wに、Wi-Fi版のMachiKania type Pをインストールすると、Wi-Fi機能を利用することができます。2.4 GHz帯のWi-Fiルーターを使用してください。ルーターに接続すためのSSIDとパスワードは、MACHIKAP.INIで次の例のように設定することができます。 WIFISSID=xxxx WIFIPASSWD=xxxx ルーターがDHCPによるIPアドレスの自動割り当ての機能を持っていれば(ほとんどのケースで持っています)、ネットに接続することができます。ルーターがインターネット接続であれば、MachiKaniaからもインターネットに接続することができます。 MachiKaniaを用いて、クライアントアプリケーションとサーバーアプリケーションのどちらでも構築することができます。インターネットではHTTPプロトコル(http, https, web, www, htmlなどと表記されるもの)が多用されますが、MachiKaniaでは、WGETクラスやHTTPDクラスを用いて、http/httpsクライアントアプリケーションやhttpサーバーアプリケーションを容易に構築できます。 <Wi-Fi用のSSIDとパスワードを指定するもう一つの方法> Wi-Fi用のSSIDとパスワードをMMC/SDカードにファイルとして保存する事がセキュリティー上問題になるケースがあると思います。そのような場合は、Raspberry Pi Pico Wの本体に、SSIDとパスワードを埋め込むことができます。これには、GitHubレポジトリーの「scripts」フォルダーにある、「embed_ssid_passwd.php」もしくは「embed_ssid_passwd_kb.php」を用います。「phyllosoma.uf2」もしくは「phyllosoma_kb.uf2」を同じフォルダーにコピーし、「embed_ssid_passwd.php」もしくは「embed_ssid_passwd_kb.php」を編集してファイル冒頭でSSIDとパスワードを指定してください。PHPにてこれらのphpスクリプトを実行すれば「result.uf2」が作成されますので、Raspberry Pi Pico WのRPI-RP2ドライブにコピーしてください。MACHIKAP.INIにSSIDやパスワードを記述しなくても、Wi-Fiに接続できます。 <Wi-Fi関連のMACHIKAP.INI設定> 関連したMACHIKAP.INIの設定は、次の物があります。 USEWIFI 指定すると、起動時にWi-Fiに接続する。 WIFICOUNTRY= アルファベット2文字の、国識別コードを指定する。日本は「JP」アメリカは「US」。cyw43-driveのソースコード(https://github.com/georgerobotics/cyw43-driver)の「src/cyw43_country.h」を参照のこと。 WIFISSID= WIFIPASSWD= Wi-Fi接続時のSSIDとパスワードを指定。 HOSTNAME= Wi-Fi接続時のホスト名を指定(デフォルト: PicoW)。ドメイン名は使用するルーターによって異なる。フルネームを知りたいときはコンソール/コマンドプロンプトで「ping -a 」などの方法で調べることができる。 NTPSERVER= 使用するNTPサーバーのホスト名を指定(デフォルト: pool.ntp.org)。 INITIALNTP 起動時にNTPサーバーに接続してリアルタイムクロック(RTC)の設定を行いたいときに指定。 <ネット接続用のクラス> クライアントアプリケーション用のクラスとして、WGETをライブラリーに用意しました。これを用いると、URLを文字列として指定するだけで、webサイトから情報を取得することができます。httpsサイトにも対応しています。使い方は、WGETクラスのhelp.txtを参照してください。 サーバーアプリケーション用のクラスとして、HTTPDをライブラリーに用意しました。htmlや画像ファイルなどをディレクトリーに配置しておけば、一般的なHTTPサーバーとして用いることができます。どのURLにアクセスを受けたのかを容易に知ることができるので、スマートフォンからMachiKaniaを操作する事が、簡単にできます。使い方は、HTTPDクラスのhelp.txtを参照してください。 <Wi-Fi用の命令と関数> Wi-Fiに関連した命令や関数としては、以下の物があります。使い方の概要としては、まずTCPCLIENT/TLSCLIENT/TCPSERVERのいずれかを呼び出し、TCPSTATUS()もしくはTCPACCEPT()をポーリングし、接続があればTCPSEND/TCPRECEIVEで反応を行い、最後にTCPCLOSEで接続を切る、という流れです。下の使用例や、WGETクラスやHTTPDクラスでの利用例を参考にしてください。 DNS$(x$) インターネット上のホスト名がx$で示されるコンピューターのIPアドレスを文字列として返す。 IFCONFIG$(x) Wi-Fi接続情報を文字列として返す。 xが0の時、IPアドレス xが1の時、サブネットマスク xが2の時、ゲートウェイアドレス xが3の時、DNSサーバーアドレス xが16の時、MACアドレス NTP, NTP() NTPサーバーに接続し、RTC(リアルタイムクロック)を設定する。関数として呼ばれた場合は、エラー番号(エラーが無いときは0)を返す。NTPサーバーの設定は、MACHIKAP.INIの「NTPSERVER=」で行う(上記参照)。 TCPACCEPT() TCPサーバーを開始している時、クライアントからの接続もしくは受信があった時、コネクションIDを整数値で返す。接続か受信のどちらを返すかは、TCPSERVERの使い方を参照。コネクションIDはこの関数から一度だけしか返されないので、保存しておく必要がある。 TCPCLIENT x$[,y], TCPCLIENT(x$[,y]) x$で示されるサーバーの、yで示されるポートに、TCP接続する。yを省略した場合は80。関数として呼ばれた場合は、エラー番号を返す。 TCPCLOSE [x], TCPCLOSE([x]) TCP接続を閉じる。サーバーを利用している場合、xを指定した場合は指定のコネクションIDとの接続を切り、xを指定しない場合はサーバーをシャットダウンする。 TCPRECEIVE x,y[,z], TCPRECEIVE(x,y[,z]) xで示されるバッファーに、最大でyバイト受信する。サーバーを利用時にzを指定した場合は、指定のコネクションIDからの受信を得る。関数として呼ばれた場合、受信バイト数を返す。 TCPSEND x|x$[,y[,z]], TCPSEND (x|x$[,y[,z]]) xで示されるバッファーもしくはx$で示される文字列を、yバイト送信する。文字列の場合はyを省略する、もしくは-1とすると、全文字列が送信される。サーバーを利用時にzを指定した場合は、指定のコネクションIDに対して送信する。関数として呼ばれた場合、エラー番号(エラーが無いときは0)を返す。なお、この命令をTCPCLIENT/TLSCLIENTの前に実行すれば、接続時にすぐに送信することができる。 TCPSERVER [x[,y]] TCPサーバーを、ポートxで開始する。xを省略した場合は、80。yには、TCPACCEPT()が返す情報の種類を指定する。省略した場合は、1。 yが0の時、TCPACCEPT()はクライアントが接続してきたときにコネクションIDを返す。 yが1の時、TCPACCEPT()はクライアントから受信したときにコネクションIDを返す。 TCPSTATUS(x[,y]) TCP/IP接続状況を返す。サーバーを利用時にyを指定した場合は、指定のコネクションIDに関する情報を返す。 xが0の時、接続しているかどうか。接続していれば1を、接続していなければ0を返す。 xが1の時、受け取った通信のバイト数を返す。 TLSCLIENT x$[,y], TLSCLIENT(x$[,y]) x$で示されるサーバーの、yで示されるポートに、TLS接続する。yを省略した場合は443。関数として呼ばれた場合は、エラー番号を返す。 WIFIERR() WiFi関連の命令を実行した際のエラー番号を返す。主なエラー番号は以下の通りだが、これ以外のエラー番号を返すこともある。ただし、下に上げた以外のエラー番号は、MachiKaniaのバージョンごとに異なる可能性があるので注意。 0: エラーなし 1: 通信先から接続が切断された(クライアントとして接続時の正常終了) 2: DNS サーバーによるIPアドレスの解決に失敗した 3: 接続タイムアウト 4: WiFi接続していない WIFIERR$() WiFi関連の命令を実行した際のエラーの内容を、文字列として返す。 <サーバーの固定URLを得るには> MachiKaniaでHTTPサーバーを構築した場合、IPアドレスがWi-FiルーターのDHCPサーバーにより、動的に割り当てられることになり、IPアドレスは不変ではありません。従って、PCやスマートフォンからこのHTTPサーバーにアクセスするときのURLが変わってしまう事があります。これを避けるのに、2つの方法があります。 一つの方法は、MACHIKAP.INIで「HOSTNAME=」を指定する事です。例えば、「HOSTNAME=macserver」と指定すると、MachiKaniaのホスト名が「macserver.mshome.net」等のようになります。この場合、「http://macserver.mshome.net/」にアクセスすることで、MachiKaniaのHTTPサーバーに接続できます。ただし、「mshome.net」の部分は環境によって異なりますので、上で述べたように「ping -a 」などの方法でフルホスト名を調べてください。 もう一つの方法は、Wi-Fiルーターの設定で、MachiKaniaに用いているRaspberry Pi Pico Wに割り当てられているMACアドレスに対し固定IPを指定する事です。例えば「192.168.1.100」と設定した場合のURLは、「http://192.168.1.100/」で固定されます。どのようなIPが指定できるかは、Wi-Fiルーターの種類によって異なります。MACアドレスを知るには、MachiKania上で「PRINT IFCONFIG$(16)」としてください。 <セキュリティーについて> MachiKaniaは、組み込み機器用の小規模プログラムです。従って、一般的なwebブラウザー(FireFox, Chrome, Edgeなど)や、一般的なサーバー(Apacheなど)と同レベルのセキュリティーを確保する事はできません。 MachiKaniaでサーバーを構築した場合、そのサーバーはローカル環境(イントラネット)内でのみ利用し、外部に公開する事は避けてください。外部に公開した場合、インターネットに於いて行われる様々な攻撃に脆弱です。例えば、DoS攻撃には無防備で、簡単にシャットダウンさせることが可能です。その他、乗っ取りや情報の漏洩などが起こりえます。プライベートなWi-Fiを用いたローカル環境でのみ接続可能な状況にしておけば、これらの心配をする必要はありません。ローカルな環境であっても、パブリックなWi-Fiに接続した場合は同様の問題が起こりえますので、注意してください。 MachiKaniaでhttpsサイトにアクセスした場合、通常のブラウザーによるhttpsサイトへのアクセスに比べて、セキュリティーレベルが低いです。たとえ接続先がhttpsサイトであっても、httpサイトへの接続と同じ問題が起こる可能性があります。例えば、送信する個人情報(パスワードなど)の漏洩や、接続先が指定した物とは異なるフィッシングなどの被害が起こりえます。これは、専門的に解説すると、MachiKanianiaに限らず小規模プログラムでTLS接続を行う場合、CA証明書の確認とAES暗号を仕様どおりの強度に保つことが難しい事によります。MachiKaniaではCA証明書の確認は行っておらず、AES暗号キー類推の難易度は高くはありません。従って、httpサイトへの接続ほどではないにせよ、httpsサイトへの接続は問題が起こりえることを考えてください。サイトからの情報の収集は問題ないですが、IDやパスワードなどの個人情報を送信することで接続を確保する場合には注意が必要で、自己責任の元で行ってください。 また、MACHIKAP.INIにWi-FiのSSIDとパスワードを記述している場合、MMC/SDカードを紛失したり盗難にあったりしないように注意してください。「Wi-Fi用のSSIDとパスワードを指定するもう一つの方法」で述べたようにRaspberry Pi Pico Wに埋め込んだ場合、そのRaspberry Pi Pico Wを紛失したり盗難にあったりしないように注意してください。万一、紛失したり盗難にあったりした場合、パスワードを変更する事をお勧めします。 <使用例> WGETクラスを用いて、情報をダウンロードして表示する例。 useclass WGET print WGET::FORSTRING$("https://machikania.net/") クラスを用いず、TCPCLIENT命令などを用いて情報をダウンロードする例。なお、このコードで「TCPCLIENT」を「TLSCLIENT」に変更すれば、httpサイトではなくhttpsサイトに接続できる。 t$="GET / HTTP/1.0\r\n" t$=t$+"Host: machikania.net\r\n" t$=t$+"Connection: close\r\n" t$=t$+"\r\n" dim b(64) TCPSEND t$ TCPCLIENT "machikania.net" t$="" do until TCPSTATUS(1) : idle : loop do i=TCPRECEIVE(b,256) if 0=i then break poke b+i,0 t$=t$+b$ loop TCPCLOSE print t$ HTTPDクラスを用いて80番ポートにサーバーを構築する例。「/httproot」ディレクトリーに、index.htmを配置する。なお、この例ではURLの「?led=」を読み取って表示している。 useclass HTTPD h=new(HTTPD,80,"/httproot") do u$=h.START$() print u$,"'";h.GETPARAM$("led");"'" loop <バージョン履歴> ・KM-1503 2023年9月公開。