良い一日! ルーターを少し調整すること、より正確には、デジタル温度計を追加し、ルーター自体を使用してそこからデータを表示することについてお話したいと思います。
卒業証書の作成中、DS18B20センサーが手に落ちました。
これは、1-wireプロトコルを使用してデータを送信するデジタル出力温度計です。 少し考えた後、統計のために、好奇心から外へ、外気温度を表示するために私の辛抱強いルーターを教えることに決めました。 別のファームウェアDD-WRT v24-sp2(11/11/04)の大きいLinksys E3000があります。 このような場合の通常のファームウェアは適切ではなく、将来必要なルーター機能へのアクセスを提供しません。 私個人の意見では、DD-WRTは最良かつ最もリッチな代替ファームウェアです。 さて、64 MBのRAMを搭載したホームルーターでBGPをサポートするファームウェアに夢中にならないようにするには)DD-WRTファームウェアのWebインターフェイスを以下に示します。
通常、1-wireを介したデータ転送では、COMまたはLPTポートを使用しますが、残念ながら、このルーターにはUSBコネクタが1つしかありません。 より正確には、ボード自体にUART用の配線がありますが、ルーターのカバーが足りないため、ルートでLinksysの設計能力が損なわれます。 この場合、pl2303などのUSB-RS-232コンバーターを使用してセンサーを操作できます。 ただし、このコンバーターを正しく動作させるには、ドライバーが必要です。 pl2303のドライバーはすでにDD-WRTファームウェアに含まれており、ロードされていないため、私のように振る舞ってソースからコンパイルする必要はありません。ダウンロードするには、sshまたはtelnetプロトコルを使用してログインする必要があります(ユーザー名はroot、パスワードはWebインターフェイスで設定したものと同じです)すべてがうまくいった場合、次のようなものが表示されます。
既に理解しているように、これはUnixシステム(残念ながらiOSではなく、LinksysはCiscoではありません)であるため、シェルへの適応に問題はないはずです。
ドライバーはディレクトリ/lib/modules/2.6.24.111/kernel/drivers/usb/serialにあり、usbserial.koおよびpl2303.koと呼ばれます。 2.6.24.111はカーネルバージョンであり、将来変更される可能性があります)それらは含まれているディレクトリからinsmod usbserial.koおよびinsmod pl2303.koコマンドでロードされます。 USB-RS-232アダプターが接続されている場合、これらのコマンドの後、デバイスはアドレス/ dev / usb / tts / <デバイス番号>に表示されるはずです。私の場合は0です。dmesgを使用してドライバーのロードを制御できます。 :
登録済みの新しいインターフェイスドライバーusbserial
drivers / usb / serial / usb-serial.c:USBシリアルドライバーコア
ドライバー/ usb /シリアル/ usb-serial.c:pl2303に登録されたUSBシリアルサポート
pl2303 1-1.3:1.0:pl2303コンバーターが検出されました
usb 1-1.3:ttyUSB0に接続されたpl2303コンバーター
usbcore:登録済みの新しいインターフェイスドライバーpl2303
ドライバー/ usb /シリアル/ pl2303.c:Prolific PL2303 USB to serial adapter driver
次に行うことは、1-wireで動作できるプログラムを追加することです。
これはdigitempと呼ばれ、GNU General Public Licenseの下で配布されています。 ルーター用にコンパイルするか、コンパイルされたプログラムでインターネット上のファームウェアを検索できます。 ただし、小さな落とし穴があります。ルーターのハードウェア機能により、プログラムを直接ROMに書き込むことはできません。 / tmp、つまり、再起動後に安全に消去されるRAM、またはUSBハブを介して接続されるUSBフラッシュドライブに書き込むことができます。 ハブがアクティブであることが非常に望ましいです。そうしないと、ルーターをロードするときにUSBフラッシュドライブとpl2303に同時に十分な電力が供給されず、システムで一方/両方のデバイスが誤って認識されます。
フラッシュドライブを機能させるには、ルーターのWebインターフェイスで[USBコアサポート]、[自動ドライブマウント]の項目を選択し、[ディスクマウントポイント]のマウントポイントを指定する必要があります。 これらはすべて、 Services> USBの下のWebインターフェイスにあります 。 フラッシュドライブが/ optにマウントされました。
次に確認するのは、digitempの動作です。 これは、コマンド./digitemp -s / dev / usb / tts / 0 –i(デバイスの初期化)および./digitemp -a(まだ一体型であるすべてのセンサーから温度を読み取る)によってチェックされます。 マニュアルに書かれているように、一度初期化する必要がありましたが、スケジュールに従ってデータを読み取ると、毎回再初期化する必要がありました。 すべてがうまくいった場合、コマンドの出力は次のようになります。
DigiTemp v3.3.2 Copyright 1996-2004 by Brian C.Lane
GNU Public License v2.0-http:#www.brianlane.com
すべてのDS2409カプラーをオフにする
。
1-Wire LANを検索する
28B6ACDA020000EC:DS18B20温度センサー
ROM#0:28B6ACDA020000EC
.digitemprcを書いた
11月1日16:40:13センサー0 C:20.88 F:69.57
すべてのハードウェアアセンブリ:
残っているのは、温度を表示するためのWebインターフェイスを作成することだけです。
作成には多くのオプションがありましたが、私はcgi-binに基づいて動的なWebページを作成することに決めました。 テキストファイルからデータを受信します。これは、基本的にクラウンでdigitempを実行した結果です。 クラウンが正しく機能するには、データを取得する時間が正確になるように、ルーターでNTPクライアントを構成する必要があります。 これは、DD-WRT Webインターフェイスの[設定]-> [基本設定]-[時間設定]セクションで行います。 そこで、最初に起動(有効オプションを選択)してから、タイムゾーン(サマーゾーン)、サマータイム(DST)(夏時間)を設定し、サーバーIP /名前をNTPサーバーの名前またはアドレスに設定する必要があります。 VNIIFTRIアドレス(ntp1.vniiftri.ru)。 変更を保存して再起動すると、ルーターは時刻を状態標準の時刻と頻度と同期します。
残念ながら、DD-WRTの脆弱性により、最新バージョンではユーザーディレクトリからのcgi-binスクリプトが無効になっているため、動的ページには、lighttpdを選択した別のWebサーバーをインストールする必要があります。 ページ自体はperlで記述されており、microperlがハンドラーとして選択されているため、lighttpd構成ではmod_cgiのコメントが解除されています。Webページが機能する必要があります。 以下は、標準のlighttpd設定の変更点です。
server.document-root = "/ opt / share / www /"
#Webページファイルが配置されるディレクトリ。
index-file.names =( "index.cgi")
#デフォルトページ。
server.event-handler = "poll"
#イベント処理のタイプ。
server.tag = "lighttpd"
#Webサーバーの署名、私たちは丁寧になります
static-file.exclude-extensions =( ".fcgi"、 ".php"、 ".pl"、 ".py"、 ".rb"、 ".cgi")
#次のページを静的として処理しないようにします。
server.port = 8081
#Webサーバーが動作するポート。
server.username = "nobody"
#Webサーバーが動作するユーザー名。
server.groupname = "65534"
#Webサーバーが動作するユーザーグループ。
cgi.assign =( ".pl" => "/ opt / bin / microperl"、
".cgi" => "/ opt / bin / microperl")
#cgi-binベースのWebページに使用するハンドラーを設定します。
Raphaelライブラリは、温度グラフを表示するために使用されます。 情報量が多く情報量が少ないため、自分でリストを提供することはしません。
そして最後のタッチ-再起動後もすべてが機能するように、DD-WRT Webインターフェースの起動スクリプト構成に編集が追加されました。
insmod /lib/modules/2.6.24.111/kernel/drivers/usb/serial/usbserial.ko
insmod /lib/modules/2.6.24.111/kernel/drivers/usb/serial/pl2303.ko
//温度計のドライバーをロードする
chmod 666 / dev / usb / tts / 0
chmod 666 /opt/var/log/lighttpd/error.log
chmod 666 /opt/var/log/lighttpd/access.log
//ファイルのパーミッションを変更しますが、そのような数字ではデーモンのみを起動する必要があります。
grep -q nobody / etc / passwd || echo "nobody:*:65534:65534:nobody:/ var:/ bin / false" >> / etc / passwd
// lighttpdが動作するユーザーを作成します(小さな妄想はまだ誰も傷つけていません!)
lighttpd -f /opt/etc/lighttpd/lighttpd.conf
// lighttpd自体をデーモンモードで起動します(オペレーティングシステムは私ではなく、そのようなものです...)。
別の行がcronに追加され、スケジュールされたデータの取得を担当します。
0 * * * * root sh /opt/input.sh
スクリプトinput.shの内容(1時間ごとにセンサーからデータを読み取ります)
#!/ bin /
/opt/share/./digitemp -s / dev / usb / tts / 0 -i;
/opt/share/./digitemp -a -o%.2C | tail -n 1 >> /opt/share/www/temp1.txt
#センサーからの温度を摂氏で小数点以下2桁でtemp1.txtファイルに書き込みます。
tail -n 24 /opt/share/www/temp1.txt> /opt/share/www/temp.txt
#ファイルから最新の24個の温度値を切り取ります。
日付+%R >> /opt/share/www/time1.txt
#データが取得された時間を記録します。
tail -n 24 /opt/share/www/time1.txt> /opt/share/www/time.txt
#ファイルから最新の24個の温度値を切り取ります。
したがって、最終日の温度を取得します。
すべての設定後、ページ192.168.1.1:8081にアクセスすると次のように表示されます。
1線規格自体は共通のバスで動作しますが、最大300メートルのライン長を許可しているため、家全体およびそれ以降の温度を測定できます。 さらに、センサーだけでなくアクチュエータも1線で動作するため、このプロトコルとホームルーターに基づいて、インターネット制御を備えた小さなスマートハウスを構築できます。