• BL602&BL604综合项目1:Dohome智能全彩灯具


    通过BL602/BL604芯片作为系统主控,实现智能全彩灯的控制,可通过wifi接入Dohome平台,同时DoHome APP已经对接了各大智能音箱(小米小爱,百度小度,阿里天猫精灵,Amazon,Google,京东叮咚)。可根据需求通过BL602模组制作智能灯具和其他相关产品。

    项目地址:

    https://github.com/SmartArduino/Doiting_BL/tree/master/examples/bl602_Dohome_Light_RGB

    在app_config.h中定义了软件的版本号,开发板产生的热点名,我们需连接通信的DoHome服务器,和我们udp,tcp通信使用的端口号,以及使用到的IO口:

    /*
     * Log config
    */
    #define USE_UART_LOG        1
    #define LOG_COLOR_ENABLE    0
    #define USE_UDP_LOG         0
    
    #if USE_UART_LOG
    #define LOG_MIAN_EN       1
    #define LOG_WIFI_EN       1
    #define LOG_FLASH_EN      1
    #define LOG_UTILS_EN      0
    #define LOG_PROTOCOL_EN   1
    #define LOG_DEVICE_EN     1
    #define LOG_UDP_EN        1
    #define LOG_LIGHT_EN      0
    #define LOG_TCP_EN        0
    #define LOG_TCP_CONFIG_EN 1
    #define LOG_HTTP_EN       1
    #define LOG_UPLOAD_EN     1
    #define LOG_SNTP_EN       1
    #define LOG_TIMER_EN      1
    #define LOG_PROCES_EN     0
    #define LOG_LED_DRIVE_EN  0
    #define LOG_LED_BOARD_EN  0
    #define LOG_OTA_EN        1
    #define LOG_UDPLOG_EN     0
    #define LOG_FACTORY_EN    1
    #define LOG_KEY_EN        1
    #define LOG_LOG_EN        1
    #define LOG_IR_EN         1
    #define LOG_PRODUCT_EN    1
    #endif
    
    
    /*
     * product config
    */
    #define IS_WYRGB
    // #define IS_WY
    // #define IS_STRIP
    #if defined IS_STRIP
    #define HARDWARE_TYPE           "_STRIPE"
    #elif defined IS_WYRGB
    #define DEVIVE_NAME_PREFIX      "Light_"
    #define HARDWARE_TYPE           "_DT-WYRGB"
    #define PIN_LED_R       27
    #define PIN_LED_G       13
    #define PIN_LED_B       26
    #define PIN_LED_W       4
    #define PIN_LED_Y       16
    #elif defined IS_WY
    #define HARDWARE_TYPE           "_DT-WY"
    #else
    #define HARDWARE_TYPE           "_LED"
    #endif
    
    
    /*
     * doit config
    */
    #define FW_VERSION              "1.1.0"
    #define DEF_SSID_PREFIX         "DoHome_"
    #define DEF_HOSTNAME            "DoHome"
    
    #define ORGANIZATION            "_DOIT"
    #define CHIP_TYPE               "_ESP32"
    
    #define REMOTE_SERVER_IP        "115.28.78.23"      
    
    #define REMOTE_SRV_HOST         "led_iot.doit.am"
    #define REMOTE_SRV_PORT         8899//6007
    
    #define UPLOAD_SRV_HOST         "dohome.doit.am"
    #define UPLOAD_SRV_PORT         8008
    
    #define NTP_SERVER_HOST         "xinfeng.doit.am"
    #define NTP_SERVER_PORT         80
    
    #define UPLOAD_SRV_URL          "http://dohome.doit.am:8008"
    #define NTP_SERVER_URL          "http://xinfeng.doit.am/iot_api/get_iot_time.php"
    
    #define MAX_STA_NUM             3
    #define TCP_SRV_PORT            5555
    
    #define SPI_FLASH_SEC_SIZE      4096
    
    #define UDP_BROADCAST_INFO_PORT 6095
    #define UDP_SRV_PORT            6091
    
    #define WEB_SRV_PORT            80
    #define DNS_SRV_PORT            53
    
    #define OTA_TCP_PORT            6093
    #define OTA_TCP_ECHO_PORT       6094
    
    #define HTTP_UPO
    #define WIFI_DEF_MAGIC          0x03
    
    #define KEEPALIVE_TIME          60*1000
    
    #define RESTART_TRIGGER_COUNT      3
    
    #define EXT_UPLOAD_PERIOD           (60)        //second        
    #define BASE_UPLOAD_PERIOD          (50)        //second
    
    #define SYNC_TIME_PERIOD            (30*60)         //second
    
    #define MIN_TIMEZONE_OFFSET     0
    #define MAX_TIMEZONE_OFFSET     23
    
    #define TIMER_NUM               7       // you can setup at most TIMER_NUM timer
    
    #define SEQ_SIZE                (16 * 5)
    #define POWERUP_COLOR_MAX_NUM   16
    #define MAX_CUSTOM_COLOR        16
    
    #define OTA_PKG_SIZE            240
    #define HB_SEND_MAX_COUNT       8
    
    #define SSID_PASS_LEN           64
    #define SSID_SSID_LEN           32
    
    #define COLOR_MAX               1000
    #define LIGHT_GRA_STEP          10
    
    #define USE_WM_HTTP             0
    #ifndef IS_STRIP_WS2812
    #define USE_RTC_TIME            1
    #endif
    
    #define RESTART_REASON_RESET_NULL                   0
    #define RESTART_REASON_RESET_DEV                    1
    #define RESTART_REASON_REBOOT_REQ                   2

    为了稳定的配网,此方案使用ap配网,通过连接开发板产生的热点,手机app把路由器wifi名称密码发送给开发板完成配网:

    int wifi_setup_ap(void)
    {    
        LOGI(TAG, "wifi_setup_ap");
        char def_ap_ssid[33] = {"BL602_AP"};
        memset(def_ap_ssid, 0x00, sizeof(def_ap_ssid));
        get_default_ssid(def_ap_ssid);
    
        wifi_interface_t wifi_interface_ap = wifi_mgmr_ap_enable();
        dhcpd_set_server_gw("192.168.4.1");
        wifi_mgmr_ap_start(wifi_interface_ap, def_ap_ssid, 0, NULL, 1);
        return 1;
    }

    连上服务器后开始发送心跳包:

    static void vTimerCallback(TimerHandle_t timer)
    {
        //服务器连接上了,开始发送心跳
        if (b_start_keep_alive) {
            char keep_msg[256];
            memset(keep_msg, 0x00, sizeof(keep_msg));
            sprintf(keep_msg, "cmd=keep&device_id=%s&device_key=%s
    ", dev_id, dev_key);
            send(g_client_fd, keep_msg, strlen(keep_msg), 0);
            LOGI(TAG, "keepalive buff: %s", keep_msg);
        } else {
            // LOGI(TAG, "tcp client disconnect=====");
        }
    }

    处理下发的数据进行设备控制:

    /*
        处理tcp服务下发的数据
     */
    static void parse(int socket, char *buff, int len)
    {
        // LOGI(TAG, "tcp_package: %s", buff);
        if (strstr(buff, "cmd=subscribe") != NULL) {
            char *pstart = strstr(buff, "res=");
            if (pstart != NULL) {
                pstart += strlen("res=");
                int r = *pstart - '0';
                if (r == 1) {
                    LOGI(TAG, "register device on remote server OK");
                } else {
                    LOGI(TAG, "register device failed!");
                }
            } else {
                LOGI(TAG, "result not found!");
            }
        } else if (strstr(buff, "cmd=publish") != NULL) {
            char *pstart = strstr(buff, "message=");
            if (pstart != NULL) {
                pstart += strlen("message=");
                char ret_buf[256];
                parse_dohome_protocol(pstart, len - (pstart - buff), ret_buf);
            } else {
                LOGI(TAG, "message not found!");
            }
        } else if (strstr(buff, "cmd=keep") != NULL) {
            LOGI(TAG, "send heartbeat OK");
        } else {
            LOGI(TAG, "no such command");
        }
    }

    将程序编译好后烧录到芯片中,手机下载Dohome APP,添加设备,按提示进行设备的配网

    1.扫码下载APP

     2.进入APP点击右上角添加设备,选择彩色灯

     3.按APP提示进行配网

    4.添加设备成功,能从Dohome  APP控制设备

    配网成功后,可使用app控制,也可以绑定智能音箱控制。

  • 相关阅读:
    dart 库
    dart effective-设计
    Python3-Set
    python 基本输入和输出+变量和基本对象
    python 基本语法元素
    模版方法模式 展现程序员的一天
    外观模式 一键电影模式
    装饰者模式 带你重回传奇世界
    命令模式 之 管理智能家电
    适配器模式 以手机充电器为例
  • 原文地址:https://www.cnblogs.com/doiting/p/14131563.html
Copyright © 2020-2023  润新知