iOSからラズベリーパイに接続する

### 方法1: HTTPサーバーを使用する

### ラズベリーパイ側

1. ラズベリーパイ上で簡単なHTTPサーバーをセットアップします。Flaskなどの軽量なPythonウェブフレームワークを使用することができます。
    
    ```python
    from flask import Flask, request
    
    app = Flask(__name__)
    
    @app.route('/upload', methods=['POST'])
    def upload_file():
        file = request.files['file']
        file.save('/path/to/save/' + file.filename)
        return 'File uploaded successfully'
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
    ```
    
2. このスクリプトを実行して、ラズベリーパイ上でHTTPサーバーを起動します。
    
    ```bash
    python3 your_script_name.py
    ```
    

### iOS側

iOSアプリからラズベリーパイにHTTPリクエストを送信してファイルをアップロードします。`URLSession`を使用します。

```swift
import Foundation

func uploadCoordinatesToServer(latitude: Double, longitude: Double) {
    let url = URL(string: "http://your_raspberry_pi_ip:5000/upload")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"

    let boundary = UUID().uuidString
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    let fileName = "coordinates.txt"
    let coordinateString = "Latitude: \(latitude), Longitude: \(longitude)\n"
    let fileData = coordinateString.data(using: .utf8)!

    var body = Data()
    body.append("--\(boundary)\r\n")
    body.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(fileName)\"\r\n")
    body.append("Content-Type: text/plain\r\n\r\n")
    body.append(fileData)
    body.append("\r\n")
    body.append("--\(boundary)--\r\n")

    let task = URLSession.shared.uploadTask(with: request, from: body) { data, response, error in
        if let error = error {
            print("Error: \(error)")
            return
        }
        print("File uploaded successfully")
    }

    task.resume()
}

extension Data {
    mutating func append(_ string: String) {
        if let data = string.data(using: .utf8) {
            append(data)
        }
    }
}
```

### 方法2: FTPサーバーを使用する

### ラズベリーパイ側

1. ラズベリーパイ上でFTPサーバーをセットアップします。vsftpdなどのFTPサーバーをインストールします。
    
    ```bash
    sudo apt update
    sudo apt install vsftpd
    sudo systemctl start vsftpd
    sudo systemctl enable vsftpd
    ```
    
2. 必要に応じて、`/etc/vsftpd.conf`ファイルを編集してFTPサーバーを設定します。

### iOS側

iOSアプリからFTPサーバーにファイルをアップロードするために、第三者のFTPライブラリを使用します。以下は、`BlueSocket`ライブラリを使用した例です。

```swift
import Foundation
import BlueSocket

func uploadCoordinatesToFTPServer(latitude: Double, longitude: Double) {
    let coordinateString = "Latitude: \(latitude), Longitude: \(longitude)\n"
    guard let fileData = coordinateString.data(using: .utf8) else { return }
    let ftpServerIP = "your_raspberry_pi_ip"
    let ftpUsername = "your_username"
    let ftpPassword = "your_password"
    let ftpFilePath = "/path/to/save/coordinates.txt"

    let ftpClient = FTPClient()
    ftpClient.connect(to: ftpServerIP)
    ftpClient.login(username: ftpUsername, password: ftpPassword)
    ftpClient.upload(data: fileData, to: ftpFilePath)
    ftpClient.disconnect()
}

class FTPClient {
    private var controlSocket: Socket?

    func connect(to ip: String, port: Int32 = 21) {
        do {
            controlSocket = try Socket.create()
            try controlSocket?.connect(to: ip, port: port)
            // Handle server response...
        } catch {
            print("Failed to connect: \(error)")
        }
    }

    func login(username: String, password: String) {
        // Send USER and PASS commands to the FTP server...
    }

    func upload(data: Data, to path: String) {
        // Send STOR command and upload data to the FTP server...
    }

    func disconnect() {
        controlSocket?.close()
    }
}
```

上記のコードは基本的な構造を示したものです。実際の実装ではFTPプロトコルに従った詳細なコマンドのやり取りが必要です。

### まとめ

以上の方法により、iOSからラズベリーパイにファイルを送信することができます。HTTPサーバーを使用する方法が比較的簡単であり、セキュアな接続（HTTPS）も簡単に設定できます。FTPサーバーを使用する方法も可能ですが、セキュリティの面で注意が必要です。