本文源自: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 文件里添加以下代码:
intw800_living_platform_attribute_upload(constchar*dev_id, constchar*msg, int*packet_id) { intret=-1; intrsp_dev_id=-1; intrsp_packet_id=-1; intrsp_code=-1; intrsp_reply_len=-1; intid=-1; charevent_str[64] = {0}; charunknown_str[64] = {0}; if (!dev_id||!msg||!packet_id) { returnret; } aos_mutex_lock(&g_cmd_mutex, AOS_WAIT_FOREVER); atparser_clr_buf(g_atparser_uservice_t); /*** AT+IDMPP= 0,"{\"powerstate\":1}"*/charat_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); returnret; } intw800_living_platform_event_upload(constchar*dev_id, constchar*event_id, constchar*event_payload, int*packet_id) { intret=-1; intrsp_dev_id=-1; intrsp_packet_id=-1; intrsp_code=-1; intrsp_reply_len=-1; intid=-1; charevent_str[64] = {0}; charunknown_str[64] = {0}; if (!dev_id||!event_id||!packet_id||!event_payload) { returnret; } aos_mutex_lock(&g_cmd_mutex, AOS_WAIT_FOREVER); atparser_clr_buf(g_atparser_uservice_t); charat_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); returnret; } /*** w800_living_platform_recv_handler_register* * @param cmd* example: "+IDMPS:"*/voidw800_living_platform_recv_handler_register(constchar*cmd, void*cb, void*context) { atparser_oob_create(g_atparser_uservice_t, cmd, cb, context); }
并在 w800_api.h 文件里添加以下代码:
externintw800_living_platform_config(constchar*product_key, constchar*dev_name, constchar*dev_secret, constchar*product_secret); externintw800_living_platform_conn(void); externintw800_living_platform_link_status_get(int*state); externintw800_living_platform_attribute_upload(constchar*dev_id, constchar*msg, int*packet_id); externintw800_living_platform_event_upload(constchar*dev_id, constchar*event_id, constchar*event_payload, int*packet_id); externvoidw800_living_platform_recv_handler_register(constchar*cmd, void*cb, void*context);
四、设备端添加示例代码
修改 app --> src --> app_main.c
代码。
externintw800_living_platform_config(constchar*product_key, constchar*dev_name, constchar*dev_secret, constchar*product_secret); externintw800_living_platform_conn(void); externintw800_living_platform_link_status_get(int*state); intapp_living_platform_conn(void); staticaos_sem_tg_living_start_sem= {0}; intapp_living_platform_init(void) { intret=-1; ret=aos_sem_new(&g_living_start_sem, 0); if (ret!=0) { goto__exit; } __exit: returnret; } intapp_living_platform_wait_start(void) { intret=-1; ret=aos_sem_wait(&g_living_start_sem, AOS_WAIT_FOREVER); if (ret!=0) { goto__exit; } __exit: returnret; } voidapp_living_platform_notify_start(void) { aos_sem_signal(&g_living_start_sem); } staticvoidnetwork_event(uint32_tevent_id, constvoid*param, void*context) { switch(event_id) { caseEVENT_NETMGR_GOT_IP: LOGD(TAG, "net got ip"); app_living_platform_notify_start(); break; caseEVENT_NETMGR_NET_DISCON: LOGD(TAG, "net disconnect"); break; } } intmain(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"); } return0; } staticint_living_platform_attribute_set_handler(atparser_uservice_t*at, void*priv, oob_data_t*oob_data) { intstore_order= (int)priv; char*buf= (oob_data!=NULL?oob_data->buf : NULL); LOGD(TAG, "recv data len: %d; data: %s\n", store_order, buf); return0; } intapp_living_platform_conn(void) { intret=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); { intlink_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); { externintw800_living_platform_attribute_upload(constchar*dev_id, constchar*msg, int*packet_id); externintw800_living_platform_event_upload(constchar*dev_id, constchar*event_id, constchar*event_payload, int*packet_id); constchar*dev_id="0"; constchar*msg_on="{\\\"powerstate\\\":1}"; constchar*msg_off="{\\\"powerstate\\\":0}"; intpkt_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: returnret; }
五、源码获取
后面整理后放到 gitee 。