华为云14天鸿蒙设备开发-Day7WIFI功能开发
目录
- 前言
- 一、WiFI编程简介
- 主要API简介
- 二、开发流程
- 1.AP与STA模式区别
- 2.AP热点开发流程
- 3.STA站点开发流程
- 三、官方案例实现
- 1. AP
- 代码编写
- 编译调试
- 2. STA
- 代码编写
- 编译调试
前言
HarmonyOS新手入门设备开发的“芯”路历程
官方文帐中将鸿蒙小熊派开发板从采用的模组到芯片都介绍了一遍。开发板采用的芯片是Hi3861V100芯片。
Hi3861V100是一款高度集成的2.4GHz SoC WiFi芯片,集成IEEE 802.11b/g/n基带和RF电路,RF电路包括功率放大器PA、低 噪声放大器LNA、RF balun、天线开关以及电源管理等模块;支持20MHz标准带宽和5MHz/10MHz窄带宽,提供最大72.2Mbit/s 物理层速率。Hi3861V100 WiFi基带支持正交频分复用(OFDM)技术,并向下兼容直接序列扩频(DSSS)和补码键控(CCK)技术,支 持IEEE 802.11 b/g/n协议的各种数据速率。 Hi3861V100芯片集成高性能32bit微处理器、硬件安全引擎以及丰富的外设接口,外设接口包括SPI、UART、I2C、PWM、 GPIO和多路ADC,同时支持高速SDIO2.0 Slave接口,最高时钟可达50MHz;芯片内置SRAM和Flash,可独立运行,并支持 在Flash上运行程序。 Hi3861V100支持HUAWEI LiteOS和第三方组件,并配套提供开放、易用的开发和调试运行环境。 Hi3861V100芯片适应于智能家电等物联网智能终端领域。
更多的可以去官方社区账号专栏看。本文主要总结鸿蒙的wifi接口
一、WiFI编程简介
Hi3861V100、Hi3861LV100 通过API(Application Programming Interface)面向开发者提供Wi-Fi功能的开发和应用接口,包括芯片初始化、资源配置、Station创建和配置、扫描、关联以及去关联、状态查询等一系列功能, 框架结构如图所示。
APP应用开发层:用户基于API接口的二次开发。
Example示例:SDK提供的功能开发示例。
API接口:提供基于SDK的通用接口。
LWIP协议栈:网络协议栈。
WPA SUPPLICANT(含HOSTAPD):Wi-Fi管理模块。
Wi-Fi驱动:802.11协议实现模块。
Platform平台:提供SoC系统板级支持包(包括:芯片和外围设备驱动、操作系统以及系统管理)
鸿蒙系统代码的API文件在如下路径:
foundation\communication\interfaces\kits\wifi_lite\wifiservice\wifi_device.h foundation\communication\interfaces\kits\wifi_lite\wifiservice\wifi_hotspot.h
主要API简介
1. RegisterWifiEvent()
WifiErrorCode RegisterWifiEvent (WifiEvent * event)
描述: 为指定的Wi-Fi事件注册回调函数。当WifiEvent中定义的Wi-Fi事件发生时,将调用已注册的回调函数
参数:
名字 | 描述 |
---|---|
event | 表示要注册回调的事件 |
2. EnableHotspot()
WifiErrorCode EnableHotspot (void )
描述: 启用Wifi热点模式
3. SetHotspotConfig()
WifiErrorCode SetHotspotConfig(const HotspotConfig* config)
描述: 设置指定的热点配置
4. IsHotspotActive()
int IsHotspotActive(void);
描述: 检查AP热点模式是否启用
5. GetStationList()
WifiErrorCode GetStationList(StationInfo* result, unsigned int* size)
描述: 获取连接到该热点的一系列STA
参数:
名字 | 描述 |
---|---|
result | 表示连接到该热点的STA列表 |
size | 表示连接到该热点的STA数量 |
6. EnableWifi()
WifiErrorCode EnableWifi (void )
描述: 启用STA模式
7. AddDeviceConfig()
WifiErrorCode AddDeviceConfig (const WifiDeviceConfig * config, int * result )
描述: 添加用于配置连接的热点信息,此函数生成一个networkId
参数:
名字 | 描述 |
---|---|
config | 表示要连接的热点信息 |
result | 表示生成的networkId。每个networkId匹配一个热点配置 |
8. ConnectTo()
WifiErrorCode ConnectTo (int networkId)
描述: 连接到指定networkId的热点
9. netifapi_netif_find()
struct netif *netifapi_netif_find(const char *name);
描述: 获取netif用于IP操作
10. dhcp_start()
err_t dhcp_start(n)
描述:启动DHCP, 获取IP
二、开发流程
1.AP与STA模式区别
AP:无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个AP。
STA站点:就是每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。
AP模式: Access Point,提供无线接入服务,允许其它无线设备接入,提供数据访问,一般的无线路由/网桥工作在该模式下。AP和AP之间允许相互连接。
在此模式下,手机、PAD、电脑等设备可以直接连上模块,可以很方便对用户设备进行控制。
Sta模式: Station, 类似于无线终端,sta本身并不接受无线的接入,它可以连接到AP,一般无线网卡即工作在该模式。
这是一种基本的组网方式,由一个AP和许多STA组成。其特点是AP处于中心地位,STA之间的相互通信都通过AP转发完成。该模式下,WIFI模块工作在STA(CLIENT)模式。通过适当的设置,COM的数据与WIFI的网路数据相互转换。
2.AP热点开发流程
鸿蒙设备完成Wifi热点的扫描需要以下几步
- 通过
RegisterWifiEvent
接口向系统注册热点状态改变事件、STA站点加入事件、STA站点退出事件
OnHotspotStateChangedHandler
用于绑定热点状态改变事件,该回调函数有一个参数 state ;其中state表示是否开启AP模式,取值为0和1,0表示已启用Wifi AP模式,1表示已禁用Wifi AP模式;OnHotspotStaLeaveHandler
用于绑定STA站点退出事件,当有STA站点退出,该回调函数会打印出退出站点的MAC地址;OnHotspotStaJoinHandler
用于绑定STA站点加入事件,当有新的STA站点加入时,该回调函数会创建 HotspotStaJoinTask,在该任务中会调用 GetStationList 函数获取当前接入到该AP的所有STA站点信息,并打印出每个STA站点的MAC地址;
调用
SetHotspotConfig
接口,设置指定的热点配置;调用
EnableHotspot
接口,使能 Wifi AP 模式;调用
IsHotspotActive
接口,检查AP热点模式是否启用;调用
netifapi_netif_set_addr
函数设置网卡信息;调用
netifapi_dhcps_start
函数启动dhcp服务;
3.STA站点开发流程
鸿蒙设备完成Wifi热点的连接需要以下几步
- 通过
RegisterWifiEvent
接口向系统注册扫描状态监听函数,用于接收扫描状态通知,如扫描动作是否完成等
OnWifiConnectionChangedHandler
用于绑定连接状态监听函数,该回调函数有两个参数 state 和 info ;state表示扫描状态,取值为0和1,1表示热点连接成功;info表示Wi-Fi连接信息,包含以下参数:
名字 | 描述 |
---|---|
ssid [WIFI_MAX_SSID_LEN] | 连接的热点名称. |
bssid [WIFI_MAC_LEN] | MAC地址. |
rssi | 接收信号强度(RSSI). |
connState | Wifi连接状态. |
disconnectedReason | Wi-Fi断开的原因. |
- 调用
EnableWifi
接口,使能 Wifi。 - 调用
AddDeviceConfig
接口,配置连接的热点信息。 - 调用
ConnectTo
接口,连接到指定networkId的热点。 - 调用
WaitConnectResult
接口等待,该函数中会有15s的时间去轮询连接成功标志位g_ConnectSuccess
,当g_ConnectSuccess
为 1 时退出等待。 - 调用
netifapi_netif_find
接口,获取 netif 用于 IP 操作 - 调用
dhcp_start
接口,启动 DHCP, 获取 IP
三、官方案例实现
1. AP
此模式下并不能联网,只是能够将终端连接到设备而已。如需联网应该采用AP+STA模式。
代码编写
主任务函数
#define AP_SSID "BearPi"
#define AP_PSK "0987654321"#define ONE_SECOND 1
#define DEF_TIMEOUT 15static void OnHotspotStaJoinHandler(StationInfo *info);
static void OnHotspotStateChangedHandler(int state);
static void OnHotspotStaLeaveHandler(StationInfo *info);static struct netif *g_lwip_netif = NULL;
static int g_apEnableSuccess = 0;
WifiEvent g_wifiEventHandler = {0};
WifiErrorCode error;static BOOL WifiAPTask(void)
{//延时2S便于查看日志osDelay(200);//注册wifi事件的回调函数g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;error = RegisterWifiEvent(&g_wifiEventHandler);if (error != WIFI_SUCCESS){printf("RegisterWifiEvent failed, error = %d.\r\n",error);return -1;}printf("RegisterWifiEvent succeed!\r\n");//设置指定的热点配置HotspotConfig config = {0};strcpy(config.ssid, AP_SSID);strcpy(config.preSharedKey, AP_PSK);config.securityType = WIFI_SEC_TYPE_PSK;config.band = HOTSPOT_BAND_TYPE_2G;config.channelNum = 7;error = SetHotspotConfig(&config);if (error != WIFI_SUCCESS){printf("SetHotspotConfig failed, error = %d.\r\n", error);return -1;}printf("SetHotspotConfig succeed!\r\n");//启动wifi热点模式error = EnableHotspot(); if (error != WIFI_SUCCESS){printf("EnableHotspot failed, error = %d.\r\n", error);return -1;}printf("EnableHotspot succeed!\r\n");//检查热点模式是否使能if (IsHotspotActive() == WIFI_HOTSPOT_NOT_ACTIVE){printf("Wifi station is not actived.\r\n");return -1;}printf("Wifi station is actived!\r\n");//启动dhcpg_lwip_netif = netifapi_netif_find("ap0");if (g_lwip_netif) {ip4_addr_t bp_gw;ip4_addr_t bp_ipaddr;ip4_addr_t bp_netmask;IP4_ADDR(&bp_gw, 192, 168, 1, 1); /* input your gateway for example: 192.168.1.1 */IP4_ADDR(&bp_ipaddr, 192, 168, 1, 1); /* input your IP for example: 192.168.1.1 */IP4_ADDR(&bp_netmask, 255, 255, 255, 0); /* input your netmask for example: 255.255.255.0 */err_t ret = netifapi_netif_set_addr(g_lwip_netif, &bp_ipaddr, &bp_netmask, &bp_gw);if(ret != ERR_OK){printf("netifapi_netif_set_addr failed, error = %d.\r\n", ret);return -1;}printf("netifapi_netif_set_addr succeed!\r\n");ret = netifapi_dhcps_start(g_lwip_netif, 0, 0);if(ret != ERR_OK){ printf("netifapi_dhcp_start failed, error = %d.\r\n", ret);return -1;}printf("netifapi_dhcps_start succeed!\r\n");}/****************以下为UDP服务器代码***************///在sock_fd 进行监听int sock_fd;//服务端地址信息struct sockaddr_in server_sock;//创建socketif ((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){perror("socket is error.\r\n");return -1;}bzero(&server_sock, sizeof(server_sock));server_sock.sin_family = AF_INET;server_sock.sin_addr.s_addr = htonl(INADDR_ANY);server_sock.sin_port = htons(8888);//调用bind函数绑定socket和地址if (bind(sock_fd, (struct sockaddr *)&server_sock, sizeof(struct sockaddr)) == -1){perror("bind is error.\r\n");return -1;}int ret;char recvBuf[512] = {0};//客户端地址信息struct sockaddr_in client_addr;int size_client_addr= sizeof(struct sockaddr_in);while (1){printf("Waiting to receive data...\r\n");memset(recvBuf, 0, sizeof(recvBuf));ret = recvfrom(sock_fd, recvBuf, sizeof(recvBuf), 0, (struct sockaddr*)&client_addr,(socklen_t*)&size_client_addr);if(ret < 0){printf("UDP server receive failed!\r\n");return -1;}printf("receive %d bytes of data from ipaddr = %s, port = %d.\r\n", ret, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));printf("data is %s\r\n",recvBuf);ret = sendto(sock_fd, recvBuf, strlen(recvBuf), 0, (struct sockaddr *)&client_addr, sizeof(client_addr));if (ret < 0){printf("UDP server send failed!\r\n");return -1;}}/*********************END********************/
}
回调函数
课程上说是获取站点列表函数在回调函数中调用得不到结果,所以写了个任务函数在回调函数中调用。
static void HotspotStaJoinTask(void)
{static char macAddress[32] = {0};StationInfo stainfo[WIFI_MAX_STA_NUM] = {0};StationInfo *sta_list_node = NULL;unsigned int size = WIFI_MAX_STA_NUM;error = GetStationList(stainfo, &size);if (error != WIFI_SUCCESS) {printf("HotspotStaJoin:get list fail, error is %d.\r\n", error);return;}sta_list_node = stainfo;for (uint32_t i = 0; i < size; i++, sta_list_node++) {unsigned char* mac = sta_list_node->macAddress;snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);printf("HotspotSta[%d]: macAddress=%s.\r\n",i, macAddress);}g_apEnableSuccess++;
}
static void OnHotspotStaJoinHandler(StationInfo *info)
{if (info == NULL) {printf("HotspotStaJoin:info is null.\r\n");} else {printf("New Sta Join\n");osThreadAttr_t attr;attr.name = "HotspotStaJoinTask";attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = 2048;attr.priority = 24;if (osThreadNew((osThreadFunc_t)HotspotStaJoinTask, NULL, &attr) == NULL) {printf("HotspotStaJoin:create task fail!\r\n");}}return;
}static void OnHotspotStaLeaveHandler(StationInfo *info)
{if (info == NULL) {printf("HotspotStaLeave:info is null.\r\n");} else {static char macAddress[32] = {0};unsigned char* mac = info->macAddress;snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);printf("HotspotStaLeave: macAddress=%s, reason=%d.\r\n", macAddress, info->disconnectedReason);g_apEnableSuccess--;}return;
}static void OnHotspotStateChangedHandler(int state)
{printf("HotspotStateChanged:state is %d.\r\n", state);if (state == WIFI_HOTSPOT_ACTIVE) {printf("wifi hotspot active.\r\n");} else {printf("wifi hotspot noactive.\r\n");}
}
编译调试
1.修改BUILD.gn
修改 applications\BearPi\BearPi-HM_Nano\sample
路径下 BUILD.gn 文件,指定 wifi_ap 参与编译。
2.编译
Linux终端或者MobaXterm的会话连接内,进入代码目录执行 python build.py BearPi-HM_Nano
进行编译。
3.烧录
使用HiBurn工具,波特率设置为2000000.
选择对应的com口和要烧录的文件,勾选auto burn。点击connect,再点开发板复位按键。进行烧录。
4.运行结果
通过MobaXterm的串口工具查看。用手机连一下试试。
2. STA
此模式下设备能联网,但是不能够将终端连接到设备。如需联网应该采用AP+STA模式。
代码编写
相关声明
#define DEF_TIMEOUT 15
#define ONE_SECOND 1static void WiFiInit(void);
static void WaitSacnResult(void);
static int WaitConnectResult(void);
static void OnWifiScanStateChangedHandler(int state, int size);
static void OnWifiConnectionChangedHandler(int state, WifiLinkedInfo *info);
static void OnHotspotStaJoinHandler(StationInfo *info);
static void OnHotspotStateChangedHandler(int state);
static void OnHotspotStaLeaveHandler(StationInfo *info);static int g_staScanSuccess = 0;
static int g_ConnectSuccess = 0;
static int ssid_count = 0;
WifiEvent g_wifiEventHandler = {0};
WifiErrorCode error;#define SELECT_WLAN_PORT "wlan0"#define SELECT_WIFI_SSID "your wifi ssid"//这里改成要连接的热点账号和对应密码
#define SELECT_WIFI_PASSWORD "your wifi password"
#define SELECT_WIFI_SECURITYTYPE WIFI_SEC_TYPE_PSK
主任务函数
static BOOL WifiSTATask(void)
{WifiScanInfo *info = NULL;unsigned int size = WIFI_SCAN_HOTSPOT_LIMIT;static struct netif *g_lwip_netif = NULL;WifiDeviceConfig select_ap_config = {0};osDelay(200);printf("<--System Init-->\r\n");//初始化WIFI,将回调函数绑定写到这里了WiFiInit();//使能WIFIif (EnableWifi() != WIFI_SUCCESS){printf("EnableWifi failed, error = %d\n", error);return -1;}//判断WIFI是否激活if (IsWifiActive() == 0){printf("Wifi station is not actived.\n");return -1;}//分配空间,保存WiFi信息info = malloc(sizeof(WifiScanInfo) * WIFI_SCAN_HOTSPOT_LIMIT);if (info == NULL){return -1;}//轮询查找WiFi列表do{//重置标志位ssid_count = 0;g_staScanSuccess = 0;//开始扫描Scan();//等待扫描结果WaitSacnResult();//获取扫描列表error = GetScanInfoList(info, &size);}while(g_staScanSuccess != 1);//打印WiFi列表printf("********************\r\n");for(uint8_t i = 0; i < ssid_count; i++){printf("no:%03d, ssid:%-30s, rssi:%5d\r\n", i+1, info[i].ssid, info[i].rssi/100);}printf("********************\r\n");//连接指定的WiFi热点for(uint8_t i = 0; i < ssid_count; i++){if (strcmp(SELECT_WIFI_SSID, info[i].ssid) == 0){int result;printf("Select:%3d wireless, Waiting...\r\n", i+1);//拷贝要连接的热点信息strcpy(select_ap_config.ssid, info[i].ssid);strcpy(select_ap_config.preSharedKey, SELECT_WIFI_PASSWORD);select_ap_config.securityType = SELECT_WIFI_SECURITYTYPE;if (AddDeviceConfig(&select_ap_config, &result) == WIFI_SUCCESS){if (ConnectTo(result) == WIFI_SUCCESS && WaitConnectResult() == 1){printf("WiFi connect succeed!\r\n");g_lwip_netif = netifapi_netif_find(SELECT_WLAN_PORT);break;}}}if(i == ssid_count-1){printf("ERROR: No wifi as expected\r\n");while(1) osDelay(100);}}//启动DHCPif (g_lwip_netif){dhcp_start(g_lwip_netif);printf("begain to dhcp");}//等待DHCPfor(;;){if(dhcp_is_bound(g_lwip_netif) == ERR_OK){printf("<-- DHCP state:OK -->\r\n");//打印获取到的IP信息netifapi_netif_common(g_lwip_netif, dhcp_clients_info_show, NULL);break;}printf("<-- DHCP state:Inprogress -->\r\n");osDelay(100);}//执行其他操作for(;;){osDelay(100);}}
回调函数
将回调函数的注册绑定写到了初始化函数里。
static void WiFiInit(void)
{printf("<--Wifi Init-->\r\n");g_wifiEventHandler.OnWifiScanStateChanged = OnWifiScanStateChangedHandler;g_wifiEventHandler.OnWifiConnectionChanged = OnWifiConnectionChangedHandler;g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;error = RegisterWifiEvent(&g_wifiEventHandler);if (error != WIFI_SUCCESS){printf("register wifi event fail!\r\n");}else{printf("register wifi event succeed!\r\n");}
}static void OnWifiScanStateChangedHandler(int state, int size)
{(void)state;if (size > 0){ssid_count = size;g_staScanSuccess = 1;}return;
}static void OnWifiConnectionChangedHandler(int state, WifiLinkedInfo *info)
{(void)info;if (state > 0){g_ConnectSuccess = 1;printf("callback function for wifi connect\r\n");}else{printf("connect error,please check password\r\n");}return;
}static void OnHotspotStaJoinHandler(StationInfo *info)
{(void)info;printf("STA join AP\n");return;
}static void OnHotspotStaLeaveHandler(StationInfo *info)
{(void)info;printf("HotspotStaLeave:info is null.\n");return;
}static void OnHotspotStateChangedHandler(int state)
{printf("HotspotStateChanged:state is %d.\n", state);return;
}static void WaitSacnResult(void)
{int scanTimeout = DEF_TIMEOUT;while (scanTimeout > 0){sleep(ONE_SECOND);scanTimeout--;if (g_staScanSuccess == 1){printf("WaitSacnResult:wait success[%d]s\n", (DEF_TIMEOUT - scanTimeout));break;}}if (scanTimeout <= 0){printf("WaitSacnResult:timeout!\n");}
}static int WaitConnectResult(void)
{int ConnectTimeout = DEF_TIMEOUT;while (ConnectTimeout > 0){sleep(1);ConnectTimeout--;if (g_ConnectSuccess == 1){printf("WaitConnectResult:wait success[%d]s\n", (DEF_TIMEOUT - ConnectTimeout));break;}}if (ConnectTimeout <= 0){printf("WaitConnectResult:timeout!\n");return 0;}return 1;
}
编译调试
1.修改BUILD.gn
修改 applications\BearPi\BearPi-HM_Nano\sample
路径下 BUILD.gn 文件,指定 wifi_sta_connect
参与编译。
2.编译
Linux终端或者MobaXterm的会话连接内,进入代码目录执行 python build.py BearPi-HM_Nano
进行编译。
3.烧录
使用HiBurn工具,波特率设置为2000000.
选择对应的com口和要烧录的文件,勾选auto burn。点击connect,再点开发板复位按键。进行烧录。
4.运行结果
通过MobaXterm的串口工具查看。
ready to OS start
sdk ver:Hi3861V100R001C00SPC025 2020-09-03 18:10:00
formatting spiffs...
FileSystem mount ok.
wifi init success!00 00:00:00 0 196 D 0/HIVIEW: hilog init success.
00 00:00:00 0 196 D 0/HIVIEW: log limit init success.
00 00:00:00 0 196 I 1/SAMGR: Bootstrap core services(count:3).
00 00:00:00 0 196 I 1/SAMGR: Init service:0x4af9bc TaskPool:0xfa724
00 00:00:00 0 196 I 1/SAMGR: Init service:0x4af9e0 TaskPool:0xfad94
00 00:00:00 0 196 I 1/SAMGR: Init service:0x4afaf0 TaskPool:0xfaf54
00 00:00:00 0 228 I 1/SAMGR: Init service 0x4af9e0 <time: 0ms> success!
00 00:00:00 0 128 I 1/SAMGR: Init service 0x4af9bc <time: 0ms> success!
00 00:00:00 0 72 D 0/HIVIEW: hiview init success.
00 00:00:00 0 72 I 1/SAMGR: Init service 0x4afaf0 <time: 0ms> success!
00 00:00:00 0 72 I 1/SAMGR: Initialized all core system services!
00 00:00:00 0 128 I 1/SAMGR: Bootstrap system and application services(count:0).
00 00:00:00 0 128 I 1/SAMGR: Initialized all system and application services!
00 00:00:00 0 128 I 1/SAMGR: Bootstrap dynamic registered services(count:0).
<--System Init-->
<--Wifi Init-->
register wifi event succeed!
+NOTICE:SCANFINISH
WaitSacnResult:wait success[1]s
********************
no:001, ssid:HONOR 70 Pro , rssi: -48
no:002, ssid:FAST_3886 , rssi: -51********************
Select: 1 wireless, Waiting...
+NOTICE:CONNECTED
callback function for wifi connect
WaitConnectResult:wait success[1]s
WiFi connect succeed!
begain to dhcp<-- DHCP state:Inprogress -->
<-- DHCP state:OK -->
server :server_id : 192.168.244.147mask : 255.255.255.0, 1gw : 192.168.244.147T0 : 3599T1 : 1799T2 : 3149
clients <1> :mac_idx mac addr state lease tries rto0 3c11317c4ad7 192.168.244.27 10 0 1 4
华为云14天鸿蒙设备开发-Day7WIFI功能开发相关推荐
- 华为云14天鸿蒙设备开发培训Day3:快速入门
目录 华为云14天鸿蒙设备开发培训Day3:快速入门 OpenHarmony快速入门:Hello_World 添加Hello_World源码文件 编写Hello_World业务代码 编写编译构建文件B ...
- 华为云14天鸿蒙设备开发-Day1环境搭建
环境搭建 一.准备环境 二.Windows下环境搭建 1.安装相关驱动与软件 2.虚拟机下安装Ubuntu 3.配置Ubuntu网络 三.Ubuntu下环境搭建 1.在windows下使用MobaXt ...
- 华为云14天鸿蒙设备开发-Day1源码获取
目录 前言 一.获取源码 1.源码获取方式 1.1 从镜像站点获取 1.2 从HPM网站组件式获取 1.3 用包管理器命令行获取 1.4从代码仓库获取 二.在Windows中打开工程源码 1.映射工程 ...
- 【14天鸿蒙设备开发实战-第七章 设备联网上云 学习笔记】
14天鸿蒙设备开发实战-第七章 设备联网上云 学习笔记 一.开发环境.平台与硬件需求 二.华为IoT平台API 2.1 初始化 2.1.1 设备信息初始化 2.1.2 华为IoT平台 初始化 2.1. ...
- 华为14天鸿蒙设备开发实战笔记一
目录 一.物联网典型层级架构 二.物联网常见通信协议 1.常见通信协议1 2.常见通信协议2 3.常见通信协议3 三.物联网设备接入方式 1.有线通信技术 2.短距无线通信技术 3.蜂窝移动网络 4. ...
- 华为云WeLink会议系统还有“隐藏功能”?这些你都知道吗?
你知道华为云WeLink会议系统的"隐藏功能"吗? 今天我们来一探究竟, 看看华为云WeLink会议系统有哪些小功能是你没有发现的 01 外部联系人会议通知 发起预约会议后,会议系 ...
- 华为云物联网平台的微信小程序开发
第0章 简介 上上期出了一个华为云物联网平台的Android APP应用开发教程, 根据后台的私信,包括华为云物联网IOT论坛里和公众号里,发现大家对物联网平台的移动端的开发需求还是很大的,接下来,带 ...
- 华为云MVP高浩:打破AI开发瓶颈,解决数据、算法、算力三大难题
摘要:在高浩看来,大量的数字蓝领人才和AI应用开发人员构成了当前AI行业发展人才之基,这也为高校学生就业初期从事的工作指明了方向,而华为ModelArts平台在教育领域有着天然的数据.算法优势,非常适 ...
- MoXing——华为云深度学习服务提供的网络模型开发API
序言:MoXing是华为云深度学习服务提供的网络模型开发API.相对于TensorFlow和MXNet等原生API而言,MoXing API让模型的代码编写更加简单,而且能够自动获取高性能的分布式执行 ...
最新文章
- upgrade lnmpa php.sh,LNMP 状态管理命令说明及Nginx、MySQL/MariaDB、PHP升级教程
- log4j.logger java_java – Log4JLogger的根本原因是找不到还是不可用?
- jggrid应用于asp.net
- springCloud Finchley 实战入门(基于springBoot 2.0.3)【三 Eureka-高可用服务注册中心】...
- java面向对象(引用类型--参数传递)
- 打开fiddler后打不开网页_如何通过fiddler的导入导出功能,保存一份分类管理的请求报文...
- python文件是怎么打开_python file怎么打开
- iOS 合并静态库出现 can't move temporary file错误
- 在SPS中直接查看用HTML格式阅读Office文档
- vb6启动时提示安装VS2008 SP1
- 黑客语言Python
- 支付宝“手机网站支付”开发的相关文档和工具
- vmware 官方下载
- 智慧城市发展参差不齐 亟待分级分类破“短板”
- 2021年教师资格证 科目三 高中数学 课程标准 简答题
- Dialog_xml制作——博客地址
- 简单明了的分类算法:OneR。
- 架构师聊的四层代理和七层代理,都在聊什么?
- ffmpeg源码精读1,音视频处理概述
- STM32 的核心Cortex-M3 处理器
热门文章
- doe五步法_minitab中实验设计(doe).pdf
- java异常处理机制
- 对接腾讯企业邮箱(授权免登,获取未读邮件数量)
- 心法利器[62] | 向量召回和字面召回的选择与权衡
- Leetcode-892. 三维形体的表面积
- 测试薪资差距悬殊,我们对比北上深杭,原来藏着这些秘密!
- 【快应用】小程序转快应用如何退出整个快应用
- JS正则表达式 ,reg.test()时,慎重全局查找/.../g属性
- 如何理解Liveupdate Administrator (LUA) 下SEP的更新文件
- 斯图飞腾Stratifyd发布《2021金融服务行业客户体验报告》