20160127_jeffrey - silenceuncrio/diary GitHub Wiki
- 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
CC2541 帶底板藍芽模塊到貨
早上已經報了帳
Pioneer 希望我自己搞定這一塊 三月底的 demo 就順延兩個禮拜
我需要重新安排一下整體的 schedule 來讓上級知道 IoT Platform 已經順應了這個改變
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 的進展
唉... 就不回這封信了... 穩扎穩打吧我
繼續昨天的 coding
紀錄目前的成果
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;
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 $@ $<
/* 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;
}
#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;
#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,
};
#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;
#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#
下午來玩 CC2541 帶底板藍芽模塊
該模塊購買自
無奈 DX-BT05 4.0 藍牙模快 資料下載 需要啥實名認證
放棄...
找到這個討論串有很多 DX-BT05 資料可供下載
便註冊了 EEHub
收集到文檔如下
- DX-BT05 AT指令使用方法.pdf
- DX-BT05 4.0插针模块使用方法.pdf
- DX-BT05 4.0模块新手操作指南.pdf
- DX-BT05 4.0蓝牙手机操作指南.pdf
- DX-BT05 4.0蓝牙模块AT指令集v2.0.pdf
- DX-BT05 4.0蓝牙模块技术手册.pdf
- androidAPK .rar
從新手操作指南開始吧 DX-BT05 4.0模块新手操作指南.pdf
3頁的問與答... 教新手看啥
目前已經能發送 AT Command
記得搭配 Download AccessPort 1.37
而不是大陸的 串口调试小助手1.3
... RX 異常
這個藍芽模組從 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 到...