損害賠償なしのシステム開発な日常:また長堀橋
Raspberry PiでIoTなシステム開発:OSXのインターネット共有でIPを割り当ててログイン
Raspberry Pi用のpreempt_rtのコンパイル済みカーネルイメージが配布されているのを発見しました。http://docs.emlid.com/navio/Downloads/Real-time-Linux-RPi2/これであればバイク競技用計測器として実用になるものが作成できるかもという期待から、環境を構築してみることにします。本当はXenomaiの方が圧倒的にリアルタイム性が優れているようなんですが、rpi2ではなかなか起動に成功しないようです。https://www.osadl.org/fileadmin/dam/rtlws/12/Brown.pdfhttps://www.raspberrypi.org/forums/viewtopic.php?f=71&t=74686インストールは本家チュートリアルそのままです。ただしbs=1Mだと怒られるので、1mになっています。sudo dd bs=1m if=emlid-raspberrypi2-raspbian-rt-20150401.img of=/dev/rdisk2rdisk2だけ環境とタイミングにより修正ですね。さて本稿の本題はログイン環境の構築です。モニタ無しで運用する場合、最初の最初にPiにどうやってログインするかという問題があります。Piをさわり始めた当初はシリアル通信でログインしていたのですが、このイメージファイルではシリアルが無効化されていました。なお無線LANアクセスポイントになれるようなのですが、自分が使っているWifiアダプタは認識されないようでAPとしては動き出しません。もう一つのやり方としては有線LANでのログインです。以前やったのは、有線LANアダプタがデフォルトでDHCPでIPを取るようになっているので、ルーターを用意して、IPを取得させ、ルーター側の設定画面で割り振られたIPを確認するという方法。これは簡単でよいのですが、今回は手元に使えるルーターが無く、この方法だと時間がかかりそうでした(ルーターが手元に届くまで)。使用する機材も増えるのでスマートではありません。そこで思いついたのがMacのインターネット共有を使う方法。ググって見ると多くの先達が実行しているようです。早速Thunderbolt Ethernet アダプタに固定IPで192.168.2.1を振って接続してみると、あっさり成功しました。ネット上の情報だとクライアントには192.168.2.2が振られるという話しが多かったのですが、実際やってみると、リースされる毎にIPが変わりました。実際の割り当てを確認するには、bootpdのログを見ればいいらしく、以下のコマンドで抽出しました。
cat /var/log/system.log | grep bootpd
Jan 28 07:33:20 kawauchiyasuo-no-MacBook-Pro.local bootpd[2491]: DHCP DISCOVER [bridge100]: 1,b8:27:eb:f6:3c:22Jan 28 07:33:20 kawauchiyasuo-no-MacBook-Pro.local bootpd[2491]: OFFER sent 192.168.2.3 pktsize 300Jan 28 07:33:20 kawauchiyasuo-no-MacBook-Pro.local bootpd[2491]: DHCP REQUEST [bridge100]: 1,b8:27:eb:f6:3c:22 Jan 28 07:33:20 kawauchiyasuo-no-MacBook-Pro.local bootpd[2491]: ACK sent 192.168.2.3 pktsize 300
grepしないと人力では解読不能な出力になります。このIPだとpingも通り、sshで接続できました。”””
損害賠償なしのシステム開発な日常:ピントが
ピントがずれていて御蔵入りになっていたレンズ。メーカーに調整に出したらバッチリに調整されて帰ってきました。2世代ぐらいまえのカメラとレンズですが、結構綺麗に撮れます。 “””
損害賠償なしのシステム開発な日常:予告通り
Raspberry PiでIoTなシステム開発:ワイヤレスアクセスポイントとして動作させるまで
2016/02/08:追記:下記の一連の記事は諸般の事情により奏効しない可能性が高いです。普通に使うのであればこちらの記事を参照してください。Raspberry PiでIoTなシステム開発:ワイヤレスアクセスポイントとして動作させるまで(改訂版)ネットでいくら事前準備をしてもなかなか一筋縄ではいなかいのがこの世界の常。色々引っかかりましたので、メモを残します。Raspberry Piの場合、設定がスムーズに行くワイヤレスアダプタを使うのが安全です。が、色々と試して見て、起動が安定するのがWN-G150UMだったという過去の経験から、今回もこれを使うことにします。まずPiの最初にすることの定番作業として、アップデートをかけます。sudo apt-get updatesudo apt-get upgradeファイルシステムのサイズがSDにあっていないので拡張します。df -hsudo raspi-configから、expand filesystemを実行。localeは変更しません。timezoneをtokyoに設定。各種記事からするとavahiをインストールするのが定番のようですが、サービスログから割り当てIPがわかるので、サービスを減らす観点から、今回は止めておきます。起動安定化のため/boot/config.txtsafe_mode_gpio=4max_usb_current=1WN-G150UMはドライバの追加インストールは不要だが、デバイスIDの指定が必要ということなので設定ファイルに追記。http://marm.cocolog-nifty.com/jokanaan/2012/12/wn-g150um-on-ra.htmlpi@navio-rpi ~ $ sudo vi /etc/udev/rules.d/network_drivers.rulesACTION==””add””,SUBSYSTEM==””usb””, ATTR{idVendor}==””04bb””, ATTR{idProduct}==””094c””, RUN+=””/sbin/modprobe -qba 8192cu””pi@navio-rpi ~ $ sudo vi /etc/modprobe.d/network_drivers.confinstall 8192cu /sbin/modprobe –ignore-install 8192cu $CMDLINE_OPTS; /bin/echo “”04bb 094c”” > /sys/bus/usb/drivers/rtl8192cu/new_idアクセスポイント化する前にとりあえずクライアントとしてつながるかどうかを確認。pi@navio-rpi ~ $ sudo nano /etc/network/interfacesauto loiface lo inet loopbackiface eth0 inet dhcpauto wlan0iface wlan0 inet dhcpwpa-conf /etc/wpa_supplicant/wpa_supplicant.confpi@navio-rpi ~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.confctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdevupdate_config=1# Default networknetwork={ssid=””apname””psk=””hogehoge””}IP取れました。pi@navio-rpi ~ $ ifconfigeth0 Link encap:Ethernet HWaddr b8:27:eb:f6:3c:22inet addr:192.168.2.3 Bcast:192.168.2.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:3173 errors:0 dropped:0 overruns:0 frame:0TX packets:1988 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:230514 (225.1 KiB) TX bytes:429332 (419.2 KiB)lo Link encap:Local Loopbackinet addr:127.0.0.1 Mask:255.0.0.0UP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:37 errors:0 dropped:0 overruns:0 frame:0TX packets:37 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:4312 (4.2 KiB) TX bytes:4312 (4.2 KiB)wlan0 Link encap:Ethernet HWaddr 34:76:c5:5d:34:91inet addr:192.168.0.108 Bcast:192.168.0.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:140 errors:0 dropped:345 overruns:0 frame:0TX packets:27 errors:0 dropped:1 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:186351 (181.9 KiB) TX bytes:4399 (4.2 KiB)インターフェースを再起動してつながるか再確認。pi@navio-rpi ~ $ sudo ifdown wlan0pi@navio-rpi ~ $ sudo ifup wlan0pingコマンドはインターフェースを指定できます。pi@navio-rpi ~ $ ping -I wlan0 192.168.0.1同じネットワークにつながっているMacからルーター経由でのpingも通りました。kawauchiyasuo-no-MacBook-Pro:~ yasuo$ ping 192.168.0.108PING 192.168.0.108 (192.168.0.108): 56 data bytesRequest timeout for icmp_seq 0Request timeout for icmp_seq 164 bytes from 192.168.0.108: icmp_seq=2 ttl=64 time=20.403 ms64 bytes from 192.168.0.108: icmp_seq=3 ttl=64 time=4.651 msルーター化のためには8192cuに対応したhostapdをインストールする必要があるらしいです。僕はこの「8192cu対応hostapd」をインストールするだけで良いと思っていて色々手こずったのですが、実際には、公式のhostapdをインストールして本体のバイナリだけ入れ替えるという作業が正しいようです。ドライバもコンパイルする必要があるという情報もありましたが、コンパイルが通りませんでしたし、とりあえずOSに付いている奴で動きました。そのため以下のブラックリスト登録は行っていません。echo “”blacklist rtl8192cu”” >> /etc/modprobe.d/blacklist.confpi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911 $ sudo apt-get install hostapdRealtekのダウンロードサイトでダウンロードしたパッケージをSFTPでホームにアップロードしておきます。pi@navio-rpi ~ $ ls0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip深めの階層にありますので降りていってmakeします。pi@navio-rpi ~ $ cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911 $ cd wpa_supplicant_hostapd/pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd $ tar zxvf wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gzpi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd $ cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812 $ lsCOPYING README hostapd src wpa_supplicantpi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812 $ cd hostapd/pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ make出来上がったものをコピー。実際には間違って/usr/sbinにもコピーしてしまいました。pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo cp hostapd hostapd_cli /usr/local/sbin/設定ファイルの作成。ディレクトリの作成あたりは本家パッケージをインストールして入れば不要かもしれません。pi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo mkdir /etc/hostapdpi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo touch /etc/hostapd/hostapd.confpi@navio-rpi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo nano /etc/hostapd/hostapd.confssid=piinterface=wlan0driver=rtl871xdrvhw_mode=gchannel=6# 0 = allowed if not in deny listmacaddr_acl=0hw_mode=gwpa=2wpa_passphrase=raspberrywpa_key_mgmt=WPA-PSKwpa_pairwise=CCMPrsn_pairwise=TKIPmax_num_sta=8wpa_group_rekey=86400auth_algs=1ignore_broadcast_ssid=0wlan0に固定IPを割り当て。pi@navio-rpi ~ $ sudo nano /etc/network/interfacesauto loiface lo inet loopbackiface eth0 inet dhcpauto wlan0iface wlan0 inet staticaddress 192.168.10.1netmask 255.255.255.0hostapdの起動に先立ちWPASupplucantを停止しておく必要がある模様。sudo mv /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service ~/ここでhostapdを起動するとwlan0に割り振られているIPが無くなるという問題発生。以下の設定変更でifplugdの挙動を変更して、eth0に限定する。/etc/default/ifplugd変更前INTERFACES=””auto””HOTPLUG_INTERFACES=””all””ARGS=””-q -f -u0 -d10 -w -I””SUSPEND_ACTION=””stop””変更後INTERFACES=””eth0″”HOTPLUG_INTERFACES=””eth0″”ARGS=””-q -f -u0 -d10 -w -I””SUSPEND_ACTION=””stop””起動。-ddでログが多くなります。この時点で他の無線LANデバイスから見えるようになります。DHCPがまだですが固定IPなら接続可に。スクリプトから起動しないとダメという情報もありましたが動いています。sudo hostapd /etc/hostapd/hostapd.conf -ddpi@navio-rpi ~ $ ps ax | grep hostapdデーモンにするための設定。pi@navio-rpi ~ $ sudo nano /etc/default/hostapdDAEMON_CONF=””/etc/hostapd/hostapd.conf””クライアントに都度固定IPを割り振るのは面倒なのでDHCPサーバーをインストールpi@navio-rpi ~ $ sudo apt-get install isc-dhcp-serverこの時点では設定ファイルができていないので起動に失敗するのでは無いかと思います。あと、適用する先のインターフェースにipが設定されていない場合やはり起動に失敗します。サーバー動作させる対象のインターフェースを指定pi@navio-rpi ~ $ sudo nano /etc/default/isc-dhcp-serverINTERFACES=””wlan0″”DHCPサーバーの動作設定pi@navio-rpi ~ $ sudo nano /etc/dhcp/dhcpd.conf以下コメントアウト。#option domain-name “”example.org””;#option domain-name-servers ns1.example.org, ns2.example.org;以下追記ping-check true;subnet 192.168.10.0 netmask 255.255.255.0 {option routers 192.168.10.1;option broadcast-address 192.168.10.255;option subnet-mask 255.255.255.0;option domain-name “”local””;option domain-name-servers 8.8.8.8,8.8.4.4;default-lease-time 600;max-lease-time 7200;range 192.168.10.101 192.168.10.199;}不安定問題はまだ発生していないのですが、もし発生するようならpower managementのオフを設定します。http://unix.stackexchange.com/questions/64392/intermittent-ping-times-on-a-raspberry-pi-wifi-access-point今回の用途はクライアントをインターネットに出さないので、ルーターとしての設定は行いません。再起動後wifiクライアントから接続できれば成功と。”””
ハイブリッドアプリでシステム開発:JSでボタンへのイベント登録はloadの後じゃ無いとだめ
最近流行のハイブリッドアプリの開発に挑戦してみようと思い、実質二択であるmonacaとionicを試してみることに強いました。まずはmonacaから。HTML5+JavaScriptを標榜するだけあって、開発自体はHTML5+JavaScriptそのまんまな感じですね。HTMLで書いてJSのイベントドリブンで記述していきます。ここでハマったのが、HTML要素にイベントを登録するには、ページの読み込み、または少なくともDOMツリーの構築が完了してからで無いといけないということ。以前にNodeでシステムを作っていたときには意識していたはずなんですが、すっかり忘れていました。というかこのあたりは公式チュートリアルとか公式本で言及しておいて欲しいところです。甘い?
内容は公式のサンプルのOnsen UIの最小限のテンプレに記述を加えたものです。
Navigator
test button 1 test button 2
windowのloadイベントが発火した後に実行したaddEventLinsterとかJQueryのonは有効なようで、関数が登録されちゃんと実行されます。一方スクリプト読み込み時に実行されるものは登録されませんでした。
/*//これは動作しないdocument.getElementById(""page1button"").addEventListener(""click"", function(e){ console.log(""test log addeventlister non jquery 1"");});//これも動作しないdocument.addEventListener(""click"", function(e){ if(e.target.id ===""page1button""){ console.log(""test log addeventlister non jquery 2""); }});//これも動作しない$(""ons-button#page1button""),on(""click"",function(e){ console.log(""test log addeventlister jquery""); })//これらを記載してコメントアウトしない状態だとloadイベントで追加する方も実行されなくなる*/ //これはok しかしhtml側に関数名を都度記述しないといけないfunction onClickTest(){ console.log(""test onclick element"");}//windowのloadイベントはページ要素の描画完了後//参考 http://himco.jp/monaca/?p=306window.addEventListener(""load"", onLoad, false);function onLoad(){ //これは動作した document.getElementById(""page1button"").addEventListener(""click"", function(e){ console.log(""test function added after load by addeventlister""); }); //これは動作した $(""#page1button"").on(""click"",function(e){ console.log(""test function added after load by jquery""); })};
HTML側のonclickで登録した関数については実行されるのですが、これだと関数名を記述しないといけなくなり、JS側のロジックの一部をHTML側に持ち込むことになり美しくないと思います。動的にHTMLを生成してJSの関数を実行する際にも問題が出そうなので、できるだけloadをきっかけに登録する方法で行くことにします。”””
Raspberry PiでIoTなシステム開発:リアルタイム性能測定用の波形をmbedで作る
preempt_rtパッチが当たったlinuxカーネルの性能をGPIO割り込みで確かめるべく、入力させる用の波形を作ります。ファンクションジェネレータを使おうかと思いましたが、マイコンで書く方が融通が利きそうなので、mbedでささっと書くことにします。
#include ""mbed.h""PwmOut mypwm(PA_5);int main() { mypwm.period_us(600); mypwm.pulsewidth_us(200); while(1) { }}
今回波形の計測に使用したのはBitScopeです。PCオシロはWindows用ばかりなのですが、これはMacでも使用できるクライアントソフトが配布されいます。さすがはマイコン。200usオン、400usオフの結構周波数の高い波形ですが、キレイに出ています。さてLinuxでどこまでこれに追随できるでしょうか? “””
Raspberry PiでIoTなシステム開発:リアルタイムタスクと非リアルタイムタスクとの違い:波形生成
リアルタイムタスクと非リアルタイムタスクの性能差を確認すべく、Raspbbery Piに矩形波を生成させ、ストレスをかけてみました。使用したコードは以下の通り。
#include#include #include #include #include #include #include #define MY_PRIORITY (49) /* we use 49 as the PRREMPT_RT use 50 as the priority of kernel tasklets and interrupt handler by default */#define MAX_SAFE_STACK (8*1024) /* The maximum stack size which is guaranteed safe to access without faulting */#define NSEC_PER_SEC (1000000000) /* The number of nsecs per sec. */void stack_prefault(void) { unsigned char dummy[MAX_SAFE_STACK]; memset(dummy, 0, MAX_SAFE_STACK); return;}int main(int argc, char* argv[]){ struct timespec t; struct sched_param param;// int interval = 500000000; /* 500ms*/ int interval = 50000; /* 50us*/ /* Declare ourself as a real time task */ param.sched_priority = MY_PRIORITY; if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror(""sched_setscheduler failed""); exit(-1); } /* Lock memory */ if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) { perror(""mlockall failed""); exit(-2); } /* Pre-fault our stack */ stack_prefault(); clock_gettime(CLOCK_MONOTONIC ,&t); /* start after one second */ t.tv_sec++; wiringPiSetup () ; pinMode (7, OUTPUT) ; while(1) { /* wait until next shot */ clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL); /* do the stuff */// printf(""hello\n""); digitalWrite (7, HIGH) ; /* calculate next shot */ t.tv_nsec += interval; while (t.tv_nsec >= NSEC_PER_SEC) { t.tv_nsec -= NSEC_PER_SEC; t.tv_sec++; } /* wait until next shot */ clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL); /* do the stuff */// printf(""good night\n""); digitalWrite (7, LOW) ; /* calculate next shot */ t.tv_nsec += interval; while (t.tv_nsec >= NSEC_PER_SEC) { t.tv_nsec -= NSEC_PER_SEC; t.tv_sec++; } }}
公式のサンプルにWiringPiでのピンのアップダウンを加えただけです。これがhigh_priorityの方。
param.sched_priority = MY_PRIORITY; if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror(""sched_setscheduler failed""); exit(-1); }
low_priorityはhigh_priorityの上記の優先度設定部分をコメントアウトしたものです。ストレスはstressコマンドでかけました。low_priorityは起動直後は良いのですが、stressで負荷をかけた途端ぐちゃぐちゃになります。一方high_priorityはそのまま。よく見るとstressをかけない状態でもhigh_priorityの方が波形が安定している様に見えます。デフォルトカーネルもconfig_preemptは入っているので、それとの比較をすべきなのですが、手元に環境が無いのでそれはまたいつか。 “””
Raspberry PiでIoTなシステム開発:RASPBIAN JESSIEでのネットワーク設定
リアルタイムパッチが当たっていないRaspbianを用意しようと公式を見たところ、JESSIEというリリースが追加されていました。LITE版だとデスクトップ環境が省かれていてダウンロードが早く済みそうです。そこでこれを利用してセットアップしてみたのですが、早速ハマりました。今までとはネットワークのコンフィギュレーション方法が変わっています。
sudo nano /etc/network/interfacesでの内容は以下の通りとしました。
http://raspberrypi.stackexchange.com/questions/37920/how-do-i-set-up-networking-wifi-static-iphttps://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md
# interfaces(5) file used by ifup(8) and ifdown(8)# Please note that this file is written to be used with dhcpcd# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'# Include files from /etc/network/interfaces.d:source-directory /etc/network/interfaces.dauto loiface lo inet loopbackauto eth0allow-hotplug eth0iface eth0 inet manualauto wlan0iface wlan0 inet manualwpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
あと何故かV6アドレスが割り振られていたのでV6を無効化しました。
pi@raspberrypi:~ $ ifconfigeth0 Link encap:Ethernet HWaddr b8:27:eb:f6:3c:22 inet addr:192.168.2.10 Bcast:192.168.2.255 Mask:255.255.255.0 inet6 addr: fe80::5451:ee7b:51eb:6a2c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3043 errors:0 dropped:0 overruns:0 frame:0 TX packets:1949 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:233714 (228.2 KiB) TX bytes:303159 (296.0 KiB)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)wlan0 Link encap:Ethernet HWaddr 34:76:c5:5d:34:91 inet6 addr: fe80::e49a:83c8:afde:dccb/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)pi@raspberrypi:~ $ sudo nano /etc/syssysctl.conf sysctl.d/ systemd/ pi@raspberrypi:~ $ sudo nano /etc/syssysctl.conf sysctl.d/ systemd/ pi@raspberrypi:~ $ sudo nano /etc/sysctl.conf pi@raspberrypi:~ $ sudo sysctl -pnet.ipv6.conf.all.disable_ipv6 = 1pi@raspberrypi:~ $ ifconfigeth0 Link encap:Ethernet HWaddr b8:27:eb:f6:3c:22 inet addr:192.168.2.10 Bcast:192.168.2.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3480 errors:0 dropped:0 overruns:0 frame:0 TX packets:2178 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:265828 (259.5 KiB) TX bytes:339972 (332.0 KiB)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)wlan0 Link encap:Ethernet HWaddr 34:76:c5:5d:34:91 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
“””