蓝牙遥控器在T2-U上的应用
文章目录
- 简介
- 优势
- 使用流程
- 示例代码
- 遥控器命令表
- 遥控器代码实现
- 开启遥控器配对功能
- 运行
简介
Tuya beacon 协议是基于 BLE 广播通信技术,完善配对解绑、组包拆包、群组管理、加密解密、安全策略,形成的一种轻量、安全的可接入涂鸦云的蓝牙协议。
蓝牙 beacon 是基于蓝牙 BLE 技术的一种应用,是蓝牙 BLE 的诸多应用之一。BLE 的通信包括两个主要部分:advertising(广播)和connecting(连接),Beacon 设备只使用了广播通信信道,不和任何低功耗蓝牙主机进行连接,正如 beacon(信标、灯塔)的字面意思。当你在 beacon 遥控器上按下按键后 beacon 遥控器便会发送一个对应的数据包。
优势
- 成本低,无需使用任何模组,只需要一个 16 脚的 IC 和少量的外围器件就可以实现遥控器的硬件方案。
- 遥控器无需配网,支持被控的设备已激活状态下配对,也支持未激活未配网设备处于低功耗状态下配对。配对成功后,设备离线也仍然可以被遥控器控制。
- 控制范围大,无需对准设备即可控制。红外遥控器需要对准产品上的红外接收头才能正确接收。
- 最大支持 4 个群组。
配网模式中涉及到的低功耗,是指关闭射频模组,芯片并非进入了睡眠模式。配网模式详细说明可参考:https://developer.tuya.com/cn/docs/iot-device-dev/TuyaOS-iot_abi_network_config_mode?id=Kc67tro6mzaz0
使用流程
- 注册蓝牙 beacon 数据接收回调函数。此接口在需要使用蓝牙遥控器功能下必须调用,当用户没有注册蓝牙遥控器数据处理回调函数时,SDK将不启动蓝牙广播扫描,蓝牙遥控器功能不可用。
//callback function for advertisement scanning data processing
typedef VOID (*TUYA_BLE_APP_SCAN_HANDLE)(UCHAR_T *data, UCHAR_T len, UCHAR_T type, UCHAR_T* mac);OPERATE_RET tuya_ble_reg_app_scan_adv_cb(TUYA_BLE_APP_SCAN_HANDLE cb);
注:
- 使用蓝牙 beacon 遥控器之前需先调用 TuyaOS 联网单品设备初始化,“设备初始化"详细说明可参考:https://developer.tuya.com/cn/docs/iot-device-dev/TuyaOS-iot_abi_device_init?id=Kc67dkj0mxrne。
- 注册蓝牙遥控器绑定校验,绑定/解绑通知回调函数,通过注册的两个函数可以进行蓝牙遥控器绑定判断和得到是否成功绑定的结果。
typedef struct {BLE_SCAN_ADV_BIND_CHECK_CB bind_check;BLE_SCAN_ADV_BIND_RSLT_NOTIFY_CB bind_notify;
} TUYA_BLE_SCAN_ADV_HANDLE_CBS;/**\* @brief Register callback function for advertisement scanning data processing** @param[in] cbs: callback function** @note This API is used for registering callback function for advertisement scanning data processing** @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h*/
OPERATE_RET tuya_ble_reg_app_scan_adv_handle_cbs(TUYA_BLE_SCAN_ADV_HANDLE_CBS* cbs);
- 可在遥控器绑定校验回调中做指令校验,可通过返回
OPRT_OK
或OPRT_ERR_COMMON
允许/拒绝当前遥控器绑定。 - 在遥控器绑定/解绑通知回调函数
bind_notify
中做如指示灯状态提示,可帮助产品使用者判断当前遥控器绑定状态。
注:当前函数 tuya_ble_reg_app_scan_adv_handle_cbs() 非必须调用,如未调用该接口,可通过tuya_ble_reg_app_scan_adv_cb() 注册的数据接收回调函数中通过命令字获取绑定/解绑状态。
- 蓝牙遥控器绑定窗口时间设置函数。该函数也可以不调用,默认绑定窗口时间为 30s。
/*** @brief Set timeout window for binding remote controller** @param[in] time_out: time out in second, 0: no window** @note This API is used for setting timeout window for binding remote controller** @return VOID*/
VOID_T tuya_ble_set_bind_window(UINT_T time_out);
- 手工打开蓝牙遥控器绑定窗口。设备在每次上电后自动开启蓝牙绑定窗口,直至绑定窗口时间超时后关闭。此函数用于在TuyaOS关闭蓝牙遥控器绑定窗口后,手工开启设备绑定窗口,如使用按钮触发使设备再次进入蓝牙遥控器绑定窗口
/*** @brief Open window for binding remote controller** @param[in] VOID** @note This API is used for opening window for binding remote controller** @return VOID*/
VOID_T tuya_ble_open_bind_window(VOID_T);
注:该函数不能用于设备配网状态下,否则会导致设备蓝牙配网失败。
示例代码
遥控器命令表
#define BLE_KEY_TYPE_CMD 0x01 //健值
#define BLE_BIND_CMD 0x02 //绑定
#define BLE_UNBIND_CMD 0x03 //解绑
#define BLE_SWITCH_CMD 0x04 //开关
#define BLE_FAVORITES_CMD 0x05 //喜好收藏
#define BLE_SCHEDULED_CLOSE_CMD 0x06 //倒计时
#define BLE_GROUP_CHECK_CMD 0x07 //一键群组查询#define BLE_LIGHT_SWITCH_CMD 0x08 //照明开关
#define BLE_LIGHT_BRIGHT_STEP_CMD 0x09 //照明步进调亮度
#define BLE_LIGHT_BRIGHT_STEPLESS_CMD 0x0a //照明无极调亮度
#define BLE_LIGHT_TEMP_STEP_CMD 0x0b //照明步进调色温
#define BLE_LIGHT_TEMP_STEPLESS_CMD 0x0c //照明无极调色温
#define BLE_LIGHT_SEVEN_COLOR_CMD 0x0d //七彩调节
#define BLE_LIGHT_COLOE_H_STEP_CMD 0x0e //H 值调节
#define BLE_LIGHT_COLOE_H_DIMMING_CMD 0x0f //H 值无极调节
#define BLE_LIGHT_COLOE_S_STEP_CMD 0x10 //S 值调节
#define BLE_LIGHT_COLOE_S_DIMMING_CMD 0x11 //S 值无极调节
#define BLE_LIGHT_COLOE_V_STEP_CMD 0x12 //V 值调节
#define BLE_LIGHT_COLOE_V_DIMMING_CMD 0x13 //S 值无极调节
#define BLE_LIGHT_COLOE_HSV_CMD 0x14 //HSV 值调节
#define BLE_LIGHT_SCENE_CHANGE_CMD 0x15 //场景调节
#define BLE_LIGHT_MODE_SET_CMD 0x16 //模式设置
#define BLE_SPECIAL_MODE 0x17 //夜灯模式#define BLE_RGBY_CONTROL_CMD 0xff //定制rgby方向调节颜色
遥控器代码实现
/**
* @brief
*
* @param[in] data: data
* @param[in] len: data len
* @param[in] type: type
* @param[in] mac: device mac
* @return none
*/
STATIC VOID ble_receive_callback(UCHAR_T *data, UCHAR_T len, UCHAR_T type, UCHAR_T* mac)
{INT_T i = 0;if(type == 0xff){TAL_PR_DEBUG("ble remote(old ver): data len: %d", len);for ( i = 0; i < len; i++) {TAL_PR_DEBUG("data[%d] : %d", i, data[i]); }}else if(type == 0x16){TAL_PR_DEBUG("ble remote(new ver): data len: %d", len);UCHAR_T *data_cmd = (data + 2);//解析控制数据switch(data_cmd[2]){case BLE_BIND_CMD://do binding operationTAL_PR_NOTICE("=====bind success!!!=====");break;case BLE_UNBIND_CMD://do unbinding operationTAL_PR_NOTICE("====unbind success!!!====");break;default://do ctrl operationTAL_PR_DEBUG("====please do ctrl operation!!!==== cmd: [%02x], cmd len: [%02d]", data_cmd[2], len - 2);// do_handle(&(data_cmd[2]),len-2); break;}}return;
}/**
* @brief ble scanf adv bind check callback
*
* @param[in] type: bind type for bluetooth remote controller
* @param[in] data: data
* @param[in] len: data len
* @return OPRT_OK
*/
STATIC OPERATE_RET ble_scan_adv_bind_check_callback(TUYA_BLE_BIND_TYPE type, UCHAR_T *data, UCHAR_T len)
{INT_T i = 0;TAL_PR_DEBUG("----------------scan adv bind check cb-----------------");TAL_PR_DEBUG("ble bind type : %d, data len: %d", type, len);for(i=0;i<len;i++) {TAL_PR_DEBUG("data[%d] : %d", i, data[i]);}return OPRT_OK;
}/**
* @brief ble scan adv bind notify callback
*
* @param[in] type: bind type for bluetooth remote controller
* @return none
*/
STATIC VOID_T ble_adv_scan_bind_notify_callback(TUYA_BLE_BIND_TYPE type, int rslt)
{TAL_PR_DEBUG("------------------ble scan adv bind notify cb----------------");TAL_PR_DEBUG("ble bind type : %s", (type == TUYA_BLE_OP_BIND) ? "bind" : "unbind");TAL_PR_DEBUG("result : %s", (rslt == 0) ? "success" : "failed");return ;
}/**
* @brief ble remote init
*
* @param[in] param: none
* @return none
*/
VOID ble_remote_init(VOID)
{OPERATE_RET rt = OPRT_OK;TUYA_BLE_SCAN_ADV_HANDLE_CBS ble_scan_cfg = {0};ble_scan_cfg.bind_check = ble_scan_adv_bind_check_callback;ble_scan_cfg.bind_notify = ble_adv_scan_bind_notify_callback;/* Register callback function for advertisement scanning data processing */TUYA_CALL_ERR_GOTO(tuya_ble_reg_app_scan_adv_cb(ble_receive_callback), __EXIT);/* Register callback function for advertisement scanning data processing */TUYA_CALL_ERR_GOTO(tuya_ble_reg_app_scan_adv_handle_cbs(&ble_scan_cfg), __EXIT);/* set bind window (s) */tuya_ble_set_bind_window(30);__EXIT:return;
}
可根据具体项目情况
- 在
ble_scan_adv_bind_check_callback()
回调函数中实现对遥控器数据做判断,如判读正确返回OPRT_OK
表示允许绑定,否则返回OPRT_COM_ERROR
表示不允许绑定。 - 在
ble_adv_scan_bind_notify_callback()
回调函数中实现绑定/解绑指示。 - 在
ble_receive_callback()
回调函数中实现控制逻辑代码。
开启遥控器配对功能
将 ble_remote_config()
加入 tuyaos_demo_quickstart 项目,加入到 __soc_device_init()
函数最后。由于设备在未配网状态下同样会开启蓝牙用于配网,如在未配网状态下开启遥控器配对功能会导致蓝牙配网失败。
OPERATE_RET __soc_device_init(VOID_T)
{OPERATE_RET rt = OPRT_OK;#if (defined(UUID) && defined(AUTHKEY))ws_db_init_mf();/* Set authorization information* Note that if you use the default authorization information of the code, there may be problems of multiple users and conflicts, * so try to use all the authorizations purchased from the tuya iot platform.* Buying guide: https://developer.tuya.com/cn/docs/iot/lisence-management?id=Kb4qlem97idl0.* You can also apply for two authorization codes for free in the five-step hardware development stage of the Tuya IoT platform.* Authorization information can also be written through the production testing tool.* When the production testing function is started and the authorization is burned with the Tuya Cloud module tool, * please comment out this piece of code.*/WF_GW_PROD_INFO_S prod_info = {UUID, AUTHKEY};TUYA_CALL_ERR_RETURN(tuya_iot_set_wf_gw_prod_info(&prod_info));
#else// 产测初始化, 注册函数需要应用实现,其中串口驱动不需要应用提供MF_IMPORT_INTF_S intf = {0};intf.uart_init = mf_uart_init_callback;intf.uart_free = mf_uart_free_callback;intf.uart_send = mf_uart_send_callback;intf.uart_recv = mf_uart_recv_callback;intf.gpio_test = mf_gpio_test_cb;intf.mf_user_product_test = mf_user_product_test_callback;intf.user_callback = mf_user_callback;intf.user_enter_mf_callback = mf_user_enter_mf_callback;intf.user_pre_gpio_test = mf_pre_gpio_test_cb;TAL_PR_ERR("mf_init APP_BIN_NAME[%s] USER_SW_VER[%s]", APP_BIN_NAME, USER_SW_VER);TUYA_CALL_ERR_RETURN(mf_init(&intf, APP_BIN_NAME, USER_SW_VER, TRUE));
#endif/* Initialize TuyaOS product information */TY_IOT_CBS_S iot_cbs = {0};iot_cbs.gw_status_cb = __soc_dev_status_changed_cb;iot_cbs.gw_ug_cb = __soc_dev_rev_upgrade_info_cb;iot_cbs.gw_reset_cb = __soc_dev_restart_req_cb;iot_cbs.dev_obj_dp_cb = __soc_dev_obj_dp_cmd_cb;iot_cbs.dev_raw_dp_cb = __soc_dev_raw_dp_cmd_cb;iot_cbs.dev_dp_query_cb = __soc_dev_dp_query_cb;TUYA_CALL_ERR_RETURN(tuya_iot_wf_soc_dev_init(GWCM_OLD, WF_START_AP_FIRST, &iot_cbs, PID, USER_SW_VER));TUYA_CALL_ERR_RETURN(tuya_iot_reg_get_wf_nw_stat_cb(__soc_dev_net_status_cb));/* Network button, LED initialization */app_led_init(LED_PIN);app_key_init(KEY_PIN);ble_remote_init();return 0;
}
运行
设备重新上电,进入蓝牙 beacon 遥控器配对模式。
同时长按蓝牙遥控器的分组键,(如果你的蓝牙遥控器没有分组键,那么开关键就是默认的分组1),蓝牙遥控器开始和设备配对。
[09-13 16:20:18 TUYA D][example_ble_remote.c:113] ----------------scan adv bind check cb-----------------
[09-13 16:20:18 TUYA D][example_ble_remote.c:114] ble bind type : 1, data len: 12
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[0] : 11
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[1] : 7
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[2] : 1
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[3] : 255
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[4] : 2
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[5] : 1
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[6] : 255
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[7] : 92
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[8] : 139
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[9] : 0
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[10] : 211
[09-13 16:20:18 TUYA D][example_ble_remote.c:116] data[11] : 206
蓝牙状态发送变化,进入蓝牙事件回调函数中。
[09-13 16:20:18 TUYA D][example_ble_remote.c:130] ------------------ble scan adv bind notify cb----------------
[09-13 16:20:18 TUYA D][example_ble_remote.c:131] ble bind type : bind
[09-13 16:20:18 TUYA D][example_ble_remote.c:132] result : success
按下蓝牙遥控器的控制键。进入数据处理回调函数中。
[09-13 16:20:27 TUYA D][example_ble_remote.c:75] ble remote(new ver): data len: 9
[09-13 16:20:27 TUYA D][example_ble_remote.c:92] ====please do ctrl operation!!!==== cmd: [04], cmd len: [07]
同时长按蓝牙遥控器的亮度-和配对时的分组键,开始解绑流程。
设备解绑,状态发生变化,进入蓝牙事件回调函数中。
[09-13 16:24:11 TUYA D][example_ble_remote.c:75] ble remote(new ver): data len: 9
[09-13 16:24:11 TUYA N][example_ble_remote.c:87] ====unbind success!!!====
[09-13 16:24:11 TUYA D][example_ble_remote.c:130] ------------------ble scan adv bind notify cb----------------
[09-13 16:24:11 TUYA D][example_ble_remote.c:131] ble bind type : unbind
[09-13 16:24:11 TUYA D][example_ble_remote.c:132] result : success
相关文章:
蓝牙遥控器在T2-U上的应用
文章目录 简介优势使用流程示例代码遥控器命令表遥控器代码实现开启遥控器配对功能运行 简介 Tuya beacon 协议是基于 BLE 广播通信技术,完善配对解绑、组包拆包、群组管理、加密解密、安全策略,形成的一种轻量、安全的可接入涂鸦云的蓝牙协议。 蓝牙 …...
数据驱动的数字营销与消费者运营
引言:基于海洋馆文旅企业在推广宣传中,如何通过指标体系量化分析广告收益对业务带来的收益价值的思考? 第一部分:前链路引流投放的策略与实战 1.1 动态广告的实现: 偶然与必然 动态广告是一种基于实时数据和用户行为的广告形式,它…...
Qt点亮I.MX6U开发板的一个LED
本篇开始将会介绍与开发版相关的Qt项目,首先从点亮一个LED开始。I.MX6U和STM32MP157的相关信息都会用到,但是后期还是将I.MX6U的学习作为重点。当然其他开发版的开发也可以参考本博文。 文章目录 1. Qt是如何操控开发板上的一个LED2. 出厂内核设备树中注…...
网络摄像头-流媒体服务器-视频流客户端
取电脑的视频流 当涉及交通事件检测算法和摄像头视频数据处理时,涉及的代码案例可能会非常复杂,因为这涉及到多个组件和技术。以下是一个简单的Python代码示例,演示如何使用OpenCV库捕获摄像头视频流并进行实时车辆检测,这是一个…...
Django05_反向解析
Django05_反向解析 5.1 反向解析概述 随着功能的不断扩展,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。这个时候我们可以通过反向解析,将 url解析成对应的 试图函数 通过 path…...
基于HTML、CSS和JavaScript制作一个中秋节倒计时网页
💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 这个项目使用HTML、CSS和…...
富斯I6刷10通道固件
使用USB转串口模块刷写10通道固件 一、下载固件 1. 十通道英文固件 下载地址: https://github.com/benb0jangles/FlySky-i6-Mod-/tree/master 选择 FlySky-i6-Mod–master \ 10ch Mod i6 Updater \ 10ch_MOD_i6_Programmer_V1 路径下的文件,亲测可用。 2. 原版六通道中…...
vector的模拟实现 总结
vector的模拟实现 总结 vector.hTest.cpp vector.h 1、迭代器的实现 #pragma oncenamespace JPC {template<class T>class vector{public://对于存储空间是连续的结构而言,可以用原身指针来 模拟实现 迭代器。typedef T* iterator;typedef const T* const_i…...
k8s中的有状态,无状态,pv、pvc等
数据库是一个典型的有状态服务,他的部署和无状态服务是不一样的。 PostgresSQL----基于Kubernetes部署PostgresSQL-CSDN博客 一、创建SC、PV和PVC存储对象 二、部署PostgresSQL Volume Kubernetes 中文指南——云原生应用架构实战手册 有状态应用: …...
springboot+jxls复杂excel模板导出
JXLS 是基于 Jakarta POI API 的 Excel 报表生成工具,可以生成精美的 Excel 格式报表。它采用标签的方式,类似 JSP 标签,写一个 Excel 模板,然后生成报表,非常灵活,简单! Java 有一些用于创建 …...
用selenium webdriver获取网站cookie后,实现免登录上网站
以csdn为例,代码分为两部分。 一、csdn_get_cookies.py为半手动登录网站后获取cookies 二、csdn_use_cookies.py为使用获取到的cookies免登录上网站 #获取登录cookiesfrom selenium import webdriver import jsoncsdn_driver webdriver.Chrome() url "htt…...
如何使用Java进行安全测试?
要使用Java进行安全测试,可以按照以下步骤进行: 确定测试目标:首先,明确要测试的应用程序或系统的安全目标和需求。确定要测试的安全方面,如身份验证、授权、输入验证、安全配置等。 了解安全测试知识:熟悉…...
Linux之Socket函数(详细篇)
本篇是基于Linux man手册的一些总结 socket作用: create an endpoint for communication 函数结构 c #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); 描述 socket() …...
Dajngo06_Template模板
Dajngo06_Template模板 6.1 Template模板概述 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术 静态网页:页面上的数据都是写死的,万年不变 动态网页:页面上的数据是从后端动态获取的(后端获取数据库…...
快速幂 c++
一般大家写都是 int ans 1; for (int i 1; i < a; i )ans * x;时间复杂度 但是这对于我们还不够,我们要 首先我们得知道一个数学知识 那么求 就有以下递归式 a 能被2整除 a 不能被2整除 (这里a/2是整除) 所以每次都调用 不就是么 最后补充一个东西…...
分享一个基于微信小程序的医院口腔助手小程序 牙科诊所预约小程序 源码 lw 调试
💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…...
Si3262 一款低功耗刷卡+触摸+mcu 三合一SOC芯片
Si3262是-款高度集成的低功耗soC芯片,其集成了基于RISC-V 核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。 该芯片ACD模式下刷卡距离可达4-5cm(天线决定),适用于智能门锁,电子锁,柜锁,桑拿…...
[H5动画制作系列] 奔跑的豹子的四种Demo演化
资源: bg.jpg: leopard.png: 背景透明 peopard2.png 背景不透明 参考代码1: leopard.js: (function(window) {ma function() {this.initialize();}ma._SpriteSheet new createjs.SpriteSheet({images: ["leopard.png"], frames: [[0,0,484,207],[486,0,484,207]…...
如何实现让一个函数能返回多个值的效果
在C语言中,一个函数通常只能返回一个值。但是可以通过指针参数或结构体来模拟返回多个值的效果。 使用指针参数:你可以将需要返回的值作为函数的参数,通过指针的形式传入,让函数将结果写入指针所指向的内存位置。 void multiple…...
End-to-end 3D Human Pose Estimation with Transformer
基于Transformer的端到端三维人体姿态估计 摘要 基于Transformer的架构已经成为自然语言处理中的常见选择,并且现在正在计算机视觉任务中实现SOTA性能,例如图像分类,对象检测。然而,卷积方法在3D人体姿态估计的许多方法中仍然保…...
状态管理Pinia
Vue3 状态管理 - Pinia 1. 什么是Pinia Pinia 是 Vue 的专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品 2. 手动添加Pinia到Vue项目 后面在实际开发项目的时候,Pinia可以在项目创建时自动添加,现在我们初次学习,从零开始…...
maven运行报错解决
在IDEA上运行较大项目时,编译量很大,可能会报出 Error:java: java.lang.OutOfMemoryError: Java heap space 的错误,解决方法如下: java.lang.OutOfMemoryError是内存不足导致的,因此需要修改Idea运行项目的内存大小。…...
在线会计软件推荐:高效实用的选择解析
如果您始终在密切关注Zoho,您一定知道,我们的软件在一个接一个的增加,为的是构建出一套可以全面在线协作、提升业务生产力的应用系统,我们始终致力于为各类企业构建完整的业务应用,以便他们在Zoho上运行整个业务系统。…...
vue监听Enter键
目录 keydown.enter 方法1: 使用keydown.enter指令 方法2: 在keydown事件处理函数中检查按下的键 keyup.enter.native keydown.enter与keyup.enter.native区别 1. 触发时机: 2. 事件类型: 3. 事件冒泡: keydown.enter 在Vue中监听En…...
ADS中带通滤波器模型参数含义学习笔记
ADS中带通滤波器模型参数含义 1、 Fcenter 中心频率 2、 BWpass 通带带宽 3、 Apass 衰减量时的通带带宽 这两个是对应的,比如说是80MHz,3dB,那么就是3dB时的带宽为80MHz,如果改为0.1dB,那么带宽就是0.1dB时的带宽为80…...
【Blender】Blender入门学习
目录 0 参考视频教程0.1 Blender理论知识0.2 Blender上手实践0.3 FBX模型导入Unity 1 Blender的窗口介绍1.1 主界面1.2 模型编辑窗口 2 Blender的基本操作2.1 3D视图的平移2.2 3D视图的旋转2.3 3D视图的缩放2.4 修改快捷键2.5 使物体围绕选择的物体旋转2.6 四视图的查看2.7 局部…...
Redis 三种特殊的数据类型 - Geospatial地理位置 - Hyperloglog基数统计的算法 - Bitmaps位图(位存储)
目录 Redis 三种特殊的数据类型: Geospatial:地理位置 Geospatial类型常用的命令: GEOADD:添加地理位置 GEOPOS:获取地理位置 GEODIST:返回两个给定位置之间的距离 GEORADIUS:以给定的经纬…...
Python web 框架web.py「简约美」
web.py is a web framework for Python that is as simple as it is powerful. web.py is in the public domain, you can use it for whatever purpose with absolutely no restrictions. web.py 是一个简单而强大的 Python Web 框架。web.py 属于公共领域,您可以…...
Bootstrap 重新数据查询时页码为当前页问题
记录一下使用前端组件Bootstrap遇到的一个小问题: 问题描述 第一次查询数据为5页,翻页到第5页后,选中条件再次查询数据时,传到后端页码仍旧为5,而此时数据量小于5页,这时候页码没有重置成第一页ÿ…...
scratch舞蹈比赛 2023年5月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析
目录 scratch舞蹈比赛 一、题目要求 1、准备工作 2、功能实现 二、案例分析...
关键词是在网站后台做的吗/深圳市住房和建设局
北京各街头的情愿 今天是2016年10月24日,也是1024程序员节,就在前几天,作为IT人群高密度聚集的北京地区,在北京各个街头出现了大量参与“程序员不加班”的请愿行动的人群,受北京“1024程序员节”请愿活动影响ÿ…...
做sorry动图的网站/合肥优化排名推广
现在越来越多的外国企业在中国开设分公司,很多人有很强的技术和能力,但是英语不行进不了外企。这是因为中国糟糕的英语教育导致的,我们大家都是学英语学了几十年到头来都是英语聋哑人。 本方法是笔者多年国内外学习英语的经历并结合语言专家们…...
党委门户网站建设/免费推广引流平台推荐
你的js使用了三层引号,双引号里面包含了单引号,单引号里面又包含了单引号,所以就出现了问题,可以把你js里面的第三层单引号改为"代替单引号,就可以正常使用了下面是修改之后可以正常运行的代码,你看一…...
网站建设类有哪些岗位/青岛网站建设培训学校
理解javascript中的MVC MVC模式是软件工程中一种软件架构模式,一般把软件模式分为三部分,模型(Model)视图(View)控制器(Controller); 模型:模型用于封装与应用程序的业务逻辑相关的数据以及对数据处理的方法。模型有对数据直接访问的权利。模…...
遂宁市城市建设档案馆网站/济南网络推广公司
https://lihkstyle.iteye.com/category/292765转载于:https://www.cnblogs.com/Joy-Hu/p/10830652.html...
眉山网站定制/新野seo公司
本篇主要是为初次部署windows server 2008的朋友做图文指导,希望对您的提高能够有所帮助.步骤如下.1 放入windows server 2008 安装光盘后,重新启动计算机设置biso启动顺序(注意设置bios启动顺序为光盘启动),再启动后,出现如下安装画面.选择语言后点击下一步;<?xml:namespa…...