本文源自:RISC-V 大賽 - 那我就自己來吧
本文作者:Murphy
本文轉自:
晶片開放社群(OCC)一、準備
- RVB2601 開發闆
- 飛燕平台産品
- CDK 軟體開發環境

二、飛燕平台建立産品
打開
飛燕平台按照提示開啟該功能,并建立項目。
1.建立項目
2.建立産品
可以選擇使用 led 進行測試,使用預設的功能定義。
3.添加測試裝置
點選上步驟建立的産品,然後進入産品功能配置。然後點選 3-裝置調試,随便選擇一個 WiFi 模組,然後新增測試裝置。
4.擷取裝置管理的四元組
- 産品 ID
- 産品 Secret
- 裝置名稱
- 裝置 Secret
三、工程準備
打開 CDK,進入 Welcome Page。
然後點選 建立工程 ,在搜尋框輸入 ch2601_webplayer_demo 找到示例工程,添加到本地。
三、裝置端添加驅動代碼
在工程的
sdk_chip_ch2601 --> drv_wifi_at_w800
裡找到
w800_api.c/h
檔案。
在這 w800_api.c 檔案裡添加以下代碼:
int w800_living_platform_attribute_upload(const char *dev_id,
const char *msg, int *packet_id)
{
int ret = -1;
int rsp_dev_id = -1;
int rsp_packet_id = -1;
int rsp_code = -1;
int rsp_reply_len = -1;
int id = -1;
char event_str[64] = {0};
char unknown_str[64] = {0};
if (!dev_id || !msg || !packet_id) {
return ret;
}
aos_mutex_lock(&g_cmd_mutex, AOS_WAIT_FOREVER);
atparser_clr_buf(g_atparser_uservice_t);
/**
* AT+IDMPP= 0,"{\"powerstate\":1}"
*/
char at_string_msg[64] = {0};
snprintf(at_string_msg, 64, "AT+IDMPP=0,\"%s\"", msg);
LOGD(TAG, "Send msg: %s\r\n", at_string_msg);
if (atparser_send(g_atparser_uservice_t, at_string_msg) == 0) {
if (((atparser_recv(g_atparser_uservice_t, "+IDMPP:%d\n", packet_id) == 0) &&
(atparser_recv(g_atparser_uservice_t, "OK\n") == 0)) ||
(atparser_recv(g_atparser_uservice_t, "+IDMPP:%d,%d,%d,%d,%s\n",
&rsp_dev_id, &rsp_packet_id, &rsp_code, &rsp_reply_len, event_str) == 0)) {
ret = 0;
LOGD(TAG, "Send at cmd ok\r\n");
}
} else {
LOGD(TAG, "Send at cmd err\r\n");
}
atparser_cmd_exit(g_atparser_uservice_t);
aos_mutex_unlock(&g_cmd_mutex);
return ret;
}
int w800_living_platform_event_upload(const char *dev_id,
const char *event_id, const char *event_payload, int *packet_id)
{
int ret = -1;
int rsp_dev_id = -1;
int rsp_packet_id = -1;
int rsp_code = -1;
int rsp_reply_len = -1;
int id = -1;
char event_str[64] = {0};
char unknown_str[64] = {0};
if (!dev_id || !event_id || !packet_id || !event_payload) {
return ret;
}
aos_mutex_lock(&g_cmd_mutex, AOS_WAIT_FOREVER);
atparser_clr_buf(g_atparser_uservice_t);
char at_string_msg[64] = {0};
snprintf(at_string_msg, 64, "AT+IDMEP=%s,\"%s\",\"%s\"", dev_id, event_id, event_payload);
LOGD(TAG, "Send msg: %s\r\n", at_string_msg);
if (atparser_send(g_atparser_uservice_t, at_string_msg) == 0) {
if ((atparser_recv(g_atparser_uservice_t, "+IDMEP:%d\n", packet_id) == 0) &&
(atparser_recv(g_atparser_uservice_t, "OK\n") == 0)) {
ret = 0;
}
}
atparser_cmd_exit(g_atparser_uservice_t);
aos_mutex_unlock(&g_cmd_mutex);
return ret;
}
/**
* w800_living_platform_recv_handler_register
*
* @param cmd
* example: "+IDMPS:"
*/
void w800_living_platform_recv_handler_register(const char *cmd, void *cb, void *context)
{
atparser_oob_create(g_atparser_uservice_t, cmd, cb, context);
}
并在 w800_api.h 檔案裡添加以下代碼:
extern int w800_living_platform_config(const char* product_key, const char* dev_name,
const char* dev_secret, const char* product_secret);
extern int w800_living_platform_conn(void);
extern int w800_living_platform_link_status_get(int *state);
extern int w800_living_platform_attribute_upload(const char *dev_id,
const char *msg, int *packet_id);
extern int w800_living_platform_event_upload(const char *dev_id,
const char *event_id, const char *event_payload, int *packet_id);
extern void w800_living_platform_recv_handler_register(const char *cmd, void *cb, void *context);
四、裝置端添加示例代碼
修改
app --> src --> app_main.c
代碼。
#include <aos/aos.h>
#include <devices/w800.h>
#include <yoc/atparser.h>
#define LIVING_PLATFORM_PROD_KEY "xx"
#define LIVING_PLATFORM_PROD_SECRET "xx"
#define LIVING_PLATFORM_DEV_NAME "xxx"
#define LIVING_PLATFORM_DEV_SECRET "xxx"
extern int w800_living_platform_config(const char* product_key, const char* dev_name,
const char* dev_secret, const char* product_secret);
extern int w800_living_platform_conn(void);
extern int w800_living_platform_link_status_get(int *state);
int app_living_platform_conn(void);
static aos_sem_t g_living_start_sem = {0};
int app_living_platform_init(void)
{
int ret = -1;
ret = aos_sem_new(&g_living_start_sem, 0);
if (ret != 0)
{
goto __exit;
}
__exit:
return ret;
}
int app_living_platform_wait_start(void)
{
int ret = -1;
ret = aos_sem_wait(&g_living_start_sem, AOS_WAIT_FOREVER);
if (ret != 0)
{
goto __exit;
}
__exit:
return ret;
}
void app_living_platform_notify_start(void)
{
aos_sem_signal(&g_living_start_sem);
}
static void network_event(uint32_t event_id, const void *param, void *context)
{
switch(event_id) {
case EVENT_NETMGR_GOT_IP:
LOGD(TAG, "net got ip");
app_living_platform_notify_start();
break;
case EVENT_NETMGR_NET_DISCON:
LOGD(TAG, "net disconnect");
break;
}
}
int main(void)
{
board_yoc_init();
if (0 != app_living_platform_init())
{
LOGE(TAG, "app_living_platform_init failed");
return -1;
}
/* Subscribe */
event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);
if (0 == app_living_platform_wait_start())
{
if (0 != app_living_platform_conn())
{
LOGE(TAG, "app_living_platform_conn failed");
}
}
else
{
LOGE(TAG, "app_living_platform_wait_start failed");
}
return 0;
}
static int _living_platform_attribute_set_handler(atparser_uservice_t *at, void *priv, oob_data_t *oob_data)
{
int store_order = (int)priv;
char *buf = (oob_data != NULL ? oob_data->buf : NULL);
LOGD(TAG, "recv data len: %d; data: %s\n", store_order, buf);
return 0;
}
int app_living_platform_conn(void)
{
int ret = 0;
w800_living_platform_recv_handler_register("+IDMPS:", _living_platform_attribute_set_handler, NULL);
LOGD(TAG, "==> start config living platform");
ret = w800_living_platform_config(
LIVING_PLATFORM_PROD_KEY, LIVING_PLATFORM_DEV_NAME,
LIVING_PLATFORM_DEV_SECRET, LIVING_PLATFORM_PROD_SECRET);
if (ret != 0)
{
goto __exit;
}
LOGD(TAG, "<== end config living platform");
LOGD(TAG, "==> start connect living platform");
ret = w800_living_platform_conn();
if (ret != 0)
{
goto __exit;
}
LOGD(TAG, "==> end connect living platform");
/* delay some time, then check link status */
aos_msleep(4000);
{
int link_status = -1;
LOGD(TAG, "==> start get link status");
ret = w800_living_platform_link_status_get(&link_status);
if (ret != 0)
{
goto __exit;
}
LOGD(TAG, "<== end get link status <%d>", link_status);
}
/* delay some time, then upload attribute */
aos_msleep(1000);
{
extern int w800_living_platform_attribute_upload(const char *dev_id,
const char *msg, int *packet_id);
extern int w800_living_platform_event_upload(const char *dev_id,
const char *event_id, const char *event_payload, int *packet_id);
const char *dev_id = "0";
const char *msg_on = "{\\\"powerstate\\\":1}";
const char *msg_off = "{\\\"powerstate\\\":0}";
int pkt_id = 0;
LOGD(TAG, "==> start attribute upload");
ret = w800_living_platform_attribute_upload(dev_id, msg_on, &pkt_id);
if (ret != 0)
{
goto __exit;
}
LOGD(TAG, "<== end attribute upload, packet id <%d>", pkt_id);
}
__exit:
return ret;
}
五、源碼擷取
後面整理後放到 gitee 。