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)
クライアントからのデータを受信しました : こんにちはサーバーさん。私はクライアントです
コネクションは閉じられました
サーバーソケットは閉じられました

クライアント側 再び

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

出力:

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

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

課題

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

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

Python:スタティックメソド @staticmethod

前回のクラスメソド @classmethod に続きましてスタティックメソド @staticmethonです。前回のを見てから、その流れでこちらを見ることをおすすめします。

こちらもまた、クラスをオブジェクト化していない場合に対するpythonの便利?機能です。

(1) @staticmethodをメソドの前行につけます。引数にselfは不要です。

(2) このメソドはクラスの外に丸ごと出してしまっても全く問題ありませんが、@staticmethodとしてクラスの内部に書くことによって、クラスPersonの仲間なんだよという意思を表現することができます。

ぶっちゃけ、あんまり使おうとは思いませんが、色々な人のスクリプトを見ていると、出てきますので覚えた次第であります。

 

Python: クラスメソド @classmethod

クラスメソドをやっていきましょう。

普通のクラスと使い方

インスタンス(オブジェクト)を作るときに、カッコを付けるのが普通ですが、カッコをつけない場合は、アトリビュートにアクセスできなくなります。

オブジェクト内のグローバル変数的な意味合いのある”クラス変数”にはアクセスできます。

 

本題:クラスメソド @classmethod

 

カッコをつけてオブジェクト化していなくても、アトリビュートにアクセスできるようにクラスメソドを使います。

やり方:

(1)メソドの前行に @classmethod とマーキングする。

(2)メソドの引数self を clsに変更する。cls = classの意味

kenji3はクラスのままでオブジェクト化されていませんが、@classmethodでマーキングしたメソドはちゃんと使えるようになりました。

次回はスタティックメソド @staticmethod をやってみます。

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”]#キー指定で値を得る

Python:デコレータ関数で機能追加

今日はデコレータをやっていきます。

既存のプログラムを使用しているときに、ちょっとこの関数に機能を追加したいなあ、なんて思ったことありませんか?

デコレータ追加前

引数xと引数yを足した数値を返す機能を”基本機能”と呼びましょう。

これに、機能を追加(デコレート)していきましょう。

デコレーターを使わない場合

その前に、このスクリプトに対して単純に機能を追加するならば下記のようになりますよね。print()という機能をresultを算出する前後に追加しました。

しかし、これではadd_numするたびに毎回print()→add_num→print()と3行書かなくてはなりません。

デコレータを使った場合

ここでデコレータの出番です。

デコレータの動きを解説

まず、通常の関数定義 def add_num(x, y): の前行に @deco とつけます。

このdecoという名称が、これから作る追加機能(デコレータ)の名称になります。(任意の名前で結構です)

@decoの前行に デコレータ関数定義 def deco(func):をします。

このdef decoの引数funcには、関数add_num実行時に@decoで指定されているので、add_numが入ってきます。

デコレータ関数decoはwrapperというものをreturnするようにしますが、このwrapperを デコレータ関数内のインナー関数として定義します。def wrapper():

引数にはタプルでもディクショナリでもどちらでも入るように、def wrapper(*args, **kwargs):にしておきます。

この中に、下記3行を書き実行します。この前後print文が今回追加した(デコレートした)機能です。ここのfuncの引数にも、入ってきた引数が何であれ全て受け入れます。つまり、そのまま返すということです。

print(‘関数実行の前に、何かの処理:足し算しますよー’)
result = func(*args, **kwargs)
print(‘関数実行の後に、何かの処理:終わりましたよー’)

これで、デコレータ関数の作成はおわりました。

実行

実行するときは

r=add_num(100,200)
print(r)

とすれば、add_numの基本機能の他にデコレータの追加機能も合わせて処理が行われます。

【実行結果】

  • 関数実行の前に、何かの処理:足し算しますよー #デコレータによる追加機能
  • 関数実行の後に、何かの処理:終わりましたよー #デコレータによる追加機能
  • 300  #基本機能