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.pswp.cn/news/41068.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41068.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41068.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AndroidStudio中修改打包生成的apk名稱

1.配置手機架構 splits {abi {enable truereset()include armeabi-v7a,arm64-v8auniversalApk false} } 2.多渠道 productFlavors {normal {applicationId "*****"manifestPlaceholders [appName: "string/app_name_normal"]}driver {applicationId &qu…

圖片轉換成pdf格式?這幾種轉換格式方法了解一下

圖片轉換成pdf格式&#xff1f;將圖片轉換成PDF格式的好處有很多。首先&#xff0c;PDF格式具有通用性&#xff0c;可以在幾乎任何設備上查看。其次&#xff0c;PDF格式可以更好地保護文件&#xff0c;防止被篡改或者復制。此外&#xff0c;PDF格式還可以更好地壓縮文件大小&am…

使用Kaptcha生成驗證碼

說明&#xff1a;驗證碼&#xff0c;是登錄流程中必不可少的一環&#xff0c;一般企業級的系統&#xff0c;使用都是專門制作驗證碼、審核校驗的第三方SDK&#xff08;如極驗&#xff09;。本文介紹&#xff0c;使用谷歌提供的Kaptcha技術&#xff0c;制作一個簡單的驗證碼。 …

sqlserver數據庫導出到mysql

愛到分才顯珍貴&#xff0c;很多人都不懂珍惜擁有&#xff0c;只到失去才看到&#xff0c;其實那最熟悉的才最珍貴的。 這里只介紹一種方式&#xff0c;有很多的方式。 1.使用Navicat 安裝 下載 2.工具 數據傳輸 3.選擇源和目標 然后開始 4.最好導入前備份一下庫

【KVM虛擬化環境部署】

環境部署 KVM虛擬化環境 1、裝系統時手動選擇安裝 2、CentOS 7 最小化安裝 yum install qemu-kvm qemu-img libvirt -y yum install virt-install libvirt-python virt-manager python-virtinst libvirt-client -y安裝好CentOS 7后&#xff0c;去設置里面點擊處理器&#x…

4.0 Spring Boot入門

1. Spring Boot概述 Spring Boot介紹 Spring Boot是Pivotal團隊在2014年推出的全新框架&#xff0c;主要用于簡化Spring項目的開發過程&#xff0c;可以使用最少的配置快速創建Spring項目。 Spring Boot版本 2014年4月v1.0.0.RELEASE發布。 ? 2.Spring Boot特性 約定優于配…

docker-compose部署可道云

文章目錄 一. Mac1.1 下載源碼1.2 部署1.2.1 修改密碼部署(可忽略)1.2.2 直接部署 1.3 卸載1.4 訪問 二. Win2.1 下載源碼2.2 部署2.2.1 修改密碼部署(可忽略)2.2.2 直接部署 2.3 卸載 一. Mac 1.1 下載源碼 mkdir -p /Users/wanfei/docker-compose && cd /Users/wan…

mysql 數據備份和恢復

操作系統&#xff1a;22.04.1-Ubuntu mysql 版本&#xff1a;8.033 binlog 介紹 binlog 是mysql 二進制日志 binary log的簡稱&#xff0c;可以簡單理解為數據的修改記錄。 需要開啟binlog,才會產生文件&#xff0c;mysql 8.0 默認開啟,開啟后可以在 /var/lib/mysql &#xff…

技術債 筆記

目錄 1. 技術債 筆記1.1. 什么是技術債1.2. 討論1.3. 國內技術從業者怎么看? 1. 技術債 筆記 1.1. 什么是技術債 1992 年, Ward Cunningham 在敏捷宣言中首次提出了"技術債"概念, 主要指有意或無意地做了錯誤的或不理想的技術決策所累積的債務。隨后, 《重構》一書…

sql中union all、union、intersect、minus的區別圖解,測試

相關文章 sql 的 join、left join、full join的區別圖解總結&#xff0c;測試&#xff0c;注意事項 1. 結論示意圖 對于intersect、minus&#xff0c;oracle支持&#xff0c;mysql不支持&#xff0c;可以變通&#xff08;in或exists&#xff09;實現 2.測試 2.1.創建表和數…

vue pc端項目el-upload上傳圖片時加水印

html代碼&#xff1a; <a-uploadclass"avatar-uploader"list-type"picture-card":file-list"uploadFileList":custom-request"uploadDoneHandle":before-upload"beforeUpload":remove"removeHandle"v-decorat…

案例21 基于Spring Boot+Redis實現圖書信息按書號存儲案例

1. 案例需求 基于Spring BootRedis實現圖書信息按書號存儲和取出功能&#xff0c;數據存儲至Redis。 2. 創建Spring Boot項目 創建Spring Boot項目&#xff0c;項目名稱為springboot-redis02。 3. 選擇依賴 ? pom.xml文件內容如下所示&#xff1a; <?xml version&quo…

瀏覽器控制臺調試代碼和JavaScript控制臺方法介紹

瀏覽器控制臺調試代碼和JavaScript控制臺方法介紹 瀏覽器控制臺調試代碼 瀏覽器控制臺&#xff08;Console&#xff09;是瀏覽器提供的一個開發工具&#xff0c;用于在瀏覽器中執行和調試 JavaScript 代碼。它提供了一個交互式環境&#xff0c;可以輸入 JavaScript 代碼&#…

Qt:隱式內存共享

隱式內存共享 Many C classes in Qt use implicit data sharing to maximize resource usage and minimize copying. Implicitly shared classes are both safe and efficient when passed as arguments, because only a pointer to the data is passed around, and the data i…

C語言:每日一練(選擇+編程)

目錄 選擇題&#xff1a; 題一&#xff1a; 題二&#xff1a; 題三&#xff1a; 題四&#xff1a; 題五&#xff1a; 編程題&#xff1a; 題一&#xff1a;打印1到最大的n位數 示例1 思路一&#xff1a; 題二&#xff1a;計算日期到天數轉換 示例1 思路一&#xf…

【JVM】如何判定一個對象已死以及“標記-清除”、“標記-復制”、“標記-整理”三種垃圾收集算法

文章目錄 0、如何判定一個對象的生死&#xff1f;1、上文提到的引用又是什么1、強引用&#xff1a;2、軟引用&#xff1a;3、弱引用&#xff1a;4、虛引用&#xff1a; 2、垃圾收集算法1、標記-清除2、標記-復制優化&#xff1a;&#x1f447; 3、標記-整理 0、如何判定一個對象…

Java面向對象程序設計——知識、概念、定義及作用(簡答)

?專欄&#xff1a;《Java面向對象程序設計》學習筆記 問題是依據考綱整理的&#xff0c;稍微做了一些補充。大部分答案由GPT生成&#xff0c;部分內容摘選自書本。 內容太多了&#xff0c;目前懶得濃縮精煉了&#xff0c;以后再說吧。 如果有大佬可以幫忙精簡一些文字、補充…

R語言實現神經網絡(1)

#R語言實現神經網絡 library(neuralnet) library(caret) library(MASS) library(vcd) data(shuttle) str(shuttle)#因變量use; table1<-structable(windmagn~use,shuttle) mosaic(table1,shadingT) mosaic(use~errorvis,shuttle) prop.table(table(shuttle$use,shuttle$stab…

計算機網絡-物理層(二)- 傳輸方式

計算機網絡-物理層&#xff08;二&#xff09;- 傳輸方式 串型傳輸與并行傳輸 串行傳輸:是指數據是一個比特一個比特依次發送的&#xff0c;因此在發送端和接收端之間&#xff0c;只需要一條數據傳輸線路即可 并行傳輸:是指一次發送n個比特而不是一個比特&#xff0c;因此發送…

【Uniapp】base64圖片資源轉為本地圖片,解決canvas不支持base64問題

通過接口獲取到base64類型的二維碼&#xff0c;把二維碼放到canvas里生成海報 遇到的問題&#xff1a; 在微信小程序開發工具中能夠正常顯示海報&#xff0c;到真機上測試就無法顯示二維碼 原因&#xff1a; 因為canvas不支持base64&#xff0c;其次在使用小程序 canvas 的 dr…