Cách đây không lâu thì tôi có một bài viết về tắt/bật đèn LED trên Raspberry Pi qua Swift tại đây: 

https://techmaster.vn/posts/34237/lap-trinh-swift-tren-raspberry-pi

Yêu cầu đầu tiên của bài này là các bạn hay đọc và làm theo bài viết đó để có thể hiểu rõ được nguyên lý hoạt động của Swift trên Raspberry. Và ở bài viết ngày hôm nay, chúng ta sẽ cùng nhau tạo một ứng dụng điều khiển đèn LED bằng iPhone qua một server Swift. Đầu tiên chúng ta hãy cùng nhìn qua sơ đồ mà hệ thống này sẽ hoạt động như sau:

 

 

 

Nguyên lý cơ bản ở đây đó là ứng dụng iOS sẽ giao tiếp với server chạy trên Pi qua một vài HTTP methos cơ bản, sau đó server sẽ điều khiển phần cứng thông qua thư viện GPIO. Đầu tiên, tôi sẽ thiết lập ứng dụng iOS, công việc của nó là scan ở trong local network để định vị Pi. Khi tìm thấy Pi thì chúng ta sẽ cấu hình app với địa chỉ IP của nó. Việc còn lại là viết một API đơn giản thực thi trên Raspberry ở từ action như nháy đèn LED.vv

Với Swift thì chúng ta có một vài server framework nổi bật như VaporKituraPerfect. Ở bài viết này tôi lựa chọn Vapor vì tính thân thiện và dễ sử dụng của nó.

Để điều khiển thiết bị tôi sử dụng SwiftyGPIO. Chúng ta sẽ gói toàn bộ hệ thống Raspberry vào tronng một protocol như sau: 

protocol RaspberryApi: class {
    func switchLedOn()
    func switchLedOff()
    func startLedBlink()    
    func stopLedBlink()
    func setLedIntensity(_ intensity: Double)
    func displayDigit(_ digit: OneDigitSegmentDisplay.Digit)
    func switchDigitDisplaySegmentOff()
    func toggleRGBLedColor(_ color: RGBLed.Color)
}

Sau đó tôi khai báo 2 class riêng biệt conform protocol này. Class MockRaspberry để test và chạy trên Mac (SwiftyGPIO không chạy được trên Mac) và Raspberry đóng vai trò điều khiển thiết bị hardware trên Linux. Tùy từng OS mà chúng ta sẽ select class phù hợp: 

final class RaspberryFactory {
    
    static func getRaspberry() -> RaspberryApi {
        let raspberry: RaspberryApi
        
        #if os(Linux)
            raspberry = Raspberry.shared
        #else
            raspberry = MockRaspberry.shared
        #endif
        
        return raspberry
    }
}

Thực sự mà nói thì tôi rất ấn tượng với Vapor vì tính đơn giản và gọn gàng của nó. Chỉ với vài dòng code thì chúng ta đã có được một api giao tiếp với iOS app:

import Vapor
let drop = Droplet()
let raspberry = RaspberryFactory.getRaspberry()
drop.get { req in
    return "Success"
}
drop.patch("led", "switch_on") { (request) in
    raspberry.switchLedOn()
    return "OK"
}
drop.patch("led", "switch_off") { (request) in
    raspberry.switchLedOff()
    return "OK"
}
drop.patch("led", "start_blink") { (request) in
    raspberry.startLedBlink()
    return "OK"
}
drop.patch("led", "stop_blink") { (request) in
    raspberry.stopLedBlink()
    return "OK"
}
drop.patch("led", "intensity") { (request) in
    guard let intensity = request.query?["intensity"]?.double else {
        throw Abort.badRequest
    }
    
    raspberry.setLedIntensity(intensity)
    return "Ok"
}
drop.patch("digitSegment", Int.self) { (request, digit) in
        guard let digit = OneDigitSegmentDisplay.Digit(rawValue: digit) else {
            throw Abort.badRequest
        }
        raspberry.displayDigit(digit)
        return "OK"
    }
drop.patch("digitSegment", "switchOff") { (request) in
        raspberry.switchDigitDisplaySegmentOff()
        return "OK"
    }
drop.patch("rgbLed", RGBLed.Color.self, "toggle") { (request, color) in
        raspberry.toggleRGBLedColor(color)
        return "OK"
    }
drop.run()

Sau khi thiết lập khối API trên thì chúng ta đã hoàn thành việc communicate với server chạy trên Pi. Và hãy cùng xem video ở dưới đây để tận hưởng thành quả nhé: 

 

Khóa học lập trình di động tại Techmaster:

Để cài đặt MacOSX lên phần cứng không phải Apple liên hệ chuyên gia cài Hackintosh:

  • Nguyễn Minh Sơn: 01287065634
  • Huỳnh Minh Sơn: 0936225565
  • Website: caidatmacos.com