华为云物联网平台微信小程序开发教程2.0【完整详细教程】

news2024/11/24 17:32:54

一、简介

  在之前曾发布过一篇文章“华为云物联网平台的微信小程序开发”,在最近接到部分用户私信在使用开发过程中出现的问题,例如API访问的"401"现象等问题,在重新查看上面的文章教程时发现教程内容的步骤不详细,现对教程重新整理,将具体的开发过程以及工程源码分享给大家,文章可面向微信小程序开发的零基础小白。

二、开发前准备

  由于我们小程序对接的时华为云物联网平台,所以我们需要提前在华为云物联网平台创建产品及设备,并准备以下相关信息:

1. 产品ID、设备ID、设备属性

  在大家完成华为云物联网平台的MQTT数据通信测试后都回准备好了相关信息,如果还没有创建产品有设备,可以参考这篇文文章:华为云物联网平台创建产品与设备(含MQTT.fx测试).

2. 服务ID、控制名称、控制参数

  在上传设备属性和命令下发时需要使用到服务ID、控制名称和控制参数,具体设置如下图:
在这里插入图片描述

3. IAM账户

  1) 简介

  IAM账户对初次接触华为云物联网平台的应用侧开发的伙伴来说可能比较陌生,首先介绍一下在我们使用API时的流程,API的使用需要通过IAM服务鉴权来获取token,然后将这个Token作为API的参数之一,官方开发文档:华为云物联网平台——API使用指导,如下图:
在这里插入图片描述

  2) 创建IAM账户

   首先进入华为云控制台,在右上角进入统一身份认证平台:
在这里插入图片描述
   然后点击右上角的创建用户:
在这里插入图片描述
   然后按下图创建用户:
在这里插入图片描述
在这里插入图片描述

  3) IAM账户登录测试

   首先复制登录链接:
在这里插入图片描述
   然后打开新的浏览器(推荐)或者退出当前账户登录,然后进入刚才复制的链接:
在这里插入图片描述
   输入新建的IAM用户和密码:
在这里插入图片描述
   能够登录即可,登陆后如下图所示:
在这里插入图片描述

4. 相关API

 1) 获取Token

   查看开发文档:Token认证,如下图,可知需要构建一个HTTP请求,并且按下述格式完成调用。
在这里插入图片描述
   其中地区可以在控制台接入信息中的地址中查看,大家选择自己对应的地区,不要随意修改:
在这里插入图片描述
   我的HTTP请求JSON数据格式:

{
	"auth": {
		"identity": {
			"methods": ["password"],
			"password": {
				"user": {
					"name": "funiot_xyz",
					"password": "www.funiot.xyz",
					"domain": {
						"name": "hw_0086xxxxxxxxxxx"
					}
				}
			}
		},
		"scope": {
			"project": {
				"name": "cn-north-4"
			}
		}
	}
}

  2) 获取设备属性(通过设备影子)

   在完成token获取后我们即可进行其他API的调用,例如获取设备影子来解析设备属性,只需要利用HTTP完成对应URL的GET请求,然后解析响应数据即可。

GET https://{endpoint}/v5/iot/{project_id}/devices/{device_id}/shadow

在这里插入图片描述

  3) 下发设备命令

   同获取设备影子的API类似,也是利用HTTP完成对应URL的相应请求,然后解析响应数据即可,在下发设备命令时,我们暂时对返回结果不关心。
在这里插入图片描述

POST https://{endpoint}/v5/iot/{project_id}/devices/{device_id}/commands

{
  "service_id" : "Dev_data",
  "command_name" : "Control",
  "paras" : {
    "led" : "ON"
  }
}

 4) 终端节点Endpoint

   大家可能看到了上面请求的URL链接中包含一个Endpoint信息,Endpoint为指定承载REST服务端点的服务器域名或IP,不同服务不同区域的Endpoint不同,我们可以在地区和终端节点中查看,例如我的HTTP访问的终端节点为:

iam.cn-north-4.myhuaweicloud.com

 5) 准备信息汇总

  截止到目前,我们准备的信息有:产品ID、设备ID、设备属性、用户名、IAM用户名、IAM用户密码、服务ID、控制名称、控制参数、相应API的数据格式等,接下来我们就可以开始微信小程序的开发了。

三、微信小程序开发

1. 新建工程

 1) 环境准备

  官网下载并安装“微信开发工具”:微信开发者工具下载地址与更新日志
在这里插入图片描述

 2) 获取AppID

  进入微信小程序开发管理网页:微信小程序开发管理,然后点击开发设置,复制AppID。
在这里插入图片描述

 3) 新建工程

   填写在开发管理中复制的AppID并选择“JavaScript基础模板”,然后点击“确定”等待项目生成
在这里插入图片描述在这里插入图片描述

 4) 精简工程

   我们把模板中无关的信息进行一下删减,首先删除page中的“index”以及“logs”界面,并新建page “Huawei_IOT”
在这里插入图片描述

在这里插入图片描述
  系统会自动生成相关文件:
在这里插入图片描述
  修改app.json文件,删除界面引用:
在这里插入图片描述
  然后打开“Huawei_IOT.wxml”文件,这是小程序的页面布局文件,大家根据需要完成自己的界面设计:
在这里插入图片描述

2. 初始设计

 1)初始界面设计

   这里以非常简单的布局设计为例,在”Huawei_IOT.wxml“文件中添加三个按钮和两个文本提示信息,其中一个文本采用变量的形式,并为按钮添加触发函数名。
在这里插入图片描述

<text >提示信息:</text>
<text>{{result}}</text>
<button type="primary" bindtap="touchBtn_gettoken">获取token</button>
<button type="default" bindtap="touchBtn_getshadow">获取设备影子</button>
<button type="warn" bindtap="touchBtn_getshadow">设备命令下发</button>

 2)初始功能设计

   然后在“Huawei_IOT.js”文件中的date内补充变量以及按钮触发函数:
在这里插入图片描述

 /**
     * 页面的初始数据
     */
    data: {
        result:'等待获取token',
    },
    /**
     * 获取token按钮按下:
     */
    touchBtn_gettoken:function()
    {
        console.log("获取token按钮按下");
    },
    /**
     * 获取设备影子按钮按下:
     */
    touchBtn_getshadow:function()
    {
        console.log("获取设备影子按钮按下");
    },
     /**
     * 设备命令下发按钮按下:
     */
    touchBtn_setCommand:function()
    {
        console.log("设备命令下发按钮按下");
    },  

 3)初始测试

   编译之后在左侧模拟器中点击按钮,查看右侧的输出界面可以打印的信息,同时左侧模拟器的文本会对应更新:
在这里插入图片描述
接下来我们便开始完成华为云物联网平台的相关开发。

3. 华为云物联网平台通信

 1)wx.request方法

   wx.request方法用来建立http连接,完成GET或POST请求,实现各种HTTP API的调用, wx.request方法结构如下:

wx.request({
       url: '',
       data:'',
       method: '', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
       header: {}, // 设置请求的 header 
       success: function(res){// success
       // success
       	console.log(res);//打印完整消息
       },
        fail:function(){
        // fail
       },
        complete: function() {
       // complete
       } 
 });

  2)获取token

   在前面我们已经学习了获取token的方法,即构建一个HTTP的POST请求,并且按对应格式完成调用。
在这里插入图片描述

    a)url

   在wx.request方法中的url为:
在这里插入图片描述

https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens 

(注意更换自己的产品地区,我的是cn-north-4)

    b)添加合法域名

   由于微信小程序对域名访问有限制,需要手动添加为合法域名,首先打开微信小程序开发管理网页:微信小程序开发管理,然后点击开发设置,在服务器域名处点击修改,补充上述的根域名(注意:截止到.com),例如:

https://iam.cn-north-4.myhuaweicloud.com

在这里插入图片描述
   在项目中点击右上角的“详情”“项目配置”,可以看到合法域名已经被添加,如果没有,可以尝试点击刷新:
在这里插入图片描述
   如果刷新后仍没有,请检查文章刚开始复制的AppID是否一致,如果不一致,可在右上角“详情”“基本信息”中修改:
在这里插入图片描述
此处有小伙伴因为AppID有误导致合法域名未有效添加引起,从而导致API调用失败的问题。

    c)data

   在wx.request方法中的data为上图URL下方的数据:
在这里插入图片描述

   将自己的信息填写完整,例如我的data为:

{"auth": { "identity": {"methods": ["password"],"password": {"user": {"name": "funiot_xyz","password": "yourpassword","domain": {"name": "hw_0086xxxxxx"}}}},"scope": {"project": {"name": "cn-north-4"}}}}

   建议大家在填写后进行json格式化验证,避免在填写过程中出现json数据格式错误,在线JSON校验格式化工具。(有部分小伙伴因为这个问题失败)。
在这里插入图片描述

    d)method

   method为POST:
在这里插入图片描述

    e)header

   请求头为:
在这里插入图片描述

{'content-type': 'application/json' }

    f)补充request方法

将上述整理的所需数据填写完补充,如下所示:

	/**
     * 获取token
     */
    gettoken:function(){
        console.log("开始获取。。。");//打印完整消息
        var that=this;  //这个很重要,在下面的回调函数中由于异步问题不能有效修改变量,需要用that获取
        wx.request({
            url: 'https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens',
            data:'{"auth": { "identity": {"methods": ["password"],"password": {"user": {"name": "funiot_xyz","password": "xxxxxxxx","domain": {"name": "hw_0086xxxxxxxx"}}}},"scope": {"project": {"name": "cn-north-4"}}}}',
            method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
            header: {'content-type': 'application/json' }, // 请求的 header 
            success: function(res){// success
              // success
                console.log("获取token成功");//打印完整消息
                console.log(res);//打印完整消息
            },
            fail:function(){
                // fail
                console.log("获取token失败");//打印完整消息
            },
            complete: function() {
                // complete
                console.log("获取token完成");//打印完整消息
            } 
        });
    },

    g)按键事件添加调用

this.gettoken();

在这里插入图片描述

    h)编译运行

   在输出端口可以看到打印了HTTP返回的消息,展开可以看到token:
在这里插入图片描述

    i)添加解析

    在wx.request方法中的 success回调函数,补充解析token的代码:

var token='';
token=JSON.stringify(res.header['X-Subject-Token']);//解析消息头token
token=token.replaceAll("\"", "");
console.log("获取token=\n"+token);//打印token
wx.setStorageSync('token',token);//把token写到缓存中,以便可以随时随地调用

    再次编译运行,可以看到提取了token:
在这里插入图片描述

    j)获取token完整函数

    /**
     * 获取token
     */
    gettoken:function(){
        console.log("开始获取。。。");//打印完整消息
        var that=this;  //这个很重要,在下面的回调函数中由于异步问题不能有效修改变量,需要用that获取
        wx.request({
            url: 'https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens',
            data:'{"auth": { "identity": {"methods": ["password"],"password": {"user": {"name": "funiot_xyz","password": "xxxxxxxx","domain": {"name": "hw_0086xxxxxxxx"}}}},"scope": {"project": {"name": "cn-north-4"}}}}',
            method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
            header: {'content-type': 'application/json' }, // 请求的 header 
            success: function(res){// success
              // success
                console.log("获取token成功");//打印完整消息
                console.log(res);//打印完整消息
                var token='';
                token=JSON.stringify(res.header['X-Subject-Token']);//解析消息头的token
                token=token.replaceAll("\"", "");
                console.log("获取token=\n"+token);//打印token
                wx.setStorageSync('token',token);//把token写到缓存中,以便可以随时随地调用
            },
            fail:function(){
                // fail
                console.log("获取token失败");//打印完整消息
            },
            complete: function() {
                // complete
                console.log("获取token完成");//打印完整消息
            } 
        });
    },

    获取了token之后我们就可以开始使用其他API啦,接下来以获取设备影子为例。

  3)获取设备属性(通过设备影子)

    在前面我们已经学习了调用设备影子API的方法,即只需要利用HTTP完成对应URL的GET请求,然后解析响应数据即可。首先还是使用wx.request方法:

wx.request({
       url: '',
       data:'',
       method: '', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
       header: {}, // 设置请求的 header 
       success: function(res){// success
       // success
       },
        fail:function(){
        // fail
       },
        complete: function() {
       // complete
       } 
 });

    a)URL

   根据文档可知,其中URL为:
在这里插入图片描述
   我们将自己的参数补充进去,例如我的URL为:

https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/08e942062b80f46xxxxxxxxxxxxxx/devices/61fb2d7fde993xxxxxxx_esp8266_test01/shadow

    b)添加合法域名

   同上一次添加合法域名一样,打开微信小程序开发管理网页:微信小程序开发管理,然后点击开发设置,在服务器域名处点击修改,补充上述的根域名(注意:截止到.com),例如:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    c)data

        此处消息体没有数据,我们可以直接忽略

data:''

    d)method

    method采用GET请求
在这里插入图片描述

    e)header

   消息头为:

{'content-type': 'application/json','X-Auth-Token':token }

将获取的token作为参数X-Auth-Token的值,instance-Id可以忽略
在这里插入图片描述

    f)补充request方法

   将上述信息补充到wx.request中,例如:

    getshadow:function(){
        console.log("开始获取影子");//打印完整消息
        var that=this;  //这个很重要,在下面的回调函数中由于异步问题不能有效修改变量,需要用that获取
        var token=wx.getStorageSync('token');//读缓存中保存的token
        console.log("我的toekn:"+token);//打印完整消息
        wx.request({
            url: 'https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/08e94206xxxxxxxxxxxxxxxxxx/devices/61fb2d7fde99xxxxxxxxx_esp8266_test01/shadow',
            data:'',
            method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
            header: {'content-type': 'application/json','X-Auth-Token':token }, //请求的header 
            success: function(res){// success
              // success
                console.log(res);//打印完整消息
            },
            fail:function(){
                // fail
                console.log("获取影子失败");//打印完整消息
            },
            complete: function() {
                // complete
                console.log("获取影子完成");//打印完整消息
            } 
        });
    },

    g)按键事件调用

this.getshadow();

在这里插入图片描述

    h)编译运行

   在输出端口可以看到打印了HTTP返回的消息,展开可以看到设备属性数据:
在这里插入图片描述

    i)添加解析

    在wx.request方法中的 success回调函数,补充解析设备属性的代码,再次编译运行:

var shadow=JSON.stringify(res.data.shadow[0].reported.properties);
console.log('设备影子数据:'+shadow);
 //以下根据自己的设备属性进行解析
 //我的设备影子:{"Temp":30,"temp":89,"Dev_data":77.20592,"humi":80,"light":3000,"GPS_N":3904.2279,"GPS_E":11706.2279,"warning":1,"MPU6050":1,"foot":12,"led":1,"temps":"89"}
 var Temp=JSON.stringify(res.data.shadow[0].reported.properties.Temp);
 var Humi=JSON.stringify(res.data.shadow[0].reported.properties.humi);
 console.log('温度='+Temp+'℃');
 console.log('湿度='+Humi+'%');
 that.setData({result:'温度'+Temp+'℃,湿度'+Humi+'%'});

在这里插入图片描述

    j)获取设备属性(通过设备影子)完整函数

/**
* 获取设备影子
*/
 getshadow:function(){
     console.log("开始获取影子");//打印完整消息
     var that=this;  //这个很重要,在下面的回调函数中由于异步问题不能有效修改变量,需要用that获取
     var token=wx.getStorageSync('token');//读缓存中保存的token
     wx.request({
         url: 'https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/08e942062xxxxxxxxxxxxxxxxxx/devices/61fb2d7fde9xxxxxxxxx_esp8266_test01/shadow',
         data:'',
         method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
         header: {'content-type': 'application/json','X-Auth-Token':token }, //请求的header 
         success: function(res){// success
         // success
             console.log(res);//打印完整消息
             var shadow=JSON.stringify(res.data.shadow[0].reported.properties);
             console.log('设备影子数据:'+shadow);
             //以下根据自己的设备属性进行解析
             //我的设备影子:{"Temp":30,"temp":89,"Dev_data":77.20592,"humi":80,"light":3000,"GPS_N":3904.2279,"GPS_E":11706.2279,"warning":1,"MPU6050":1,"foot":12,"led":1,"temps":"89"}
             var Temp=JSON.stringify(res.data.shadow[0].reported.properties.Temp);
             var Humi=JSON.stringify(res.data.shadow[0].reported.properties.humi);
             console.log('温度='+Temp+'℃');
             console.log('湿度='+Humi+'%');
             that.setData({result:'温度'+Temp+'℃,湿度'+Humi+'%'});
         },
         fail:function(){
             // fail
             console.log("获取影子失败");//打印完整消息
             console.log("请先获取token");//打印完整消息
         },
         complete: function() {
             // complete
             console.log("获取影子完成");//打印完整消息
         } 
     });
 },

  4)设备命令下发

   通过前面的练习,我们可以了解到主要的就是访问的URL不同、mode不同,消息体和消息头不同,完成后解析对应的数据即可,在设备命令下发中前面已经介绍了这个API使用方法:
在这里插入图片描述

    a)URL

   根据文档可知,其中URL为:
在这里插入图片描述
   补充参数后,我的URL为:

https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/08e94206xxxxxxxxxxxxx/devices/61fb2d7fde99xxxxxxxx_esp8266_test01/commands

   由于此域名与获取设备影子的域名一致,此处不用再次添加合法域名。

    b)data

        此处消息体为:
在这里插入图片描述
        我的data:

{"service_id": "Dev_data","command_name": "Control","paras": { "led": 1}}

   此处同样建议进行JSON格式化,避免在填写过程中出现json数据格式错误,在线JSON校验格式化工具。

    c)method

    method采用POST请求
在这里插入图片描述

    d)header

   消息头为:

{'content-type': 'application/json','X-Auth-Token':token}

    e)按键事件调用

this.setCommand();

在这里插入图片描述

    f)补充request方法

   将上述信息补充到wx.request中,例如:

    /**
     * 设备命令下发
     */
    setCommand:function(){
        console.log("开始下发命令。。。");//打印完整消息
        var that=this;  //这个很重要,在下面的回调函数中由于异步问题不能有效修改变量,需要用that获取
        var token=wx.getStorageSync('token');//读缓存中保存的token
        wx.request({
            url: 'https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/08e942062b80xxxxxxxxxxxxxx/devices/61fb2d7fde9xxxxxxxxxxxxxx_esp8266_test01/commands',
            data:'{"service_id": "Dev_data","command_name": "Control","paras": { "led": 1}}',
            method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
            header: {'content-type': 'application/json','X-Auth-Token':token }, //请求的header 
            success: function(res){// success
                // success
                console.log("下发命令成功");//打印完整消息
                console.log(res);//打印完整消息
                
            },
            fail:function(){
                // fail
                console.log("命令下发失败");//打印完整消息
                console.log("请先获取token");//打印完整消息
            },
            complete: function() {
                // complete
                console.log("命令下发完成");//打印完整消息
                that.setData({result:'设备命令下发完成'});
            } 
        });
    },


    g)编译运行

   在输出端口可以看到打印了HTTP返回的消息,展开可以看到命令下发情况:
在这里插入图片描述
   在华为云物联网平台的监控运维中可以看到具体命令:
在这里插入图片描述

    h)命令下发完整函数

    /**
     * 设备命令下发
     */
    setCommand:function(){
        console.log("开始下发命令。。。");//打印完整消息
        var that=this;  //这个很重要,在下面的回调函数中由于异步问题不能有效修改变量,需要用that获取
        var token=wx.getStorageSync('token');//读缓存中保存的token
        wx.request({
            url: 'https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/08e942062b80xxxxxxxxxxxxxx/devices/61fb2d7fde9xxxxxxxxxxxxxx_esp8266_test01/commands',
            data:'{"service_id": "Dev_data","command_name": "Control","paras": { "led": 1}}',
            method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
            header: {'content-type': 'application/json','X-Auth-Token':token }, //请求的header 
            success: function(res){// success
                // success
                console.log("下发命令成功");//打印完整消息
                console.log(res);//打印完整消息
                
            },
            fail:function(){
                // fail
                console.log("命令下发失败");//打印完整消息
                console.log("请先获取token");//打印完整消息
            },
            complete: function() {
                // complete
                console.log("命令下发完成");//打印完整消息
                that.setData({result:'设备命令下发完成'});
            } 
        });
    },

   至此,本期教程到此结束,大家可以通过这个项目完成基本的华为云物联网平台的设备属性查询与设备控制,所有相关代码均在文中给出,如有相关问题可以在文章下留言,收到留言后会第一时间处理,如果需要这个工程的项目文件,可以在公众号“IOT趣制作”内回复关键字“华为云WXIOT”或“0619”即可获得项目文件的下载链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/663336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman快速入门(一)

一、基本介绍 postman是一款流程的接口调试工具&#xff0c;其特点就是使用简单&#xff0c;功能强大。使用角色也非常广泛&#xff0c;后端开发&#xff0c;前端人员&#xff0c;测试人员都可以使用它进行接口调试或测试。 下图是基本功能介绍 发送第一个请求 如果你是第一次…

人工智能如何彻底改变 SaaS 格局

人工智能 (AI) 正在颠覆几乎所有行业&#xff0c;并正在改变我们开展业务的方式。近年来&#xff0c;SaaS 行业一直是受影响最大的行业之一&#xff0c;人工智能在其指数级增长中发挥着至关重要的作用。在本文中&#xff0c;我们将详细讨论实施 AI 对 SaaS 产品的增长和开发有何…

C++拷贝构造函数

文章目录 拷贝构造函数是一个c的默认成员函数&#xff0c;它是用来拷贝对象的&#xff0c;当你想修改对象&#xff0c;但是又不想修改它本身&#xff0c;那么可以将其拷贝给一个对象对这个拷贝出来的对象进行操作 拷贝构造函数语法&#xff1a;类名&#xff08;const 类名&…

Java-API简析_java.util.StringTokenizer类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131293596 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

设计模式之——单例模式

✍&#x1f3fc;作者&#xff1a;周棋洛&#xff0c;计算机学生 ♉星座&#xff1a;金牛座 &#x1f3e0;主页&#xff1a;点击学习更多 &#x1f310;关键&#xff1a;JavaScript 单例 设计模式 单例模式的定义是&#xff1a;保证一个类仅有一个实例&#xff0c;并提供一个访问…

【操作系统】程序运行环境

目录 1.处理器运行模式 1.1特权指令 1.2非特权指令 2.中断和异常的概念 2.1中断和异常的定义 2.1.1外中断 2.1.2内中断&#xff08;异常&#xff09; 2.2中断和异常的处理过程 3.系统调用 1.处理器运行模式 计算机系统中&#xff0c;通常 CPU 执行两种不同性质的程序:一…

【Android开发基础】手机传感器信息的获取

文章目录 一、引言二、了解1、概述2、关键 三、设计1、UI设计&#xff08;1&#xff09;主界面&#xff08;2&#xff09;适配器item 2、编码&#xff08;1&#xff09;获取数据&#xff08;传感器信息&#xff09;&#xff08;2&#xff09;渲染数据&#xff08;初始化适配器&…

SpringBoot不在使用@Validated 做参数校验但是不想在Controller层怎么办?

目录 场景再现&#xff1a; 怎么做&#xff1f; 遇到了什么问题&#xff1f; 怎么实现&#xff1f; 场景再现&#xff1a; 某API接口接受加密的json字符串&#xff0c;接受字符串之后先进行解密处理&#xff0c;解密完成之后还要进行参数校验处理&#xff0c;如果参数不合规…

华为HCIA备考(数通) 易错题整理 PART1

1.IEEE802.1Q定义的 VLAN 帧格式中VLAN ID总共有多少bit 答&#xff1a;12 2.NAPT允许多个私有IP地址通过不同的端口号映射到同一个公有IP地址上&#xff0c;且不需要做任何关于端口号的配置。 3.IEEE802.1Q定义的VLAN帧总长度为多少字节&#xff1f; 答&#xff1a;4 4.关于…

2023亚马逊云科技中国峰会:强化学习探索—— Amazon DeepRacer

1️⃣前言 Amazon DeepRacer 是一个综合性的学习系统&#xff0c;可供各个水平的用户用来学习和探索强化学习以及试验和构建自动驾驶应用程序。 2️⃣Amazon DeepRacer 介绍 DeepRacer是一款小型自主驾驶车辆&#xff0c;它结合了深度学习、强化学习和云计算等技术&#xff0c…

Karl Guttag评Vision Pro(二):这些硬件问题不容忽视

上周&#xff0c;AR/VR光学专家Karl Guttag从价格、VST透视、应用、交互等方面&#xff0c;将Vision Pro与Quest Pro进行对比&#xff0c;发现Vision Pro在设计上做出更多正确决策。尽管如此&#xff0c;Guttag认为该头显本身在硬件部分&#xff0c;依然存在一些不易发现的问题…

C语言结构体计算大小结构体的对齐数,修改默认对齐数。

结构体的对齐规则 第一个成员在与结构体变量偏移量为0的地址处。剩余成员变量要对齐到对齐数的整数倍的地址处。 对齐数&#xff1a;编译器默认对齐数与该成员大小的较小值vs中默认对齐数为8没有默认对齐数&#xff0c;那么对齐数就是其本身成员大小 结构体总大小为最大对齐数…

2个小工具让你轻松解决大数据/数据库测试

目录 前言&#xff1a; 研究背景 工具 支持功能 支持功能 使用方法 总结 前言&#xff1a; 做大数据/数据库测试时&#xff0c;通常需要编写复杂的测试用例代码或手动操作来测试系统的正确性和稳定性。但是&#xff0c;有些小工具可以轻松解决这个问题&#xff0c;提高测试效率…

python自动化测试- 自动化框架及工具

1 概述 手续的关于测试的方法论&#xff0c;都是建立在之前的文章里面提到的观点&#xff1a; 功能测试不建议做自动化接口测试性价比最高接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 如果你想学习自动化测试&#xff0c;我这边给你推…

智慧绿色档案馆之八防一体化解决系统方案

主要涉及系统&#xff1a; 智慧档案馆温湿度监控系统 智慧档案馆净化系统 智慧档案馆防火监控系统 智慧档案馆防盗监控系统 智慧档案馆漏水监控系统 智慧档案馆空气质量监控系统 智慧档案馆自动化恒温恒净化系统 智慧档案馆大数据云平台建设系统 &#xff08;一&#xff09;技…

C语言实现青蛙跳台阶问题【图解】

目录 问题分析方法1&#xff1a;找规律问题分析方法2&#xff1a;递归两种方法的代码 题目 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法&#xff1f; 问题分析方法1&#xff1a;找规律 当n1时&#xff0c;显然…

vue+Nodejs+Koa搭建前后端系统(六)-- 用户登录

前言 采用vue3&#xff0c;vue-router版本为4.x前端构建工具采用viteIDE采用VSCODE&#xff0c;安装了MYSQL客户端插件 前端编写 安装并使用 vue-router 如果有vue-router&#xff0c;就略过这一小节。 vue-router完整教程&#xff1a;点这里>> 第一步&#xff1a;n…

MySQL ⽀持哪些存储引擎?默认使⽤哪个?MyISAM 和 InnoDB 引擎有什么区别,如何选择?

&#x1f4a7; M y S Q L ⽀持哪些存储引擎&#xff1f;默认使⽤哪个&#xff1f; M y I S A M 和 I n n o D B 引擎有什么区别&#xff0c;如何选择&#xff1f; \color{#FF1493}{MySQL ⽀持哪些存储引擎&#xff1f;默认使⽤哪个&#xff1f;MyISAM 和 InnoDB 引擎有什么区别…

centos tomcat

利用samba共享将所用的的组件复制到/usr/java/中 并给/usr/java设置777权限 Samba配置如下 重启smb服务 进入目录开始安装jdk 在当前目录解压jdk 配置环境变量 使配置生效 查看jdk版本 创建tomcat目录 解压tomcat的安装包到当前目录 进入tomcat配置目录 启动tomcat 先关闭在启…

【微服务】微服务架构设计

文章目录 背景一、流量入口Nginx二、网关三、业务组件四、服务注册中心五、缓存和分布式锁六、数据持久层七、结构型数据存储八、消息中间件九、日志收集十、任务调度中心十一、分布式对象存储 背景 当前&#xff0c;微服务架构在很多公司都已经落地实施了&#xff0c;下面用一…