映像/IoT

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

2024-10-16

概要

iOSからラズベリーパイに接続するための基本的な方法を解説します。HTTPサーバーを使用する方法とFTPサーバーを使用する方法があります。

詳細

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

ラズベリーパイ側

1.ラズベリーパイ上でFTPサーバーをセットアップします。vsftpdなどのFTPサーバーをインストールします。

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サーバーを起動します。

python3 your_script_name.py

iOS側

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

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サーバーをインストールします。

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ライブラリを使用した例です。

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サーバーを使用する方法も可能ですが、セキュリティの面で注意が必要です。

関連Webサイト

https://qiita.com/halloweenjack@github/items/068888a1ffd957820ab1

連絡先・問い合わせ先

K2GO.jp

お問い合わせページからお願いします。