20160127_jeffrey - silenceuncrio/diary GitHub Wiki

Index

  • 1010 - CC2541 帶底板藍芽模塊到貨
  • 1020 - Jim Chen-SmartThings merged by Samsung and leading in US market for Smart Home business
  • 1035 - 繼續昨天的 coding
  • 1145 - 紀錄目前的成果
  • 1305 - 玩 CC2541 帶底板藍芽模塊
  • 1415 - 從新手操作指南開始
  • 1605 - 發送 AT Command
  • 1735 - 使用 AT Command 無法 search 到 Osmart_Plug

1010

CC2541 帶底板藍芽模塊到貨
早上已經報了帳

Pioneer 希望我自己搞定這一塊 三月底的 demo 就順延兩個禮拜

我需要重新安排一下整體的 schedule 來讓上級知道 IoT Platform 已經順應了這個改變

1020

Proscend/Jim Chen (陳金勇) 於 2016/1/27 上午 10:12 寫道:

Dear All,

I heard SmartThings merged by Samsung and leading in US market for Smart Home business (http://www.forbes.com/sites/aarontilley/2014/08/14/samsung-smartthings-acquisition-2/#432b16ff7965). Please take a look of their Hub solution as attached: (https://shop.smartthings.com/#!/products/samsung-smartthings-hub).

Basically, we will set up the industrial platform by iMX6 and also consider the commercial one. If based on the SmartThings' hub spec (IP/Zigbee/Z-WAVE), (the end user's price US$99.-/unit), then we might keep the same level cost structure (Unit Manufacturing Cost around US$30) with extra advanced features (WiFi, BLE). Under this situation, iMX6 could be the option for commercial purpose with higher performance and saving our R&D resource.

FYI!

Jim

花點時間觀察一下 SAMSUNG 的進展

唉... 就不回這封信了... 穩扎穩打吧我

1035

繼續昨天的 coding

1145

紀錄目前的成果

iot_init.sql

BEGIN TRANSACTION;

DROP TABLE IF EXISTS WhiteBoxes;
DROP TABLE IF EXISTS Boxes;
DROP TABLE IF EXISTS Things;
DROP TABLE IF EXISTS OpenDetectors;
DROP TABLE IF EXISTS LightDetectors;

CREATE TABLE IF NOT EXISTS WhiteBoxes (
    WhiteBoxId       INTEGER   PRIMARY KEY   NOT NULL,
    WhiteBoxUrl      TEXT   NOT NULL,
    WhiteBoxActive   INTEGER   NOT NULL
);

INSERT INTO WhiteBoxes(WhiteBoxUrl, WhiteBoxActive) VALUES('http://192.168.1.113:8888/test_01/common', 0);
INSERT INTO WhiteBoxes(WhiteBoxUrl, WhiteBoxActive) VALUES('http://192.168.1.113:8888/test_02/common', 0);
INSERT INTO WhiteBoxes(WhiteBoxUrl, WhiteBoxActive) VALUES('http://192.168.1.113:8888/test_03/common', 0);

CREATE TABLE IF NOT EXISTS Boxes (
    BoxId         INTEGER   PRIMARY KEY   NOT NULL,
    BoxName       TEXT   NOT NULL,
    BoxLocation   TEXT   NOT NULL,
    BoxConfig_    TEXT   NOT NULL
);

CREATE TABLE Things (
    ThingId        INTEGER   PRIMARY KEY,
    ThingType      TEXT   NOT NULL,
    ThingStatus_   TEXT   NOT NULL,
    BoxId          INTEGER   NOT NULL   REFERENCES Boxes( BoxId )
);

CREATE TABLE OpenDetectors (
    OpenId        INTEGER   PRIMARY KEY,
    OpenConfig_   TEXT   NOT NULL,
    OpenStatus_   TEXT   NOT NULL,
    ThingId       INTEGER   NOT NULL   REFERENCES Things( ThingId )
);

CREATE TABLE LightDetectors (
    LightId        INTEGER   PRIMARY KEY,
    LightConfig_   TEXT   NOT NULL,
    LightStatus_   TEXT   NOT NULL,
    ThingId        INTEGER   NOT NULL   REFERENCES Things( ThingId )
);

COMMIT;

Makefile

CROSS_COMPILE	 = mips-openwrt-linux-uclibc-
CC				 = $(CROSS_COMPILE)gcc
AR				 = $(CROSS_COMPILE)ar
CC_I			 = -I/home/jeffrey/openwrt/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/include/
CC_I			+= -I/home/jeffrey/openwrt/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/include/
CC_L			 = -L/home/jeffrey/openwrt/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/lib/
CC_L			+= -L/home/jeffrey/openwrt/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/lib
LIBS			 = -lm -ldl -lpthread -lfcgi -ljson-c -lpolarssl -lcurl -lsqlite3

get_common_2: get_common_2.o timecost_2.o database_2.o
	$(CC) $(CC_I) $(CC_L) $(LIBS) -o $@ get_common_2.o timecost_2.o database_2.o

%.o: %.c
	@echo Compile $< ...
	$(CC) $(CC_I) $(CC_L) $(LIBS) -c -o $@ $<

get_common_2.c

/* standard includes */
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>

/* json-c (https://github.com/json-c/json-c) */
#include <json-c/json.h>

/* libcurl (http://curl.haxx.se/libcurl/c) */
#include <curl/curl.h>

#include "timecost_2.h"

#include "database_2.h"



/* holder for curl fetch */
struct curl_fetch_st {
    char *payload;
    size_t size;
};

/* callback for curl fetch */
size_t curl_callback (void *contents, size_t size, size_t nmemb, void *userp) {
    size_t realsize = size * nmemb;                             /* calculate buffer size */
    struct curl_fetch_st *p = (struct curl_fetch_st *) userp;   /* cast pointer to fetch struct */

    /* expand buffer */
    p->payload = (char *) realloc(p->payload, p->size + realsize + 1);

    /* check buffer */
    if (p->payload == NULL) {
      /* this isn't good */
      fprintf(stderr, "ERROR: Failed to expand buffer in curl_callback");
      /* free buffer */
      free(p->payload);
      /* return */
      return -1;
    }

    /* copy contents to buffer */
    memcpy(&(p->payload[p->size]), contents, realsize);

    /* set new buffer size */
    p->size += realsize;

    /* ensure null termination */
    p->payload[p->size] = 0;

    /* return size */
    return realsize;
}

/* fetch and return url body via curl */
CURLcode curl_fetch_url(CURL *ch, const char *url, struct curl_fetch_st *fetch) {
    CURLcode rcode;                   /* curl result code */

    /* init payload */
    fetch->payload = (char *) calloc(1, sizeof(fetch->payload));

    /* check payload */
    if (fetch->payload == NULL) {
        /* log error */
        fprintf(stderr, "ERROR: Failed to allocate payload in curl_fetch_url");
        /* return error */
        return CURLE_FAILED_INIT;
    }

    /* init size */
    fetch->size = 0;

    /* set url to fetch */
    curl_easy_setopt(ch, CURLOPT_URL, url);

    /* set calback function */
    curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, curl_callback);

    /* pass fetch struct pointer */
    curl_easy_setopt(ch, CURLOPT_WRITEDATA, (void *) fetch);

    /* set default user agent */
    curl_easy_setopt(ch, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    /* set timeout */
    curl_easy_setopt(ch, CURLOPT_TIMEOUT, 5);

    /* enable location redirects */
    curl_easy_setopt(ch, CURLOPT_FOLLOWLOCATION, 1);

    /* set maximum allowed redirects */
    curl_easy_setopt(ch, CURLOPT_MAXREDIRS, 1);

    /* fetch the url */
    rcode = curl_easy_perform(ch);

    /* return */
    return rcode;
}



static int _key2string(json_object *obj, const char *key, char *value) {
    json_object *j;
    if (!json_object_object_get_ex(obj, key, &j)) {
        printf("Error: %s(%s) fail\n", __FUNCTION__, key);
        return -1;
    }

    strcpy(value, json_object_get_string(j));
    printf("%s: %s\n", key, value);
    return 0;
}



static int _key2obj(json_object *obj, const char *key, json_object **keyObj) {
    if (!json_object_object_get_ex(obj, key, keyObj)) {
        printf("Error: %s(%s) fail\n", __FUNCTION__, key);
        return -1;
    }

    printf("%s: %s\n", key, json_object_to_json_string(*keyObj));
    return 0;
}



static int _hasKey(json_object *obj, const char *key) {
    json_object *j;
    if (!json_object_object_get_ex(obj, key, &j)) {
        printf("Error: %s(%s) fail\n", __FUNCTION__, key);
        return 0;
    }
    return 1;
}



int select_inactive_callback(void *NotUsed, int argc, char **argv, char **azColName) {
    int i;
    NotUsed = 0;
    
    for (i = 0; i < argc; i++) {
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
   
    return 0;
}



int main(int argc, char *argv[]) {
    CURL *ch;                                               /* curl handle */
    CURLcode rcode;                                         /* curl result code */

    json_object *json;                                      /* json post body */
    enum json_tokener_error jerr = json_tokener_success;    /* json parse error */

    struct curl_fetch_st curl_fetch;                        /* curl fetch struct */
    struct curl_fetch_st *cf = &curl_fetch;                 /* pointer to fetch struct */


    Timecost.start();



    Db.open();
    Db.whiteBoxes.select_inactive(select_inactive_callback);
    Db.close();


    
    Timecost.stop();
    Timecost.report();

    return 0;
}

timecost_2.h

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <sys/time.h>






typedef struct {

    void    (*start)    (void);
    void    (*stop)     (void);
    void    (*report)   (void);

} timecost_t;

extern timecost_t Timecost;

timecost_2.c

#include "timecost_2.h"



struct timeval t1, t2;
double timecost;



void timecost_start() {
    gettimeofday(&t1, NULL);
}



void timecost_stop() {
    gettimeofday(&t2, NULL);
}

void timecost_report() {
    timecost = (t2.tv_sec - t1.tv_sec) * 1000.0;    // sec to ms
    timecost += (t2.tv_usec - t1.tv_usec) / 1000.0; // us to ms
    printf("Code time cost: %f\n", timecost);
}


timecost_t Timecost = {
    .start  = timecost_start,
    .stop   = timecost_stop,
    .report = timecost_report,
};

database_2.h

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <sqlite3.h>






typedef struct {

    int     (*select_inactive)
            (int (*callback)(void*,int,char**,char**));

} db_whiteBoxes_t;



typedef struct {

    int     (*open)();
    void    (*close)();

    int     (*select_inactive_from_whiteBoxes)
            (int (*callback)(void*,int,char**,char**));

    int     (*insert_into_openDetectors)
            (const char *OpenConfig_, const char *OpenStatus_, int ThingId);

    db_whiteBoxes_t whiteBoxes;

} db_t;



extern db_t Db;

database_2.c

#include "database_2.h"



sqlite3 *Database;



int database_select_inactive_from_whiteBoxes(int (*callback)(void*,int,char**,char**)) {
    char sql[256];
    sprintf(sql, 
        "SELECT * FROM WhiteBoxes WHERE WhiteBoxActive=0;"
        );

    char *err_msg = 0;
    if (SQLITE_OK != sqlite3_exec(Database, sql, callback, 0, &err_msg)) {
        fprintf(stderr, "SQL error: %s\n", err_msg);
        sqlite3_free(err_msg);
        return -1;
    }

    return sqlite3_last_insert_rowid(Database);
}



int database_insert_into_openDetectors(const char *OpenConfig_, const char *OpenStatus_, int ThingId) {
    char sql[256];
    sprintf(sql, 
        "INSERT INTO OpenDetectors(OpenConfig_, OpenStatus_, ThingId)"
        "VALUES ('%s', '%s', %d);"
        , OpenConfig_, OpenStatus_, ThingId);

    char *err_msg = 0;
    if (SQLITE_OK != sqlite3_exec(Database, sql, 0, 0, &err_msg)) {
        fprintf(stderr, "SQL error: %s\n", err_msg);
        sqlite3_free(err_msg);
        return -1;
    }

    return sqlite3_last_insert_rowid(Database);
}



int database_insert_into_lightDetectors(const char *LightConfig_, const char *LightStatus_, int ThingId) {
    char sql[256];
    sprintf(sql, 
        "INSERT INTO LightDetectors(LightConfig_, LightStatus_, ThingId)"
        "VALUES ('%s', '%s', %d);"
        , LightConfig_, LightStatus_, ThingId);

    char *err_msg = 0;
    if (SQLITE_OK != sqlite3_exec(Database, sql, 0, 0, &err_msg)) {
        fprintf(stderr, "SQL error: %s\n", err_msg);
        sqlite3_free(err_msg);
        return -1;
    }

    return sqlite3_last_insert_rowid(Database);
}



int database_insert_into_things(const char *ThingType, const char *ThingStatus_, int BoxId) {
    char sql[256];
    sprintf(sql, 
        "INSERT INTO Things(ThingType, ThingStatus_, BoxId) "
        "VALUES ('%s', '%s', %d);"
        , ThingType, ThingStatus_, BoxId);

    char *err_msg = 0;
    if (SQLITE_OK != sqlite3_exec(Database, sql, 0, 0, &err_msg)) {
        fprintf(stderr, "Failed to insert into Things\n");
        fprintf(stderr, "SQL error: %s\n", err_msg);
        sqlite3_free(err_msg);
        return -1;
    }

    return sqlite3_last_insert_rowid(Database);
}



int database_insert_into_boxes(const char *BoxName, const char *BoxLocation, const char *BoxConfig_) {
    char sql[256];
    sprintf(sql, 
        "INSERT INTO Boxes(BoxName, BoxLocation, BoxConfig_) "
        "VALUES ('%s', '%s', '%s');"
        , BoxName, BoxLocation, BoxConfig_);

    char *err_msg = 0;
    if (SQLITE_OK != sqlite3_exec(Database, sql, 0, 0, &err_msg)) {
        fprintf(stderr, "SQL error: %s\n", err_msg);
        sqlite3_free(err_msg);
        return -1;
    }

    return sqlite3_last_insert_rowid(Database);
}



int database_open() {
    if (SQLITE_OK != sqlite3_open("iot.db", &Database)) {
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(Database));
        sqlite3_close(Database);
        return -1;
    }
}



void database_close() {
    sqlite3_close(Database);
}






db_t Db = {
    .open                               = database_open,

    .close                              = database_close,

    .select_inactive_from_whiteBoxes    = database_select_inactive_from_whiteBoxes,

	.insert_into_openDetectors          = database_insert_into_openDetectors,

    .whiteBoxes.select_inactive    = database_select_inactive_from_whiteBoxes,
};

執行結果

root@JoySince:/usr/test_db# ./get_common_2
WhiteBoxId = 1
WhiteBoxUrl = http://192.168.1.113:8888/test_01/common
WhiteBoxActive = 0

WhiteBoxId = 2
WhiteBoxUrl = http://192.168.1.113:8888/test_02/common
WhiteBoxActive = 0

WhiteBoxId = 3
WhiteBoxUrl = http://192.168.1.113:8888/test_03/common
WhiteBoxActive = 0

Code time cost: 8.586000
root@JoySince:/usr/test_db#

1305

下午來玩 CC2541 帶底板藍芽模塊

該模塊購買自

無奈 DX-BT05 4.0 藍牙模快 資料下載 需要啥實名認證

放棄...

找到這個討論串有很多 DX-BT05 資料可供下載

便註冊了 EEHub

image

image

收集到文檔如下

1415

從新手操作指南開始吧 DX-BT05 4.0模块新手操作指南.pdf

3頁的問與答... 教新手看啥

1605

目前已經能發送 AT Command
記得搭配 Download AccessPort 1.37
而不是大陸的 串口调试小助手1.3... RX 異常

1735

這個藍芽模組從 AT Command 的 help 看到 http://www.bolutek.com/

發現我們買的是這個 BLE-CC41-A

現在最糟的問題是我使用 BLE-CC41-A 的 AT Command AT+INQ search slave model 時並無法 search 到 Osmart_Plug
奇怪的是我在 Android 手機上就很順利的 search 到...

⚠️ **GitHub.com Fallback** ⚠️