HarmonyOS Connect設(shè)備開發(fā)之南向開發(fā)-設(shè)備配網(wǎng)
??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??
一、分析模板demo-winder
回到設(shè)備側(cè)開發(fā)指導(dǎo),winder案例工程結(jié)構(gòu)如下:
├── BUILD.gn
├── include
│ ├── code_tab.h // 字母和漢字編碼
│ ├── common.h // 設(shè)備初始化相關(guān)接口
│ ├── defines.h // 通用宏及調(diào)試宏定義
│ ├── keypad.h // 按鍵相關(guān)接口
│ ├── led.h // LED等控制相關(guān)接口
│ ├── netcfg.h // 無感配網(wǎng)注冊(cè)相關(guān)接口
│ ├── network_config_service.h //無感配網(wǎng)相關(guān)頭文件。
│ ├── oled.h // OLED 相關(guān)接口
│ ├── pwm.h // PWM 相關(guān)接口
│ ├── sensor.h // 傳感器相關(guān)接口
│ └── winder.h // 風(fēng)扇相關(guān)宏定義
├── libs
│ ├── libhilinkadapter_3861.a // 無感配網(wǎng)相關(guān)庫(kù)文件。
│ └── libnetcfgdevicesdk.a // 無感配網(wǎng)相關(guān)庫(kù)文件。
└── src
├── common.c // 設(shè)備相關(guān)初始化操作
├── keypad.c // 按鍵驅(qū)動(dòng)模塊
├── led.c // LED燈相關(guān)控制實(shí)現(xiàn)
├── netcfg.c // NAN相關(guān)操作和聯(lián)網(wǎng)動(dòng)作
├── oled.c // 與OLED 模塊相關(guān)
├── pwm.c // PWM相關(guān)控制實(shí)現(xiàn)
├── sensor.c // 傳感器相關(guān)
└── winder.c // 風(fēng)扇主函數(shù)入口,及相關(guān)控制邏輯的實(shí)現(xiàn)
找出設(shè)備配網(wǎng)依賴,總結(jié)如下:
include:
│ ├── netcfg.h // 無感配網(wǎng)注冊(cè)相關(guān)接口
│ ├── network_config_service.h //無感配網(wǎng)相關(guān)頭文件。
libs:
├── libs
│ ├── libhilinkadapter_3861.a // 無感配網(wǎng)相關(guān)庫(kù)文件。
│ └── libnetcfgdevicesdk.a // 無感配網(wǎng)相關(guān)庫(kù)文件。
src:
├── netcfg.c // NAN相關(guān)操作和聯(lián)網(wǎng)動(dòng)作
二、配網(wǎng)函數(shù)API
我們分析配網(wǎng)相關(guān)的幾個(gè)文件。
① network_config_service.h文件_StartNetCfg()函數(shù):開始配網(wǎng)入口。
DevInfo是配網(wǎng)信息,在netcfg.c中引用如下:
const char *g_ssid = "SmartFan ";
const char *g_pinCode = "11111111";
const char *g_productId = "1";
const char *g_sn = "0123/.,.,4567890123450123456789012345";
···
devInfo[0].key = "productId";
devInfo[1].key = "sn";
devInfo[0].value = g_productId;
devInfo[1].value = g_sn;
ret = StartNetCfg(devInfo, DEVICE_INFO_NUM, NETCFG_SOFTAP_NAN); //SoftAP and NAN模式
② netcfg.h文件 -NetCfgRegister()函數(shù): 進(jìn)入配網(wǎng)狀態(tài)并注冊(cè)網(wǎng)絡(luò)監(jiān)聽事件,在主函數(shù)入口調(diào)用。
在winder工程調(diào)用如下:
③ netcfg.c RecvRawData()函數(shù)-接收數(shù)據(jù)。
在winder工程中,使用注冊(cè)回調(diào)函數(shù)的形式接收數(shù)據(jù)。如下:
三、新建smart_fan工程
分析完winder demo設(shè)備側(cè)代碼,我們新建一個(gè)smart_fan工程,引入配網(wǎng)依賴,新建業(yè)務(wù)代碼。
1、依賴庫(kù)拷貝
在app目錄下新建一個(gè)文件夾smart_fan,將winder工程中的BUILD.gn、libs、include、src拷貝到該目錄下,只保留需要的幾個(gè)文件,同新建smart_fan.c文件,工程架構(gòu)如下:
├── BUILD.gn
├── include
│ ├── defines.h // 通用宏及調(diào)試宏定義
│ ├── netcfg.h // 無感配網(wǎng)注冊(cè)相關(guān)接口
│ ├── network_config_service.h //無感配網(wǎng)相關(guān)頭文件。
├── libs
│ ├── libhilinkadapter_3861.a // 無感配網(wǎng)相關(guān)庫(kù)文件。
│ └── libnetcfgdevicesdk.a // 無感配網(wǎng)相關(guān)庫(kù)文件。
└── src
├── netcfg.c // NAN相關(guān)操作和聯(lián)網(wǎng)動(dòng)作
└── smart_fan.c // 風(fēng)扇主函數(shù)入口,及相關(guān)控制邏輯的實(shí)現(xiàn)
復(fù)制
2、業(yè)務(wù)代碼
接下來我們?cè)趕mart_fan.c中編寫業(yè)務(wù)代碼,實(shí)現(xiàn)配網(wǎng)、接收數(shù)據(jù)。
//接收數(shù)據(jù)
char app_msg[20] = {0};
static void WinderProcessAppMessage(const char *data, int data_len)
{
if (strcpy(app_msg, data) != 0)
{
WINERR("strncpy_s failed! \n");
return;
}
printf("app_msg %s\r\n",app_msg);
}
//NetEvent回調(diào)函數(shù)
static int WinderNetEventHandler(NET_EVENT_TYPE event, void *data)
{
switch (event)
{
case NET_EVENT_CONNECTTED: // 網(wǎng)絡(luò)連接成功
printf("connect net successful"); // 顯示網(wǎng)絡(luò)已連接
break;
case NET_EVENT_RECV_DATA: // 接收到網(wǎng)絡(luò)信息(FA發(fā)送的消息)
WinderProcessAppMessage((const char *)data, strlen(data)); // 處理對(duì)應(yīng)的信息
break;
default:
break;
}
return 0;
}
static void *WinderTask(const char *arg)
{
(void)arg;
WINDBG("WinderTask Enter! \n");
NetCfgRegister(WinderNetEventHandler); // 進(jìn)入配網(wǎng)狀態(tài)并注冊(cè)網(wǎng)絡(luò)監(jiān)聽事件
}
3、編譯燒錄
修改BUILD.gn文件,正常編譯燒錄即可。
四、配網(wǎng)測(cè)試
燒錄成功后,碰一碰進(jìn)行配網(wǎng),串口會(huì)輸出北向開發(fā)APP發(fā)出的對(duì)應(yīng)數(shù)據(jù)。如下:
小結(jié)
本節(jié)我們完成了smart_fan設(shè)備側(cè)的配網(wǎng)開發(fā),目前能實(shí)現(xiàn)配網(wǎng)。下一節(jié)我們編寫業(yè)務(wù)代碼,并演示【HarmonyOS Connect設(shè)備開發(fā)-個(gè)人】最終的成果。