simカードを差すモジュール(SIM800L)を購入しましたが、2Gのみ対応で、契約したsimカードが3GとLTEにしか対応しておらず、通信することができませんでした。
温度通知システムを使用する日が近づいているので、ひとまずスマートフォンを介してインターネットに接続することを試してみます。
10分しか接続できず断念
oppoのスマートフォンを使っていましたが、Wi-Fi接続はパーソナルホットスポットという機能でできました。
しかし、この機能は10分後でオフになってしまうため断念しました。
最新の機種のはオフを回避できるようですが、自分の持っている古い端末だとそのアップデートがなされていないようでした。
Bluetooth接続を試す
そこでBluetooth接続を試すことにしました。
ところが、必要なライブラリをインストールしたはずが、以下の周辺にBluetooth機器を検索するコードが動きませんでした。
import bluetooth
def scan_devices():
nearby_devices = bluetooth.discover_devices(duration=10, lookup_names=True, flush_cache=True, device_id=-1)
print("Nearby devices:")
for addr, name in nearby_devices:
print(f"{addr} - {name}")
if __name__ == "__main__":
scan_devices()
・エラー
Traceback (most recent call last):
File "micropython/bluetooth.py", line 10, in <module>
scan_devices()
File "micropython/bluetooth.py", line 4, in scan_devices
nearby_devices = bluetooth.discover_devices(duration=10, lookup_names=True, flush_cache=True, device_id=-1)
^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'bluetooth' has no attribute 'discover_devices'
そこで、bluetoothのライブラリが正常にインストールされているか確認したところ、エラーが出ました。
・エラー
% python3
Python 3.9.6 (default, Aug 11 2023, 19:44:49)
[Clang 15.0.0 (clang-1500.0.40.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import bluetooth
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'bluetooth'
これでbluetoothライブラリがインストールされていないことがわかりました。
ネットで検索してみると、Macbook M1ではPybluezの依存関係の一部がサポートされておらず、Pybluezをインストールしてもbluetoothライブラリが使えないようでした。
そのためblueutilでBluetooth機器を探すことにしました。
brew install blueutil
blueutil
address: x-x-x-x-x-x, connected (master, -54 dBm), not favourite, paired, name: "XXX", recent access date: 2024-03-28 15:32:34 +0000
上記のコードでMACアドレスを取得することができました。
ampyコマンドが一部動作して一部エラーになる
ここで以下のコードを実行しようとしました。
import bluetooth
# スマートフォンのMACアドレス
DEVICE_MAC_ADDRESS = "b4:cb:57:6a:c8:f8"
# Bluetoothソケットを作成
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
# スマートフォンに接続
sock.connect((DEVICE_MAC_ADDRESS, 1))
# 接続が成功したことを表示
print("接続成功")
# データの送受信を行う
# ...
# ソケットを閉じる
sock.close()
・エラー
$ ampy --port /dev/tty.usbserial-0001 run main.py
Traceback (most recent call last):
File "/Users/user/anaconda3/bin/ampy", line 8, in <module>
sys.exit(cli())
^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/cli.py", line 338, in run
output = board_files.run(local_file, not no_output, not no_output)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/files.py", line 309, in run
self._pyboard.execfile(filename, stream_output=True)
File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/pyboard.py", line 285, in execfile
return self.exec_(pyfile, stream_output=stream_output)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/ampy/pyboard.py", line 279, in exec_
raise PyboardError('exception', ret, ret_err)
ampy.pyboard.PyboardError: ('exception', b'', b'Traceback (most recent call last):\r\n File "<stdin>", line 7, in <module>\r\nAttributeError: \'module\' object has no attribute \'BluetoothSocket\'\r\n')
する上記のエラーになったので、ESP32にampyでbluetoothライブラリをインストールしようとしたところ、以下のエラーが出ました。
$ ampy --port /dev/tty.usbserial-0001 put main.py
$ ampy --port /dev/tty.usbserial-0001 install micropython-bluetooth
Usage: ampy [OPTIONS] COMMAND [ARGS]...
Try 'ampy --help' for help.
Error: No such command 'install'.
$ ampy --version
Traceback (most recent call last):
File "/Users/user/anaconda3/bin/ampy", line 8, in <module>
sys.exit(cli())
^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1077, in main
with self.make_context(prog_name, args, **extra) as ctx:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 943, in make_context
self.parse_args(ctx, args)
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1644, in parse_args
rest = super().parse_args(ctx, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1408, in parse_args
value, args = param.handle_parse_result(ctx, opts, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 2400, in handle_parse_result
value = self.process_value(ctx, value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 2362, in process_value
value = self.callback(ctx, self, value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/decorators.py", line 506, in callback
raise RuntimeError(
RuntimeError: 'ampy' is not installed. Try passing 'package_name' instead.
$ ampy --version
Traceback (most recent call last):
File "/Users/user/anaconda3/bin/ampy", line 8, in <module>
sys.exit(cli())
^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1077, in main
with self.make_context(prog_name, args, **extra) as ctx:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 943, in make_context
self.parse_args(ctx, args)
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1644, in parse_args
rest = super().parse_args(ctx, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 1408, in parse_args
value, args = param.handle_parse_result(ctx, opts, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 2400, in handle_parse_result
value = self.process_value(ctx, value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/core.py", line 2362, in process_value
value = self.callback(ctx, self, value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user/anaconda3/lib/python3.11/site-packages/click/decorators.py", line 506, in callback
raise RuntimeError(
RuntimeError: 'ampy' is not installed. Try passing 'package_name' instead.
どうもmacbook M1でanacondaの環境ではダメらしいので、VS code(anaconda)ではなくターミナルで(非anacondaで)実施することにしました。
ampyの前に必要なライブラリをインストールします。
pip3 install --upgrade pip setuptools
pip3 install blosc2 cython FuzzyTM
pip3 install ampy
ampy --version
ampy, version 0.1.1
ようやくampyがインストールされ、バージョンが確認できました。
しかし以下のようにinstallコマンドが使えませんでした。
ampy --port /dev/tty.usbserial-0001 install micropython-bluetooth
Usage: ampy [OPTIONS] COMMAND [ARGS]...
Try 'ampy --help' for help.
Error: No such command 'install'.
どうもinstallというコマンドが通らないようです。
そこでESP32にインストールされているmicropythonにライブラリとしてbluetoothがあるのか対話モードで確認しました。
screen /dev/tty.usbserial-0001 115200
>>> help('modules')
__main__ bluetooth heapq select
_asyncio btree inisetup socket
_boot builtins io ssl
_espnow cmath json struct
_onewire collections machine sys
_thread cryptolib math time
_webrepl deflate micropython uasyncio
aioespnow dht mip/__init__ uctypes
apa106 ds18x20 neopixel umqtt/robust
array errno network umqtt/simple
asyncio/__init__ esp ntptime upysh
asyncio/core esp32 onewire urequests
asyncio/event espnow os webrepl
asyncio/funcs flashbdev platform webrepl_setup
asyncio/lock framebuf random websocket
asyncio/stream gc re
binascii hashlib requests/__init__
するとbluetoothライブラリは存在しているようです。
しかし、対話モードにてライブラリのバージョンを確認しようとするとエラーになりました。
>>> import bluetooth
>>> print(bluetooth.__version__)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__version__'
どうも、ライブラリが存在するもののバージョンが古く__version__属性がないことが原因らしいです。
色々と調べた結果、どうやらBluetoothSocketがきちんと機能するようにbluetoothの機能をビルドするときに含める必要があるようでした。
そこまでする時間がないので一度断念しました。
別角度の発想 スマートフォンのホットスポットをアプリで無制限にする
ここで別の方法を思いつきました。
スマートフォンのホットスポット機能が時間制限があるのなら、無制限で出来るスマホアプリを使えば良いのです。
そこで、Androidアプリでホットスポットを設定できるものを試してみました。