如何基於 SDK 快速開發一款IoT App 控制智能燈(iOS 版)

背景:

科技在不斷進步,愈來愈多的智能家居產品和服務進入到人們的平常生活中。智能燈是一款常見的智能設備,安裝智能燈後,用戶可使用手機 App 輕鬆調整室內顏色和亮度,設置不一樣的照明場景來輕鬆創造出溫暖、放鬆、有趣或者鼓舞人心的室內空間。ios

Android版請參考:《如何基於SDK快速開發一款IoT App控制智能燈泡(Android版)》git

RGB 5 路智能燈介紹

包含功能:

image.png

五路燈有白光和彩光是 2 種模式切換,不可同時啓用。github

RGB 色彩模型

RGB(Red、Green、Blue)色彩模式是一種面向硬件的色彩模型,顯示系統都採用RGB顏色模型來進行圖像顯示。RGB色彩模型屬於加法混色原理,每種原色的數值越高,色彩就越亮,RGB都是0時是黑色,都是255時是白色。安全

RGB色彩模型表示直接,可是RGB數值和色彩的三屬性沒有直接的聯繫,不能揭示色彩之間的關係。app

HSV 色彩模型

HSV 色彩模式是一種面向用戶感官的色彩模型,側重與色彩表示。這是根據人的視覺系統對亮度的敏感度要強於色彩值這個生理特性而提出的顏色模型。它比 RGB 更接近人們對彩色的感知經驗。很是直觀地表達顏色的色調、鮮豔程度和明暗程度,方便進行顏色的對比。ide

HSV(Hue、Saturation、Value)分別對應色相、飽和度、明度。ui

  • 色相 H:用角度度量,取值範圍爲0°~360°,從紅色開始按照逆時針方向計算,紅色爲0°,綠色爲120°,藍色爲240°,黃色爲60°,青色爲180°,品紅爲300°,對應於繞圓柱的中心軸的角度。
  • 飽和度 S:表示色彩的純度,對應於離圓柱的中心軸的距離。數值越高顏色則深而豔,數值越低則顏色逐漸變灰,取值範圍爲0.0~1.0,白色的S=0。
  • 明度 V:表示顏色的明亮程度。取值範圍爲0.0(黑色)~1.0(白色)。對應於繞圓柱的中心軸的高度,軸取值爲自底部的黑色V=0到頂部的白色V=1。

image.png

基礎準備

基於 SDK 開發一個智能燈 App 的時候,須要作下面準備:編碼

  • 建立 App SDK
  • 集成 SDK
  • 註冊和登陸
  • 建立家庭
  • 設備配網
  • 設備控制

具體參考spa

功能點介紹

功能點是對產品功能的抽象表示,是具體智能設備功能的抽象,用於描述產品功能及其參數。.net

  • 功能點 ID:功能點的編碼。設備與雲端的功能數據經過功能點 ID 進行傳輸。
  • 功能點名稱:自定義的功能名稱。
  • 標識名:功能點 Code 值,用於 App 顯示功能名稱的多語言管理。支持字母、數字和下劃線,以字母開頭。
  • 數據類型

image.png

數據傳輸類型

  • 可下發可上報:指令數據能夠發送給設備,設備數據能夠傳輸給雲端。
  • 只上報:數據只支持從設備傳輸給雲端。
  • 只下發:數據只支持從雲端發送給設備。

產品 pid : "ylr9R01cMWnMRqEB" 的功能點以下圖所示:

image.png

Demo 介紹

Demo 地址

demo 地址:https://github.com/tuya/tuya-home-ios-sdk 功能分支:main

SDK 文檔地址:https://tuyainc.github.io/tuyasmart_home_ios_sdk_doc/zh-hans/

Demo 下載

在終端的命令行中輸入:

git clone https:_//github.com/tuya/tuya-home-ios-sdk.git_

下載 demo 到本地。

環境配置

一、打開項目設置,Target => General,修改 Bundle Identifier 爲塗鴉開發者平臺對應的 iOS 包名

二、導入安全圖片到工程根目錄,重命名爲 t_s.bmp,並加入「項目設置 => Target => Build Phases => Copy Bundle Resources」中。

三、在項目的PrefixHeader.pch文件添加如下內容:

#import <TuyaSmartHomeKit/TuyaSmartKit.h>

四、打開AppDelegate.m文件,在[AppDelegate application:didFinishLaunchingWithOptions:]方法中初始化SDK:

[[TuyaSmartSDK sharedInstance] startWithAppKey:<#your_app_key#> secretKey:<#your_secret_key#>];

五、打開 Debug 模式

在開發的過程當中能夠開啓 Debug 模式,打印一些日誌用於分析問題。

Objc:

#ifdef DEBUG
    [[TuyaSmartSDK sharedInstance] setDebugMode:YES];
#else
#endif

Demo 內容

你們在開發的過程當中能夠參考的 demo 的代碼。

在 demo 中咱們已經完成了基於 dp 點控制實現智能燈泡的開關,亮度,冷暖,顏色控制。

智能燈控制頁面的若是下圖所示:

image.png

功能點 ID

NSString * const kLightSwtichDpId = @"1";/* 控制燈開關的 dp 點 */
NSString * const kLightColorTypeDpId = @"2";/* 控制燈類型的 dp 點 */

NSString * const kLightColorBrightDpId = @"3";/* 控制彩燈亮度的 dp 點 */
NSString * const kLightColorTempDpId = @"4";/* 控制彩燈 temp 的 dp 點 */

NSString * const kLightColorDpId = @"5";/* 控制燈色彩的 dp 點 */

開關操做

- (void)switchAction:(UISwitch *)sender {
    // 開關操做
    WEAKSELF_AT
    [TPDemoProgressUtils showMessag:TYSDKDemoLocalizedString(@"loading", @"") toView:self.view];
    
    [self.device publishDps:@{kLightSwtichDpId:@(sender.isOn)} success:^{
        [TPDemoProgressUtils hideHUDForView:weakSelf_AT.view animated:NO];
    } failure:^(NSError *error) {
        [TPDemoProgressUtils hideHUDForView:weakSelf_AT.view animated:NO];
        [TPDemoProgressUtils showError:error.localizedDescription];
    }];
}

亮度調節(白光和彩光模式下都支持)

分兩種狀況:在白光模式和彩光模式兩種狀況

// Bright
NSDictionary *dps = self.device.deviceModel.dps;
if ([[dps objectForKey:kLightColorTypeDpId] isEqualToString:@"colour"]) {
    int ir,ig,ib;

    _hsvValue.v = value;

    HSVToRGB(_hsvValue.h, _hsvValue.s, _hsvValue.v, &ir, &ig, &ib);

    UIColor *resColor = RGBCOLOR(ir, ig, ib);

    NSString *dpsString = [NSString stringWithFormat:@"%@%@",
                           [[[resColor hexStringFromColor] lowercaseString] substringFromIndex:1],
                           [self getHexStringFromHSV:_hsvValue]];

    publishDps = @{
                     kLightSwtichDpId:@(YES),
                     kLightColorDpId:dpsString,
                     kLightColorTypeDpId:@"colour"
                     };

} else {
    CGFloat tempV = (value * 100 - 1)/(100.0-1.0) * (self.maxValue - self.minValue) + self.minValue;
    int val = [self round:tempV];
    publishDps = @{
                  kLightSwtichDpId:@(YES),
                  kLightColorBrightDpId:@(val),
                  kLightColorTypeDpId:@"white",
                  };
}

[self.device publishDps:publishDps success:^{
        
} failure:^(NSError *error) {

}];

冷暖調節(只有白光模式支持)

// Temperature
int dpsInt = (int)(value * (self.tempMaxValue - self.tempMinValue) + self.tempMinValue);
publishDps = @{
    kLightColorTypeDpId:@"white",
    kLightColorTempDpId:@(dpsInt)
};

[self.device publishDps:publishDps success:^{
        
} failure:^(NSError *error) {

}];

顏色調節(只有彩光模式支持)

#pragma mark - RSColorPickerViewDelegate
- (void)colorPickerDidChangeSelection:(RSColorPickerView *)colorPicker {

    NSDictionary *dps = self.device.deviceModel.dps;
    
    BOOL isSwitch = [[dps objectForKey:kLightSwtichDpId] tysdk_toBool];
    
    if (!isSwitch) {
        return;
    }

    HSVType hsv = [self.class getHSVFromUIColor:colorPicker.selectionColor];
    
    _hsvValue.h = hsv.h;
    _hsvValue.s = hsv.s;
    _currentH = hsv.h;
    
    if (_hsvValue.v == 0) {
        _hsvValue.v = 1;
    }

    int r, g, b;
    
    HSVToRGB(_hsvValue.h, _hsvValue.s, _hsvValue.v, &r, &g, &b);
    
    NSString *dpsString = [NSString stringWithFormat:@"%02x%02x%02x%@",
                           (unsigned int)r,
                           (unsigned int)g,
                           (unsigned int)b,
                           [self getHexStringFromHSV:_hsvValue]];
    
    NSDictionary *publishDps = @{
                                 kLightColorDpId:dpsString,
                                 kLightColorTypeDpId:@"colour",
                                 };

    [self.device publishDps:publishDps success:^{
            
    } failure:^(NSError *error) {
        
    }];
}

飽和度調節(只有彩光模式支持)

// Saturation
_hsvValue.s = value;

if (_hsvValue.v == 0) {
    _hsvValue.v = 1;
}
int r, g, b;
HSVToRGB(_hsvValue.h, _hsvValue.s, _hsvValue.v, &r, &g, &b);

NSString *dpsString = [NSString stringWithFormat:@"%02x%02x%02x%@",
                       (unsigned int)r,
                       (unsigned int)g,
                       (unsigned int)b,
                       [self getHexStringFromHSV:_hsvValue]];

publishDps = @{
                 kLightColorDpId:dpsString,
                 kLightColorTypeDpId:@"colour",
             };
[self.device publishDps:publishDps success:^{
        
} failure:^(NSError *error) {

}];

智能燈狀態變化回調刷新

#pragma mark - TuyaSmartDeviceDelegate

/// dp數據更新
- (void)device:(TuyaSmartDevice *)device dpsUpdate:(NSDictionary *)dps {
    [self reloadData];
}

- (void)reloadData {
    
    _hsvValue = [self getHSVFromDpId:kLightColorDpId];
    
    NSDictionary *dps = self.device.deviceModel.dps;
    BOOL isSwitch = [[dps objectForKey:kLightSwtichDpId] boolValue];
    [self.switchButton setOn:isSwitch];
    
    double brightnessValue = [self getBrightness:dps];
    [self.brightSliderView setSliderValue:brightnessValue];
    
    double tempValue = [self getTempValue:[[dps objectForKey:kLightColorTempDpId] doubleValue]];
    [self.tempSliderView setSliderValue:tempValue];
    
    HSVType hsv = [self getHSVFromDpId:kLightColorDpId];
    UIColor *color = [self getColorFromDpId:kLightColorDpId];
    
    NSLog(@" h : %f, s : %f, v : %f, color : %@", hsv.h, hsv.s, hsv.v, color);
    if (fabs(roundf(hsv.h) - roundf(_currentH)) > 1) {

        _currentH = hsv.h;
        
        self.colorPicker.selectionColor = color;
        self.colorPicker.brightness = 1;
        self.colorPicker.opaque = YES;
    }
    
    [self.saturationSliderView setSliderValue:hsv.s];
}
相關文章
相關標籤/搜索