Android设备通过蓝牙HID技术模拟键盘实现

目录

一,背景介绍

二,技术方案

2.1 获取BluetoothHidDevice实例

2.2 注册/解除注册HID实例

2.3 Hid report description描述符生成工具

2.4 键盘映射表

2.5 通过HID发送键盘事件

 三,实例


一,背景介绍

        日常生活中,各种物理遥控器和鼠标等设备,需要摆放和携带,便捷性有待考验。根据蓝牙HID特性,可以用蓝牙协议模仿键盘,来实现空中键盘等功能。


二,技术方案

        自Android 9开放BluetoothHidDevice功能后,Android平台可以很简单的通过BluetoothHidDevice模拟键盘鼠标等蓝牙hid device角色。


2.1 获取BluetoothHidDevice实例

 BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();bluetoothAdapter.setName("KEYBOARD BT");bluetoothAdapter.getProfileProxy(context,mProfileServiceListener,BluetoothProfile.HID_DEVICE);

2.2 注册/解除注册HID实例

    public static BluetoothProfile.ServiceListener mProfileServiceListener = new BluetoothProfile.ServiceListener() {@Overridepublic void onServiceDisconnected(int profile) {Log.e(TAG, "hid onServiceDisconnected");if (profile == BluetoothProfile.HID_DEVICE) {mHidDevice.unregisterApp();}}@SuppressLint("NewApi")@Overridepublic void onServiceConnected(int profile, BluetoothProfile proxy) {Log.e(TAG, "hid onServiceConnected");bluetoothProfile = proxy;if (profile == BluetoothProfile.HID_DEVICE) {mHidDevice = (BluetoothHidDevice) proxy;HidConsts.HidDevice = mHidDevice;BluetoothHidDeviceAppSdpSettings sdp = new BluetoothHidDeviceAppSdpSettings(HidConsts.NAME, HidConsts.DESCRIPTION, HidConsts.PROVIDER, BluetoothHidDevice.SUBCLASS1_COMBO, HidConsts.Descriptor);mHidDevice.registerApp(sdp, null, null, Executors.newCachedThreadPool(), mCallback);}}};

 

        在获取到BluetoothHidDevice实例后通过registerApp注册hid device,此时hid host角色会被禁用,因此在不需要hid device功能时要及时解除hid device的注册。

        registerApp函数中最重要的一个参数BluetoothHidDeviceAppSdpSettings,主要是给对端host提供hid device角色的名称,描述信息,供应商信息,以及Hid device的Reports Descriptor。


2.3 Hid report description描述符生成工具

参考文章《官网HID描述符工具》

 

   val Descriptor = byteArrayOf(0x05.toByte(),0x01.toByte(),0x09.toByte(),0x02.toByte(),0xa1.toByte(),0x01.toByte(),0x09.toByte(),0x01.toByte(),0xa1.toByte(),0x00.toByte(),0x85.toByte(),0x01.toByte(),0x05.toByte(),0x09.toByte(),0x19.toByte(),0x01.toByte(),0x29.toByte(),0x03.toByte(),0x15.toByte(),0x00.toByte(),0x25.toByte(),0x01.toByte(),0x95.toByte(),0x03.toByte(),0x75.toByte(),0x01.toByte(),0x81.toByte(),0x02.toByte(),0x95.toByte(),0x01.toByte(),0x75.toByte(),0x05.toByte(),0x81.toByte(),0x03.toByte(),0x05.toByte(),0x01.toByte(),0x09.toByte(),0x30.toByte(),0x09.toByte(),0x31.toByte(),0x09.toByte(),0x38.toByte(),0x15.toByte(),0x81.toByte(),0x25.toByte(),0x7f.toByte(),0x75.toByte(),0x08.toByte(),0x95.toByte(),0x03.toByte(),0x81.toByte(),0x06.toByte(),0xc0.toByte(),0xc0.toByte(),0x05.toByte(),0x01.toByte(),0x09.toByte(),0x06.toByte(),0xa1.toByte(),0x01.toByte(),0x85.toByte(),0x02.toByte(),0x05.toByte(),0x07.toByte(),0x19.toByte(),0xE0.toByte(),0x29.toByte(),0xE7.toByte(),0x15.toByte(),0x00.toByte(),0x25.toByte(),0x01.toByte(),0x75.toByte(),0x01.toByte(),0x95.toByte(),0x08.toByte(),0x81.toByte(),0x02.toByte(),0x95.toByte(),0x01.toByte(),0x75.toByte(),0x08.toByte(),0x15.toByte(),0x00.toByte(),0x25.toByte(),0x65.toByte(),0x19.toByte(),0x00.toByte(),0x29.toByte(),0x65.toByte(),0x81.toByte(),0x00.toByte(),0x05.toByte(),0x08.toByte(),0x95.toByte(),0x05.toByte(),0x75.toByte(),0x01.toByte(),0x19.toByte(),0x01.toByte(),0x29.toByte(),0x05.toByte(),0x91.toByte(),0x02.toByte(),0x95.toByte(),0x01.toByte(),0x75.toByte(),0x03.toByte(),0x91.toByte(),0x03.toByte(),0xc0.toByte())


2.4 键盘映射表

    <string name="KeyText1" translatable="false">Esc</string><string name="KeyCode1" translatable="false">29</string> <!-- Keyboard ESCAPE --><string name="KeyText2" translatable="false">F1</string><string name="KeyCode2" translatable="false">3a</string> <!-- Keyboard F1 --><string name="KeyText3" translatable="false">F2</string><string name="KeyCode3" translatable="false">3b</string> <!-- Keyboard F2 --><string name="KeyText4" translatable="false">F3</string><string name="KeyCode4" translatable="false">3c</string> <!-- Keyboard F3 --><string name="KeyText5" translatable="false">F4</string><string name="KeyCode5" translatable="false">3d</string> <!-- Keyboard F4 --><string name="KeyText6" translatable="false">F5</string><string name="KeyCode6" translatable="false">3e</string> <!-- Keyboard F5 --><string name="KeyText7" translatable="false">F6</string><string name="KeyCode7" translatable="false">3f</string> <!-- Keyboard F6 --><string name="KeyText8" translatable="false">F7</string><string name="KeyCode8" translatable="false">40</string> <!-- Keyboard F7 --><string name="KeyText9" translatable="false">F8</string><string name="KeyCode9" translatable="false">41</string> <!-- Keyboard F8 --><string name="KeyText10" translatable="false">F9</string><string name="KeyCode10" translatable="false">42</string> <!-- Keyboard F9 --><string name="KeyText11" translatable="false">F10</string><string name="KeyCode11" translatable="false">43</string> <!-- Keyboard F10 --><string name="KeyText12" translatable="false">F11</string><string name="KeyCode12" translatable="false">44</string> <!-- Keyboard F11 --><string name="KeyText13" translatable="false">F12</string><string name="KeyCode13" translatable="false">45</string> <!-- Keyboard F12 --><string name="KeyText14" translatable="false">`&#160;&#160;~</string><string name="KeyCode14" translatable="false">35</string> <!-- Keyboard ` and ~ --><string name="KeyText15" translatable="false">1&#160;&#160;!</string><string name="KeyCode15" translatable="false">1e</string> <!-- Keyboard 1 and ! --><string name="KeyText16" translatable="false">2&#160;&#160;@</string><string name="KeyCode16" translatable="false">1f</string> <!-- Keyboard 2 and @ --><string name="KeyText17" translatable="false">3&#160;&#160;#</string><string name="KeyCode17" translatable="false">20</string> <!-- Keyboard 3 and # --><string name="KeyText18" translatable="false">4&#160;&#160;$</string><string name="KeyCode18" translatable="false">21</string> <!-- Keyboard 4 and $ --><string name="KeyText19" translatable="false">5&#160;&#160;%</string><string name="KeyCode19" translatable="false">22</string> <!-- Keyboard 5 and % --><string name="KeyText20" translatable="false">6&#160;&#160;^</string><string name="KeyCode20" translatable="false">23</string> <!-- Keyboard 6 and ^ --><string name="KeyText21" translatable="false">7&#160;&#160;&amp;</string><string name="KeyCode21" translatable="false">24</string> <!-- Keyboard 7 and & --><string name="KeyText22" translatable="false">8&#160;&#160;*</string><string name="KeyCode22" translatable="false">25</string> <!-- Keyboard 8 and * --><string name="KeyText23" translatable="false">9&#160;&#160;(</string><string name="KeyCode23" translatable="false">26</string> <!-- Keyboard 9 and ( --><string name="KeyText24" translatable="false">0&#160;&#160;)</string><string name="KeyCode24" translatable="false">27</string> <!-- Keyboard 0 and ) --><string name="KeyText25" translatable="false">-&#160;&#160;_</string><string name="KeyCode25" translatable="false">2d</string> <!-- Keyboard - and _ --><string name="KeyText26" translatable="false">=&#160;&#160;+</string><string name="KeyCode26" translatable="false">2e</string> <!-- Keyboard = and + --><string name="KeyText27" translatable="false">Backspace</string><string name="KeyCode27" translatable="false">2a</string> <!-- Keyboard DELETE (Backspace) --><string name="KeyText28" translatable="false">Tab</string><string name="KeyCode28" translatable="false">2b</string> <!-- Keyboard Tab --><string name="KeyText29" translatable="false">Q</string><string name="KeyCode29" translatable="false">14</string> <!-- Keyboard q and Q --><string name="KeyText30" translatable="false">W</string><string name="KeyCode30" translatable="false">1a</string> <!-- Keyboard w and W --><string name="KeyText31" translatable="false">E</string><string name="KeyCode31" translatable="false">08</string> <!-- Keyboard e and E --><string name="KeyText32" translatable="false">R</string><string name="KeyCode32" translatable="false">15</string> <!-- Keyboard r and R --><string name="KeyText33" translatable="false">T</string><string name="KeyCode33" translatable="false">17</string> <!-- Keyboard t and T --><string name="KeyText34" translatable="false">Y</string><string name="KeyCode34" translatable="false">1c</string> <!-- Keyboard y and Y --><string name="KeyText35" translatable="false">U</string><string name="KeyCode35" translatable="false">18</string> <!-- Keyboard u and U --><string name="KeyText36" translatable="false">I</string><string name="KeyCode36" translatable="false">0c</string> <!-- Keyboard i and I --><string name="KeyText37" translatable="false">O</string><string name="KeyCode37" translatable="false">12</string> <!-- Keyboard o and O --><string name="KeyText38" translatable="false">P</string><string name="KeyCode38" translatable="false">13</string> <!-- Keyboard p and P --><string name="KeyText39" translatable="false">[&#160;&#160;{</string><string name="KeyCode39" translatable="false">2f</string> <!-- Keyboard [ and { --><string name="KeyText40" translatable="false">]&#160;&#160;}</string><string name="KeyCode40" translatable="false">30</string> <!-- Keyboard ] and } --><string name="KeyText41" translatable="false">\\&#160;&#160;|</string><string name="KeyCode41" translatable="false">31</string> <!-- Keyboard \ and | --><string name="KeyText42" translatable="false">CapsLock</string><string name="KeyCode42" translatable="false">39</string> <!-- Keyboard Caps Lock --><string name="KeyText43" translatable="false">A</string><string name="KeyCode43" translatable="false">04</string> <!-- Keyboard a and A --><string name="KeyText44" translatable="false">S</string><string name="KeyCode44" translatable="false">16</string> <!-- Keyboard s and S --><string name="KeyText45" translatable="false">D</string><string name="KeyCode45" translatable="false">07</string> <!-- Keyboard d and D --><string name="KeyText46" translatable="false">F</string><string name="KeyCode46" translatable="false">09</string> <!-- Keyboard f and F --><string name="KeyText47" translatable="false">G</string><string name="KeyCode47" translatable="false">0a</string> <!-- Keyboard g and G --><string name="KeyText48" translatable="false">H</string><string name="KeyCode48" translatable="false">0b</string> <!-- Keyboard h and H --><string name="KeyText49" translatable="false">J</string><string name="KeyCode49" translatable="false">0d</string> <!-- Keyboard j and J --><string name="KeyText50" translatable="false">K</string><string name="KeyCode50" translatable="false">0e</string> <!-- Keyboard k and K --><string name="KeyText51" translatable="false">L</string><string name="KeyCode51" translatable="false">0f</string> <!-- Keyboard l and L --><string name="KeyText52" translatable="false">;&#160;&#160;:</string><string name="KeyCode52" translatable="false">33</string> <!-- Keyboard ; and : --><string name="KeyText53" translatable="false">\'&#160;&#160;\"</string><string name="KeyCode53" translatable="false">34</string> <!-- Keyboard ' and " --><string name="KeyText54" translatable="false">Enter</string><string name="KeyCode54" translatable="false">28</string> <!-- Keyboard Return (ENTER) --><string name="KeyText55" translatable="false">Shift</string><string name="KeyCode55" translatable="false">02</string> <!-- Keyboard Left Shift --><string name="KeyText56" translatable="false">Z</string><string name="KeyCode56" translatable="false">1d</string> <!-- Keyboard z and Z --><string name="KeyText57" translatable="false">X</string><string name="KeyCode57" translatable="false">1b</string> <!-- Keyboard x and X --><string name="KeyText58" translatable="false">C</string><string name="KeyCode58" translatable="false">06</string> <!-- Keyboard c and C --><string name="KeyText59" translatable="false">V</string><string name="KeyCode59" translatable="false">19</string> <!-- Keyboard v and V --><string name="KeyText60" translatable="false">B</string><string name="KeyCode60" translatable="false">05</string> <!-- Keyboard b and B --><string name="KeyText61" translatable="false">N</string><string name="KeyCode61" translatable="false">11</string> <!-- Keyboard n and N --><string name="KeyText62" translatable="false">M</string><string name="KeyCode62" translatable="false">10</string> <!-- Keyboard m and M --><string name="KeyText63" translatable="false">,&#160;&#160;&lt;</string><string name="KeyCode63" translatable="false">36</string> <!-- Keyboard , and < --><string name="KeyText64" translatable="false">.&#160;&#160;&gt;</string><string name="KeyCode64" translatable="false">37</string> <!-- Keyboard . and > --><string name="KeyText65" translatable="false">/&#160;&#160;?</string><string name="KeyCode65" translatable="false">38</string> <!-- Keyboard / and ? --><string name="KeyText66" translatable="false">Shift</string><string name="KeyCode66" translatable="false">20</string> <!-- Keyboard Right Shift --><string name="KeyText67" translatable="false">Ctrl</string><string name="KeyCode67" translatable="false">01</string> <!-- Keyboard Left Ctrl --><string name="KeyText68" translatable="false">⊞</string><string name="KeyCode68" translatable="false">08</string> <!-- Keyboard Left Win --><string name="KeyText69" translatable="false">Alt</string><string name="KeyCode69" translatable="false">04</string> <!-- Keyboard Left Alt --><string name="KeyText70" translatable="false">SPACE</string><string name="KeyCode70" translatable="false">2c</string> <!-- Keyboard Space --><string name="KeyText71" translatable="false">Alt</string><string name="KeyCode71" translatable="false">40</string> <!-- Keyboard Right Alt --><string name="KeyText72" translatable="false">Win</string><string name="KeyCode72" translatable="false">80</string> <!-- Keyboard Right Win --><string name="KeyText73" translatable="false">☰</string><string name="KeyCode73" translatable="false">65</string> <!-- Keyboard Application --><string name="KeyText74" translatable="false">Ctrl</string><string name="KeyCode74" translatable="false">10</string> <!-- Keyboard Right Ctrl --><string name="KeyText75" translatable="false">Print Screen</string><string name="KeyCode75" translatable="false">46</string> <!-- Keyboard Print Screen --><string name="KeyText76" translatable="false">Scroll Lock</string><string name="KeyCode76" translatable="false">47</string> <!-- Keyboard Scroll Lock --><string name="KeyText77" translatable="false">PAUSE</string><string name="KeyCode77" translatable="false">48</string> <!-- Keyboard Pause --><string name="KeyText78" translatable="false">Insert</string><string name="KeyCode78" translatable="false">49</string> <!-- Keyboard Insert --><string name="KeyText79" translatable="false">Home</string><string name="KeyCode79" translatable="false">4a</string> <!-- Keyboard Home --><string name="KeyText80" translatable="false">PgUp</string><string name="KeyCode80" translatable="false">4b</string> <!-- Keyboard Page Up --><string name="KeyText81" translatable="false">Delete</string><string name="KeyCode81" translatable="false">4c</string> <!-- Keyboard Delete Forward --><string name="KeyText82" translatable="false">End</string><string name="KeyCode82" translatable="false">4d</string> <!-- Keyboard End --><string name="KeyText83" translatable="false">PgDn</string><string name="KeyCode83" translatable="false">4e</string> <!-- Keyboard Page Down --><string name="KeyText84" translatable="false">▲</string><string name="KeyCode84" translatable="false">52</string> <!-- Keyboard Up Arrow --><string name="KeyText85" translatable="false">◀</string><string name="KeyCode85" translatable="false">50</string> <!-- Keyboard Left Arrow --><string name="KeyText86" translatable="false">▼</string><string name="KeyCode86" translatable="false">51</string> <!-- Keyboard Down Arrow --><string name="KeyText87" translatable="false">▶</string><string name="KeyCode87" translatable="false">4f</string> <!-- Keyboard Right Arrow -->

2.5 通过HID发送键盘事件

        通过HID设备,发送report,

HidDevice!!.sendReport(HidUtils.mDevice, report.ReportId.toInt(), report.ReportData)


 三,实例

 

       需要源码,请私信

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试热题(单词搜索)

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相…

【100天精通python】Day37:GUI界面编程_PyQT从入门到实战(上)

目录 专栏导读 1 PyQt6 简介&#xff1a; 1.1 安装 PyQt6 和相关工具&#xff1a; 1.2 PyQt6 基础知识&#xff1a; 1.2.1 Qt 的基本概念和组件&#xff1a; 1.2.2 创建和使用 Qt 窗口、标签、按钮等基本组件 1.2.3 布局管理器&#xff1a;垂直布局、水平布局、网格布局…

记一次前端直接上传图片到oss报错

前端直接上传图片到阿里云oss,相关过程官网和网上资料已经很详细&#xff0c;不做赘述。 但这个过程比较复杂&#xff0c;前后端对接过程中很容易出现报错&#xff0c;这里遇到了以下报错&#xff0c;不容易排查。 请求显示net::ERR_NAME_NOT_RESOLVED错误&#xff0c;catch输…

题目:售货员的难题(状压dp)

售货员的难题 题目描述输入输出格式输入格式&#xff1a;输出格式&#xff1a; 输入输出样例输入样例#1&#xff1a;输出样例#1&#xff1a; 思路AC代码&#xff1a; 题目描述 某乡有n个村庄( 1 < n < 16 )&#xff0c;有一个售货员&#xff0c;他要到各个村庄去售货&am…

【LangChain】P0 LangChain 是什么与准备工作

LangChain 是什么与准备工作 LangChain 是什么&#xff1f;所谓增强数据感知所谓与环境互动 Get Started下载安装 langchain下载安装 openai获取 OpenAI API Key通过名为 openai_api_key 的参数传递密钥 LangChain 是什么&#xff1f; LangChain 是一个利用语言模型开发应用程序…

也许你正处于《孤注一掷》中的“团队”,要留心了

看完这部电影&#xff0c;心情久久不能平静&#xff0c;想了很多&#xff0c;倒不是担心自己哪天也成为“消失的yaozi”&#xff0c;而是在想&#xff0c;我们每天所赖以生存的工作&#xff0c;跟电影里他们的工作比&#xff0c;差别在哪里呢&#xff1f; 目录 1. 产品的本质…

ElementUI 树形表格的使用以及表单嵌套树形表格的校验问题等汇总

目录 一、树形表格如何添加序号体现层级关系 二、树形表格展开收缩图标位置放置&#xff0c;设置指定列 三、表单嵌套树形表格的校验问题以及如何给校验rules传参 普通表格绑定如下&#xff1a;这种方法只能校验表格的第一层&#xff0c;树形需要递归设置子级节点prop。 树…

【0基础入门Python笔记】python 之基础语法、基础数据类型、复合数据类型及基本操作

python 基础&#xff08;一&#xff09; 基础语法规则基础数据类型数字类型&#xff08;Numbers&#xff09;字符串类型&#xff08;String&#xff09;布尔类型&#xff08;Boolean&#xff09; 复合数据类型List&#xff08;列表&#xff09;Tuple&#xff08;元组&#xff0…

Vue CLI创建Vue项目详细步骤

&#x1f680; 一、安装Node环境&#xff08;建议使用LTS版本&#xff09; 在开始之前&#xff0c;请确保您已经安装了Node.js环境。您可以从Node.js官方网站下载LTS版本&#xff0c;以确保稳定性和兼容性。 中文官网下载 确认已安装 Node.js。可以在终端中运行 node -v 命令…

【mysql报错解决】MySql.Data.MySqlClient.MySqlException (0x80004005)或1366

场景&#xff1a;c#使用mysql数据库执行数据库迁移&#xff0c;使用了新增inserter的语句&#xff0c;然后报错 报错如下&#xff1a; 1.MySql.Data.MySqlClient.MySqlException (0x80004005): Incorrect string value: ‘\xE6\x9B\xB4\xE6\x94\xB9…’ for column ‘Migratio…

Sigmastar SSC8826Q 2K行车记录仪解决方案

一、方案描述 行车记录仪是智能辅助汽车驾驶&#xff0c;和管理行车生活的车联网智能终端设备&#xff0c;利用智能芯片处理器、GPS定位、网络通信、自动控制等技术&#xff0c;将与行车生活有关的各项数据有机地结合在一起。 行车记录仪如今已经成了必不可少的车载用品之一&…

如何在安卓设备上安装并使用 ONLYOFFICE 文档

您可以使用文档安卓版应用&#xff0c;在移动设备上访问存在您 ONLYOFFICE 帐号中的文件。阅读本文&#xff0c;了解如何操作。 什么是 ONLYOFFICE 文档安卓版 适用于 Android 系统的 ONLYOFFICE 文档是一款全面的办公工具&#xff0c;您可以使用它&#xff0c;查看、创建、编…

Apache-Maven

安装Maven 解压apache-maven到目录下 Maven目录如下 bin&#xff1a;目录中存放的是可执行文件&#xff0c;JAVA项目中的编译执行打包都要使用bin. conf:存放的是Maven的配置文件&#xff0c;本地配置、私服配置都需要在conf下的settings.xml进行配置。 lib下存放的是Maven所…

ThreadLocal(超详细介绍!!)

关于ThreadLocal&#xff0c;可能很多同学在学习Java的并发编程部分时&#xff0c;都有所耳闻&#xff0c;但是如果要仔细问ThreadLocal是个啥&#xff0c;我们可能也说不清楚&#xff0c;所以这篇博客旨在帮助大家了解ThreadLocal到底是个啥&#xff1f; 1.ThreadLocal是什么&…

VS2019 + Qt : setToolTip的提示内容出现乱码

VS2019 Qt : setToolTip的提示内容出现乱码 在使用setToolTip()时&#xff0c; setToolTip(QString("asd你好&#xff01;");标签提示只有英文是对的&#xff0c;中文是乱码&#xff01; 应该是编码出了问题。默认情况下&#xff0c;Qt使用的是UTF-8编码&#xf…

Linux学习之sed多行模式

N将下一行加入到模式空间 D删除模式空间中的第一个字符到第一个换行符 P打印模式空间中的第一个字符到第一个换行符 doubleSpace.txt里边的内容如下&#xff1a; goo d man使用下边的命令可以实现把上边对应的内容放到doubleSpace.txt。 echo goo >> doubleSpace.txt e…

Redis系列(一):深入了解Redis数据类型和底层数据结构

Redis有以下几种常用的数据类型&#xff1a; redis数据是如何组织的 为了实现从键到值的快速访问&#xff0c;Redis 使用了一个哈希表来保存所有键值对。 Redis全局哈希表&#xff08;Global Hash Table&#xff09;是指在Redis数据库内部用于存储所有键值对的主要数据结构。…

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用

目录 一、前言 二、思路及实现方法 三、CC2530相关寄存器 四、思路以及代码实现 五、源码 一、前言 前面我们提到了非定时器模式实现呼吸灯效果&#xff0c;但由于其占用单片机主线程&#xff0c;如果不能加入RTOS的话&#xff0c;很难实现与其他功能的同步使用&#xff0…

C# 随机法求解线性规划问题 蒙特卡洛

线性规划问题: max3x12x2 x12x2<5 2x1x2<4 4x13x2<9 x1>0 x2>0 正确的结果:x11.5; x21, max z6.5 Random random1 new Random(DateTime.Now.Millisecond);Random random2 new Random(DateTime.Now.Millisecond*DateTime.Now.Millisecond);double max-9999,x1…

阿里云服务器镜像大全_Linux和Windows操作系统清单

阿里云服务器操作系统大全&#xff0c;阿里云提供的镜像均为正版授权&#xff0c;正版镜像可以在云服务器ECS上运行的应用程序提供安全、稳定的运行环境系统&#xff0c;阿里云服务器以公共镜像为例分享阿里云服务器操作系统大全&#xff0c;包括Alibaba Cloud Linux镜像、Linu…