HarmonyOS IoT设备开发实战

HarmonyOS IoT设备开发实战
作者: 江苏润和软件股份有限公司
出版社: 电子工业
原售价: 79.00
折扣价: 55.30
折扣购买: HarmonyOS IoT设备开发实战
ISBN: 9787121411755

作者简介

江苏润和软件股份有限公司(证券代码:300339),是中国领先的产品与解决方案提供商和平台运营商。公司主营业务横跨金融科技、物联网两大领域,以国产化、数字化为核心,以信息技术为依托,致力于向国内外客户提供从芯片、硬件、底层软件到应用平台的综合解决方案与优质科技服务,公司已与多家行业头部客户建立了密切的战略伙伴关系,全面赋能企业的数字化转型。公司业务遍及中国、日本、东南亚、北美等区域,拥有全球化的技术洞察、技术资源与服务达到能力,能够为客户提供全面、即时、高效、前沿的数字化科技服务。许思维:从事嵌入式系统软件开发近10年,从事Android系统相关产品研发6年,参与了多款内置NPU的SoC芯片的软件研发工作,参与了多个IoT相关软硬件一体化项目。对智能手机、智能手表、微控制器等资源受限系统上的软件设计、调试、开发深刻实践,对基于MQTT、CoAP等协议的物联网系统架构有一定实践经验。姜年檑:从事嵌入式软件开发5年以上。擅长C语言和Python。熟悉MCU软件开发和Linux底层驱动开发。产品领域涉及手机、智能硬件、物联网等。冯宝鹏:从事嵌入式软件开发8年以上。擅长C/C++语言、JAVA语言。熟悉Linux底层驱动开发和内核内存管理研究。产品领域涉及手机、智能手表、WiFi IOT等。蔡旭:从事嵌入式软件开发8年以上。擅长C语言,熟悉MCU软件开发和Linux底层驱动开发。产品领域涉及手机、智能家居、物联网等。沈峰:从事操作系统、云计算等基础软件产品研发和研发管理20年,擅长C语言、Python语言,精通Linux操作系统。屈博:从事嵌入式软件开发10年以上。擅长C语言,汇编语言,熟悉MCU软件开发和Linux底层驱动开发。产品领域涉及手机、智能家居、物联网、打印机等。王高浩:从事AI软件、监控软件开发、音视频编解码优化,近15年,擅长C++、C语言、汇编语言,熟悉Linux、Visual Studio开发环境以及Caffe深度学习框架,产品领域涉及视频监控平台、前端,嵌入式设备等。丁成杰:从事嵌入式软件开发4年。擅长C语言和JS,熟悉安卓recovery和应用开发。产品领域涉及手机,TV,物联网等。程劲松,从事嵌入式系统开发,精通c/c++开发,熟悉Android系统。多年芯片开发经验。

内容简介

5.2 HarmonyOS IoT硬件的Wi-Fi STA模式编程 本节主要介绍在HarmonyOS 上的Wi-Fi API。 5.2.1扫描其他Wi-Fi接入点 在HarmonyOS中,通过下面的函数来扫描Wi-Fi接入点。 WifiErrorCode Scan(void) 该函数触发Wi-Fi 接入点的扫描。若成功,则返回WIFI_SUCCESS;若错误,则返回相应的错误码。 注意,Scan函数并不会返回扫描的结果,只是触发扫描的事件,最终的扫描结果由底层的Wi-Fi芯片上报。也就是说,如果Scan函数返回WIFI_SUCCESS,那么上层也可能无法正常地获取到扫描结果。获取扫描结果需要单独调用另外一个函数,见下面的描述。 WifiErrorCode GetScanInfoList(WifiScanInfo* result, unsigned int* size) 该函数用来获取扫描结果。 result存放扫描的结果,size为result的长度。在HarmonyOS中,Wi-Fi扫描结果的数量是受限的,不能超过宏WIFI_SCAN_HOTSPOT_LIMIT定义的大小。该宏定义在foundation/communication/interfaces/kits/wifi_lite/wifiservice/ wifi_scan_info.h中,值为64。也就是说,最多只能获取64个扫描结果。 作为形参的size,一般直接传这个宏就可以了。实例代码片段如下: #include \\\\\\\\\\\\\\\"wifi_scan_info.h\\\\\\\\\\\\\\\" #include \\\\\\\\\\\\\\\"wifi_device.h\\\\\\\\\\\\\\\" WiFiScanInfo *info = malloc(sizeof(WifiScanInfo) * WIFI_SCAN_HOTSPOT_LIMIT ); if (info == NULL) { printf(\\\\\\\\\\\\\\\"Allocate memory failed.\\\\\\\\\\\\\\\\n\\\\\\\\\\\\\\\"); return NULL; } int scanInfoSize = WIFI_SCAN_HOTSPOT_LIMIT; WifiErrorCode error = GetScanInfoList(info, &scanInfoSize); if (error != WIFI_SUCCESS) { printf(\\\\\\\\\\\\\\\"Error! get Wi-Fi Scan results failed: %d\\\\\\\\\\\\\\\", error); } else { printf(\\\\\\\\\\\\\\\"Get Wi-Fi scan results success, size = %d\\\\\\\\\\\\\\\", scanInfoSize); } return info; 返回值:若成功,则返回WIFI_SUCCESS;若错误,则返回相应的错误码。 5.2.2连接到某个Wi-Fi接入点 在扫描完成之后,可以选择一个接入点,调用相关的函数进行网络连接。 WifiErrorCode ConnectTo(int networkId) 根据networkId连接一个指定的网络。networkId是WifiDeviceConfig类型的全局数组的索引。通过指定的networkId获取一个Wi-Fi的配置。 WifiDeviceConfig的定义如下: typedef struct WifiDeviceConfig { char ssid[WIFI_MAX_SSID_LEN]; // 无线网络的SSID unsiged char bssid[WIFI_MAC_LEN]; // 无线网络的BSSID char preSharedKey[WIFI_MAX_KEY_LEN]; // PSK, 即无线网络预先设置的密钥 int securityType; // 认证类型,如OPEN、WEP、WPA-PSK 等 int netId; // 网络ID,一个有效的ID,不能小于0,也不能大于10(由宏WIFI_MAX_ CONFIG_SIZE 定义) unsigned int freq; // 频段 int wapiPskType; // PSK类型,ASCII字符或者16进制数。目前,Hi3861芯片只支持ASCII字符 }; ConnectTo函数完成了认证、关联等一系列操作。 返回值:若成功,则返回WIFI_SUCCESS;若错误,则返回相应的错误码。 5.3 HarmonyOS IoT硬件的Wi-Fi AP模式编程 5.3.1创建Wi-Fi热点 在开始介绍相关的接口函数之前,有一个约定需要说明一下。 本节是介绍Wi-Fi AP模式编程的,但是你会发现接下来要介绍的函数的名字都包含了hotspot,即热点。热点和接入点是两个不同的概念。这里需要解释一下。 HarmonyOS使用下面的函数创建Wi-Fi热点: (1)WifiErrorCode EnableHotspot(void) 调用上面的函数,可以在HarmonyOS中开启接入点功能,并设置全局变量g_wifiApStatus为ACTIVE状态。你可能会觉得奇怪,难道开启接入点功能什么参数都不需要吗?接入点需要配置SSID,可能也需要配置PSK、设置频段等操作。为什么这个函数一个参数都没有?与接入点相关的这些参数是怎么设置进去的? 这是因为HarmonyOS使用一个叫g_wifiApConfig的全局变量保存接入点的配置,该变量是HotspotConfig类型的,为一个结构体。关于该结构体,在本节的后面会进行介绍。 返回值:若成功,则返回WIFI_SUCCESS;若错误,则返回相应的错误码。 (2)WifiErrorCode DisableHotspot(void) 该函数用于禁用接入点功能,并设置全局变量g_wifiApStatus 为NOT ACTIVE状态。 返回值:若成功,则返回WIFI_SUCCESS;若错误,则返回相应的错误码。 (3)int IsHotspotActive(void) 该函数用于获取接入点的状态。这里要说明一下,从这个函数名来看,似乎该函数用于判断当前设备的AP模式有没有使能。这个函数最终只返回上面所提到的全局变量g_wifiApStatus的值。也就是说,实际上这个函数只返回状态,而不判断AP模式是不是使能。我们可以针对这个函数重新封装一个返回值为布尔型的函数,若返回TRUE,则表示接入点功能被开启,若返回FALSE,则表示接入点功能被禁用。实现方法如下: #include \\\\\\\\\\\\\\\"wifi_hotspot.h\\\\\\\\\\\\\\\" #include \\\\\\\\\\\\\\\"wifi_event.h\\\\\\\\\\\\\\\" BOOL IsHotspotEnabled(void) { int apStatus = IsHotspotActive(); return apStatus == WIFI_HOTSPOT_ACTIVE; } 返回值:若成功,则返回接入点状态,若错误,则返回相应的错误码。 (4)WifiErrorCode GetStationList(StationInfo* result, unsigned int* size) 该函数用于获取当前连接到接入点的STA信息。size 表示存储StationInfo 数组的长度,即result的长度。 根据HarmonyOS的定义,最多只能获取6个STA的信息。由宏WIFI_MAX_STA_NUM 控制。 该宏定义在foundation/communication/interfaces/kits/wifi_lite/wifiservice/ wifi_hotspot_config.h中。 返回值:若成功,则返回WIFI_SUCCESS;若错误,则返回相应的错误码。 (5)WifiErrorCode SetHotspotConfig(const HotspotConfig* config) 该函数用于接入点配置。在上文中提到,在使能AP模式的函数中,没有任何参数传递,这是因为接入点需要的配置信息都保存在一个全局变量g_wifiApConfig中。这个全局变量就是通过该函数设置的。HotspotConfig结构体的定义如下: typedef struct { char ssid[WIFI_MAX_SSID_LEN]; // SSID名称 int securityType; // 认证类型 int band; // 频带 int channelNum; // 信道 char preSharedKey[WIFI_MAX_KEY_LEN]; // PSK } HotspotConfig; 该函数将形参config的值拷贝到全局变量g_wifiApConfig 中。根据此config,可以调用EnableHotspot函数开启接入点功能。 返回值:若成功,则返回WIFI_SUCCESS;若错误,则返回相应的错误码。 (6)WifiErrorCode GetHotspotConfig(HotspotConfig*result) 该函数比较好理解,就是获取全局变量g_wifiApConfig 中的内容,将其拷贝到result 中。 返回值:若成功,则返回WIFI_SUCCESS;若错误,则返回相应的错误码。 (7)int GetSignalLevel(int rssi, int band) 该函数用于获取信号强度等级。rssi是Received Signal Strength Indicator的缩写,即接收信号强度指示,用于判断接收的信号质量。 rssi在不同的频带下有不同的值,代表的强度不一样。rssi的单位是DBm(分贝毫瓦),是用于描述功率的单位。其值一般在-90~0。数值越大,说明信号越好。 该函数根据rssi和频带的值,返回一个HarmonyOS定义的信号等级。目前的值是1,2,3,4这四个等级,由枚举变量RssiLevel定义,用于指示当前Wi-Fi的信号状态。根据这个状态,可以在设备状态栏中刷新指示Wi-Fi连接的图标。下面是HarmonyOS定义的信号等级枚举类型定义: typedef enum { RSSI_LEVEL_1 = 1, RSSI_LEVEL_2 = 2, RSSI_LEVEL_3 = 3, RSSI_LEVEL_4 = 4, } RssiLevel; 返回值:若成功获取到信号,则返回Signal Level,否则返回-1。 信号等级和rssi的对应关系如表5 2所示。 表5 2 信号等级 2.4GHz热点rssi范围 5GHz热点rssi范围 1 -88≤rssi<-82 -85≤rssi<-79 2 -82≤rssi<-75 -79≤rssi<-72 3 -75≤rssi<-65 -72≤rssi<-65 3 -65≤rssi<0 -65≤rssi<0 HarmonyOS(鸿蒙操作系统)是一款“面向未来”的操作系统,是万物互联的基础,会给人们的生活带来巨大的变化! 《HarmonyOS IoT设备开发实战》介绍如何使用HarmonyOS开发物联网设备端软件,具体包括外设控制、网络编程、物联网平台接入等。从0到1,教你开发一个物联网应用。