TP-Link スマートコンセントHS-105をAPIから操作(3)

昨日の続きでPython3で通信できるようにやってみた。まだPython2系が無くなったわけではないし、緊急性はなかったが、動作しないのを見たらどうしても直してみたくなった。ちなみにPythonバージョンは3.6.4。

実行してまず、実行エラーで引っかかったのはprint関数。
Python2 ・・・ print ‘文字列’
Python3 ・・・  print(‘文字列’)
これはすぐに分かった。
もう一つ大きなものは、文字列とバイト列の関係だ。変わったのはわかってたので、単純にbytes関数で変換したら、エラーは消えたが全く返答が帰ってこない。

わけが分からずに使っていたが、bytes()関数は大きさを指定してbytesオブジェクトを作る関数だったようだ。

bytes(10)
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00’

Python3は文字列はデフォルトでUnicodeになって、その代りbytes型ができた。
下記のような感じである

PYTHON3PYTHON2
byte列bytes (b”)str (”)
通常の文字列str (”)str (”)

要するに文字列をbyte列に直せば良い。
変更箇所は下記の通り
まずは暗号化関数

整数をからbyte列に変換するにはto_bytes()関数を使用する。動作は下記の通り。

i=ord(‘a’)
i.to_bytes(1,’big’)
b’a’

Python3.2から使用可能。標準関数なのでimportする必要はない。
これがわかるまで結構時間がかかってしまった。
次に復号化

受信する時に、byte列で入ってくるので、Python2のようにord() 関数で整数に戻す必要がないので、記入としては減る方向になった。

無事にPython2のファイルと同じことができた。