Spresense本体ボード+
LTE拡張ボードの構成で、SpresenseのFTPクライアントから、ネットワークサーバー上のFTPサーバへアクセス(ファイル書き込み、ファイル読み出し）を実現したいと考えています。  
「Networkチュートリアル」には、「FTPサンプルアプリケーション」の実例が掲載されていますが、WiFi環境(IDY Wi-Fi Add-on
Board iS110B搭載)が前提となっています。  
そこで、このFTPサンプルアプリケーションをWiFi通信からLTE-M通信へ変更する方法を教えていただけないでしょうか。  
LTE-M関連の設定は自己解決するとして、WiFiもLTEにはTCP/IP通信レベルで互換があると思うので、何かの設定などで実現できると助かるのですが。  
「LTE-M経由でIoTデータをファイルサーバーへ定期的にUPしたい」、というのが最終目標です。
CC BY-SA 4.0
2021-02-16T06:33:08.150
74041
2023-02-01T11:07:50.857
43987
question
spresense ftp
spresense LTE拡張ボードでFTPクライアント通信を行う方法
ドンピシャリという回答ではないですが、次の実装が参考になると思います。

<https://github.com/sonydevworld/spresense/tree/master/examples/lte_http_get>

ここで、wget_initialize でHTTPサーバーとやりとりを行っているのですが、grep で引っ掛けてみた所、次のところに実装がありました。

<https://github.com/sonydevworld/spresense-nuttx-apps/blob/new-
master/netutils/webclient/webclient.c>  
注意）Spresense SDK をダウンロードすると spresense/sdk/apps/netutils
以下に展開されます。このあたりちょっと分かりにくい・・・

webclinet.c の中を見てもわかるように、こちらはよくある socket を使ったプログラミングになってます。

ですので、lte_http_get サンプルの中のLteのコネクション部分をもってきて、wget_initialize(), wget()
の部分をFTPに入れ替えればよいかと思います。思いっきり端折ったコードを書くとこんな感じでしょうか…。

```

    int main(int argc, FAR char *argv[])
    {
      ... 省略 ....
    
      app_mq_create(APP_MQUEUE_NAME);
      lte_initialize();
      lte_set_report_restart(app_restart_cb);
      lte_power_on();
      lte_set_report_localtime(app_localtime_report_cb);
      lte_radio_on_sync();
    
      /* Set the APN to be connected. */
      ...　省略 ...
      lte_activate_pdn_sync(&apnsetting, &pdn);
      app_show_pdn(&pdn);
      data_pdn_sid = pdn.session_id;
    
      ...　省略 ...
    
      /* ↓ここにFTPのソケットコード実装を書く↓ */
    
    　FTP初期化
    　FTPサーバーに接続
    　FTPサーバーにデータ送信
    
      /* ↑ここにFTPのソケットコード実装を書く↑ */
    
      lte_deactivate_pdn_sync(data_pdn_sid);
      lte_radio_off_sync();
      lte_power_off();
      lte_finalize();
      app_mq_delete(APP_MQUEUE_NAME);
    
      return 0;
    }
    
```

FTPクライアントのソケット実装は、次のサイトとかが参考になるかと。ご参考まで。

[http://x68000.q-e-d.net/~68user/net/c-ftp-1.html](http://x68000.q-e-d.net/%7E68user/net/c-ftp-1.html)
CC BY-SA 4.0
2021-03-03T03:22:14.093
74382
2021-03-03T03:22:14.093
27334
74041
answer
SpresenseのSDKで、  
sdk/configs/examples/ftp/defconfig と  
sdk/configs/examples/lte_http_get/defconfig  
を比較すると、FTPクライアントに関わる部分の違いは、  
+EXAMPLES_FTPC=y  
+NETUTILS_FTPC=y  
だけのようです。

ビルド時のコンフィグで、  
`$ ./tools/config.py examples/lte_http_get`  
とした後、  
`$ make menuconfig`  
で、メニューコンフィグを開いて、

"Application Coonfiguration" -> "Network Utilities"  
の中にある、  
"FTP client"  
を有効にするのと、

"Application Coonfiguration" -> "Examples"  
の中にある、  
”FTP client example"  
を有効にすれば、  
NuttShellで、ftpcを使うことが出来ると思います。

LTEボードを持っていないので、  
試せてはいないので、参考でしかないですが、  
試してみてください。
CC BY-SA 4.0
2021-03-08T00:38:52.753
74503
2021-03-08T00:38:52.753
44242
74041
answer
2つ目にいただいた回答の通り、lte_http_getをベースに、次の2つのコンフィグを有効にして、  
"Application Coonfiguration" -> "Network Utilities" -> "FTP client"  
"Application Coonfiguration" -> "Examples"-> ”FTP client example"  
あと、追加でLTE daemonも有効にすることで、LTE-M経由でインターネット上のFTPサーバーへの通信（put/getとも）ができました！  
ただ、１つ課題が残っています。  
ftpc " **.**. **.** "
とIPアドレス直打ち（FTPサーバーのグローバルIPアドレス）では成功するのですが、ドメイン名(例：aaa.bbb.com)にて接続しようとするとエラーになって接続できませんでした。  
nsh>ftpc <ftp://aaa.bbb.com>  
nsh>ftpc aaa.bbb.com  
のどちらで実行してもエラーになります。  
サンプル"lte_http_get"は、"http://www.example.com"のようにドメイン名指定で問題なく動作できているため、DNSサーバー設定（下記）はこのままでも良さそうに思えます。  
+NETDB_DNSCLIENT=y  
+NETDB_DNSCLIENT_MAXRESPONSE=176  
+NETDB_DNSCLIENT_NAMESIZE=255  
+NETDB_DNSSERVER_IPv4ADDR=0x8080808  
そこで、コンフィグレーションにてLTEデバッグを有効にしてエラー出力すると下記のように出力されました。  
nsh> ftpc <ftp://aaa.bbb.com>  
[ERR] getsockname_request:134 API command response is err :128.  
[ERR] 2343 altcom_getsockname() failed = -128  
Failed to connect to the server: 9

FTPサーバー(<ftp://aaa.bbb.com>)へは、PCからアクセスできています(SSLなしです）。  
何か設定が間違っているのでしょうか。それとも、SpresenseのFTP client
sampleは、IPアドレス指定しか動作しないという制約があるのでしょうか。  
（WiFi Add-on Boardを所有していないため、WiFi経由でFTP client +
ドメイン指定にて動作確認はできていません。インターネット上のFTPサーバーのIPアドレスが変更されることがあるため、ドメイン名にてアクセスを実現したいです。
CC BY-SA 4.0
2021-03-16T07:18:40.423
74692
2021-03-16T07:18:40.423
43987
74041
answer
お二方に加えて、気になるポイントを2つコメントします。

  1. NuttXのFTPクライアントサンプルはIPアドレス指定にしか対応していない
  2. 同サンプルはコンフィグによって指定できるIPアドレスのタイプが異なる

1点目についてですが、現在のFTPクライアントサンプルはヘルプテキスト通りIPアドレス指定にしか対応していないようです。  
ですので、サンプルをそのまま使う場合はIPを事前に調べてから

```

      nsh> ftp xx.xx.xx.xx
    
```

のようにIP直指定してあげるしかなさそうです。  
アプリケーションを書く場合には、getaddrinfoなどの関数を使用してドメインをIPに変換してあげる必要があります。

2点目ですが、FTPクライアントサンプルのコードを確認してみましたが、コンフィグによって指定するIPアドレスのタイプ(IPv4/IPv6)を切り替えているようです。  
現在、examples/lte_http_get
では、IPv4とIPv6共に有効になっているため、このサンプルではIPv6アドレスを指定してあげなければなりません。  
これを回避する方法としては、

```

    ./tools/config.py -m
    
```

でmenuconfigを開いたのち

```

    Networking Support --->
      Internet Protocol Selection  --->
        IPv6 ★このチェックを外す
    
```

という様なコンフィグ変更をする必要があるようです。

以上のような変更を加えて、私の環境ではFTPクライアントがLTE通信で確認できました。

(lte_daemon start/ifup eth0 を行うと、ftp xx:xx:xx:xx で動作を確認することができます。)

参考になればうれしいです。
CC BY-SA 4.0
2021-04-07T03:36:17.653
75131
2021-04-07T03:36:17.653
32034
74041
answer