操纵手册——软件篇
一、准备工作
选择开始菜单,单击设置
选择系统->激活,查看自己的Windows版本是家庭版还是别的
Windows专业版开启Hyper-V功能
开启后,重启电脑,在搜索栏上搜索Hyper-V,看是否存在
Windows家庭版开启Hyper-V功能
1.打开记事本,将下面的代码复制到内里,然后另存为XX.bat,名字可以自界说
@echo off
Pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
pause
2.运行后,会在当前目录创建hyper.txt文件(可以删除),重启后,搜索Hyper是否存在,假如没有,那就可以使用专业版的方法启动该功能(家庭版默认该功能被隐藏)
参考文章:
Windows家庭版没有Hyper-V功能的解决方案_windows没有hyper-v-CSDN博客
文档中心
注意:安装华为DevEco Studio时,肯定要先启用Hyper-V功能,否则无法使用模拟器或者预览器
MQTTX
MQTTX:全功能 MQTT 客户端工具
二、华为云的使用
1.登录华为云
2.选择符合的服务区域
3.选择服务列表
4.搜索装备接入IoTDA服务
5.购买实例
6.按照图片所示进行自界说配置
7.确定配置无误后,选择提交
8.进入创建后的实例
9.创建立备之前,先记录一下后续操纵需要使用的信息
10.MQTT接入所在是硬件或软件模拟上传数据的服务器所在,HTTPS接入所在是后续使用鸿蒙app进行云端数据获取或者命令下发的endpoint参数
11.选择产品
12.创建产品
13.按照图片所示进行自界说配置
14.所属行业与所属子行业可以任意选择模板,后续是通过自己的自界说模子来添加实际的数据属性和命令
15.选择详情进入产品详情页
16.添加自界说模子
17.自界说服务ID名,该ID也是后续鸿蒙app所使用的serviceid
18.根据自己的需求添加数据属性和命令
19.LedStatus是字符串类型,访问方式可读;命令LedSwitch,下发参数为value(字符串类型),相应参数result(布尔型),不同的命令的下发参数和相应参数可以一样,因为它们是通过命令名称进行区分的。注意: 数据类型要与硬件或者软件模拟的数据类型保存同等,否则会出现问题
20.进入Topic管理
21.记录一下装备ID就是后面所创建的云端装备
平台下发命令给装备:
$oc/devices/装备ID/sys/commands/response/request_id=
装备上报属性数据:
$oc/devices/装备ID/sys/properties/report
22.选择装备->所有装备
23.注册装备,添加云端装备
24.根据下面的图片进行自界说配置
25.保存并关闭后,浏览器会下载一个密钥文件,可以选择自己保存,也可以删除,因为装备详情页内里可以查看
26.进入装备详情页
27.根据图片,记录一下所需内容
1.根据图片,将之前记录的相干信息填入到MQTTX软件中,硬件类似
2.毗连乐成后,云端装备会表现在线
3.使用$oc/devices/装备ID/sys/properties/report,将数据按照指定格式进行数据的上报。
参考文档:
装备属性上报_装备接入 IoTDA_华为云
4.上报乐成后,云端会得到硬件或软件模拟的值
三、鸿蒙app的使用
1.先记录一下自己API根据,这是后续鸿蒙app的project_id,项目ID
2.一般都是创建一个新的权限不高的IAM用户来获取XToken,在后续的鸿蒙app中用于获取XToken,只有颠末验证后的XToken,才气让鸿蒙app获取云端数据或者下发命令
3.在创建的鸿蒙项目的ets目录下创建Tools目录和Models目录,然后在Tools创建一个HttpTool的ArkTS文件,在Models目录下创建一个HW_User的ArkTS文件(这是将常用的Http操纵和IAM用户获取X-Token进行封装,方便后续操纵)
HW_User.ets
export class HW_User {
auth: Auth
constructor(name: string, password: string, domain: string) {
this.auth = {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"domain": {
"name": domain //IAM用户所属账号名
},
"name": name, //IAM用户名
"password": password //IAM用户密码
}
}
},
"scope": {
"domain": {
"name": domain //IAM用户所属账号名
}
}
}
}
}
interface Auth {
identity: Identity
scope: Scope
}
interface Identity {
methods: string[]
password: Password
}
interface Password {
user: User
}
interface User {
name: string
password: string
domain: Domain
}
interface Domain {
name: string
}
interface Scope {
domain: Domain
}
布局是固定的,通过封装类来实现
参考文档:
获取IAM用户Token(使用密码)_同一身份认证服务 IAM_华为云
文档中的哀求示例
HttpTool.ets
import { http } from '@kit.NetworkKit'
import { BusinessError } from '@kit.BasicServicesKit'
export class HttpTool {
static get(url: string, fn: Function) {
// 每一个httpRequest对应一个HTTP哀求任务,不可复用
let httpRequest = http.createHttp()
let options: http.HttpRequestOptions = {
method: http.RequestMethod.GET,
// 当使用POST哀求时此字段用于传递哀求体内容,具体格式与服务端协商确定
expectDataType: http.HttpDataType.OBJECT, // 可选,指定返回数据的类型
// 开发者根据自身业务需要添加header字段
// header: { 'Accept': 'application/json' },
header: {
'Content-Type': 'application/json',
'X-Auth-Token': globalThis.token //获取云端数据需要xToken认证,这里使用全局变量
},
}
httpRequest.request(url, options, (err: BusinessError, data: http.HttpResponse) => {
if (!err) {
fn(data)
} else {
console.info('error:' + JSON.stringify(err))
}
httpRequest.destroy()
})
}
//一般情况下的post哀求
static post(url: string, param: string | Object | ArrayBuffer, fn: Function) {
// 每一个httpRequest对应一个HTTP哀求任务,不可复用
let httpRequest = http.createHttp()
let options: http.HttpRequestOptions = {
method: http.RequestMethod.POST,
// 当使用POST哀求时此字段用于传递哀求体内容,具体格式与服务端协商确定
extraData: param,
expectDataType: http.HttpDataType.OBJECT, // 可选,指定返回数据的类型
// 开发者根据自身业务需要添加header字段
// header: { 'Accept': 'application/json' },
header: {
'Content-Type': 'application/json',
},
}
httpRequest.request(url, options, (err: BusinessError, data: http.HttpResponse) => {
if (!err) {
fn(data)
} else {
console.info('error:' + JSON.stringify(err))
}
httpRequest.destroy()
})
}
//命令下发使用的post哀求
static postCommands(url: string, param: string | Object | ArrayBuffer, fn: Function) {
// 每一个httpRequest对应一个HTTP哀求任务,不可复用
let httpRequest = http.createHttp()
let options: http.HttpRequestOptions = {
method: http.RequestMethod.POST,
// 当使用POST哀求时此字段用于传递哀求体内容,具体格式与服务端协商确定
extraData: param,
expectDataType: http.HttpDataType.OBJECT, // 可选,指定返回数据的类型
// 开发者根据自身业务需要添加header字段
// header: { 'Accept': 'application/json' },
header: {
'Content-Type': 'application/json',
'X-Auth-Token': globalThis.token //下发命令需要xToken认证,这里使用全局变量
},
}
httpRequest.request(url, options, (err: BusinessError, data: http.HttpResponse) => {
if (!err) {
fn(data)
} else {
console.info('error:' + JSON.stringify(err))
}
httpRequest.destroy()
})
}
}
参考文档:
文档中心
Index.ets
import { HW_User } from '../Models/HW_User'
import { HttpTool } from '../Tools/HttpTool'
import { http } from '@kit.NetworkKit'
//通过接口的封装来下达命令和接受返回参数
interface Command {
service_id: string
command_name: string
paras: Paras
}
interface Paras {
value: string
}
interface Properties {
LedStatus: string
}
// Command和Paras使用接口来实现命令下发的上传格式,Properties是使用接口获取云端数据的返回数据
@Entry
@Component
struct Index {
private url: string = 'https://iam.myhuaweicloud.com/v3/auth/tokens'
private hw_user = new HW_User('你创建的IAM用户', '你的IAM用户密码', '你的登录或注册的默认用户就是domain')
// 使用封装的HW_User来进行用户的认证,从左往右依次是新创建的IAM用户及其密码,还有你的默认用户企业管理员
private endpoint: string = '你的http接入所在'
private project_id: string = '你的api根据也就是项目id'
private device_id: string = '你的装备id'
//endpoint是你之前复制的https接入所在,project_id是你复制的api根据(要与区域保持同等),device_id是你的装备id
private url1: string =
'https://' + this.endpoint + '/v5/iot/' + this.project_id + '/devices/' + this.device_id + '/shadow'
private url2: string =
'https://' + this.endpoint + '/v5/iot/' + this.project_id + '/devices/' + this.device_id + '/commands'
//url1是获取云端数据的写法,url2是命令下发的写法
@State properties: Properties = { LedStatus: '' }
private com: Command = { service_id: 'TS001', command_name: 'LedSwitch', paras: { 'value': 'ON' } }
//使用接口重载可以方便后续的调整
build() {
Column() {
Column() {
//onClick事件,当单击文本时,触发内里所写的内容
Text('获取Token').fontSize(25).onClick(() => {
HttpTool.post(this.url, this.hw_user, (data: http.HttpResponse) => {
console.log('result:', JSON.stringify(data.result))
globalThis.token = data.header['x-subject-token'] //x-subject-token作为全局变量,让封装的HttpTool类可以使用
})
// 使用封装类后的HttpTool的post哀求获取到x-token的值
})
Text('获取数据').fontSize(25).onClick(() => {
HttpTool.get(this.url1, (data: http.HttpResponse) => {
console.log('result:', JSON.stringify(data.result)) //打印获取的效果到终端上
this.properties = data.result['shadow'][0].reported.properties as Properties
console.log('LedStatus:' + this.properties.LedStatus) //将获取到的LedStatus打印到终端上
})
})
Text('命令下发测试').fontSize(25).onClick(() => {
HttpTool.postCommands(this.url2, this.com, (data: http.HttpResponse) => {
console.log('result:', JSON.stringify(data.result))//将获取到的命令返回效果打印到终端上
})
})
}
}.width('100%').height('100%')
}
}
数据获取参考文档
查询装备影子数据_装备接入 IoTDA_华为云
命令下发参考文档
下发装备命令_装备接入 IoTDA_华为云
4.代码写好后,启动预览器或者模拟器,然后打开日志调试终端,进行测试
软件模拟或硬件做出命令回应的格式参考文档
平台命令下发_装备接入 IoTDA_华为云
软件模拟或硬件上传数据的格式参考文档
装备属性上报_装备接入 IoTDA_华为云
至此,有关鸿蒙app毗连华为云获取硬件上传的数据和下发命令的操纵教程竣事,至于本地服务端的搭建,因每个人所使用的web框架和数据库不一样,这里不在写了。简单来说就是web框架毗连数据库,从数据库获取数据,然后使用鸿蒙app的post哀求获取web框架的页面路由返回数据,就可以将数据读取到鸿蒙app中。
鸿蒙的ArkTS语言学习参考文档:
官方文档:
文档中心-HarmonyOS NEXT开发文档-华为开发者联盟
官方免费的视频教程:
华为开发者学堂
或者别的平台的学习资源
操纵手册——硬件篇
声明:提供的资料文件有
hi3861_hdu_iot_application240515
DevTools_Hi3861V100_v1.0.zip
CH341SER.EXE
串口调试助手
(一)、安装 Visual Studio Code
1.下载VSCode
VSCode全称是Visual Studio Code,它是一款免费开源的现代化轻量级代码编辑器。VSCode官方下载所在是:Visual Studio Code - Code Editing. Redefined我们使用Windows x64 版本
具体安装步骤参考VSCode安装配置使用教程(最新版超详细保姆级含插件)一文就够了_vscode使用教程-CSDN博客
2.安装VSCode相干插件
安装完VSCode后,需要安装如下图的插件:
以C/C++插件安装为例,点击左侧的扩展商店里输入“C/C++”,选择下载第一个
别的插件安装步骤相似,最终安装效果表现如下:
HUAWEI DevEco Device Tool(以下简称DevEco Device Tool)是HarmonyOS面向智能装备开发者提供的一站式集成开发情况,支持HarmonyOS的组件按需定制,支持代码编辑、编译、烧录和调试等功能,支持C/C++语言,以插件的情势摆设在Visual Studio Code上。
- 打开HarmonyOS官网开发工具网站:华为集成开发情况IDE DevEco Device Tool下载 | HarmonyOS装备开发
找到“DevEco Device Tool 4.0 Release”
- 在控制面板-添加或删除步伐中,搜索Python关键字,遭到所有安装的Python进行卸载,特别是安装Anconda情况下的Python,制止干扰情况,确保在cmd中输入python后系统找不到python情况即可。
- 双击DevEco Device Tool安装包步伐,点击“Next”,进行安装。
- 设置安装路径,点击“Next”。
- 第2)步中已经卸载Python,所以选择“自界说安装”(注意选择Add Python 3.8 to PATH),然后点击Install Now。安装完成后点击Close即可。
选择添加PATH选项
注意 Python 必须安装在全英文目录!假如默认目录不是全英文目录,需要点击 Customize install ation 选项:
然后点击 Next:
勾选 Install for all users 和 Add Python to environment variables,从而包管英文安装目录并添加情况变量。
在界面中点击“安装”进行软件安装。
安装乐成后打开VSCode后扩展览表现这四个扩展:
4.启动DevEco Device Tool
1)启用VSCode,在DevEco Device Tool运行时依赖C/C++、CodeLLDB插件,可以在VSCode的扩展包管理处进行搜索和安装。
- 重启VSCode软件,点击左侧扩展列表,即可打开DevEco Home界面,表现乐成安装开发情况。
5.下载SDK
我会将SDK压缩包提供出来
我们的例程代码位于目录【\\hi3861_hdu_iot_application\src\vendor\hqyj\fs_hi3861\demo】面,可通过编辑【\\hi3861_hdu_iot_application\src\applications\sample\wifi-iot\app\BUILD.gn】中的信息来将编译目录指向我们的例程,如下图所示:
1)我将提供DevTools_Hi3861V100_v1.0.zip包,注意解压到全英文目录下,解压后的目录文件布局如下:
2)打开VSCode,打开DevEco Device Tool主页,点击“导入工程”。
3)在导入工程弹窗中选择Hi3861 SDK目录,点击“导入”。
4)在后续导入工程弹窗,SOC栏选择Hi3861,开发板栏选择hi3861,框架栏选择hb,之后点击“导入”,等待导入乐成即可。
- 代码导入乐成后,即工程创建乐成,之后可使用该IDE 实现代码开发、一键编译、一键烧写等功能。
7)配置开发工具路径,点击左侧的“工程配置”,选中“请选择自界说工具包”(有的版本可能无此界面,直接进行下一步即可)。
8)然后在右侧窗口中找到“hi3861,”找到“compiler_bin_path”,选择到之前下载的开发工具。
注意:以下步骤已经在所给文件中配置完成,不消手动配置,后期更改编译文件时在选择性地配置。
1)在src/applications/sample/wifi-iot/BUILD.gn文件中,修改features,如下所示。该路径用于指示编译系统去哪里探求需要编译的组件。其中冒号前的demo指的是文件所在的目录,冒号后的demo 指的是该目录下的BUILD.gn文件中的哪个lite_component。
2).修改vendor/hqyj/fs_hi3861/demo/BUILD.gn,根据需要编译对应的示例步伐:
3)由于编译过程中涉及到部门板级的驱动,因此需要复制光盘资料里的硬件驱动代码到hi3861_hdu_iot_application\src\vendor\hqyj\fs_hi3861\common\bsp目录,而且在步伐里引入相应文件时包管该工程下的BUILD.gn文件内里包罗了相应的路径。我们提供的工程文件已做好这些内容,因此不消再次操纵。
1)配置完成后,点击左侧“Rebuild”,开始编译。
2)初次编译会解压编译工具,时间较长。等待编译完成即可。
1.先使用配套的Type-C数据线,将开发板与电脑的USB口进行毗连。
2.安装CH340G驱动。安装CH341SER.EXE文件。
双击CH341SER.EXE驱动,进入安装界面,点击安装按钮即可,驱动安装乐成后,再点击确定按钮,即可表现安装驱动乐成。
- 打开Windows的装备管理器,查看串口装备,若未出现CH340串口装备,请检查驱动是否安装正常。
- 当前DevEco Device Tool工具支持Hi3861单板一键烧录功能。需要毗连开发板,配置开发板对应的串口,在编译竣事后,进行烧录。点击左侧“工程配置”,找到“upload_port”选项,选择开发板对应的烧录串口(注意:假如正在使用Monitor功能,请先关闭Monitor,才气正常烧,否则串口占用无法烧录乐成)。
2.打开开发板左下角的电源S1。
3.点击VSCode左下角“upload”按键,等待提示(出现Connecting,please reset device...),手动进行开发板复位(按下开发板复位按键)。
4.等待烧录完成,约莫30s左右,烧录乐成。
10.串口打印
1)烧录完成后,可以通过Monitor界面查看串口打印,配置Monitor串口,如下图所示。
2)配置完Monitor串口后,直接点击monitor按钮,复位开发板,查看开发板端的打印信息。
查看串口信息也可用串口调试助手(UartAssist)进行。注意,假如使用中文,需要选择好编码集。
智能农业的项目实操
对C:\hi3861_hdu_iot_application\src\vendor\hqyj\fs_hi3861\common\bsp\include\hal_bsp_ssd1306_bmps.h路径下的文件进行
#define smartFarm 0
修改成
#define smartFarm 1
修改
C:\hi3861_hdu_iot_application\src\vendor\hqyj\fs_hi3861\demo\BUILD.gn文件中
的 "smartFarm:smartFarm_demo",将表明的#号去掉
进入我们已经注册过的阿里云物联网平台中,点击进入装备接入ioTDA。
点击试用进入控制台
点击进入iot实例
点击装备—所有装备
进入后可以看到我们在上面已经创建过的装备
点击详情操纵页面
找到mqtt毗连参数,点击查看
可以查看毗连mqtt所需要的参数
回到vccode中
在我们的代码中找到smartfarm的项目文件夹,代码的路径
C:\hi3861_hdu_iot_application\src\vendor\hqyj\fs_hi3861\demo\smartFarm
打开项目中的sys_config.h文件
点击进入配置代码
将mqtt的毗连参数复制到代码中,需要注意逐一对应且端口号是1883并非是8883.
修改华为云平台的MQTT服务器的IP所在,打开Windows下cmd控制端,在控制端输入内容。
将这个ip所在填入代码中
填入mqtt信息
回到华为云平台iot实例,点击产品
点击详情
进入模子界说界面,点击编辑
添加基础服务(base)
添加控礼服务(control)
在基础服务(base)中添加“fan”属性
在基础服务(base)中添加“humidity”属性
在基础服务(base)中添加temperature”属性
在基础服务(base)中添”automode’属性
在控礼服务(control)中添加“fan”命令
在控礼服务(control)中添加“automode”命令
回到demo代码中,进入
C:\hi3861_hdu_iot_application\src\vendor\hqyj\fs_hi3861\common\bsp\src\hal_bsp_nfc_to_wifi.c文件将上面部门表明掉
并添加这串代码
uint8_t wechat_GetWiFi_ssid_passwd(const char *nfc_buff, char *wifi_name,char *wifi_passwd)
{
uint8_t payload_len = nfc_buff[NDEF_PROTOCOL_DATA_LENGTH_OFFSET]; // 获取数据长度
//uint8_t payload_len = nfc_buff[2]; // 获取数据长度
uint8_t *payload = (uint8_t *)malloc(payload_len + 1);
uint8_t ret = 0;
if (payload == NULL) {
printf("payload malloc failed.\r\n");
return 0;
}
memset_s(payload, payload_len + 1, 0, payload_len + 1);
//memcpy_s(payload, payload_len + 1, nfc_buff + NDEF_PROTOCOL_VALID_DATA_OFFSET, payload_len);
memcpy_s(payload, payload_len + 1, nfc_buff + 9, payload_len);
printf("Use Wechat system..........\n");
printf("payload = %s\r\n", payload);
cJSON *root = cJSON_Parse(payload);
cJSON *ssid = cJSON_GetObjectItem(root, "ssid");
cJSON *password = cJSON_GetObjectItem(root, "passwd");
if (root != NULL && ssid != NULL && password != NULL) {
printf("ssid = %s, password = %s", ssid->valuestring, password->valuestring);
if (strcpy_s(wifi_name, strlen(ssid->valuestring) + 1, ssid->valuestring) == 0) {
ret = 1;
} else {
ret = 0;
}
if (strcpy_s(wifi_passwd, strlen(password->valuestring) + 1, password->valuestring) == 0) {
ret = 1; // 乐成获取到WiFi名称和密码
} else {
ret = 0;
}
cJSON_Delete(root);
free(payload);
ssid = NULL;
password = NULL;
root = NULL;
payload = NULL;
return ret;
}
}
uint32_t NFC_configuresWiFiNetwork(uint16_t *ndefBuff)
{
if (ndefBuff == NULL) {
printf("NFC_configuresWiFiNetwork to ndefBuff is NULL\r\n");
return -1;
}
uint8_t ret = 0;
char * wifi_name[MAX_BUFF] = {0}; // WiFi名称
char * wifi_passwd[MAX_BUFF] = {0}; // WiFi密码
//使用微信小步伐进行配网
#if 0
if (ndefBuff[NDEF_PROTOCOL_DATA_TYPE_OFFSET] == 't') {
ret = wechat_GetWiFi_ssid_passwd(ndefBuff, wifi_name, wifi_passwd);
} else {
ret = ios_GetWiFi_ssid_passwd(ndefBuff, wifi_name, wifi_passwd);
}
#endif
ret = wechat_GetWiFi_ssid_passwd(ndefBuff, wifi_name, wifi_passwd);
if (ret)
//char *wifi_name = "peigezhao";
//char *wifi_passwd = "peigezhao";
printf("wifi_name: %s\n", wifi_name);
printf("wifi_passwd: %s\n", wifi_passwd);
// 毗连wifi
if (WIFI_SUCCESS == WiFi_connectHotspots(wifi_name, wifi_passwd)) {
printf("thongth to nfc connect wifi is success.\r\n");
ret= 0;
} else {
printf("thongth to nfc connect wifi is failed.\r\n");
ret=1;
}
return ret;
}
对修改的代码进行编译
编译假如出现succes的绿色字体证明编译乐成
点击烧录按钮,需要检测端口号是否正确
手机下载nfc标签助手
、
点击进入软件进行nfc配网
点击文本
在内里以josn的格式输入自己的wifi名和wifi密码
写入后靠近hi3861开发板,重启开发板即可配网乐成
重启后可观察到开发版的实际效果
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |