2024鴻蒙物聯(lián)網(wǎng)設(shè)備開發(fā)應(yīng)用_第1頁
2024鴻蒙物聯(lián)網(wǎng)設(shè)備開發(fā)應(yīng)用_第2頁
2024鴻蒙物聯(lián)網(wǎng)設(shè)備開發(fā)應(yīng)用_第3頁
2024鴻蒙物聯(lián)網(wǎng)設(shè)備開發(fā)應(yīng)用_第4頁
2024鴻蒙物聯(lián)網(wǎng)設(shè)備開發(fā)應(yīng)用_第5頁
已閱讀5頁,還剩198頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

HarmonyOSIoT目錄TOC\o"1-3"\h\u5993搭建HarmonyOS 7117571.1海思Hi3861 7112851.2Wi-FiIoT 8188051.2.1 9212431.2.2 10219901.2.3 11249271.2.4 12271931.2.5 12220281.2.6OLED 1399461.2.7NFC 14167181.3準(zhǔn)備HarmonyOS 14118531.3.1 14187961.3.2 15194981.3.3 1662201.4搭建HarmonyOS編譯環(huán)境 1612211.4.1 1689391.4.2 17233531.4.3 174521. 17186092. 1724111.4.4安裝Samba 18305071.5下載和編譯HarmonyOS 1832871.5.1獲取HarmonyOS 1989571.5.2HarmonyOS源代碼目錄簡介 19161851.5.3編譯HarmonyOS 20250682. 2064811.6使用HUAWEIDevEcoDevice 21173021.6.1下載HUAWEIDevEcoDeviceTool 2116931.下載HUAWEIDevEcoDevice 2177962.下載VSCode 212193.下載Node.js 21137744.下載 21134871.6.2安裝HUAWEIDevEcoDevice 2221221.安裝VSCode 22246902.安裝 23215063.安裝JDK 23262214. 2410955.安裝HUAWEIDevEcoDevice 2456556.安裝其他VSCode 2578021.6.3映射Samba 2530831.6.4用HUAWEIDevEcoDeviceTool 2711933(3)稍等片刻后,項(xiàng)目導(dǎo)入成功,如圖1-24 28181201.7 29311201.7.1下載CH340 29160101.7.2安裝CH340 30107761.7.3 301761.7.4 325909用HarmonyOS控制I/O 3350042.1從編寫HelloWorld 33298592.1.1編寫HelloWorld 33198671.創(chuàng)建名為hello.c 3338242.修改BUILD.gn 33254472.1.2 34258692.1.3 34188602.1.4 38274002.2使用GPIO 39136882.2.1GPIO 39138372.2.2HarmonyOSIoT硬件子系統(tǒng)的GPIO模塊與輸出相關(guān)的 3946902.2.3核心板可編程LED 40108532.2.4通過GPIO模塊控制LED 40181061.創(chuàng)建led.c 40170283.編譯led.c 4285682.3使用GPIO 43326582.3.1HarmonyOSIoT硬件子系統(tǒng)的GPIO模塊與輸入相關(guān)的 43242142.3.2核心板USER 43222752.3.3通過查詢GPIO狀態(tài)控制LED 44268761.創(chuàng)建gpio_input_set.c 44200372.創(chuàng)建BUILD.gn 45261093.編譯gpio_input_set.c 45155012.3.4通過注冊(cè)GPIO中斷控制LED 46169951.創(chuàng)建gpio_input_int.c 46113292.編譯gpio_input_int.c 48298772.4使用PWM 49247342.4.1PWM 4917392.4.2HarmonyOSIoT硬件子系統(tǒng)的PWM模塊的相關(guān) 49270042.4.3 50186722.4.4通過輸出PWM 51159791.創(chuàng)建pwm_buz.c 51253762.創(chuàng)建BUILD.gn 52254693.編譯pwm_buz.c 52238432.4.5通過PWM 53280122.4.6通過PWM模塊控制蜂鳴器的音量和LED 5515507使用HarmonyOS 56102493.1使用ADC 5641173.1.1HarmonyOSIoT硬件的ADC 5631000(3)支持從解復(fù)位到開始ADC 5614664(6)支持FIFO 56110063.1.2Wi-FiIoT 5749192.三色LED 58260963. 58167193.1.3 5949913.1.4 6049153.1.5傳感器狀態(tài)控制三色LED 6119823.1.6使用ADC 623030(1) 6325681(2) 64201673.2其他ADC 6733593.2.1與環(huán)境檢測(cè)板MQ-2 6732293.2.2MQ-2 689013.2.3讀取MQ-2可燃?xì)怏w傳感器的ADC 6940523.3使用I2C 70256633.3.1HarmonyOSIoT硬件的I2C 70219301.I2C 70259442.HarmonyOS所提供的I2C 70150263.3.2AHT20 72237803.3.3 72167013.3.4實(shí)現(xiàn)AHT20 73241513.3.5獲取AHT20 7626567OLED 82111824.1使用HarmonyOS驅(qū)動(dòng)OLED 82307264.1.1OLED 82247754.1.2OLED 8315192(1)將開發(fā)板翻過來,使OLED 83129574.1.3OLED 8410134(1)將GPIO13、GPIO14引腳復(fù)用為I2C0 86105634.1.4在OLED 86285741.OLED 86130114.1.5在OLED顯示屏上繪制ASCII 88320202.OLED 9378474.2在OLED 94176934.2.1 94193554.2.2 94143855.1Wi-Fi 101269255.1.1Wi-Fi 101197611.Wi-Fi 101273072.Wi-Fi 102272295.1.2Wi-Fi 10312381.Station 103171302.AP 10445185.2HarmonyOSIoT硬件的Wi-FiSTA 104138845.2.1掃描其他Wi-Fi 104212605.2.2連接到某個(gè)Wi-Fi 105261375.3HarmonyOSIoT硬件的Wi-FiAP 10653495.3.1創(chuàng)建Wi-Fi 1069043(3)int 107285495.3.2提供DHCP 10932435.4HarmonyOSIoT硬件Wi-Fi 11214199(1)WifiErrorCode 11223048(3)int 11319562HarmonyOS 117241186.1TCP/IP 117185342. 118234973. 121229694. 122281146.2LwIP 12295321. 12329552. 123153363. 12497705.UDP 126178626.TCP 12867746.3TCP 130219636.3.1TCP 130153156.3.2TCP 13213592(6)使用close()函數(shù)關(guān)閉sockfd和connfd 136114866.4UDP 136106796.4.1UDP 13666206.4.2UDP 1397121(5)使用close()函數(shù)關(guān)閉此sockfd 14119318HarmonyOSIoT 142219927.1CMSIS-RTOSAPIV2簡介及 142319107.2 143162897.3 149298887.4 150123207.5 153120217.6 15771767.7 16125288MQTT 165175538.1什么是MQTT 16574968.2 165308168.3MQTT協(xié)議的特性 16522802(1)MQTT 16515357(2)MQTT協(xié)議基于TCP/IP 166131588.4MQTT 16679658.4.1基于MQTT 16637938.4.2 166279328.4.3 167143941. 16767402. 16723933. 16874868.4.4基于MQTT 16871361.QoS0 16865222.QoS1 168314473.QoS2 169133618.5Paho-MQTT 170276488.6Paho-MQTT 171257118.6.1 172310408.6.2 17226469(2)掃描周邊的接入點(diǎn),測(cè)試命令為AT+SCAN 17225179(5)查看連接結(jié)果,測(cè)試命令為AT+STASTAT 17232698(7)查看網(wǎng)絡(luò)配置,測(cè)試命令為AT+IFCFG 17385838.6.3服務(wù)端應(yīng)用Mosquitto 17382708.7使用MQTT 17416803 17426135(1)Name: 177315073.IoT 1798714 181298401. 181315352.下載 18112144在VirtualBox中安裝Ubuntu20.04 185128681.創(chuàng)建Ubuntu 1859008(1) 1877078(3)在“虛擬硬盤文件類型”選區(qū)中,有多種格式可供選擇,默認(rèn)為 188272052.選擇Ubuntu 188187763.安裝Ubuntu 190129275.停止Ubuntu 197282506.啟動(dòng)Ubuntu 197300867. 1983511(1)選中VirtualBox 198251438. 19923274使用SSH 199260902.使用PuTTY登錄Linux 2007822使用開源鏡像站加速安裝apt軟件包和pip 20231977(3)運(yùn)行sudoaptupdate 203188062.pip 20327552(1)創(chuàng)建~/.pip目錄,執(zhí)行mkdir~/.pip 20329090Hi3861 203第1第1搭建HarmonyOS和相關(guān)軟件安裝。本章將介紹如何搭建HarmonyOSIoT設(shè)備開發(fā)所需的開發(fā)環(huán)境。海思Hi3861的一款2.4GHzWi-FiSoC芯片,該芯片內(nèi)部集成了IEEE802.11b/g/n基帶和射頻(RadioFrequency,RF)電路。Hi3861芯片集成了32位高能效RISC-V指令集架構(gòu)CPU,內(nèi)置了控制接口和2.4GHzWi-Fi,使用該芯片可以簡單、快速、低成本地實(shí)現(xiàn)設(shè)備控制和網(wǎng)絡(luò)連Hi3861(1)32位高能效RISC-V指令集架構(gòu)CPU,最大工作頻率為160MHz內(nèi)置存儲(chǔ):352KBSRAM,2MBFlash①15個(gè)通用輸入/輸出(GeneralPurposeInput/Output,GPIO)②7路模數(shù)轉(zhuǎn)換器(AnalogtoDigitalConverter,ADC)③6路脈寬調(diào)制(PulseWidthModulation,PWM)3個(gè)通用異步收發(fā)器(UniversalAsynchronousReceiverandTransmitter,⑤2個(gè)串行外設(shè)接口(SynchronousPeripheralInterface,SPI)?2個(gè)內(nèi)部集成電路(TheInterIntegratedCircuit,I2C)⑦1個(gè)內(nèi)部集成電路音頻(Inter-ICSound,I2S)⑧1個(gè)安全數(shù)字輸入輸出(SecureDigitalInput/Output,SDIO)更多的Hi38611-1所圖1-Wi-FiIoT本書中的所有實(shí)例代碼均是基于HiSparkWi-FiIoT智能家居開發(fā)套件(簡稱為Wi-FiWi-FiIoTOLEDNFCHi3861CH340USBUSBType-C可編程LEDCH340USB轉(zhuǎn)串口芯片連接了主控芯片UART接口和核心板USBType-C接口,實(shí)現(xiàn)了主控芯片UART接口和核心板USBType-C接口之間的信號(hào)轉(zhuǎn)換,進(jìn)而實(shí)現(xiàn)了串口調(diào)試功能。復(fù)位按鍵用于觸發(fā)主控芯片的CPULEDUSER,CH340USB轉(zhuǎn)串口芯片之間的連接將會(huì)斷開,此時(shí)主控芯片的UART接口的TX和RX引腳將會(huì)核心板的外觀如圖1-2圖1-用于插入核心板,4,4供電或通過USB線連接移動(dòng)電源進(jìn)行供電。底板的外觀如圖1-3圖1-紅色LED黃色LED綠色LED圖1-三色LED炫彩燈板的外觀如圖1-5圖1-AHT20MQ-2AHT20溫度和相對(duì)濕度,MQ-2圖1-OLEDOLED(1)0.96寸OLED顯示屏[1]SSD1306圖1-NFCNFCFM11C08INFC印制電路NFC印制電路NFC線圈用于接收NFC信號(hào)。FM11C08INFCNFC以及與主控芯片通信。兩位撥碼開關(guān)用于功能選擇。NFC擴(kuò)展板的外觀如圖1-8所示。圖1-準(zhǔn)備HarmonyOSHarmonyOSHarmonyOS基于Wi-FiIoT開發(fā)套件的典型的HarmonyOS開發(fā)環(huán)境如圖1-9圖1-Linux機(jī)(在虛擬機(jī)中安裝Ubuntu20.04系統(tǒng),請(qǐng)參考附錄B)。圖1-Wi-FiIoT開發(fā)套件,它和Windows主機(jī)之間通常通過USB搭建HarmonyOS一套HiSparkWi-FiIoT本書的所有實(shí)例代碼均基于該開個(gè)人計(jì)算機(jī)最好是Windows系統(tǒng)的,因?yàn)槟壳暗腍armonyOS燒錄工具在Linux系統(tǒng)或macOSLinux系統(tǒng)或macOS的,那么需要借助Wine連接到一個(gè)無線接入點(diǎn)(AccessPoint)上。因此,你需要有一個(gè)支持IEEE802.11搭建HarmonyOS的最新LTS版本—20.04LTS,下載桌面版或服務(wù)器版均可。桌面版具有圖形用戶頁面,同VisualStudioCode代碼編輯器:一個(gè)功能豐富的代碼編輯器,以下簡稱為VSCode編輯器。VSCode編輯器支持多種編程語言,同時(shí)提供了眾多插件用于支持各種代碼編輯、調(diào)試等功能。在后續(xù)的章節(jié)中,我們都將通過它編輯代碼。你可以通過VSCode官網(wǎng)下載最新版本的VSCode安裝包。HUAWEIDevEcoDeviceTool:用于將編譯好的二進(jìn)制文件燒錄到開發(fā)板上,同時(shí)具有串口調(diào)試等功能。它本身是一個(gè)VSCode插件,需要以插件的形式安裝到VSCode編HarmonyOS設(shè)備開發(fā)網(wǎng)站下載此插件的最新版本。CH340USB轉(zhuǎn)串口芯片驅(qū)動(dòng)軟件:CH340USB轉(zhuǎn)串口芯片(簡稱為CH340芯片)是由南京沁恒微電子有限公司設(shè)計(jì)的一款USB轉(zhuǎn)串口芯片。Wi-FiIoT開發(fā)套件的核心板上集搭建HarmonyOS編譯環(huán)境本節(jié)將介紹如何在編譯服務(wù)器的Ubuntu20.04系統(tǒng)上搭建HarmonyOS的編譯環(huán)境,具在開始搭建編譯環(huán)境之前,你需要先在編譯服務(wù)器上安裝Ubuntu20.04系統(tǒng)。關(guān)于如何在虛擬機(jī)中安裝Ubuntu20.04系統(tǒng),請(qǐng)參考附錄B。在物理機(jī)器上安裝Ubuntu20.04系在Ubuntu20.04系統(tǒng)上搭建HarmonyOS編譯環(huán)境之前,需要先安裝編譯環(huán)境依賴的軟UbuntuTerminal,Alt+Ctrl+T執(zhí)行sudoaptinstallpython3-pip命令,安裝Python包管理工具。在Python包管理工具安裝成功后,即可使用Python包管理工具安裝其他Python軟件包。執(zhí)行pip3installscons命令,安裝scons軟件包。scons軟件包主要用于Hi3861SDK的編譯和構(gòu)建。執(zhí)行pip3installkconfiglib命令,安裝kconfiglib軟件包。kconfiglib軟件包主要用于根據(jù)Kconfig配置文件生成Makefile代碼段和頭文件。執(zhí)行pip3installpycryptodomeecdsa命令,安裝pycryptodome和ecdsa軟件執(zhí)行echo'exportPATH=~/.local/bin:$PATH'|tee-a~/.bashrc交叉編譯工具包,用于在Linux系統(tǒng)上編譯出Hi3861gn軟件包,用于根據(jù)BUILD.gn文件生成ninjaninja軟件包,用于執(zhí)行ninja假設(shè)你已將交叉編譯工具包下載到了本地~/DownloadsHi3861交叉編UbuntuTerminal,Alt+Ctrl+T執(zhí)行echo'exportPATH=~/gcc_riscv32/bin:$PATH'|tee-a~/.bashrc命令,gnninjagnninja軟件包UbuntuTerminal,Alt+Ctrl+T執(zhí)行tar-xvf~/Downloads/gn.1523.tar-C~/命令,解壓gn執(zhí)行tar-xvf~/Downloads/ninja.1.9.0.tar-C~/命令,解壓ninja執(zhí)行echo'exportPATH=~/gn:~/ninja:$PATH'|tee-a~/.bashrc安裝Samba譯服務(wù)器的Ubuntu20.04系統(tǒng)上安裝Samba服務(wù)。借助于Samba服務(wù),通過網(wǎng)絡(luò)共享執(zhí)行sudoaptinstallsamba命令,安裝Samba執(zhí)行sudogedit/etc/samba/smb.conf命令,打開并修改Samba配置文注:可以通過執(zhí)行mansmb.conf命令查閱幫助手冊(cè)了解Samba執(zhí)行sudosmbpasswd-auser命令,創(chuàng)建Samba用戶,其中user名。在該命令被執(zhí)行后,終端會(huì)輸出“NewSMBpassword:”提示輸入密碼。在輸入密碼并按車鍵后,終端會(huì)輸出“RetypenewSMBpassword:”提示確認(rèn)密碼,再次輸入同樣的密碼并按車鍵后,終端輸出“Addeduseruser.”表示Samba用戶添加完成。建議執(zhí)行sudoservicesmbdrestart命令,重啟Samba下載和編譯HarmonyOSHarmonyOSLinuxOpenHarmonyHarmonyOSOpenHarmony都在不斷迭代演進(jìn),應(yīng)用程序編程接口(API)OpenHarmony1.0寫。若讀者想了解最新版本的OpenHarmonyAPI和相關(guān)的源代碼,則可以從HarmonyOS官網(wǎng)獲取HarmonyOSHarmonyOSHarmonyOS設(shè)假設(shè)你已經(jīng)將代碼壓縮包文件下載到本地~/Downloads目錄下,文件名為code-執(zhí)行mkdir~/openharmonyHarmonyOS源代碼目錄簡介圖1-各個(gè)目錄或文件的簡單說明見表1-1表1-編譯HarmonyOSUbuntu20.04Python3.8,解釋命令名為python3。需PythonPython3Python解釋器設(shè)置為Python3執(zhí)行sudoln-s/usr/bin/python3/usr/bin/python命令,創(chuàng)建指向/usr/bin/python32.在HarmonyOS源代碼的頂層目錄下,執(zhí)行pythonbuild.pywifiiot命令。在一段時(shí)間后,編譯結(jié)束,若輸出BUILDSUCCESS,則表示編譯成功,如圖1-12所示。圖1-使用HUAWEIDevEcoDeviceHUAWEIDevEcoDeviceTool是HarmonyOS官方提供的開發(fā)工具,為開發(fā)者提供了代碼編輯和軟件調(diào)試于一體的集成開發(fā)能力。HUAWEIDevEcoDeviceTool是以VSCode編輯器插件的形式發(fā)布的。因此,在安裝HUAWEIDevEcoDeviceTool之前,需要先安裝VSCode下載HUAWEIDevEcoDeviceTool下載HUAWEIDevEcoDevice在HarmonyOS設(shè)備開發(fā)網(wǎng)站的IDE頁面上,可以下載HUAWEIDevEcoDeviceTool,如圖1-HarmonyOSzipzip壓縮包解下載VSCodeVSCodeVSCode官網(wǎng)的下載Node.jsHUAWEIDevEcoDeviceTool依賴一些使用Node.js開發(fā)的組件。因此,在安裝HUAWEIDevEcoDeviceTool之前,需要先下載并安裝Node.js安裝包。可以在Node.js官方網(wǎng)站下載Node.js安裝包。注意,在下載時(shí)請(qǐng)選擇LTS12.0.0及以上版本。下載HUAWEIDevEcoDeviceTool包含一些使用Java開發(fā)的組件。因此,在安裝HUAWEIDevEcoDeviceTool之前,需要先下載并安裝JDK或OpenJDK。可以在Java官方網(wǎng)站下載圖1-安裝HUAWEIDevEcoDevice在安裝HUAWEIDevEcoDeviceTool之前,需要先安裝HUAWEIDevEcoDeviceTool依賴的軟件,具體包括VSCode編輯器、Node.js、JDK/OpenJDK、以及包管理器。安裝VSCode在VSCode圖1-默認(rèn)運(yùn)行VSCode編輯器。安裝HUAWEIDevEcoDeviceTool依賴Node.js,因此在安裝HUAWEIDevEcoDeviceTool在Node.js安裝包下載完成后,單擊安裝包進(jìn)行安裝,勾選“IacceptthetermsinLicenseAgreement”(我接受許可協(xié)議中的條款)按鈕,其余選項(xiàng)全部按照默在Node.js置”→“高級(jí)”→“環(huán)境變量”→“系統(tǒng)變量”,新增NODE_PATH環(huán)境變量,值為在以上操作完成后,按Win鍵(或Win+R組合鍵)輸入cmd命令并按車鍵,打開命令安裝JDKHUAWEIDevEcoDeviceTool依賴Java8,因此在安裝HUAWEIDevEcoDeviceTool之前需要先安裝Java8。若已經(jīng)安裝了Java8,則可以跳過此步驟。打開命令提示符窗口,運(yùn)行java-version命令,檢測(cè)Java在Java官網(wǎng)或OpenJDK網(wǎng)站下載JDK運(yùn)行JDK或OpenJDK安裝包,按照向?qū)Р僮?,安裝Javajava-versionHUAWEIDevEcoDeviceTool依賴HarmonyOS包管理器(hpm),因此在安裝HUAWEIDevEcoDeviceTool前需要先安裝HarmonyOS包管理器。具體操作步驟如下。按Win鍵(或Win+R組合鍵)輸入cmd命令并按車鍵,打開命令提示符窗口執(zhí)行npminstall-g@ohos/hpm-cli命令,安裝HarmonyOShpm-V(V)。安裝HUAWEIDevEcoDevice在VSCode編輯器、Node.js、JDK/OpenJDK和HarmonyOS包管理器安裝成功后,就可以安裝HUAWEIDevEcoDeviceTool了,具體操作步驟如下。打開VSCode單擊VSCode編輯器左側(cè)的“EXTENSION”(擴(kuò)展)圖標(biāo),單擊左側(cè)邊欄右上角的“…”按鈕顯示下拉菜單,在下拉菜單中選擇“InstallfromVSIX…”(從VSIX中安圖1-的HUAWEIDevEcoDeviceTool,如圖1-17所示。圖1-安裝其他VSCode在網(wǎng)絡(luò)連接正常的情況下,你可以通過VSCode編輯器的“EXTENSION”頁面,在線搜C/C++,該插件用于提供C/C++Chinese(Simplified)LanguagePackforVisualStudioCode,簡體中文插件,該插件用于提供VSCode編輯器菜單的中文顯示。映射Samba如果你的編譯服務(wù)器Ubuntu20.04系統(tǒng)上已經(jīng)成功地安裝了Samba服務(wù),并且配置了地磁盤。在映射到本地磁盤后,就可以使用Windows上的編輯器修改Samba服務(wù)的共享目VSCode編輯代碼。在Windows主機(jī)上,映射Samba服務(wù)的共享目錄找到并打開“映射網(wǎng)絡(luò)驅(qū)動(dòng)器”下拉菜單,例如在Windows10中,可以在文件圖1-SambaIP57,Samba服務(wù)配置入“\\57\home\user”。然后,單擊“完成”按鈕,如圖1-19圖1-如果你輸入的Samba址欄中看到映射了本地盤符,如圖1-21圖1-圖1-用HUAWEIDevEcoDeviceTool在VSCode編輯器安裝HUAWEIDevEcoDeviceTool插件后,在下一次打開時(shí)會(huì)彈出HUAWEIDevEcoDeviceTool的歡迎頁面,如圖1-22所示。使用HUAWEIDevEcoDeviceTool圖1-圖1-在“導(dǎo)入工程”頁面中,在“選擇文件夾”文本框中輸入\openharmony”,HarmonyOS稍等片刻后,項(xiàng)目導(dǎo)入成功,如圖1-24圖1-VSCode編輯器內(nèi)置了多套顏色主題,可以通過“文件”→“首選項(xiàng)”→“顏色主在Wi-FiIoT開發(fā)套件的核心板上搭載了CH340芯片,用于實(shí)現(xiàn)USBType-C接口和主控芯片UART接口之間的數(shù)據(jù)傳遞。在使用串口調(diào)試工具之前,我們需要先下載并安裝串口下載CH340CH340USBUART串口芯片??梢詮脑摴竟倬W(wǎng)的CH340產(chǎn)品頁面中找到CH340芯片的相關(guān)資料,如圖1-25所示。圖1-CH341SER.EXE(Windows系統(tǒng)驅(qū)動(dòng)程序)COMTransmit.ZIP(Windows串口調(diào)試軟件)安裝CH340CH341SER.EXE1-26所圖1-單擊“安裝”按鈕即可安裝CH340芯片的驅(qū)動(dòng)到Windows在COMTransmit.ZIP文件下載完成后,將其解壓,可以得到兩個(gè)文件,如圖1-27圖1-COMTransmit.EXE是串口工具軟件,COMTransmit.ini將用16進(jìn)制的數(shù)據(jù)顯示接收到的內(nèi)容,可以顯示一些不能顯示的數(shù)據(jù)(例如,ASCII碼圖1-將Wi-FiIoT開發(fā)套件通過USBType-C圖1-打開串口調(diào)試工具,在“串口號(hào)”下拉菜單中選擇“COM9”第2第2用HarmonyOS控制I/O從編寫HelloWorld本節(jié)將會(huì)介紹如何使用C語言為開發(fā)板編寫一個(gè)HelloWorld程序,如何將編譯好的二編寫HelloWorld創(chuàng)建名為hello.c在代碼實(shí)例中,ohos_init.hHarmonyOSSYS_RUNohos_init.h修改BUILD.gn在OpenHarmony源代碼的頂層目錄下,執(zhí)行pythonbuild.pywifiiot命令,開始編為HUAWEIDevEcoDeviceTool單擊VSCode編輯器底部狀態(tài)欄的“開發(fā)板:None”按鈕,打開開發(fā)選擇下拉菜單,如圖2-1所示(或單擊圖中左側(cè)標(biāo)記1處的“DEVECOTASKS”菜單,再單擊圖中標(biāo)記2圖2-Hi3861Hi3861_wifiiot_app_allinone.bin文件,并在“方式”下拉菜單中選擇“HiBurn”選圖2-圖2-圖2-使用HUAWEIDevEcoDeviceTool使用HUAWEIDevEcoDeviceTool單擊VSCode會(huì)輸出一些提示信息,如圖2-5在終端窗口輸出“PleasetaptheReset-Keytoresettheboard”后,按下一段時(shí)間后,若終端窗口輸出“Succeedtoloadandwriteimage”,則表示圖2-圖2-在燒錄成功后,使用串口調(diào)試工具或HUAWEIDevEcoDeviceTool集成的串口工具均使用HUAWEIDevEcoDeviceTool單擊VSCode編輯器底部狀態(tài)欄的“串口”按鈕,終端窗口會(huì)輸出打開串口相關(guān)在“Picktheoneforopenning:”提問后,輸入開發(fā)板實(shí)際的串口號(hào),例如按照實(shí)際的串口設(shè)備參數(shù)輸入接下來的幾個(gè)參數(shù),在“Setendlinecharactersas'\r\n'?”提問后輸入1,如圖2-7所示。圖2-圖2-使用GPIOHarmonyOSIoTGPIOAPI,控制核GPIOGPIO是GeneralPurposeInput/Output的英文縮寫。Hi3861芯片內(nèi)部包含了GPIO模HarmonyOSIoT硬件子系統(tǒng)的GPIO模塊與輸出相關(guān)的HarmonyOSIoT(ApplicationProgrammingInterface,API)。其中,GPIO模塊的相關(guān)API可用于控制芯片引腳的數(shù)字表2-核心板可編程LED核心板可編程LED燈部分的原理如圖2-9圖2-在原理圖中,J3是兩根排針,默認(rèn)由跳帽連接,是導(dǎo)通狀態(tài)的,可視為直連狀態(tài)的。LED1LEDJ3和主控芯片GPIO09引腳連接,另制LED1的狀態(tài)。結(jié)合原理圖分析可知,主控芯片GPIO09引腳狀態(tài)和LED1狀態(tài)的對(duì)應(yīng)關(guān)表2-通過GPIO模塊控制LED創(chuàng)建led.cOpenHarmonyapplications/sample/wifi-iot/app/目錄下創(chuàng)建IoSetFunc(Hi3861GpioSetOutputVal3.編譯led.c在創(chuàng)建完led.c和BUILD.gnapplications/sample/wifi-iot/appBUILD.gn在OpenHarmony源代碼的頂層目錄下,執(zhí)行pythonbuild.pywifiiot一段時(shí)間后,若終端輸出“BUILDSUCCESS”,在燒錄完成后,按下復(fù)位按鍵,你將會(huì)看到主板上的LED使用GPIO本節(jié)將介紹如何使用HarmonyOSIoT硬件子系統(tǒng)的GPIO模塊的相關(guān)API,通過按鍵控制HarmonyOSIoT硬件子系統(tǒng)的GPIO模塊與輸入相關(guān)的HarmonyOSIoT硬件子系統(tǒng)的GPIO模塊與輸入相關(guān)的API和功能描述見表2-3表2-通過HarmonyOSIoT硬件子系統(tǒng)的GPIO模塊的相關(guān)API實(shí)現(xiàn)輸入功能,主要有兩種方查詢方式,應(yīng)用代碼通過GpioGetInputVal核心板USER核心板USER按鍵部分的原理如圖2-10圖2-在原理圖中,S2GPIO05,S2地。因此,當(dāng)按鍵被按下時(shí),GPIO05引腳將會(huì)接地,即處于低電平狀態(tài)。通過查詢GPIO狀態(tài)控制LED創(chuàng)建gpio_input_set.cOpenHarmonyapplications/sample/wifi-iot/app/目錄下創(chuàng)建創(chuàng)建BUILD.gn編譯gpio_input_set.c修改完BUILD.gn在OpenHarmony源代碼的頂層目錄下執(zhí)行pythonbuild.pywifiiot命令,開始以查看串口輸出的日志,可編程LED燈應(yīng)為熄滅狀態(tài)。因?yàn)樵诖a中設(shè)置了上拉,因此此時(shí),按下USER按鍵,LED燈將會(huì)亮,松開USER按鍵后,LED通過注冊(cè)GPIO中斷控制LED創(chuàng)建gpio_input_int.c編譯gpio_input_int.c在創(chuàng)建完gpio_input_int.capplications/sample/wifi-iot/app/gpio_demoBUILD.gn文在OpenHarmony源代碼的頂層目錄下執(zhí)行pythonbuild.pywifiiot命令,開始LEDg_ledPinValue變量的默認(rèn)值為WIFI_IOT_GPIO_VALUE0,把GPIO09引腳的輸出狀態(tài)設(shè)置為該值后將會(huì)輸出低電平。USER,LEDUSER按鍵后,LED燈仍然熄滅,再次按下USER按鍵被按下時(shí)LED燈的亮和滅會(huì)發(fā)生一次改變。使用PWMHarmonyOSIoT硬件子系統(tǒng)的脈寬調(diào)制(PulseWidthModulation,PWM)模塊的相關(guān)API控制蜂鳴器發(fā)聲和LED燈的亮度。PWMHarmonyOSIoT硬件子系統(tǒng)的PWM模塊的相關(guān)HarmonyOSIoT硬件子系統(tǒng)的PWM模塊的相關(guān)API和功能描述見表2-4表2-PwmInit函數(shù)的port參數(shù)為WifiIotPwmPort枚舉類型,用于指定使用Hi3861芯PWMWifiIotPwmPortHi3861芯片PWM輸出通道直接①WIFI_IOT_PWM_PORT_PWM0,PWM0②WIFI_IOT_PWM_PORT_PWM1,PWM1③WIFI_IOT_PWM_PORT_PWM2,PWM2④WIFI_IOT_PWM_PORT_PWM3,PWM3⑤WIFI_IOT_PWM_PORT_PWM4,PWM4?WIFI_IOT_PWM_PORT_PWM5,PWM5freq參數(shù)用于控制輸出的PWM信號(hào)頻率,具體輸出的頻率Fout等于時(shí)鐘源頻率Fclk②duty參數(shù)用于指定占空比,占空比的具體值為duty參數(shù)和freqPwmStop函數(shù)、PwmDeinit函數(shù)和PwmInit函數(shù)的portPwmSetClock函數(shù)是HarmonyOS發(fā)布后新增的接口,在使用“從代碼倉庫獲WifiIotPwmClkSourcePWMWifiIotPwmClkSource枚①WIFI_IOT_PWM_CLK_160M,內(nèi)部160MHzWIFI_IOT_PWM_CLK_XTAL,外部晶體時(shí)鐘源,24MHz或40MHz,具體取決于芯片外部使用的晶振頻率。在Wi-FiIoT開發(fā)套件上,主控芯片使用的晶振頻率是40MHz。交通燈板的蜂鳴器部分的相關(guān)原理如圖2-11在原理圖中,BEEP標(biāo)記處通過插座最終連接在主控芯片的GPIO09圖2-通過輸出PWM創(chuàng)建pwm_buz.cOpenHarmonyapplications/sample/wifi-iot/app/目錄下創(chuàng)建在這段代碼中,PwmStart函數(shù)的第三個(gè)參數(shù)的填入值是40000,根據(jù)表2-4的說明可PWM4000Hz(160MHz/40000)。PwmStart函數(shù)的第二個(gè)參數(shù)的填入值是20000,同樣可知,這里輸出的PWM方波的占空比是50%。創(chuàng)建BUILD.gnapplications/sample/wifi-iot/app/pwm_demoBUILD.gn編譯pwm_buz.c在修改完BUILD.gnapplications/sample/wifi-iot/appBUILD.gnvendor/hisi/hi3861/hi3861/build/config/usr_config.mk中的#CONFIG_PWM_SUPPORTisnotset改為CONFIG_PWM_SUPPORT=y。如果沒有修改此文在OpenHarmony源代碼的頂層目錄下執(zhí)行pythonbuild.pywifiiot命令,開始通過PWMPwmStartfreq參數(shù)值,可以輸出不同頻率的方波,也就能夠讓蜂鳴器發(fā)通過PWM模塊控制蜂鳴器的音量和LEDPwmStartfreqPWM頻率,duty參數(shù)和freq參數(shù)可以共同控制PWM輸出信號(hào)的占空比。在freqduty參數(shù)的值可以輸出不同占空比的方波信號(hào)。使用不同占空比的方波信號(hào),可以控制蜂鳴器的音量及LED燈的亮度。變化的聲音,同時(shí)核心板上的LED燈的亮度會(huì)發(fā)生變化(這兩個(gè)器件都是通過GPIO09控第3第3使用HarmonyOS本章將介紹如何使用HarmonyOS使用ADCHarmonyOSIoT硬件的ADCWi-FiIoT開發(fā)套件核心板搭載的Hi3861芯片有8個(gè)ADC通道(ADC0~ADC7),其中通道ADC7VBATAD轉(zhuǎn)換,通道ADC0~ADC6是12位逐次逼近型的模擬數(shù)字轉(zhuǎn)換器(AnalogtoDigitalConverter),實(shí)現(xiàn)將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)的功能,Wi-FiIoT開發(fā)套件已將7個(gè)通道全部預(yù)留出來供用戶使用。Hi3861芯片的ADC輸入時(shí)鐘頻率為3MHz,采樣精度為12bit,單通道采樣頻率小于200kHz80~7起切換,每個(gè)通道采樣1個(gè)數(shù),當(dāng)通道切換時(shí)會(huì)對(duì)ADC電路進(jìn)行1次復(fù)位處理。支持從解復(fù)位到開始ADC支持128bit×15bitFIFO用于數(shù)據(jù)緩存。數(shù)據(jù)存儲(chǔ)格式:高3bit為通道編號(hào),ADC1(不進(jìn)行平均)、支持FIFO表3-在Wi-FiIoT開發(fā)套件中,Hi3861芯片的所有ADC通道對(duì)應(yīng)的GPIO引腳都已連接到了底圖3-Wi-FiIoT圖3-圖3-三色LED在炫彩燈板上,三色LED燈采用5mm×5mmRGB共陽極三色LED燈。在炫彩燈板上與LED圖3-在炫彩燈板上,與光敏電阻相關(guān)的電路是開關(guān)輸出電路,在有光時(shí)PHO_RES平,在無光時(shí)PHO_RES輸出低電平(修改電路原理圖上對(duì)應(yīng)硬件的連接關(guān)系,可以實(shí)現(xiàn)ADCPHO_RES圖3-channel是采集通道,data是ADC數(shù)據(jù)的保存地址,equModel是平均算法模式,ADC3-6ADC值在圖3-人體紅外傳感器的輸出引腳(REL)Hi3861ADC3ADC3通3.1.3AdcReadADC傳感器狀態(tài)控制三色LED顏色。通過人體紅外傳感器和光敏電阻狀態(tài)來控制LED燈的顏色,先獲取傳感器的ADCADCBLUE/GREEN/RED三路不同電平,調(diào)節(jié)三色LED燈的不同顏第1行代碼定義ADC值的分辨率等級(jí)為4096級(jí)。第2行代碼定義PWM分頻倍數(shù)為64000,實(shí)驗(yàn)現(xiàn)象:當(dāng)人體紅外傳感器檢測(cè)到有人體信號(hào)時(shí),ADC3LED燈的紅色變化。光線變化引發(fā)光敏電阻變化,使ADC4通道的數(shù)值變化,三色LED燈的使用ADCWi-FiIoT開發(fā)套件上的USER鍵和OLED顯示屏板上的S1、S2鍵的外觀及位置如圖3-7所圖3-圖3-表3-在任務(wù)中主要完成ADC值獲取和通過ADC①調(diào)用ADC讀接口獲取ADC值,判斷ADC2.先將GPIO05對(duì)應(yīng)的引腳設(shè)置為ADC2功能,再將GPIO05ADC2的函數(shù),最后再啟用GPIO05中斷。當(dāng)有按鍵被按下時(shí),觸發(fā)CPU進(jìn)入GPIO05中斷,進(jìn)而通過采集ADC2值來區(qū)分按鍵。其他ADC與環(huán)境檢測(cè)板MQ-2MQ-23-9Wi-Fi圖3-圖3-MQ-2中的可燃?xì)怏w(或煙霧)讀取MQ-2可燃?xì)怏w傳感器的ADC讀取MQ-2可燃?xì)怏w傳感器的ADC值的關(guān)鍵代碼如下:使用I2C本章將基于HarmonyOS和Wi-FiIoT開發(fā)套件,講解如何使用I2C接口獲取數(shù)字溫濕度HarmonyOSIoT硬件的I2CAHT20I2CI2C接I2CI2C(Inter-IntegratedCircuit),即集成電路,也簡寫作IIC或者I2C。I2C總線協(xié)圖3-HarmonyOS所提供的I2C在HarmonyOS中,提供了IoT硬件的I2C表3-返值:成功或者錯(cuò)誤碼。功能:將數(shù)據(jù)寫入I2C第一個(gè)參數(shù)id:指定要寫入的I2C設(shè)備ID第二個(gè)參數(shù)deviceAddr:返值:成功或者錯(cuò)誤碼。功能:從I2C第二個(gè)參數(shù)deviceAddr:指示I2C第三個(gè)參數(shù)i2cData:指示要讀取的數(shù)據(jù)描述符的指針,用于返數(shù)據(jù)內(nèi)容。返值:成功或者錯(cuò)誤碼。AHT20AHT20MountedDevices,SMD)封裝,底面尺寸為3mm×3mm,高度為1.0mm,詳見圖3-12。圖3-AHT20數(shù)字溫濕度傳感器的技術(shù)參數(shù)見表3-4表3-在Wi-FiIoT開發(fā)套件的環(huán)境檢測(cè)板上搭載了一個(gè)AHT20數(shù)字溫濕度傳感器,其原理圖3-13分簡單。外圍電路通過AHT20數(shù)字溫濕度傳感器的VDD和GND引腳向其供電,再將其SDA和圖3-主控芯片Hi3681的硬件I2C有兩個(gè),分別是I2C0和I2C1。在環(huán)境監(jiān)測(cè)板上,AHT20字溫濕度傳感器使用的是Hi3681的I2C0,其引腳的對(duì)應(yīng)關(guān)系如下:GPIO13對(duì)應(yīng)I2C0_SDAGPIO14對(duì)應(yīng)I2C0_SCL實(shí)現(xiàn)AHT20直接調(diào)用I2cInit接口即可配置I2C為了使用方便,我們封裝了以下的I2C表3-AHT2040ms。在讀取溫濕度數(shù)據(jù)前,首先發(fā)送獲取狀態(tài)命令(0x71),發(fā)送觸發(fā)測(cè)量命令(0xAC),該命令的參數(shù)有兩個(gè)字節(jié),分別為0x33和0x00這樣,AHT20獲取AHT20表3-此時(shí),需要先判斷校準(zhǔn)使能位Bit[3]及忙閑指示位Bit[7]通過獲取狀態(tài)命令,共讀到6個(gè)字節(jié)的數(shù)據(jù),其結(jié)構(gòu)如圖3-14圖3-通過以下公式可以分別計(jì)算得到溫濕度值(AHT20濕度計(jì)算公式(計(jì)算結(jié)果為百分?jǐn)?shù)溫度計(jì)算公式(計(jì)算結(jié)果的單位為OLED顯示、Wi-Fi通信。當(dāng)你掌握了那些內(nèi)容后就可以使用Wi-FiIoT開發(fā)套件制作一款可以顯示和聯(lián)網(wǎng)的智能溫濕度傳第4第4OLED使用HarmonyOS驅(qū)動(dòng)OLEDOLEDOLED,即有機(jī)發(fā)光二極管(OrganicLightEmittingDiode)。OLED顯示屏同時(shí)具備液晶顯示器(LiquidCrystalDisplay,LCD),OLED顯示屏發(fā)光不需要背光板,屏幕的本書配套使用的Wi-FiIoT開發(fā)套件搭載的是0.96寸的OLED顯示屏,該顯示屏有以下特點(diǎn):0.96寸OLED模塊采用SSD1306驅(qū)動(dòng)芯片,分辨率為128像素×64I2C,地址為0x78,模塊內(nèi)帶有穩(wěn)壓芯片,支持3.3~5V電壓供電。OLED顯示屏的外觀如圖4-1圖4-OLEDWi-FiIoT開發(fā)套件的SSD1306驅(qū)動(dòng)芯片通過I2C接口和Hi3861確定OLED顯示屏使用的I2C將開發(fā)板翻過來,使OLED圖4-圖4-查看Hi3861底板原理圖,如圖4-4綜合圖4-2和圖4-3,可以得到OLED顯示屏和Hi3861芯片之間的硬件連接,見表4-1表4-圖4-OLED表4-SSD1306初始化OLED將GPIO13、GPIO14引腳復(fù)用為I2C0I2cInitHi3861I2C0,I2C0在OLEDOLEDOLEDSSD1306SSD1306GDDRAM(GraphicDisplayDataRAM,圖像顯示數(shù)據(jù)內(nèi)存,SSD1306驅(qū)動(dòng)芯片的顯存與屏幕像素的對(duì)應(yīng)關(guān)系如圖4-5圖4-COL的含義是GDDRAM列(Column)SSD1306驅(qū)動(dòng)芯片有3種內(nèi)存尋址模式,分別是頁尋址模式(PageAddressingMode)、水平尋址模式(HorizontalAddressingMode)和垂直尋址模式(VerticalAddressingMode),分別對(duì)應(yīng)的命令字節(jié)為20h、21h、22h。因?yàn)镺LED顯示屏復(fù)位之后默Hi3861(128×8),在每次修圖4-在OLED顯示屏上繪制ASCII函數(shù)說明:用指定的波特率初始化I2C基于HarmonyOSI2C接口的封裝:發(fā)送一個(gè)命令字節(jié)到SSD1306發(fā)送一個(gè)數(shù)據(jù)字節(jié)到SSD1306下面截取了一部分16×8的字符庫的內(nèi)容,一個(gè)字符用16個(gè)unsignedchar類型的數(shù)字向OLED顯示屏輸出一個(gè)ASCII向OLED顯示屏輸出ASCIIOLEDOledTaskOledTask函數(shù)顯示效果如圖4-7該測(cè)試函數(shù)很簡單,打印字符串“Hello,HarmonyOS”。至此,OLED(串)圖4-在OLED圖4-8圖4-圖4-常見的宋體字形庫如圖4-10圖4-首先,我們需要一個(gè)取模工具,這里使用PCtoLCD,工具頁面如圖4-11圖4-取模方式需要根據(jù)顯示屏的特征來配置,對(duì)于Wi-FiIoT開發(fā)套件使用的OLED顯示屏自定義格式:C51圖4-圖4-圖4-OLED顯示效果如圖4-15圖4-第5第5使用HarmonyOS控制Wi-Wi-FiWi-FiWi-Fi是一個(gè)基于IEEE802.11協(xié)議的無線局域網(wǎng)通信的實(shí)現(xiàn)技術(shù)。很多人可能會(huì)將Wi-Fi與IEEE802.11協(xié)議混為一談。其實(shí)兩者并不等同。下面先簡單說明一下什么是IEEE802.11IEEE802.11協(xié)議是無線局域網(wǎng)絡(luò)(WirelessLocalAreaNetwork,WLAN)的一個(gè)實(shí)IEEE802.15(BlueTooth)在5.1.2節(jié)將介紹Wi-Fi的幾種工作模式(OperationMode)。隨后,我們會(huì)介紹HarmonyOSWi-Fi編程接口。最后,我們會(huì)結(jié)合HarmonyOS的Wi-FiIoT開發(fā)套件編寫實(shí)例Wi-Fi與Wi-Fi相關(guān)的常見的專業(yè)術(shù)語及說明見表5-1表5-Wi-Fi1)Wi-Fi掃描有兩種不同的方式,一種是主動(dòng)掃描(ActiveScan),(PassiveScan)主動(dòng)掃描。由Wi-FiClient在每個(gè)信道(Channel)上發(fā)送探測(cè)請(qǐng)求幀(ProbeRequestFrame),接入點(diǎn)收到探測(cè)請(qǐng)求之后,返探測(cè)響應(yīng)(ProbeResponse)。主動(dòng)SSID,根據(jù)指定的APSSID頻段,根據(jù)特定的頻段掃描,如2460,單位是MHz如果沒有指定任何參數(shù),那么會(huì)認(rèn)為這是一個(gè)被動(dòng)掃描(PassiveScan)被動(dòng)掃描。被動(dòng)掃描即Wi-FiClient在每個(gè)信道(Channel)的BeaconFrame。Wi-FiClient(5.2)獲取掃描結(jié)果,再WPA-Personal,WPA-PSKWi-FiClient端使用預(yù)先設(shè)置的密鑰進(jìn)行認(rèn)證,認(rèn)證算法有TKIP和CCMP這里只是簡單地介紹了WPA認(rèn)證。早期的IEEE802.11協(xié)議支持WEP認(rèn)證,不過在較新3)在認(rèn)證完成之后,Wi-FiClient可以開始跟接入點(diǎn)進(jìn)行關(guān)聯(lián)(Association)。關(guān)聯(lián)動(dòng)作,可以被理解為將Wi-FiClient注冊(cè)到接入點(diǎn)中。大概的流程如下:Wi-FiClient發(fā)送關(guān)聯(lián)請(qǐng)求幀(AssociationRequest)如果允許關(guān)聯(lián),那么接入點(diǎn)返狀態(tài)0,表示成功;否則,返一個(gè)狀態(tài)碼。注意,一個(gè)Wi-FiClient一次只能關(guān)聯(lián)一個(gè)接入點(diǎn)。Wi-FiWi-FiStation從理論上來說,任何一個(gè)Wi-Fi設(shè)備都可以稱為Station(STA)。根據(jù)IEEE802.11協(xié)議對(duì)STA的描述,STA是支持IEEE802.11協(xié)議的設(shè)備,比如智能手機(jī)、電腦、平臺(tái)等,也在大多數(shù)情況下,當(dāng)大家說到STA模式時(shí),一般指的是具有Wi-FiClient在本書中,后面提到的STA,也是指一個(gè)具有Wi-FiClientAPAPWi-FiClient配置SSID選擇認(rèn)證類型,如果使用WPA-PSK認(rèn)證,那么需要設(shè)置密碼,這樣Wi-FiClient選擇支持的頻段,如2.4GHz或者5GHzWi-Fi還支持其他模式,如Adhoc模式,其不在本書的討論范圍之內(nèi)。有興趣的讀者HarmonyOSIoT硬件的Wi-FiSTA本節(jié)主要介紹在HarmonyOS上的Wi-FiAPI掃描其他Wi-Fi在HarmonyOS中,通過下面的函數(shù)來掃描Wi-Fi該函數(shù)觸發(fā)Wi-Fi接入點(diǎn)的掃描。若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返注意,Scan函數(shù)并不會(huì)返掃描的結(jié)果,只是觸發(fā)掃描的事件,最終的掃描結(jié)果由底層的Wi-Fi芯片上報(bào)。也就是說,如果Scan函數(shù)返WIFI_SUCCESS,那么上層也可能無法result,sizeresultHarmonyOS,Wi-Fi掃描結(jié)作為形參的size,返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼連接到某個(gè)Wi-Fi的索引。通過指定的networkId獲取一個(gè)Wi-Fi的配置。WifiDeviceConfig的定義如ConnectTo返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼HarmonyOSIoT硬件的Wi-FiAP創(chuàng)建Wi-FiWi-FiAP(1)WifiErrorCodeEnableHotspot(void)調(diào)用上面的函數(shù),可以在HarmonyOS中開啟接入點(diǎn)功能,并設(shè)置全局變量要嗎?接入點(diǎn)需要配置SSID,可能也需要配置PSK、設(shè)置頻段等操作。為什么這個(gè)函數(shù)量是HotspotConfig類型的,為一個(gè)結(jié)構(gòu)體。關(guān)于該結(jié)構(gòu)體,在本節(jié)的后面會(huì)進(jìn)行介返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(2)WifiErrorCodeDisableHotspot(void)g_wifiApStatusNOTACTIVE狀返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼(3)int于判斷當(dāng)前設(shè)備的AP模式有沒有使能。這個(gè)函數(shù)最終只返上面所提到的全局變量g_wifiApStatus的值。也就是說,實(shí)際上這個(gè)函數(shù)只返狀態(tài),而不判斷AP模式是不是使能。我們可以針對(duì)這個(gè)函數(shù)重新封裝一個(gè)返值為布爾型的函數(shù),若返TRUE,則表示接入點(diǎn)功能被開啟,若返FALSE,則表示接入點(diǎn)功能被禁用。實(shí)現(xiàn)方法如下:返值:若成功,則返接入點(diǎn)狀態(tài),若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(4)WifiErrorCodeGetStationList(StationInfo*result,unsignedint*size)該函數(shù)用于獲取當(dāng)前連接到接入點(diǎn)的STA信息。sizeStationInfo數(shù)組的長HarmonyOS6STA?WIFI_MAX_STA_NUM返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(5)WifiErrorCodeSetHotspotConfig(constHotspotConfig*config)configg_wifiApConfigconfig,可返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(6)WifiErrorCodeGetHotspotConfig(HotspotConfig*result)g_wifiApConfigresult中。返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼(7)intGetSignalLevel(intrssi,int該函數(shù)用于獲取信號(hào)強(qiáng)度等級(jí)。rssi是ReceivedSignalStrengthIndicator的縮rssi在不同的頻帶下有不同的值,代表的強(qiáng)度不一樣。rssi的單位是DBm(分貝毫該函數(shù)根據(jù)rssi和頻帶的值,返一個(gè)HarmonyOS定義的信號(hào)等級(jí)。目前的值是返值:若成功獲取到信號(hào),則返SignalLevel,否則返-1。表5-提供DHCP入外部網(wǎng)絡(luò),那么還需要提供動(dòng)態(tài)主機(jī)配置協(xié)議(DHCP)IP地址。關(guān)于DHCP的知識(shí),本書不打算進(jìn)行介紹。有興趣的讀者可以參考相關(guān)的書籍。的網(wǎng)絡(luò)協(xié)議是LwIP(LightWeightIP),即輕量級(jí)的網(wǎng)絡(luò)協(xié)議。DHCP服務(wù)都是由LwIP提Wi-Fi設(shè)備客戶端和接入點(diǎn)調(diào)用DHCPDHCP服務(wù)structnetif*netifapi_netif_find(constnameeth0。海思Hi3861平臺(tái)返值:若成功,則返網(wǎng)絡(luò)接口的結(jié)構(gòu)體;若失敗,則返空指針err_tnetifapi_netif_set_addr(structnetif*netif,constip4_addr_t*ipaddr,constip4_addr_t*netmask,constip4_addr_t*gw)返值:若成功,則返0;若失敗,則返負(fù)數(shù)的錯(cuò)誤碼err_tnetifapi_dhcps_start(structDHCPnetifstart_ip描述DHCPv4地址池(DHCPv4AddressPool)中IP的起始地址。ip_num描述DHCPv4地址池中的DHCPv4IP地址的范圍,start_ipip_num都要設(shè)置為0。返值:若成功,則返0;若失敗,則返錯(cuò)誤碼。err_tnetifapi_dhcps_stop(struct該函數(shù)用于停止接入點(diǎn)的DHCP服務(wù)。如果要在一個(gè)網(wǎng)絡(luò)接口(NetworkInterface)上重啟DHCP服務(wù),那么必須先調(diào)用該函數(shù)停止當(dāng)前的DHCP返值:若成功,則返0;若失敗,則返錯(cuò)誤碼err_tnetifapi_dhcp_start(struct該函數(shù)用于Wi-Fi設(shè)備客戶端(STA)啟動(dòng)DHCP客戶端,用于獲取IP地址。在Fi連接成功后,一般會(huì)調(diào)用該函數(shù)啟動(dòng)DHCP返值:若成功,則返0;若失敗,則返錯(cuò)誤碼err_tnetifapi_dhcp_stop(structnetif*netif)返值:若成功,則返0;若失敗,則返錯(cuò)誤碼HarmonyOSIoT硬件Wi-Fi(1)WifiErrorCode打開Wi-Fi設(shè)備的STAWi-Fi功能,使其可以掃描,并且Wi-FiEnableWifi返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(2)WifiErrorCodeDisableWifi(void)返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(3)int返值:若成功,則返Wi-Fi狀態(tài),即WIFI_STA_ACTIVE或者WIFI_STA_NOT_ACTIVE;若失敗,則返相應(yīng)的錯(cuò)誤碼。(4)WifiErrorCodeAddDeviceConfig(constWifiDeviceConfig*config,int*result)該函數(shù)用于增加設(shè)備的Wi-Fi配置。WifiDeviceConfig的定義請(qǐng)見5.2.2數(shù)將一個(gè)WifiDeviceConfig添加到設(shè)備中,并且給這個(gè)WifiDeviceConfig分配一個(gè)netid保存到result中,返給調(diào)用者。根據(jù)這個(gè)netid可以取到對(duì)應(yīng)的WifiDeviceConfig,用于進(jìn)行Wi-Fi連接。每一個(gè)Wi-Finetid能超過10個(gè)配置項(xiàng)。最大配置項(xiàng)由?WIFI_MAX_CONFIG_SIZE指定。你可以參考5.3.2節(jié)AddDeviceConfig返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(5)WifiErrorCodeGetDeviceConfigs(WifiDeviceConfig*result,unsigned該函數(shù)用于獲取所有有效的Wi-Firesultsize最大的配置數(shù),為result的長度。返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼(6)WifiErrorCodeRemoveDevice(intnetworkId)該函數(shù)用于根據(jù)netid刪除一個(gè)Wi-Fi配置。返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(7)WifiErrorCodeDisconnect(void)該函數(shù)用于斷開Wi-Fi返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(8)WifiErrorCodeGetLinkedInfo(WifiLinkedInfo*result)Wi-FiWifiLinkedInfo的定disconnectedReasonHi3861平HarmonyOS返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(9)WifiErrorCodeRegisterWifiEvent(WifiEvent*event)該函數(shù)用于注冊(cè)Wi-Fi事件的調(diào)函數(shù),可用于開發(fā)者在自己開發(fā)的應(yīng)用中注冊(cè)相應(yīng)的調(diào)函數(shù),監(jiān)聽Wi-Fi狀態(tài)的變化,根據(jù)不同的狀態(tài),做相應(yīng)的處理??梢宰?cè)的最大事件數(shù)是10個(gè)??梢宰?cè)的最大事件數(shù)由?WIFI_MAX_EVENT_SIZE指定。WifiEvent從這幾個(gè)調(diào)函數(shù)的聲明中可以看出,前面兩個(gè)是給STA模式使用的,后面三個(gè)是給關(guān)于RegisterWifiEvent的使用方法,請(qǐng)參考5.3.2說明:RegisterWifiEvent要在一開始就調(diào)用注冊(cè)好,而不能在Wi-Fi返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(10)WifiErrorCodeUnRegisterWifiEvent(constWifiEvent*event)返值:若成功,則返WIFI_SUCCESS;若錯(cuò)誤,則返相應(yīng)的錯(cuò)誤碼。(11)WifiErrorCodeGetDeviceMacAddress(unsignedchar*result)MACWi-FiMACWi-第6第6HarmonyOSTCP/IPTCP/IP是TransmissionControlProtocol/InternetProtocol的簡寫,即“傳輸控制協(xié)議/因特網(wǎng)互連協(xié)議”,是互聯(lián)網(wǎng)的基礎(chǔ)協(xié)議。顧名思義,該協(xié)議由TCPIP圖6-圖6-圖6-UDP(UserDatagramProtocol,用戶數(shù)據(jù)報(bào)協(xié)議),是一種不可靠但是簡單而快速的傳報(bào)文暫存在本地的一個(gè)緩沖區(qū)中,而接收方在成功接收到報(bào)文之后會(huì)復(fù)一個(gè)確認(rèn)消息。后面是一些狀態(tài)位,比如URG、ACK、PSH等,用于維持和變更雙方連接的狀態(tài)。狀態(tài)位圖6-n,并將該數(shù)據(jù)包發(fā)送給服務(wù)端,然后客戶端進(jìn)入SYN_SENT狀態(tài),等待服務(wù)端確認(rèn)。第二次握手是服務(wù)端在收到數(shù)據(jù)包后,發(fā)現(xiàn)此包的標(biāo)志位SYN被置位,于是知道客戶端在ack=n+1,k,并將該確認(rèn)報(bào)文發(fā)送給客戶端,告知客戶端連接請(qǐng)求已被確認(rèn),此時(shí)服務(wù)端進(jìn)入SYN_RCVD狀態(tài)。第三次握手是客戶端在收到服務(wù)端自己也構(gòu)造一個(gè)新的復(fù)報(bào)文,將標(biāo)志位ACK置位,即ack=K+1,再將該復(fù)報(bào)文發(fā)送給服務(wù)端,服務(wù)端在收到這個(gè)復(fù)報(bào)文后,會(huì)檢查ack是否為K+1、ACK是否置位,如果這兩者圖6-圖6-的,若端口號(hào)不用,則置0即可)、目的端口號(hào)、報(bào)文長度、校驗(yàn)和。根據(jù)這些字段就確。但正因?yàn)閁DP如此簡單,所以它也有獨(dú)特的優(yōu)點(diǎn):適合用在廣播或者多播不需要進(jìn)圖6-IP含有IP、ARP(AddressResolutionProtocol,地址解析協(xié)議)、路由協(xié)議。每經(jīng)過一個(gè)路由器,該值就減去1,當(dāng)該值為0時(shí),數(shù)據(jù)報(bào)被丟棄。③8位服務(wù)類型。的端的子網(wǎng)。由此可見,IPIP輸能容忍的最大時(shí)間。同時(shí),也可知IP并不保證報(bào)文一定能被送達(dá)對(duì)方。其報(bào)文頭的格圖6-標(biāo)IP地址的ARP請(qǐng)求廣播到局域網(wǎng)絡(luò)上的所有主機(jī),并接收返消息,以此確定目標(biāo)的MAC地址。在收到返消息后,主機(jī)將該IP地址和MAC地址存入本機(jī)ARP緩存中并保留一定的時(shí)ARP到目的端的子網(wǎng)中,然后再使用ARP在目的端的子網(wǎng)中尋址。路由存在于網(wǎng)絡(luò)上的路由IP報(bào)文發(fā)送到目標(biāo)IPIPMACMACLwIPLwIP是LightWeight(輕型)IP的軟件實(shí)現(xiàn),是瑞典計(jì)算機(jī)科學(xué)院(SICS)的AdamDunkels開發(fā)的一個(gè)小型開源的TCP/IP協(xié)議棧。它支持多網(wǎng)絡(luò)接口下的IP轉(zhuǎn)發(fā)、ICMP、還做了多種優(yōu)化,比如提供底層調(diào)接口、盡可能地共享內(nèi)存而不拷貝、減少進(jìn)程間的上TCP/IP上下文切換的耗費(fèi)。LwIP的做法是使用它的RAWAPI,此時(shí)各種協(xié)議的代碼都在一個(gè)進(jìn)程的LwIPAPI,LwIPLwIP級(jí)別調(diào)函數(shù)的方式來使用LwIP的功能。LwIP的設(shè)計(jì)思想是,把所有的模塊放在同一個(gè)過程中,并與操作系統(tǒng)分開,而應(yīng)用者來說,應(yīng)用程序和LwIP協(xié)議棧之間通過函數(shù)調(diào)用實(shí)現(xiàn);對(duì)于后者來說,應(yīng)用程序和量、郵箱等。LwIP的總體框架和模塊間交互如圖6-9所示。圖6-網(wǎng)絡(luò)接口(netif)結(jié)構(gòu)體里的next指針指向代表了下一個(gè)網(wǎng)卡的netifip_addr、ip_addr_tnetmask等字段存放本網(wǎng)卡的IP地址子網(wǎng)掩碼等必要屬inputIPip_output()ip_route()函UDPUDP的收發(fā)流程相對(duì)簡單,如圖6-10圖6-TCPTCP是一種面向連接的、可靠的傳輸協(xié)議,該協(xié)議比UDP復(fù)雜得多,因此實(shí)現(xiàn)它的UDPtcp_pcb的結(jié)構(gòu)體,除了雙基本的TCPTCP連接,然后把數(shù)據(jù)交給tcp_process()函數(shù)。tcp_process()函數(shù)在收到數(shù)據(jù)后,根據(jù)對(duì)數(shù)據(jù)的進(jìn)一步解析來維護(hù)所屬的TCP連接的連接狀態(tài),以及做一些必要的狀態(tài)轉(zhuǎn)換,如果判斷出接收到的是業(yè)務(wù)數(shù)據(jù),函數(shù)tcp_receive()緩沖區(qū)和網(wǎng)絡(luò)擁塞情況來決定是否發(fā)送報(bào)文。如果要發(fā)送,那么調(diào)用IP的圖6-TCPTCP所以開發(fā)者只需要通過socket就可以進(jìn)行網(wǎng)絡(luò)編程。socket分為TCPsocket和UDP是進(jìn)行UDP通信,在網(wǎng)絡(luò)兩端進(jìn)行通信的程序都各有一個(gè)socket,一個(gè)是客戶端socket,另一個(gè)是服務(wù)端socket,兩者的處理過程并不一樣。下面先介紹TCP客戶端socket的編程,基本上就是創(chuàng)建一個(gè)TCPsocket,用它來連接創(chuàng)建一個(gè)叫sockfd的TCPsocket句柄,以及一個(gè)sockaddr_in類型的變量使用connect()在連接建立后,使用send()在發(fā)送數(shù)據(jù)成功后,使用recv()函數(shù)等待服務(wù)器的復(fù)數(shù)據(jù)使用close()函數(shù)關(guān)閉此sockfdTCPTCP服務(wù)端socket編程要比客戶端編程復(fù)雜。大體過程是創(chuàng)建一個(gè)TCPsocket,個(gè)新的socket,用它來和客戶端收/發(fā)消息。在收/發(fā)消息結(jié)束后,就關(guān)閉socket。同TCP創(chuàng)建一個(gè)被稱為sockfd的TCPsocketconnfdsocketIPlisten()函數(shù)是不阻塞的,它只IP會(huì)一直等待sockfd所對(duì)應(yīng)的隊(duì)列里面是否有完成三次握手的連接,如果有,那么會(huì)返一socketconnfd來和客戶使用close()函數(shù)關(guān)閉sockfd和connfdTCP客戶端和TCP服務(wù)端的整體通信流程如圖6-12圖6-UDPUDP中,UDP客戶端socket的編程是最簡單的,基本上就是創(chuàng)建一個(gè)UDPsocket,然后直接向服務(wù)器發(fā)送消息,再接收來自服務(wù)器的返消息。在收/發(fā)消息結(jié)束后,就關(guān)閉socket。創(chuàng)建一個(gè)叫sockfd的UDPsocket句柄,以及一個(gè)sockaddr_in類型的變量使用sendto()使用recvfrom()使用close()函數(shù)關(guān)閉此sockfdUDPUDP服務(wù)端socket的編程稍微復(fù)雜一些,基本上就是創(chuàng)建一個(gè)UDPsocket,并將自己綁定在要監(jiān)聽的端口號(hào)上,然后接收來自客戶端的消息,并將自己的消息發(fā)送客戶UDP服務(wù)端程序的流程比TCP個(gè)sockaddr_in類型的變量serverAddr,sockaddr_in類型的變量clientAddr,用于記錄連接服務(wù)器的客戶端的IP地址和端口號(hào)。在調(diào)用bind()函數(shù)成功后,接著調(diào)用recvfrom()消息,并用客戶端的IP地址和端口號(hào)填充變量clientAddrsendto()IPclientAddr使用close()函數(shù)關(guān)閉此sockfdUDP客戶端和UDP服務(wù)端的整體通信流程如圖6-13圖6-第7第7HarmonyOSIoTCMSIS-RTOSAPIV2簡介及CMSIS-RTOSAPIV2是在CMSIS-RTOSAPIV1的基礎(chǔ)上發(fā)展而來的,是一組標(biāo)準(zhǔn)的系統(tǒng)編程API的定義。在HarmonyOS中,引入了CMSIS-RTOSAPIV2作為LiteOS內(nèi)核與應(yīng)用程序之間的抽象層。CMSIS-RTOSAPIV2在整個(gè)HarmonyOS中的位置如圖7-1所示。圖7-CMSIS-RTOSAPIV2提供了實(shí)時(shí)操作系統(tǒng)內(nèi)核和中間件及應(yīng)用程序之間的標(biāo)準(zhǔn)接口。如果應(yīng)用程序基于CMSIS-RTOSAPIV2實(shí)現(xiàn),那么可以很容易地移植到其他支持CMSIS-RTOSAPIV2的操作系統(tǒng)中,因而增加了應(yīng)用程序的可重用性。CMSIS-RTOSAPIV2的全部API定義在cmsis_os2.h中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論