Hi3861 OpenHarmony嵌入式应用入门--华为 IoTDA 设备接入
华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,可以将自己的 IoT 设备 联接到华为云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云物联网平台的服 务实现设备与设备之间的控制,设备与物联网平台之间的数据信息交互。
在写代码之前先准备好华为云的环境。
注册华为云账号,这里就不介绍了,有手机就行,需要进行实名认证。
在控制台选择北京四,因为其他的可能需要企业才能使用,作为个人开发者就用北京四吧。
创建设备实例。
能看到设备实例的信息
我们要是用的接入方式-mqtt
通过接入地址查询IP。
记住这个IP地址。
创建新产品
注册设备
注意:生成好的设备 ID 和设备秘钥一定到妥善保管,只生成这一份。
创建产品模型
填写服务ID和服务类型
在此服务下“添加属性”,用于上传开发板上的数据,以风扇为例,其他的传感器也是类似的方法。
创建了两个
在此服务下“添加命令”,用于控制开发板上可以控制的设备,以风扇为例,其他的传感器也是类似的方法。
根据设备信息,生成用户名和密码
1.打开由华为云提供的生成用户名和密码的网址,进行生成
Huaweicloud IoTDA Mqtt ClientId Generator
2.填写生成好的设备ID和设备秘钥,点击按钮,生成用户名和密码
注意:下面的图片提供了方法。
这两个就是刚刚注册设备时候要求保存的,应该被保存在一个txt中了。
3.将生成好的信息(ClientD、Usemame、Password),修改文件“D:\DevEcoProjects\test\src\vendor\hqyj\fs_hi3861\demo\cloud_01_HuaWei_IoTDA\cloud_huawei_iotda_example.c”,下面内容直接替换。
ip用刚刚查询的mqtt地址。
数据结构参考设备属性上报_设备接入 IoTDA (huaweicloud.com)
向云端设置属性的数据格式如下所示:
{"services": [{"service_id": "attribute","properties": {"status": "ON","color": 60}}]
}
代码编写
修改D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\BUILD.gn文件
# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. import("//build/lite/config/component/lite_component.gni")lite_component("demo") {features = [#"base_00_helloworld:base_helloworld_example",#"base_01_led:base_led_example",#"base_02_loopkey:base_loopkey_example",#"base_03_irqkey:base_irqkey_example",#"base_04_adc:base_adc_example",#"base_05_pwm:base_pwm_example",#"base_06_ssd1306:base_ssd1306_example",#"kernel_01_task:kernel_task_example",#"kernel_02_timer:kernel_timer_example",#"kernel_03_event:kernel_event_example",#"kernel_04_mutex:kernel_mutex_example",#"kernel_05_semaphore_as_mutex:kernel_semaphore_as_mutex_example",#"kernel_06_semaphore_for_sync:kernel_semaphore_for_sync_example",#"kernel_07_semaphore_for_count:kernel_semaphore_for_count_example",#"kernel_08_message_queue:kernel_message_queue_example",#"wifi_09_hotspot:wifi_hotspot_example",#"wifi_10_sta:wifi_sta_example",#"tcp_11_server:tcp_server_example",#"tcp_12_client:tcp_client_example",#"udp_13_server:udp_server_example",#"udp_14_client:udp_client_example",#"network_15_mqtt:network_mqtt_example",#"network_16_sntp:network_sntp_example",#"network_17_httpd:network_httpd_example","cloud_18_HuaWei_IoTDA:cloud_huawei_iotda_example",]
}
创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\cloud_18_HuaWei_IoTDA文件夹
文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\cloud_18_HuaWei_IoTDA\BUILD.gn文件
# Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. static_library("cloud_huawei_iotda_example") {sources = ["cloud_huawei_iotda_example.c","network_mqtt.c","wifi_connecter.c","//third_party/paho.mqtt.embedded-c/MQTTPacket/src/MQTTConnectClient.c","//third_party/paho.mqtt.embedded-c/MQTTPacket/src/MQTTConnectServer.c","//third_party/paho.mqtt.embedded-c/MQTTPacket/src/MQTTDeserializePublish.c","//third_party/paho.mqtt.embedded-c/MQTTPacket/src/MQTTFormat.c","//third_party/paho.mqtt.embedded-c/MQTTPacket/src/MQTTPacket.c","//third_party/paho.mqtt.embedded-c/MQTTPacket/src/MQTTSerializePublish.c","//third_party/paho.mqtt.embedded-c/MQTTPacket/src/MQTTSubscribeClient.c","//third_party/paho.mqtt.embedded-c/MQTTPacket/src/MQTTSubscribeServer.c","//third_party/paho.mqtt.embedded-c/MQTTPacket/src/MQTTUnsubscribeServer.c","//third_party/paho.mqtt.embedded-c/MQTTPacket/src/MQTTUnsubscribeClient.c",]include_dirs = ["//utils/native/lite/include","//kernel/liteos_m/kal/cmsis","//base/iot_hardware/peripheral/interfaces/kits","//foundation/communication/wifi_lite/interfaces/wifiservice","//third_party/paho.mqtt.embedded-c/MQTTPacket/src","//third_party/cJSON",]
}
文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\cloud_18_HuaWei_IoTDA\wifi_connecter.h文件,该头文件包含wifi连接的宏。文件同network_16_sntp\wifi_connecter.h
文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\cloud_18_HuaWei_IoTDA\wifi_connecter.c文件,文件同network_16_sntp\wifi_connecter.c
文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\cloud_18_HuaWei_IoTDA\network_mqtt.h文件,文件同network_15_mqtt\network_mqtt.h文件,文件主要包含mqtt的函数。
文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\cloud_18_HuaWei_IoTDA\network_mqtt.c文件,文件同network_15_mqtt\network_mqtt.h文件,文件主要包含mqtt的函数实现。
文件夹中创建D:\DevEcoProjects\test\src\vendor\rtplay\rt_hi3861\demo\cloud_18_HuaWei_IoTDA\cloud_huawei_iotda_example.c文件
/** Copyright (c) 2023 Beijing HuaQing YuanJian Education Technology Co., Ltd* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>#include "cJSON.h"
#include "cmsis_os2.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "iot_errno.h"
#include "iot_gpio.h"
#include "iot_pwm.h"
#include "network_mqtt.h"
#include "ohos_init.h"
#include "wifi_connecter.h"// 设备密码 fs12345678
// 设备ID
#define DEVICE_ID "668651baa559ef622666a845_hi3861"
// MQTT客户端ID
#define MQTT_CLIENT_ID "668651baa559ef622666a845_hi3861_0_0_2024070407"
// MQTT用户名
#define MQTT_USER_NAME "668651baa559ef622666a845_hi3861"
// MQTT密码
#define MQTT_PASS_WORD "d5b00ad95964f8016c9e6f79c8269265720d770acd7e97bf73cf30a339b04997"
// 华为云平台的IP地址
#define SERVER_IP_ADDR "117.78.5.125"
// 华为云平台的IP端口号
#define SERVER_IP_PORT 1883
// 订阅 接收控制命令的主题
#define MQTT_TOPIC_SUB_COMMANDS "$oc/devices/%s/sys/commands/#"
// 发布 成功接收到控制命令后的主题
#define MQTT_TOPIC_PUB_COMMANDS_REQ "$oc/devices/%s/sys/commands/response/request_id=%s"
#define MALLOC_MQTT_TOPIC_PUB_COMMANDS_REQ "$oc/devices//sys/commands/response/request_id="// 发布 设备属性数据的主题
#define MQTT_TOPIC_PUB_PROPERTIES "$oc/devices/%s/sys/properties/report"
#define MALLOC_MQTT_TOPIC_PUB_PROPERTIES "$oc/devices//sys/properties/report"#define TASK_STACK_SIZE (1024 * 10)
#define MsgQueueObjectNumber 16 // 定义消息队列对象的个数
typedef struct message_sensorData {uint8_t status; // LED灯当前的状态uint8_t color; // 颜色值
} msg_sensorData_t;
msg_sensorData_t sensorData = {0}; // 传感器的数据
osThreadId_t mqtt_send_task_id; // mqtt 发布数据任务ID
osThreadId_t mqtt_recv_task_id; // mqtt 接收数据任务ID
osThreadId_t key_detection_task_id; // 按键检测任务ID
#define MQTT_SEND_TASK_TIME 10 // s
#define MQTT_RECV_TASK_TIME 1 // s
#define TASK_INIT_TIME 2 // s
#define DISPLAY_BUFF_MAX 64
#define MQTT_DATA_MAX 256#define RED_LED_PIN_NAME HI_IO_NAME_GPIO_10
#define RED_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_10_GPIO
#define GREEN_LED_PIN_NAME HI_IO_NAME_GPIO_2
#define GREEN_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_2_GPIO
#define BLUE_LED_PIN_NAME HI_IO_NAME_GPIO_7
#define BLUE_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_7_GPIO
#define PWM0_PORT_NUM (0)
#define PWM1_PORT_NUM (1)
#define PWM2_PORT_NUM (2)
#define PWM_FREQ_DIVITION 64000#define KEY1 HI_IO_NAME_GPIO_6 // 对应按键key1
#define KEY2 HI_IO_NAME_GPIO_5 // 对应按键key2
#define TASK_DELAY_TIME (200 * 1000)static int g_netId = -1;
uint8_t publish_topic[MQTT_DATA_MAX] = {0};
uint8_t mqtt_data[MQTT_DATA_MAX] = {0};unsigned short duty0 = 0, duty1 = 0, duty2 = 0; // pwm占空比记录变量
hi_gpio_value val1, val1_last, val2, val2_last; // GPIO的状态值/*** @brief 灯光开关*/
void led_switch(uint8_t status)
{if (status == 1) {if (duty0 == 0) duty0 = 100;if (duty1 == 0) duty1 = 100;if (duty2 == 0) duty2 = 100;IoTPwmStart(PWM0_PORT_NUM, duty0, PWM_FREQ_DIVITION);IoTPwmStart(PWM1_PORT_NUM, duty1, PWM_FREQ_DIVITION);IoTPwmStart(PWM2_PORT_NUM, duty2, PWM_FREQ_DIVITION);} else {IoTPwmStart(PWM0_PORT_NUM, 0, PWM_FREQ_DIVITION);IoTPwmStart(PWM1_PORT_NUM, 0, PWM_FREQ_DIVITION);IoTPwmStart(PWM2_PORT_NUM, 0, PWM_FREQ_DIVITION);}
}/*** @brief 设置灯光颜色*/
void led_color(uint8_t r, uint8_t g, uint8_t b)
{printf("led_color: %d %d %d\r\n", r, g, b);IoTPwmStart(PWM0_PORT_NUM, b, PWM_FREQ_DIVITION);IoTPwmStart(PWM1_PORT_NUM, r, PWM_FREQ_DIVITION);IoTPwmStart(PWM2_PORT_NUM, g, PWM_FREQ_DIVITION);
}/*** @brief 组JSON数据*/
int Packaged_json_data(void)
{cJSON *root = NULL, *array = NULL, *services = NULL;cJSON *properties = NULL;int ret = 0;// 组JSON数据root = cJSON_CreateObject(); // 创建一个对象services = cJSON_CreateArray();cJSON_AddItemToObject(root, "services", services);array = cJSON_CreateObject();cJSON_AddStringToObject(array, "service_id", "attribute");properties = cJSON_CreateObject();cJSON_AddItemToObject(array, "properties", properties);cJSON_AddStringToObject(properties, "status", sensorData.status ? "ON" : "OFF");cJSON_AddNumberToObject(properties, "color", (int)sensorData.color);cJSON_AddItemToArray(services, array); // 将对象添加到数组中/* 格式化打印创建的带数组的JSON对象 */char *str_print = cJSON_PrintUnformatted(root);if (str_print != NULL) {// printf("%s\n", str_print);if (strcpy_s(mqtt_data, strlen(str_print) + 1, str_print) == 0) {ret = 0;} else {ret = -1;}cJSON_free(str_print);} else {ret = -1;}if (root != NULL) {cJSON_Delete(root);} else {ret = -1;}properties = str_print = root = array = services = NULL;return ret;
}/*** @brief MQTT 上报消息*/
void mqtt_client_pub(void)
{// 组Topicmemset_s(publish_topic, MQTT_DATA_MAX, 0, MQTT_DATA_MAX);if (sprintf_s(publish_topic, MQTT_DATA_MAX, MQTT_TOPIC_PUB_PROPERTIES, DEVICE_ID) > 0) {// 组JSON数据Packaged_json_data();// 发布消息MQTTClient_pub(publish_topic, mqtt_data, strlen((char *)mqtt_data));}
}/*** @brief MQTT 周期发布消息任务*/
void mqtt_send_task(void)
{while (1) {mqtt_client_pub();sleep(MQTT_SEND_TASK_TIME);}
}int get_jsonData_value(const cJSON *const object, uint8_t *value)
{cJSON *json_value = NULL;int ret = -1;json_value = cJSON_GetObjectItem(object, "value");if (json_value) {if (!strcmp(json_value->valuestring, "ON")) {*value = 1;json_value = NULL;ret = 0; // 0为成功} else if (!strcmp(json_value->valuestring, "OFF")) {*value = 0;json_value = NULL;ret = 0;}}json_value = NULL;return ret; // -1为失败
}/*** @brief 解析JSON数据*/
int Parsing_json_data(const char *payload)
{cJSON *root = NULL, *command_name = NULL, *paras = NULL, *value = NULL;cJSON *red = NULL, *green = NULL, *blue = NULL;int ret_code = 1;root = cJSON_Parse((const char *)payload);if (root) {// 解析JSON数据command_name = cJSON_GetObjectItem(root, "command_name");paras = cJSON_GetObjectItem(root, "paras");if (command_name) {if (!strcmp(command_name->valuestring, "led")) {ret_code = get_jsonData_value(paras, &sensorData.status);// 操作硬件led_switch(sensorData.status);} else if (!strcmp(command_name->valuestring, "RGB")) {red = cJSON_GetObjectItem(paras, "red");green = cJSON_GetObjectItem(paras, "green");blue = cJSON_GetObjectItem(paras, "blue");led_color(red->valueint, green->valueint, blue->valueint);ret_code = 0; // 0为成功}}}cJSON_Delete(root);root = command_name = paras = value = red = green = blue = NULL;return ret_code;
}// 向云端发送返回值
void send_cloud_request_code(const char *request_id, int ret_code, int request_len)
{char *request_topic =(char *)malloc(strlen(MALLOC_MQTT_TOPIC_PUB_COMMANDS_REQ) + strlen(DEVICE_ID) + request_len + 1);if (request_topic != NULL) {memset_s(request_topic, strlen(DEVICE_ID) + strlen(MALLOC_MQTT_TOPIC_PUB_COMMANDS_REQ) + request_len + 1, 0,strlen(DEVICE_ID) + strlen(MALLOC_MQTT_TOPIC_PUB_COMMANDS_REQ) + request_len + 1);if (sprintf_s(request_topic, strlen(DEVICE_ID) + strlen(MALLOC_MQTT_TOPIC_PUB_COMMANDS_REQ) + request_len + 1,MQTT_TOPIC_PUB_COMMANDS_REQ, DEVICE_ID, request_id) > 0) {if (ret_code == 0) {MQTTClient_pub(request_topic, "{\"result_code\":0}", strlen("{\"result_code\":0}"));} else if (ret_code == 1) {MQTTClient_pub(request_topic, "{\"result_code\":1}", strlen("{\"result_code\":1}"));}}free(request_topic);request_topic = NULL;}
}
/*** @brief MQTT接收数据的回调函数*/
int8_t mqttClient_sub_callback(unsigned char *topic, unsigned char *payload)
{if ((topic == NULL) || (payload == NULL)) {return -1;} else {printf("topic: %s\r\n", topic);printf("payload: %s\r\n", payload);// 提取出topic中的request_idchar request_id[50] = {0};int ret_code = 1; // 1为失败if (0 == strcpy_s(request_id, sizeof(request_id),topic + strlen(DEVICE_ID) + strlen("$oc/devices//sys/commands/request_id="))) {printf("request_id: %s\r\n", request_id);// 解析JSON数据ret_code = Parsing_json_data(payload);send_cloud_request_code(request_id, ret_code, sizeof(request_id));}}return 0;
}/*** @brief MQTT 接收消息任务*/
void mqtt_recv_task(void)
{while (1) {MQTTClient_sub();sleep(MQTT_RECV_TASK_TIME);}
}/*** @brief 按键检测任务*/
void key_detection_task(void)
{while (1) {hi_gpio_get_input_val(KEY1, &val1); // 获取GPIO引脚的状态if (val1 != val1_last) {// 当GPIO状态改变的时候, 打印输出printf("key1Value: %s\r\n", val1 ? "HI_GPIO_VALUE_1" : "HI_GPIO_VALUE_0");val1_last = val1;if (!val1_last) { // 按键被按下if (sensorData.status) {sensorData.status = 0;led_switch(sensorData.status);mqtt_client_pub();} else {sensorData.status = 1;led_switch(sensorData.status);mqtt_client_pub();}}printf("key1Value: end\r\n");}hi_gpio_get_input_val(KEY2, &val2); // 获取GPIO引脚的状态if (val2 != val2_last) {// 当GPIO状态改变的时候, 打印输出printf("key2Value: %s\r\n", val2 ? "HI_GPIO_VALUE_1" : "HI_GPIO_VALUE_0");val2_last = val2;}// 200ms一检测usleep(TASK_DELAY_TIME); // 200ms sleep}
}static void network_wifi_mqtt_example(void)
{// 外设的初始化// 灯光pwm初始化hi_io_set_func(RED_LED_PIN_NAME, HI_IO_FUNC_GPIO_10_PWM1_OUT);hi_io_set_func(GREEN_LED_PIN_NAME, HI_IO_FUNC_GPIO_2_PWM2_OUT);hi_io_set_func(BLUE_LED_PIN_NAME, HI_IO_FUNC_GPIO_7_PWM0_OUT);IoTPwmInit(PWM0_PORT_NUM);IoTPwmInit(PWM1_PORT_NUM);IoTPwmInit(PWM2_PORT_NUM);// 按键初始化hi_gpio_init(); // GPIO初始化hi_io_set_pull(KEY1, HI_IO_PULL_UP); // 设置GPIO上拉hi_io_set_func(KEY1, HI_IO_FUNC_GPIO_6_GPIO); // 设置IO16为GPIO功能hi_gpio_set_dir(KEY1, HI_GPIO_DIR_IN); // 设置GPIO为输入模式hi_io_set_pull(KEY2, HI_IO_PULL_UP); // 设置GPIO上拉hi_io_set_func(KEY2, HI_IO_FUNC_GPIO_5_GPIO); // 设置IO15为GPIO功能hi_gpio_set_dir(KEY2, HI_GPIO_DIR_IN); // 设置GPIO为输入模式p_MQTTClient_sub_callback = &mqttClient_sub_callback;// 连接WiFiWifiDeviceConfig config = {0};// 准备AP的配置参数// strcpy(config.ssid, PARAM_HOTSPOT_SSID);// strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);strcpy_s(config.ssid, WIFI_MAX_SSID_LEN, PARAM_HOTSPOT_SSID);strcpy_s(config.preSharedKey, WIFI_MAX_KEY_LEN, PARAM_HOTSPOT_PSK);config.securityType = PARAM_HOTSPOT_TYPE;g_netId = ConnectToHotspot(&config);printf("netId = %d\r\n", g_netId);sleep(TASK_INIT_TIME);// 连接MQTT服务器if (MQTTClient_connectServer(SERVER_IP_ADDR, SERVER_IP_PORT) != WIFI_SUCCESS) {printf("[error] mqttClient_connectServer\r\n");}sleep(TASK_INIT_TIME);// 初始化MQTT客户端if (MQTTClient_init(MQTT_CLIENT_ID, MQTT_USER_NAME, MQTT_PASS_WORD) != WIFI_SUCCESS) {printf("[error] mqttClient_init\r\n");}sleep(TASK_INIT_TIME);// 订阅主题if (MQTTClient_subscribe(MQTT_TOPIC_SUB_COMMANDS) != WIFI_SUCCESS) {printf("[error] mqttClient_subscribe\r\n");}sleep(TASK_INIT_TIME);mqtt_client_pub(); // 连接后上报一次消息// 创建线程osThreadAttr_t options;options.name = "mqtt_send_task";options.attr_bits = 0;options.cb_mem = NULL;options.cb_size = 0;options.stack_mem = NULL;options.stack_size = TASK_STACK_SIZE;options.priority = osPriorityNormal;mqtt_send_task_id = osThreadNew((osThreadFunc_t)mqtt_send_task, NULL, &options);if (mqtt_send_task_id != NULL) {printf("ID = %d, Create mqtt_send_task_id is OK!\r\n", mqtt_send_task_id);}options.name = "mqtt_recv_task";options.stack_size = TASK_STACK_SIZE;mqtt_recv_task_id = osThreadNew((osThreadFunc_t)mqtt_recv_task, NULL, &options);if (mqtt_recv_task_id != NULL) {printf("ID = %d, Create mqtt_recv_task_id is OK!\r\n", mqtt_recv_task_id);}options.name = "key_detection_task";options.stack_size = TASK_STACK_SIZE;key_detection_task_id = osThreadNew((osThreadFunc_t)key_detection_task, NULL, &options);if (key_detection_task_id != NULL) {printf("ID = %d, Create key_detection_task is OK!\r\n", key_detection_task_id);}
}
SYS_RUN(network_wifi_mqtt_example);
其中有三个任务,分别是mqtt的周期上报,模拟温度计类的需要定时上报的功能,mqtt接收任务,用来处理服务器下发的控制命令,还有一个任务用来检测按键,当key1按下时切换灯的开关。
使用build,编译成功后,使用upload进行烧录。
这是可以从设备信息中看到设备在线,并且能看到设备上报的状态。
通过服务器下发设备控制命令,举例控制设备灯开关。
设备收到服务器发来的数据。
同时服务器也会更新设备上报的状态。
相关文章:

Hi3861 OpenHarmony嵌入式应用入门--华为 IoTDA 设备接入
华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,可以将自己的 IoT 设备 联接到华为云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云物联网平台的服 务实现设备与设备之间的控…...

Pytorch张量
在conda的环境中安装Jupyter及其他软件包 Pytorch 建立在张量(tensor)之上,Pytorch张量是一个 n 维数组,类似于 NumPy 数组。专门针对GPU设计,可以运行在GPU上以加快计算效率。换句话说,Pytorch张量是可以运…...

医院同步时钟系统提供可靠的时间支持
在医院这个充满紧张与忙碌的环境中,每一分每一秒都关乎着患者的生命与健康。为了确保医疗服务的高效、精准和安全,医院同步时钟系统应运而生,成为了医院可靠的时间支持。 医院同步时钟系统犹如一座精准的时间堡垒,为医院的各个角落…...

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组② | 11.3 - 11.5
前言 第 11 章对应的内容选择题和案例分析都会进行考查,这一章节属于10大管理的内容,学习要以教材为准。本章上午题分值预计在15分。 目录 11.3 收集需求 11.3.1 主要输入 11.3.2 主要工具与技术 11.3.3 主要输出 11.4 定义范围 11.4.1 主要输入…...

无人直播赚钱的底层逻辑是什么?一文揭晓!
当前,网络直播已经成为各类商家提高曝光和引流获客的主要渠道之一,这在为商家带来新机遇的同时,也让他们因人手不足或资金匮乏等原因而陷入无人问津窘境之中。在此背景下,无人直播软件一经出现,便引起了众多商家的关注…...

d3dcompiler_43.dll文件是什么?如何快速有效的解决d3dcompiler_43.dll文件丢失问题
dcompiler_43.dll 是一个Windows系统中的系统文件,属于DirectX软件的一部分。这个dcompiler_43.dll(动态链接库)文件主要用于处理与3D图形编程有关的任务,是运行许多游戏和高级图形程序必需的组件之一。那么如果电脑丢失d3dcompil…...

Git分支结构
目录 1. 线性分支结构 2. 分叉与合并结构 3. 分支与标签的关系 4. 并行开发与分支管理策略 测试(本机系统为Rocky_linux9.4) 合并失败解决 删除分支 删除本地分支 删除远程分支 Git 中的分支结构是版本控制中非常重要的概念之一,它描…...
测试流程规范建设
建设目的 通过规则保障团队高效协同,自驱、可控。能和所有成员达到精确的沟通。 基本规则 测试角色管理 红线-QA 新员工试用期考核流程(RD) 周会--QA 周报--QA 需求阶段 需求变更规范 开发阶段 接口文档规范 代码走查规范 分支管…...

启英泰伦CI13LC系列:打造AI语音芯片性价比之王!
在智能家居、消费电子、汽车电子等领域,语音识别技术已深度融入各类设备。通过嵌入语音芯片,这类设备可识别并执行用户的语音指令,无论是启动、调节还是关机,仅需一句话即可完成,极大地简化了操作流程。 智能语音部分应…...

headerpwn:一款针对服务器响应与HTTP Header的模糊测试工具
关于headerpwn headerpwn是一款针对服务器响应与HTTP Header的模糊测试工具,广大研究人员可以利用该工具查找网络异常并分析服务器是如何响应不同HTTP Header的。 功能介绍 当前版本的headerpwn支持下列功能: 1、服务器安全与异常检测; 2、…...
2021 RoboCom 世界机器人开发者大赛-本科组(复赛):拼题A打卡奖励
拼题 A 的教超搞打卡活动,指定了 N 张打卡卷,第 i 张打卡卷需要 mi 分钟做完,完成后可获得 ci 枚奖励的金币。活动规定每张打卡卷最多只能做一次,并且不允许提前交卷。活动总时长为 M 分钟。请你算出最多可以赢得多少枚金币&a…...
flink 大数据处理资源分配
Flink在大数据处理中的资源分配是一个复杂但至关重要的过程,它直接影响到作业的性能和稳定性。以下将从几个方面详细阐述Flink的资源分配机制和优化策略: 一、资源分配概述 Flink是一个用于无界和有界数据流处理的分布式计算框架,它通过集群…...

独立站营销新思路:携手TikTok达人,促进用户参与与品牌传播
数字化时代,品牌传播的方式发生了重大变化。尤其是TikTok,作为全球最受欢迎的短视频平台之一,其独特的社群特点和用户行为模式,对品牌独立站提供了全新的营销思路。本文Nox聚星将和大家分析TikTok社群的特点和用户行为模式&#x…...
工单管理系统能解决什么?
工单系统具备智能化派单模式工程师响应快减少员工等待时间。自定义知识库可提升工程师专业技能水平,帮助工程师迅速判断员工问题,极大提升员工报单体验。系统还能够大幅提升职能部门可以服务的用户数,有效降低专业人力成本开支,提…...

探索Facebook在人工智能领域的最新进展
在当今快速发展的科技领域中,人工智能(AI)作为一项关键技术,正在逐步改变着社交媒体的面貌。作为全球最大的社交平台之一,Facebook积极探索和应用人工智能,以提升用户体验、增强平台安全性并推动技术创新。…...

Deepspeed : AttributeError: ‘DummyOptim‘ object has no attribute ‘step‘
题意:尝试在一个名为 DummyOptim 的对象上调用 .step() 方法,但是这个对象并没有定义这个方法 问题背景: I want to use deepspeed for training LLMs along with Huggingface Trainer. But when I use deepspeed along with trainer I get …...
【Python123题库】#查询省会 #字典的属性、方法与应用
禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/140081665 参考教程:B站视频讲解——https://space.bilibili.com/3546616042621301 有帮助麻烦点个赞 ~ ~ Python123题库 查询省会字典的属性、方法与应用 查询省会 类型…...

数据建设实践之大数据平台(一)
大数据组件版本信息 zookeeper-3.5.7hadoop-3.3.5mysql-5.7.28apache-hive-3.1.3spark-3.3.1dataxapache-dolphinscheduler-3.1.9大数据技术架构 大数据组件部署规划 node101node102node103node104node105datax datax datax ZK ZK ZK RM RM NM...
【MIT 6.5840/6.824】Lab1 MapReduce
MapReduce MapReduce思想实现思路感受 6.5840/6.824 Lab与笔记汇总 本文对应的Lab版本为MIT6.5840-Spring2024的Lab1 本博客只提供思路,不会公开任何代码 本lab耗时约6h,码量约500行 MapReduce思想 MapReduce的思想属于是比较简单的,分为两…...

如何在 C 语言中进行选择排序?
🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。 文章目…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...