UMEHOSHI ITA TOP PAGE    COMPUTER SHIEN LAB

esp32を付けた基板を「umehoshiツール(TCPクライアントツール)」などで遠隔操作

このページで紹介したロボット制御の続きとして、 「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用のクライアント機能概要を以下に列挙します。

以上の機能に対応するクライアント側ソフト(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のinput使用の注意

このロボットの構造で、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)を ビルドして得られたコードです。

esp32用の「umehoshiツール」用のTCPサーバプログラム(MicroPython:ume_tcp_esp32.py)

「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()
この上記 ume_tcp_esp32.pyを次のように転送します。([UMEHOSHI ITA]をスルーモードにして行います)
ampy -p COM8 -b 11500 put ume_tcp_esp32.py
(COM8の8は、お手持ちのUSBの接続の番号に合わせて指定してください)

変更した起動用スクリプトboot.pyを転送する。

以下のように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)を終了するまではできません。

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の送受信が別スレッドで動作しているため、メニュー表示が途中で出現しています。
そして、メニューを出すためにEnterを数回入力しています。

以下はこのページで示したUDPのモータ遠隔用プログラムを、 このTCPサーバを介して送り込み、実行させる例です。
このページでは、[UMEHOSHI ITA]操作用コードを埋め込む時、udpsvrUme.pyのコードを使いました。
このTCPサーバではUARTを片方向モードする初期設定に、同等の技法を使ってしまったためにudpsvrUme.pyをimportする技法は使えません。
そこで、udpsvrUme.pyへの埋め込みに使った「app_pwm_esp.c」のビルドファイルを[.umh]仕様にしたファイルの「udpsvrUme.umh」を用意して それを転送しています。
この転送でモータ制御のプログラムを、[UMEHOSHI ITA]に転送して、実行させています。
次にUDP受信プログラムのudpsvrEsp.pyを転送しています。
続いて、importを使ってこのモジュールを起動しています。
入力'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」は、次の 確認できます。