UMEHOSHI ITA TOP PAGE COMPUTER SHIEN LAB
このページで紹介したロボット制御の続きとして、
「umehoshiツール」や
「umehoshiEdit」ツールが
接続できるようなサーバプログラム(MicroPython)を追加する解説です。
(別途で「UMEHOSHI ITA」とAndroidをUSB接続して
他のAndroidやPCからTCP接続で制御する例を別途に紹介していますが、
このUSB接続するAndroidの代わりを、esp32とそのMicroPythonで行うものです。)
またesp32に埋め込んだプログラムで、esp32へファイルを転送して、importで実行する例も紹介しています。
|
左上のumehoshiツール(アプリ)から制御されるイメージです。
『動画とコード(.umh))』
また、左下の「umehoshiEdit」ツールでプログラミングして作ったファイルを すぐに転送して制御を確かめることもでできます。 |
上記の接続は次のように行います。
まず、リセットのSW1を押しながらSW2を押し、SW1を離してLED1が消灯から点灯に変わるまでSW2を押し続けます。
これににより、UART1コマンドモードになります
またesp32内のMicroPythonを自動的に実行させており、これでesp32はアクセスポイントでTCPサーバとして動作します。
そしてこのTCPサーバで受信した命令を、UART1を介して「UMEHOSHI ITA」へ送り込んで実行させます。
このためには、
このWifiのアクセスポイント(SSIDが「ESP-AP」でパスワードは無し)に接続し、
上記左側のような 「umehoshiツール」や 「umehoshiEdit」のTCPクライアントツールで、
192.168.222.1へ接続し、「.umh」のプログラムを転送します。
このページの後方で紹介するサーバは、「umehoshiツール」や 「umehoshiEdit」のTCPクライアントツールに対応する以外に、
このマシンの遠隔プログラミングのための機能を盛り込みました。
この機能実現は、「umehoshiアプリのTCP送受信メッセージの仕様」
のMとfの先頭文字のコマンドを使っています。
その機能の引き出すPython用のクライアント機能概要を以下に列挙します。
任意ファイルを受信してesp32内に保存する。
(受信ファイルの拡張子が「.umh」であれば、ファイル保存後に[UMEHOSHI ITA]に送ってHEXコマンドを実行します。)
fの先頭文字のファイル転送コマンド使用を利用しています。
esp32内のpythonファイルをimportで実行する。
Mの先頭文字メッセージ送信を利用して「import モジュール名」のキー入力で行います。
(これで、ファイル転送したesp32内のpythonファイルを起動させます)
esp32内のファイルのリスト情報を送信する。
Mの先頭文字メッセージ送信を利用して「ls -l ディレクトリパス」のキー入力で行います。
(「ls -l」だけキー入力した場合は、ルートのファイルリストの表示です。)
esp32内の指定ファイル内容を表示用に送信する。
Mの先頭文字メッセージ送信を利用して「cat file」のキー入力で行います。
esp32内の指定ファイルを送信する。
Mの先頭文字メッセージ送信を利用して「get file」のキー入力で行います。
esp32内の既存の指定ファイルをHEXコマンドとして、[UMEHOSHI ITA]へ転送して実行させます。
Mの先頭文字メッセージ送信を利用して「exc file」のキー入力で行います。
[UMEHOSHI ITA]用のHEXコマンドの1行を受信する。
Mの先頭文字メッセージ送信を利用して"SRG"のいづれかの文字から始まる文字列キー入力で行います。
Mの先頭文字メッセージ受信で、上記のパターンに合わない文字列の場合、エコー送信されます。
以上の機能に対応するクライアント側ソフト(client_ume_tcp_esp32.py)のソースを以下に示します。
(このPythonソフトを使わなくても、、「umehoshiツール」や 「umehoshiEdit」で「.umh」プログラムを転送・実行ができます。
このPythonソフトは、サーバ作品を作る時のデバック用として作り、
同時にPythonファイルをPCから簡単に管理(送受信や削除、閲覧、起動)できるように機能追加したものです。)
import os # client_ume_tcp_esp32.py import socket import sys import time import threading path_datas="./" # ----- 受信関連 --------------------------------- def recieve_file(sock): buf=b"" while True: bin = sock.recv(1) if len(bin) != 1: break buf += bin if buf[-2:] == b"\r\n": s = buf[0:-2].decode('utf-8') a=s.split(' ') filename, filesize = a[0], int(a[1]) bin=b"" while len(bin) < filesize: bin += sock.recv(filesize-len(bin)) with open( path_datas + filename, "wb") as f: f.write(bin) #tcp_send_message(sock,filename + ":size=" + str(len(bin))) break print(filename + ":size=" + str(filesize)) # debug --------------- def recieve_message(sock): # TCP文字列メッセージ受信 buf=b"" while True: bin = sock.recv(1)#1byte受信 if len(bin) != 1: break buf += bin if buf[-2:] == b"\r\n":# 1行の文字列受信終了? s = buf[0:-2].decode('utf-8')#バイナリから print(s) break def receiveData(sock): # 全てのTCP受信のスレッド用関数 print( "start receiveData" ) while True: bin = sock.recv(1)#1byte受信 if len(bin) != 1: break if bin == b"f" : recieve_file(sock) elif bin == b"M" : recieve_message(sock) else: print(bin , end="") # print( "receiveData ended." ) # ----- 送信関連 --------------------------------- def send_file(sock, filepath): try: filesize = os.path.getsize(filepath) filename = os.path.basename(filepath) s = "f{} {}".format(filename, filesize) bin=(s+"\r\n").encode("utf-8")#binaryへ変換 # print(bin, end=" ") sock.sendall(bin) #filename filesize 送信 with open(filepath, "rb") as f: bin = f.read(filesize) # print("送信data:" , bin ) sock.sendall(bin) # ファイル内容一括送信 print("送信byte:" , len(bin) ) except Exception as e: print( "send_file error:" + str(e)) def send_message(sock,msg): bin=('M'+msg+"\r\n").encode("utf-8")#binaryへ変換 sock.sendall(bin)#一括送信 # ----- メイン --------------------------------- portnumber=59154 ip="192.168.222.1" s = input(f"IP (defualt:{ip})Address>") if s != "": ip = s sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, portnumber)) print("接続成功") t_id = threading.Thread(target=receiveData, args=(sock,) ) t_id.start() loopFlag = True cmd="" while loopFlag: s = input("入力'M'/'f'/'quit'/w/x/a/d/>") if s != "": cmd = s if cmd == 'M': msg = input("ls -l/cat /get /exc /del /import /MESSAGE>") send_message(sock,msg) elif cmd == 'f': print(os.listdir(path_datas)) filename = input("送信したいファイル名入力>") if not os.path.isfile(path_datas + "/" + filename): print( filename, "no exist") continue send_file(sock, path_datas + "/" + filename) elif cmd == 'quit': send_message(sock,'end_listen_loop') loopFlag=False elif cmd == 'w': send_file(sock, path_datas + "/" + "uGoForward.umh") elif cmd == 'x': send_file(sock, path_datas + "/" + "uGoBack.umh") elif cmd == 'a': send_file(sock, path_datas + "/" + "uGoLeft.umh") elif cmd == 'd': send_file(sock, path_datas + "/" + "uGoRight.umh") # time.sleep(1.0) sock.close() sys.exit(0)
このロボットの構造で、esp32用のMicroPythonでprintを実行すると、その出力データが[UMEHOSHI ITA]のUARTで受信されます。
[UMEHOSHI ITA]をUART1コマンドモードで使うと、Pythonでprint("G10800090000067")のような出力は、[UMEHOSHI ITA]のUARTで受信されてその
応答文字列を送信しようとします。
ですが、UART1コマンドモードではフロー制御をしているため、Pythonのinput()の入力できない状況になっています。
([UMEHOSHI ITAのPIC32MX]とesp32ではフロー制御の接続がされていないためです。)
よって、フロー制御でなく片方向モードにする必要があります。そのコード例を以下に示します。
#include <xc.h> // ex32flowoff.c #include "common.h" #include <stdlib.h> __attribute__((address( 0x80005000 ))) void test (void); void test() { U1MODEbits.RTSMD = 1; // UxRTS ピンモード選択を片方向モード(フロー制御しない). U1MODEbits.UEN = 0; //UxTX、UxRXをピンを有効, UxCTS、UxRTSはPORTxレジスタで指定 _clear_beep_code(); _set_beep_code((uint8_t)0b00010010);//音パターン[・−]の登録 _UM_PTR_GOTO_BEEP = NULL;//ループ生成OFF }
ですが、単純に片方向モードにすると、別の不具合が発生するでしょう。
それは、byte単位のエコーがあるためです。
例えば"G10800090000067"のような受信時に、途中のエコー出力により受信の欠けが生じるため、チェックサムエラーになるでしょう。
そこで、"E\r\n"を送って「UMEHOSHI ITA」のエコーモードをオフにしてからHexコマンド文字列を送ります。
また、Hexコマンド文字列を1行送った後に応答文字を受信すると予想される時間(0.1ミリ秒)待ってから
次の1行のHexコマンド文字列を送るように制御する必要があります。
(この場合、応答文字を受信処理は別スレッドで行う必要があります。)
以上の問題が起きる可能性に対処したesp32のサーバプログラムは、次のようになります。
なお、下記の Hexコマンド 部分は、上記の UxRT指定を片方向モードするソース(ex32flowoff.c)を
ビルドして得られたコードです。
「umehoshiツール」や 「umehoshiEdit」に対するTCPサーバとなるプログラムです。
そして、同時に上記で示した「client_ume_tcp_esp32.py(PCからファイル管理する)」のサーバプログラムです。
(client_ume_tcp_esp32.pyを使って、TCPによる送受信などで動作を確認しながら作り上げたプログラムです)
import os # ume_tcp_esp32.py
import sys
import socket
import _thread
import time
path_datas = "./"
flag_listen_loop=True
def tcp_send_message(sock,msg):
bin=('M'+msg+"\r\n").encode("utf-8")
if sock : sock.sendall(bin)
def ls_filelist(sock,name):
tcp_send_message(sock,"ls_filelist:" + name)
if name == "": name="."
try:
for file in os.listdir(name):
tcp_send_message(sock,file)
except Exception as e:
# print("Error :" , e) # debug ---------------
tcp_send_message(sock,"ls_filelist Error:" + str(e))
def cat_filepath(sock, filepath):
tcp_send_message(sock, "cat_filepath:" + filepath)
try:
with open(filepath) as fr:
ss = fr.readlines()
for s in ss:
if len(s) >= 1: s=s[:-1]
tcp_send_message(sock, s)
except Exception as e:
# print("Error :" , e) # debug ---------------
tcp_send_message(sock,"cat_filepath Error"+ str(e))
def del_filepath(sock, filepath):
tcp_send_message(sock, "del_filepath:" + filepath)
try:
os.remove(filepath)
except Exception as e:
tcp_send_message(sock,"del_filepath Error"+ str(e))
def import_name(sock, name):
tcp_send_message(sock, "import_name:" + name)
try:
mod=__import__(name)
except Exception as e:
tcp_send_message(sock,"import_name Error"+ str(e))
def get_file(filename):
it = os.ilistdir(".")
while True:
t = next(it)
if t[0] == filename: return t[0], t[3]
return None,0
def send_file(sock, filepath):
try:
filename , filesize = get_file(filepath)
s = "f{} {}".format(filename, filesize)
bin=(s+"\r\n").encode("utf-8")
sock.sendall(bin) #send filename filesize
with open(filepath, "rb") as f:
bin = f.read(filesize)
sock.sendall(bin) # send binary file
# print("send binary byte:" , len(bin) )# debug ---------------
tcp_send_message(sock,"send_file:"+ filepath)
except Exception as e:
# print("Error :" , e) # debug ---------------
tcp_send_message(sock,"send_file Error"+ str(e))
def recieve_file(sock):
buf=b""
while True:
bin = sock.recv(1)
if len(bin) != 1: break
buf += bin
if buf[-2:] == b"\r\n":
s = buf[0:-2].decode('utf-8')
a=s.split(' ')
filename, filesize = a[0], int(a[1])
bin=b""
while len(bin) < filesize:
bin += sock.recv(filesize-len(bin))
with open( path_datas + filename, "wb") as f:
f.write(bin)
tcp_send_message(sock,filename + ":size=" + str(len(bin)))
if filename.endswith(".umh"):
send_cmdfile(sock,filename)
break
#print(filename + ":size=" + str(filesize)) # debug ---------------
def recieve_message(sock):
global flag_listen_loop
buf=b""
while True:
bin = sock.recv(1)
if len(bin) != 1:
flag_listen_loop = False
return False
#
buf += bin
if buf[-2:] == b"\r\n":
s = buf[0:-2].decode('utf-8').strip()
if s == "end_listen_loop":
flag_listen_loop = False
return False
#
if s.startswith("ls -l"):
ls_filelist(sock, s[5:].strip() )
return True
#
if s.startswith("cat "):
cat_filepath(sock, s[4:] )
return True
#
if s.startswith("del "):
del_filepath(sock, s[4:] )
return True
#
if s.startswith("exc "):
send_cmdfile(sock, s[4:] )
return True
#
if s.startswith("import "):
import_name(sock, s[7:] )
return True
#
if len(s)>1 and s[0] in "SRG":
print( s )
else:
tcp_send_message(sock,s) # echo
#
return True
def receiveData(sock):
tcp_send_message(sock,"start sever receiveData" )
while True:
bin = sock.recv(1)#1byte recieve
if len(bin) != 1: break
if bin == b"f" : recieve_file(sock)
elif bin == b"M" : recieve_message(sock)
else:
tcp_send_message(sock,"receive error:" + str(bin) )
#
# ------------- UART -------------------
sock2 = None
flag_input_loop=False
cmd='''E
S108000500000E8FFBD271400BFAF1000BEAF21F0A00317
S10800050100080BF033C0060629401000424C45A827C9E
S108000502000006062A480BF033C00606294044A027CA1
S108000503000006062A400A0023CF44142340000428CC3
S10800050400009F840000000000000A0023CF0414234DF
S1080005050000000428C1200042409F840000000000001
S10800050600000A0023CFC414234000040AC21E8C00397
S1080005070001400BF8F1000BE8F1800BD270800E0036F
S04800050800000000000D4
S1080005084000000000022222222222222222222222223
R00800050000061
'''
def input_loop():
global flag_input_loop
try:
flag_input_loop = True
while sock2 is None:
time.sleep(0.1)
tcp_send_message(sock2, "Connect!\r\n")
print(cmd)
while flag_input_loop:
s=input("")
tcp_send_message(sock2, s )
if s == "end_input_loop": break
#
tcp_send_message(sock2, "End! input_loop\r\n")
except Exception as e:
# print("Error :" , e) # debug ---------------
tcp_send_message(sock,"input_loop Error"+ str(e))
thread_id = _thread.start_new_thread(input_loop, ())
def send_cmd( ss, cmdchar="SRG"):# example ss=[S048000800000FFAF000086]
a = ss.split('\n')
for s in a:
s=s.strip()
if s == "" or not s[0] in cmdchar : continue
print( s )
tcp_send_message(sock2, s )
time.sleep(0.1)
def send_cmdfile(sock,filepath, cmdchar="SRG"):
try:
with open(filepath , "r", encoding="utf-8") as f:
ss = f.readlines()
if filepath.endswith(".umh") : ss = ss[1:]
ss="".join(ss)
send_cmd( ss, cmdchar)
except Exception as e:
# print("Error :" , e) # debug ---------------
tcp_send_message(sock,"send_cmdfile Error"+ str(e))
# ------------- Main -------------------
portnumber=59154
ip = "192.168.222.1"
#ip = "192.168.0.110"
server_addr =(ip, portnumber)
serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversock.bind(server_addr)
while flag_listen_loop:
serversock.listen(5)
sock2, address = serversock.accept()
try:
receiveData( sock2 )
except: pass
sock2.close()
serversock.close()
ampy -p COM8 -b 11500 put ume_tcp_esp32.py(COM8の8は、お手持ちのUSBの接続の番号に合わせて指定してください)
以下のようにboot.pyを変更して、ampy -p COM8 -b 11500 put boot.pyで転送します。
# This file is executed on every boot (including wake-boot from deepsleep) #import esp #esp.osdebug(None) #import webrepl #webrepl.start() import setap #import udpsvrUme #import udpsvrEsp import ume_tcp_esp32
最後の行に追加したume_tcp_esp32のモジュールが、上記で示したTCPサーバです。
このページで紹介したUDP受信でモータを制御するための udpsvrUme と udpsvrEsp のインポート部は
コメントします。
(ume_tcp_esp32とudpsvrUmeのモジュールは同時に動かすことがでません。)
ssidの'ESP-AP'のアクセスポイントとして起動し始めて、「192.168.222.1」のマシンにするためのsetap.pyの内容は、
以下の通りで変わってません。
import time # setap.py time.sleep(5) import network ap = network.WLAN(network.AP_IF) # create access-point interface ap.config(essid='ESP-AP') # set the ESSID of the access point ap.config(max_clients=10) # set how many clients can connect to the network ap.ifconfig(('192.168.222.1', '255.255.255.0', '192.168.222.1', '8.8.8.8')) # set (ip address, subnet mast, default gateway, dns ip address) ap.active(True) # activate the interface
以上で、TCPサーバのインストールが終了です。
なおこのページで「Tera Term」などのターミナルを使って
micropython操作している例を示しています。この操作は、
[UMEHOSHI ITA]を一時スルーモードにして行っていました。
UART1コマンドモードでなくても、このTCPサーバ(ume_tcp_esp32)が起動します。
そして、このTCPサーバ起動中はUSBのシリアル通信ができません。
つまり、スルーモードを使ったmicropython操作も、TCPサーバ(ume_tcp_esp32)を終了するまではできません。
電源を入れて、リセットのSW1を押しながらSW2を押し、SW1を離してLED1が消灯から点灯に変わるまでSW2を押して、UART1コマンドモードにします。
WindowsのWifi接続先をこのESPに変更しています。
(SSIDが「ESP-AP」でパスワードは無し)
esp32は192.168.222.1になっています。
後は次のように、client_ume_tcp_esp32.py
を実行します。
このポート番号は、59154です。
R:\esp32>python client_ume_tcp_esp32.py IP (defualt:192.168.222.1)Address>192.168.222.1 接続成功 start receiveData 入力'M'/'f'/'quit'/w/x/a/d/>start sever receiveData Connect! b'\r'b'\n'E ECHO OFF SET:80005000 SET:80005010 SET:80005020 SET:80005030 SET:80005040 SET:80005050 SET:80005060 SET:80005070 SET:80005080 SET:80005084 START:80005000 入力'M'/'f'/'quit'/w/x/a/d/>
プログラムにメモリーを設定した応答のSETが複数行表示して80005000番地から実行した応答表示が表示されています。
この表示は、「上記の黄色のUART1を片方向モードに変更して、確認用のブザーを鳴らすプログラム」の
実行の応答メッセージです。
(片方向モード変更実行により、蓄えられていた応答が表示されます。)
『入力'M'/'f'/'quit'/w/x/a/d/>』がメニューで、これが表示されていない場合、Enterをキー入力します。
下の操作は、client_ume_tcp_esp32.pyと同じ位置にある「BEEP2.umh」のファイルを転送して実行させる操作例です。
(Andoridなどのumehoshiツールを使った転送・実行の操作と同じです。)
そして、esp32内のファイルリストを取得・表示して、送信した「BEEP2.umh」の内容を表示させています。
入力'M'/'f'/'quit'/w/x/a/d/>f ['BEEP2.umh', 'boot.py', 'setap.py', 'udpsvrUme.umh', 'udpsvrEsp.py', 'ume_tcp_esp32.py'] 送信したいファイル名入力>BEEP2.umh 送信byte: 595 BEEP2.umh:size=595 S108000500000E8FFBD271400BFAF1000BEAF21F0A00317 SET:80005000 S10800050100000A0023CF44142340000428C09F84000BD SET:80005010 S1080005020000000000000A0023CF04142340000428CEB SET:80005020 S108000503000C300042409F840000000000000A0023CE8 SET:80005030 S108000504000F04142340000428CB400042409F84000C7 SET:80005040 S1080005050000000000021E8C0031400BF8F1000BE8F93 SET:80005050 S0C80005060001800BD270800E003000000006F 入力'M'/'f'/'quit'/w/x/a/d/>SET:80005060 S108000700000E8FFBD271400BFAF1000BEAF21F0A00315 SET:80007000 S10800070100000A0023CF44142340000428C09F84000BB SET:80007010 S1080007020000000000021E8C0031400BF8F1000BE8F94 SET:80007020 S0C80007030001800BD270800E0030000000070 SET:80007030 S108000506C000000000022222222222222222222222216 SET:8000506C R00800050000061 START:80005000 ['BEEP2.umh', 'boot.py', 'setap.py', 'udpsvrUme.umh', 'udpsvrEsp.py', 'ume_tcp_esp32.py'] 送信したいファイル名入力> no exist 入力'M'/'f'/'quit'/w/x/a/d/>M ls -l/cat /get /exc /del /import /MESSAGE>ls -l ls_filelist: BEEP.umh BEEP2.umh boot.py ex32flowoff.py setap.py test.txt udpsvrEsp.py udpsvrUme.py udpsvrUme.umh ume_tcp_esp32.py 入力'M'/'f'/'quit'/w/x/a/d/>M ls -l/cat /get /exc /del /import /MESSAGE>cat BEEP2.umh cat_filepath:BEEP2.umh BEEP S108000500000E8FFBD271400BFAF1000BEAF21F0A00317 S10800050100000A0023CF44142340000428C09F84000BD S1080005020000000000000A0023CF04142340000428CEB S108000503000C300042409F840000000000000A0023CE8 S108000504000F04142340000428CB400042409F84000C7 S1080005050000000000021E8C0031400BF8F1000BE8F93 S0C80005060001800BD270800E003000000006F S108000700000E8FFBD271400BFAF1000BEAF21F0A00315 S10800070100000A0023CF44142340000428C09F84000BB S1080007020000000000021E8C0031400BF8F1000BE8F94 S0C80007030001800BD270800E0030000000070 S108000506C000000000022222222222222222222222216 R00800050000061 入力'M'/'f'/'quit'/w/x/a/d/> 入力'M'/'f'/'quit'/w/x/a/d/>M ls -l/cat /get /exc /del /import /MESSAGE>exc BEEP2.umh S108000500000E8FFBD271400BFAF1000BEAF21F0A00317 SET:80005000 S10800050100000A0023CF44142340000428C09F84000BD SET:80005010 S1080005020000000000000A0023CF04142340000428CEB SET:80005020 S108000503000C300042409F840000000000000A0023CE8 SET:80005030 S108000504000F04142340000428CB400042409F84000C7 SET:80005040 S1080005050000000000021E8C0031400BF8F1000BE8F93 SET:80005050 S0C80005060001800BD270800E003000000006F SET:80005060 S108000700000E8FFBD271400BFAF1000BEAF21F0A00315 SET:80007000 入力'M'/'f'/'quit'/w/x/a/d/>S10800070100000A0023CF44142340000428C09F84000BB SET:80007010 S1080007020000000000021E8C0031400BF8F1000BE8F94 SET:80007020 S0C80007030001800BD270800E0030000000070 SET:80007030 S108000506C000000000022222222222222222222222216 SET:8000506C R00800050000061 START:80005000 ls -l/cat /get /exc /del /import /MESSAGE> 入力'M'/'f'/'quit'/w/x/a/d/>上記では、メニュー表示とUART1の送受信が別スレッドで動作しているため、メニュー表示が途中で出現しています。
入力'M'/'f'/'quit'/w/x/a/d/>f ['BEEP2.umh', 'boot.py', 'setap.py', 'udpsvrUme.umh', 'udpsvrEsp.py', 'ume_tcp_esp32.py'] 送信したいファイル名入力>udpsvrUme.umh 送信byte: 6815 udpsvrUme.umh:size=6815 S048000800000FFDF000083 SET:80008000 S048000800400FFFF00007D SET:80008004 S04800080080000050000CC SET:80008008 S048000800C0032000000C1 SET:8000800C S04800080100000000000D8 入力'M'/'f'/'quit'/w/x/a/d/>SET:80008010 S04800080140000000000D4 SET:80008014 S04800080180000000000D0 SET:80008018 S1080005B0000F8FFBD270400BEAF21F0A00388BF023C05 SET:80005B00 S1080005B100000020324341043AC0180023C1080428CC3 SET:80005B10 S1080005B2000010043240180023C108043AC0180023CC7 SET:80005B20 S1080005B30001080438C0180023C0880428C2A106200B1 SET:80005B30 S1080005B4000050040140000000088BF033C20616294CC SET:80005B40 S1080005B5000C47B027C206162A40180023C1880428C83 SET:80005B50 S1080005B60001C004104000000000180023C1480428CDB SET:80005B60 S1080005B7000010044240180033C148064AC15004104CB SET:80005B70 S1080005B8000000000000100042480BF033C00306294D9 SET:80005B80 S1080005B9000C47B827C003062A480BF033C0038629467 SET:80005B90 S1080005BA000C47B827C003862A42120000080BF033C72 SET:80005BA0 S1080005BB00000366294C47B827C003662A480BF033C5A SET:80005BB0 S1080005BC00000346294C47B827C003462A41A17000884 SET:80005BC0 S1080005BD000000000000180023C1880428C22004104D9 SET:80005BD0 S1080005BE000000000000180023C0C80428C1E004018B8 SET:80005BE0 S1080005BF000000000002120000080BF033C00306294D1 SET:80005BF0 S1080005C0000C47B827C003062A480BF033C003862946F SET:80005C00 S1080005C1000C47B827C003862A40100042480BF033C7B SET:80005C10 S1080005C200000366294C47B827C003662A480BF033C69 SET:80005C20 S1080005C300000346294C47B827C003462A40180023C94 SET:80005C30 S1080005C40001480438C0180023C0C80428C2A104300A1 SET:80005C40 S1080005C500005004010000000000180023C1880438CE9 SET:80005C50 S0880005C60000180023C148043ACE6 SET:80005C60 S1080005C680021E8C0030400BE8F0800BD270800E00368 SET:80005C68 S0480005C780000000000BA SET:80005C78 S108000500000E8FFBD271400BFAF1000BEAF21F0A00317 SET:80005000 S10800050100088BF023C0C600324246143AC00A0023C8B SET:80005010 S108000502000C84042340080033C00506334000043ACD0 SET:80005020 S1080005030000000000088BF023C00020324641043ACCB SET:80005030 S10800050400000A0023C504042340080033C005B6334D4 SET:80005040 S108000505000000043AC80BF023CFF8F0334200843AC5E SET:80005050 S10800050600088BF023C00020324681043AC00A0023C9B SET:80005060 S108000507000B84042340000428C09F8400001000424D6 SET:80005070 S10800050800080BF033C0008629401000424C47B827C92 SET:80005080 S108000509000000862A40180023C108040AC88BF033C8E SET:80005090 S10800050A00020616294C47B027C206162A400A0023C95 SET:800050A0 S10800050B000F44142340000428C09F8400000000000D5 SET:800050B0 S10800050C00000A0023CF04142340000428C09F84000AF SET:800050C0 S10800050D0002300042400A0023CFC414234000040ACB0 SET:800050D0 S10800050E00021E8C0031400BF8F1000BE8F0800E00363 SET:800050E0 S04800050F0001800BD278E SET:800050F0 S108000560000E8FFBD271400BFAF1000BEAF21F0A00311 SET:80005600 S1080005610000180023C0080428C001043240100023CE7 SET:80005610 S1080005620002A10620008004010000000000180023C0D SET:80005620 S1080005630000080428C001043240180023C008043ACCB SET:80005630 S10800056400094150008000000004017000C000000001B SET:80005640 S10800056500088BF023C2061428C008042300100422CAD SET:80005650 S108000566000FF00443088BF033C20616294C47B827C59 SET:80005660 S108000567000206162A421E8C0031400BF8F1000BE8F65 SET:80005670 S0C80005680001800BD270800E0030000000067 SET:80005680 S108000580000E8FFBD271400BFAF1000BEAF21F0A0030F SET:80005800 S1080005810000180023C0480428C001043240100023CE1 SET:80005810 S1080005820002A10620008004010000000000180023C0B SET:80005820 S1080005830000480428C001043240180023C048043ACC1 SET:80005830 S10800058400014160008000000004017000C0000000020 SET:80005840 S10800058500088BF023C2061428C008042300100422CAB SET:80005850 S108000586000FF00443088BF033C20616294C47B827C57 SET:80005860 S108000587000206162A421E8C0031400BF8F1000BE8F63 SET:80005870 S0C80005880001800BD270800E0030000000065 SET:80005880 S108000570000E8FFBD271400BFAF1000BEAF21F0A00310 SET:80005700 S1080005710000180023C0080428C00F0422408004004DB SET:80005710 S108000572000000000000180023C0080428C00F04324E9 SET:80005720 S1080005730000180023C008043ACD215000800000000DD SET:80005730 S0880005740004017000C000000002E SET:80005740 S10800057480088BF023C2061428C008042300100422CA5 SET:80005748 S108000575800FF00443088BF033C20616294C47B827C51 SET:80005758 S108000576800206162A421E8C0031400BF8F1000BE8F5D SET:80005768 S0C80005778001800BD270800E003000000005F SET:80005778 S108000590000E8FFBD271400BFAF1000BEAF21F0A0030E SET:80005900 S1080005910000180023C0480428C00F0422408004004D5 SET:80005910 S108000592000000000000180023C0480428C00F04324E3 SET:80005920 S1080005930000180023C048043AC5216000800000000E5 SET:80005930 S0880005940004017000C000000002C SET:80005940 S10800059480088BF023C2061428C008042300100422CA3 SET:80005948 S108000595800FF00443088BF033C20616294C47B827C4F SET:80005958 S108000596800206162A421E8C0031400BF8F1000BE8F5B SET:80005968 S0C80005978001800BD270800E003000000005D SET:80005978 S108000520000E8FFBD271400BFAF1000BEAF21F0A00315 SET:80005200 S1080005210000180023C108040AC010004245817000CD7 SET:80005210 S10800052200000000000010004247F17000C0000000018 SET:80005220 S10800052300088BF023C2061428C008042300100422CB3 SET:80005230 S108000524000FF00443088BF033C20616294C47B827C5F SET:80005240 S108000525000206162A421E8C0031400BF8F1000BE8F6B SET:80005250 S0C80005260001800BD270800E003000000006D SET:80005260 S108000530000E8FFBD271400BFAF1000BEAF21F0A00314 SET:80005300 S1080005310000180023C108040ACFFFF04245817000C7F SET:80005310 S10800053200000000000FFFF04247F17000C00000000C0 SET:80005320 S10800053300088BF023C2061428C008042300100422CB2 SET:80005330 S108000534000FF00443088BF033C20616294C47B827C5E SET:80005340 S108000535000206162A421E8C0031400BF8F1000BE8F6A SET:80005350 S0C80005360001800BD270800E003000000006C SET:80005360 S108000540000E8FFBD271400BFAF1000BEAF21F0A00313 SET:80005400 S1080005410000180023C108040AC010004245817000CD5 SET:80005410 S10800054200000000000FFFF04247F17000C00000000BF SET:80005420 S10800054300088BF023C2061428C008042300100422CB1 SET:80005430 S108000544000FF00443088BF033C20616294C47B827C5D SET:80005440 S108000545000206162A421E8C0031400BF8F1000BE8F69 SET:80005450 S0C80005460001800BD270800E003000000006B SET:80005460 S108000550000E8FFBD271400BFAF1000BEAF21F0A00312 SET:80005500 S1080005510000180023C108040ACFFFF04245817000C7D SET:80005510 S10800055200000000000010004247F17000C0000000015 SET:80005520 S10800055300088BF023C2061428C008042300100422CB0 SET:80005530 S108000554000FF00443088BF033C20616294C47B827C5C SET:80005540 S108000555000206162A421E8C0031400BF8F1000BE8F68 SET:80005550 S0C80005560001800BD270800E003000000006A SET:80005560 S1080005D0000E8FFBD271400BFAF1000BEAF21F0A00303 SET:80005D00 S1080005D100000A0023CF44142340000428C09F84000A9 SET:80005D10 S1080005D20000000000000A0023CF04142340000428CD7 SET:80005D20 S1080005D3000E400042409F840000000000000A0023CD1 SET:80005D30 S1080005D4000FC414234000040AC21E8C0031400BF8F63 SET:80005D40 S1080005D50001000BE8F1800BD270800E00300000000A8 SET:80005D50 S1080005A0000F8FFBD270400BEAF21F0A0032110000052 SET:80005A00 S1080005A100080BF033C203462AC80BF033C203662AC4F SET:80005A10 S1080005A200080BF033C203062AC80BF033C203862AC50 SET:80005A20 S1080005A300021E8C0030400BE8F0800BD270800E00375 SET:80005A30 S0480005A400000000000C7 SET:80005A40 S1080005D6000F8FFBD270400BEAF21F0A0030800C4AF07 SET:80005D60 S1080005D70000180023C108040AC80BF023C203840AC75 SET:80005D70 S1080005D800080BF023C203040AC0800C38F0100022489 SET:80005D80 S1080005D90000A006214000000000180023C0080428CDA SET:80005D90 S1080005DA0002118400080BF023C203843AC80BF023C62 SET:80005DA0 S1080005DB000203040AC7A170008000000000800C38FA8 SET:80005DB0 S1080005DC000FFFF0224080062140000000080BF023C7B SET:80005DC0 S1080005DD000203840AC0180023C0080428C21184000A8 SET:80005DD0 S1080005DE00080BF023C203043AC21E8C0030400BE8F3F SET:80005DE0 S0C80005DF0000800BD270800E003000000004C SET:80005DF0 S1080005DFC00F8FFBD270400BEAF21F0A0030800C4AFE4 SET:80005DFC S1080005E0C000180023C108040AC80BF023C203640AC6A SET:80005E0C S1080005E1C0080BF023C203440AC0800C38F0100022478 SET:80005E1C S1080005E2C000A006214000000000180023C0480428CC9 SET:80005E2C S1080005E3C002118400080BF023C203643AC80BF023C5E SET:80005E3C S1080005E4C00203440ACA1170008000000000800C38FA4 SET:80005E4C S1080005E5C00FFFF0224080062140000000080BF023C75 SET:80005E5C S1080005E6C00203640AC0180023C0480428C21184000A0 SET:80005E6C S1080005E7C0080BF023C203443AC21E8C0030400BE8F35 SET:80005E7C S0C80005E8C000800BD270800E0030000000046 SET:80005E8C S108000568C00008000801000000001000000FFDF0000D6 SET:8000568C S108000569C00FFFF0000000500003200000010800080CA SET:8000569C S10800056AC000C00000000000000000000002222222212 SET:800056AC R00800050000061 START:80005000 ['BEEP2.umh', 'boot.py', 'setap.py', 'udpsvrUme.umh', 'udpsvrEsp.py', 'ume_tcp_esp32.py'] 送信したいファイル名入力> no exist 入力'M'/'f'/'quit'/w/x/a/d/>f ['BEEP2.umh', 'boot.py', 'setap.py', 'udpsvrUme.umh', 'udpsvrEsp.py', 'ume_tcp_esp32.py'] 送信したいファイル名入力>udpsvrEsp.py 送信byte: 1187 udpsvrEsp.py:size=1187 入力'M'/'f'/'quit'/w/x/a/d/>M ls -l/cat /get /exc /del /import /MESSAGE>import udpsvrEsp import_name:udpsvrEsp 入力'M'/'f'/'quit'/w/x/a/d/>
以上で、UDP受信プログラムのudpsvrEspが起動しました。
この後は、ここで示したように、
PC側でpc_udp_esp32.pyを実行しを実行することでUDPによる文字列送信で遠隔操作ができます。
上記の実行例のムービーです。
上記で転送した「udpsvrUme.umh」内容とそのビルド元のソース「app_pwm_esp.c」は、次の
確認できます。