IOT:ラズベリーパイ SSHによるリモート接続

SSHによるリモート接続

ラズパイを買ったときに一度試してみたのですが、スキルが低すぎて全くできませんでした。

今回は、3ヶ月間色々学んできたので、ある程度直観力が付いたと思いリベンジ致します。

TeraTermをwindows側にインストールします。

管理者権限でログインしておきましょう。でないとエラー5にはじかれて無理でした。

最新のTera Term 4.102を入れました。

ifconfigでIPアドレスを調べる

ラズベリーパイのMACアドレスと、サブネットマスクを調べます。

有線の場合はeth0、無線の場合はwlan0を見ます。今回は無線でやります。

mtu 1500
inet 192.168.xxx.xxx (xxxはお使いのラズパイ、通信環境によって違うでしょう。)
netmast 255.255.255.0
と書いてあります。

TeraTermからラズパイにSSH接続

  1. windows側でTeraTermを起動させてください。
  2. TCP\IP ホスト 192.168.xxx.xxx と入力します。
  3. ヒストリにチェック(意味は不明)
  4. TCPポートは22固定です。いじるとつながりません。
  5. サービス SSH バージョンはSSH2
  6. OKします
  7. 次の画面でユーザー名にpiと入力します。これはラズパイのユーザー名ではありません。
  8. パスフレーズはラズパイで設定したパスワードになります。
  9. パスワードをメモリ上に記録するをチェック
  10. プレインパスワードを使うをチェック
  11. OKします。→接続できたでしょうか。

課題

現状まだIPアドレスを固定していないため、起動するたびにどんなIPアドレスになるのか予想が付きません。次はIPアドレスの固定をやってみましょう。

また、つながったのはいいのですが、Linuxのshellだけでは厳しいものがあります。

VNCで接続するとLinuxのGUIが丸ごと操作できるようになるので、次回の次回あたりでやってみましょう。

IOT:Python socketモジュールで通信してみる

どーも こんちには Keita_Nakamori (´・ω・`) です

今日は、socketモジュールを使ってみます。

前回、少しsocketモジュールについて基本的な操作をやりましたが、実際に運用するとなると不備が多いので、そこを修正していきます。

IT用語 (予備知識)

ポート

ネットワーク内の端末間でデータをやり取りする港(port)です。

ポート番号

ポートの番号です。TPCでデータをやり取りするとき、データは1プロセスとか1スレッドというプログラムの塊を対象とします。そのプロセスにはポート番号が割り当てられそこを通ってデータをやり取りします。

IPアドレスが住所なら、ポート番号はマンションの部屋番号みたいなものです。

よく使う番号をピックアップしてみます。

  • TCP 20 : FTP (データ)
  • TCP 22 : SSH
  • TCP 25 : SMTP
  • TCP 80 : HTTP
  • TCP 443 : HTTPS

ポート番号の種類

ポート番号は0から65535まで存在します。その中でも3つの種類に分けれれます。

ウェルノウンポート番号 0~1023

よく知られているポート番号という名前の通り、TPC/IP通信において主要なサービスがすでに使用しているポート番号です。ユーザーがここをいじってしまうと不具合が生じるので触らないでおきましょう。

レジスタードポート番号 1024~49151

特定のアプリケーションなどが使用することになっている番号です。IANAという団体が管理しているので、使うときは申請しなくてはいけません。

その他のポート番号 49152~65535

ユーザが自由に使って良いポート番号です。しかし、やたらと開放してはいけません。必要なものだけ開けましょう。

スクリプト

続きはあとで書きます。

IOT:python LINE Notify に メッセージを送る

どーも こんちには Keita_Nakamori (´・ω・`) です

PythonからLINE Notifyにメッセージを送るということをやってみようと思います。後々IOTの一環で、設備などの状態を監視し、故障予測の通知をしていくためにやってみました。

 

LINE notifyのAPI ドキュメント

LINE notifyのAPI ドキュメントをみるとやり方が書いてありますので、その通り進めました。通常のLINEアカウントがあればOKです。

予めトークンを取得しておいてください。

スクリプト

下記コードの<ここにアクセストークンを入れる>へ代入してください。< >は要りません。Bearerとの間にはスペースを一つ入れてください。

messageをmassageとミスタイプして焦らないでください。(わたしです)

実行すると下記のように自分のラインへアラートが来ます。

実行結果

IOT:python requestsモジュールを使ってみる

こんにちは Keita_Nakamori(´・ω・`)です。

今日は python urllib.requetsモジュールに続きまして requestsモジュールを使ってみようと思います。名称がとても似ていますが別物です。

前回のurllib.requestがpython標準モジュールであるのに対して、
今回のrequestsモジュールは標準ではなく、より使いやすく改良されています。
エンコードなども自動でやってくれるので、こちらのほうが圧倒的に人気があります。

JSONをディクショナリで取り出すときは requests.json() があるので jsonモジュールも不要です。

IT用語 予備知識

HTTPステータスコード

HTTPにおいてWebサーバからのレスポンスの意味を表現する3桁の数字からなるコードです。例えば、200はリクエストに対して正常にレスポンスが得られたという意味になります。

requestsモジュール

GET

POST

PUT

DELETE

 

 

IOT:python urllib.request を使ってみる

こんちには Keita_Nakamoriです。

Python標準モジュールのurllibを使ってHTTPメソドを実行してみましょう。

IT用語 (予備知識として)

HTTPメソド

クライアントからサーバーに命令をする具体的なやり方のことです。

基本の4つの操作
GET:データを参照する
POST:データを新規登録する(パスワードを見えないように送るとき)
PUT:データを更新する
DELETE:データを削除する

その他 HEAD OPTIONS TRACE PATCH LINK UNLINK と色々あります。

REST

-REpresentational State Transfer

”表現文の転送”ということでしょうか。Webサービスに対してデータをやり取りする際の取り決め、というかコンセプトです。

RESTに従ったWebサービスは、HTTPメソドの形式でアクセスすることでデータの送受信を行えます。

REST APIという形でまとまっているWebサービスが多いので利用できます。

パケット通信

音声通話のように回線を占有するのではなく、
データを小さな単位に分割して送受信することで
複数のユーザーで同じ回線をシェアできる方法です。

送信されたデータは交換機の記憶メディアに一時的に蓄積されるので
相手の通信環境が悪くても、復帰したときにデータを受信できます。

ペイロード

パケット通信においてパケットに含まれるヘッダやトレーラなどの付加的情報を除いたデータ本体のことです。

パケットにはデータの転送先や転送経路などを制御するための情報を含むヘッダや、データの破損などを検査するトレーラなどの情報が、データそのもののほかに付加されて送られて来ます。

ペイロードは、こうした情報を対象に含めず、ユーザーが送信したいデータそのものを指し示す際に用いられます。

urllibモジュール

基本的な GET

パラメータを含んだGET

パラメータが見えないようにするPOST

PUT

DELETE

ここで、HTTPError: HTTP Error 405: METHOD NOT ALLOWED とエラーになりました。DELETEは用意されていないようです。

IOT:通信プロトコル 色々

どーも こんちには ”Keita_Nakamori”(*’▽’)です。

コンピューターネットワークの通信規格、いわゆる通信プロトコルの種類についてざっくりまとめましょう。

表にしてみました

階層 名称 役割 通信プロトコル
第7層 アプリケーション層 アプリケーションへのアクセス HTTP, FTP ,SMTP,POP,IMAP
第6層 プレゼンテーション層 ファイル形式への対応
第5層 セッション層 接続開始と終了
第4層 トランスポート層 データの信頼性を確立 TCP , UDP
第3層 ネットワーク層 ネットワーク経路の決定 IP
第2層 データリンク層 フレーム,ビット列の変換 ARP
第1層 インターフェース層 ビット列,物理信号の変換 Ethernet,光ケーブル, 接続コネクタ

 

 

 

 

 

 

よく見るやつは高階層(アプリケーション層)

HTTP

-Hyper Text Transfer Protocol

Webブラウザで使われています。HTTPリクエストを処理します。

FTP

-File Transfer Protocol

自分のPCから遠くの場所にあるPCにファイルを送り込む仕組みです。

ホームページを持っていてサーバーとやり取りが多い人は使うそうですが、WordPressを使っている限りでは意識することはありません。今のところ。

SMTP

-Simple Mail Transfer Protocol

シンプルなメールの送信手順ということ。単純なメールの意味なのか、単純な転送手順の意味なのかは不明。

POP

-Post Office Protocol

郵便局、つまりメールサーバーにメールを取りに行く手順。

他者から送られたメールは手元まで自動的に届くわけではない。

実際には、こちらからPOPに従ってメールサーバーに取りに行っている。取ったメールはメールサーバーから消える。

IMAP

Internet Message Access Protocol

スマホでよく使われる。POPと同じくメールをメールサーバーまで取りに行く手順。POPと違ってメールを取ってもメールサーバーに残る。よって、コピーを持ってくる感じです

一般ユーザーには無縁の中層(トランスポート~ネットワーク層)

TCP(トランスポート層)

-Transmission Control Protocol

接続先やデータ到達確認、フロー制御、データの重複、データの欠落などの不備を検出します。

UDP(トランスポート層)

-User Datagram Protocol

UDPはTCPのように通信の信頼性を確保する機能を省いて転送スピードに重点を置いた設計になっています。リアルタイム性を重視したストリーミングなどのアプリケーションにぴったりのやりかたです。

IP(ネットワーク層)

-Internet Protocol

データをパケットに分割して通信相手に高速転送します。

よくTCPとIPは一緒に使われるのでTCP/IPとかプロトコルスイートとか言われています。

みんな知ってる(インターフェース層)

Ethernet

イーサネット。いわゆる物理的なLANケーブルのこと。よく指す所の爪が割れるので改良を求めます。

その他の用語

Socket

プログラムからTCP/IPへアクセスするときに出入口が必要になります。

その出入口をSocket(ソケット)といいます。

Pythonでは socketモジュール からのsocketメソド、socket.socket()でソケットを作成することができます。これをサーバー側とクライアント側で作れば、TPC/IPを通じてSocket通信することができます。

IOT:socket通信の超基本

socket 使っていきましょう。

socket通信とは

Socket通信とは複数のコンピュータが、ネットワークを介してデータをやりとるする時に用いる通信規格の一種です。

今お使いのPCをサーバーにして、同PCをクライアントとしローカルホスト接続してみましょう。

 

サーバー側

まず、サーバー側のスクリプトから起動します。

実行すると、クライアントからのデータ待ち状態になります。

出力:

サーバーはポートNO. 2000 にバインドされました

サーバーはクライアントをリスニング中です

クライアント側

クライアント側のスクリプトを実行して、サーバーへデータを送りましょう

出力:

サーバーへ接続しました
サーバーへデータを送信しました

サーバー側 再び

サーバー側がクライアントからのデータを受け取りました。

直後に、クライアントに対して受信の通知をします。

出力:

クライアントのアドレスを受信しました : (‘127.0.0.1’, 52256)
クライアントからのデータを受信しました : こんにちはサーバーさん。私はクライアントです
コネクションは閉じられました
サーバーソケットは閉じられました

クライアント側 再び

サーバーから送られてきた受信の通知を受け取りました。

出力:

サーバーからの受信確認が返ってきました : サーバーです。データをしっかり受け取りました

クライアントソケットを閉じました

課題

このスクリプトでは、送受信がシーケンスになっており厳密には同時ではありません。

同時にする仕組みとして、マルチスレッディングというのがありますので、次回やってみましょう。

IOT:Pythonでよく使う基本操作

やっていきましょう

list系

li=[] #リストの初期化でよく使う表現

li.append(1)#アペンドします。()内の値またはリストを元リストにそのままの要素で追加します。

li.extend([1,2,3,4])#エクステンドします。()内のリストを元リストに値として追加します。

li.pop(3)#ポップします。()内のリスト番号の要素を削除します。

li.sort()#リストを小さい値の順に並び変える。値のみのリストである必要がある。

li.insert(インデックス番号, オブジェクト)#指定インデックスの前にオブジェクトをインサートする

sqlist=[e**2 for e in li] #リスト内包表記です。liを一括変換するときに便利です。

tuple系

t=(1, 2, 3, 4, 5,3,5,3)

t.index(3)#()内の値があるリスト番号のうち、一番左側にあるリスト番号

dictionary系

dict={“me”: 1, “you”: 2, “him”: 3}

dict[“you”]#キー指定で値を得る