catalogue
1. 遙控器原理簡介 2. 紅外遙控原理 3. 常見紅外遙控器紅外線信號傳輸協議 4. 遙控器的發展 5. 實驗過程 6. 攻擊面 7. 基於STM32實現紅外信號解碼
1. 遙控器原理簡介
0x1: 紅外線的基本特性
1. 紅外線光按照波長范圍分為 1) 近紅外 2) 中紅外 3) 遠紅外、 4) 極紅外 2. 紅外線遙控是利用近紅外光傳送遙控指令的,波長為0.76um ~ 1.5um 3. 用近紅外作為遙控光源,是因為目前紅外發射器件與紅外接收器件的發光與受光峰值波長一般為0.8um~0.94um,這樣可以獲得較高的傳輸效率及較高的可靠性
0x2: 遙控器基本原理
遙控器其核心元器件就是編碼芯片,將需要實現的操作指令例如選台、快進等事先編碼,設備接收后解碼再控制有關部件執行相應的動作。顯然,接收電路及 CPU 也是與遙控器的編碼一起配套設計的
編碼是通過載波輸出的,即所有的脈沖信號均調制在載波上,載波頻率通常為 38K。載波是電信號去驅動紅外發光二極管(通過光波信號進行調制),將電信號變成光信號發射出去,這就是紅外光,波長范圍在 840nm 到 960nm 之間
在接收端,需要反過來通過光電二極管將紅外線光信號轉成電信號,經放大、整形、解調等步驟,最后還原成原來的脈沖編碼信號,完成遙控指令的傳遞,這是一個十分復雜的過程
紅外線發射管通常的發射角度為 30-45 度之間,角度大距離就短,反之亦然。遙控器在光軸上的遙控距離可以大於 8.5 米,與光軸成 30 度(水平方向)或 15 度(垂直方向)上大於 6.5 米,在一些具體的應用中會充分考慮應用目標,在距離角度之間需要找到某種平衡(這也就是為什么遙控器要大致對准電視機或空調才能正常發出指令)
對於遙控器涉及到如下幾個主要問題
1. 遙控器發出的編碼信號驅動紅外線發射管,必須發出波長范圍在 940nm 左右的的紅外光線(光波),因為紅外線接收器的接收二極管主要對這部分紅外光信號敏感,如果波長范圍不在此列,顯然無法達到控制之目的。不過,幾乎所有的紅外家電遙控器都遵循這一標准(正因為有這一物理基礎,多合一遙控器才有可能做成) 2. 遙控器發出一串編碼信號只需要持續數十 ms 的時間,大多數是十多 ms 或一百多 ms 重復一次,一串編碼也就包括十位左右到數十位二進制編碼,換言之,每一位二進制編碼的持續時間或者說位長不過 2ms 左右,頻率只有 500kz 這個量級,要發射更遠的距離必需通過載波,將這些信號調制到數十 khz,用得最多的是 38khz 大多數普通遙控器的載波頻率是所用的陶瓷振盪器的振盪頻率的 1/12,最常用的陶瓷振盪器是 455khz 規格,故最常用的載波也就是 455khz/12=37.9khz(簡稱 38k 載波)。此外還有 480khz(40k)、440khz(37k)、432khz(36k)等規格,也有 200k 左右的載波,用於高速編碼 紅外線接收器是一體化的組件,為了更有針對性地接收所需要的編碼,就設計成以載波為中心頻率的帶通濾波器(只允許指定頻帶通過),只容許指定載波的信號通過。顯然這是多合一遙控器應該滿足的第二個物理條件。不過,家用電器多用38k,很多紅外線接收器也能很好地接收頻率相近的 40k 或 36k 的遙控編碼 3. 一個設備受控,除了滿足上面提到的兩個基本物理條件外,最重要的變化多種多樣的應該是遙控器發出一串二進制編碼信號了,這也是不同(型號、品牌)的遙控器不能相互通用的主要原因。由於市場上出現成百上千的編碼方式並存(每個電氣廠商都設計並使用自定義的編碼方式,相當於不同的應用層協議),並沒有一個統一的國際標准,只有各芯片廠商事實上的標准,這也是模擬並替換各種原廠遙控器最大的難點。隨着技術的不斷發展,很多公司開發家電設備的遙控子系統時還不采用通用的編碼芯片,而是用通用的單片機隨心所欲地自編一些編碼,這就使通用遙控的問題更加復雜化了 4. 采用同樣的編碼芯片,也不意味着可以通用,因為還有"客戶碼"。客戶碼設計的最初本意就是為了不同的設備可以相互區分互不干擾。最初芯片廠商會從全局考慮給不同的家電廠商安排不同的客戶碼以規范市場,例如錄像機和電視機就用不同的設備碼,給甲廠分配的設備碼和乙廠分配的設備碼就區分在不同的范圍內 5. 采用同樣的編碼芯片、同樣的客戶碼下,也不能意味着一定可以通用,因為對命令碼的分配與使用上,仍然是沒有固定的模式可以遵循,遙控器編碼芯片簡單的支持數十種命令碼,多的上千種,但遙控器往往只有數十個鍵,甚至只有幾個鍵,如何從中選取這數十個鍵對應的編碼代號,這些鍵如何分配使用,不同的系統設計師都自搞一套,這樣一來事情就更復雜化了 6. 設計需考慮的問題是如何"同化"不同遙控器發射信號之間的差異。遙控編碼方式涉及很多方面 1) 首先是數字 0 和 1 的表示(調寬還是調相,脈寬和占空比) 2) 其次是幀結構(引導碼和結束碼,客戶碼和命令碼長度及發送方式) 3) 再次是幀間結構(僅發一次還是反復多次,多幀交替發送,幀間間隔變化) 4) 最后是載波頻率,以 38Khz 居多,也有 40Khz 甚至 200khz等特殊載波
設計相應電路和軟件時對上述諸多因素加以分析、歸納,將編碼特點用一串二進制位表示出來形成設備碼,對應於一個具體的遙控器。同一個設備碼下也就是同一個遙控器不同的按鍵則用命令碼來表示。代碼型遙控器用軟件的方式對這些統一的編碼進行解釋,驅動一個個命令碼按指定設備碼格式加以"封裝",形成所需要的遙控信號,達到控制家電的目的
Relevant Link:
http://baike.baidu.com/link?url=cH9CmJA31W_s6W_5OaoVM1c4SiIlyEgFDPB6k-uCidznVc-N-dRctSdroDGGcP-6cRXQ2Ylh1gMxlHyYm7aWmK http://wenku.baidu.com/link?url=10n0vBFcxQ3orPnaHwP8Fn-lVEjAQOjqg_2k4N1tbIth7I0dk-40GvdFVCemgxYWmnBkrQnAhGt_Z0c-Rp1bzKNAni_14THuUAAdYYOjl73
2. 紅外遙控原理
一般的紅外遙控系統是由紅外遙控信號發射器、紅外遙控信號接收器和微控制器及其外圍電路等三部分構成的
1. 遙控信號發射器用來產生遙控編碼脈沖,驅動紅外發射管輸出紅外遙控信號 2. 遙控接收頭完成對遙控信號的放大、檢波、整形、解調出遙控編碼脈沖 3. 遙控編碼脈沖是一組組串行二進制碼,對於一般的紅外遙控系統,此串行碼輸入到微控制器,由其內部 CPU 完成對遙控指令解碼,並執行相應的遙控功能
在紅外遙控系統中,解碼的核心是 CPU。它接收解調出的串行二進制碼,在內部根據本系統的遙控信號編碼格式將串行碼對應成遙控器上的按鍵
0x1: 紅外遙控編碼
目前應用中的各種紅外遙控系統的原理都大同小異,區別只是在於各系統的信號編碼格式不同。當按下遙控器上任一按鍵時,遙控器即產生一串脈沖編碼。遙控編碼脈沖對 40kHz 載波進行脈沖幅度調制(PAM)后便形成遙控信號,經驅動電路由紅外發射管發射出去。紅外遙控接收頭接收到調制后的遙控信號,經前置放大、限幅放大、帶通濾波、峰值檢波和波形整形,從而解調出與輸入遙控信號反相的遙控脈沖
一次按鍵動作的遙控編碼信息為 32 位串行二進制碼。對於二進制信號"0",一個脈沖占 1.2ms;對於二進制信號"1",一個脈沖占 2.4ms,而每一脈沖內低電平均為 0.6ms。從起始標志到 32 位編碼脈沖發完大約需 80ms,此后遙控信號維持高電平。若按鍵未釋放,則從起始標志起每隔 108ms 發出 3 個脈沖的重復標志
在 32 位的編碼脈沖中,前 16 位碼不隨按鍵的不同而變化,我們稱之為用戶碼。它是為了表示特定用戶而設置的一個辨識標志,以區別不同機種和不同用戶發射的遙控信號,防止誤操作。后 16 位碼隨着按鍵的不同而改變,我們就是要讀取這 16 位按鍵編碼,經解碼得到按鍵鍵號,轉而執行相應控制動作
我們可以借助於邏輯分析儀記錄下來遙控器上每一個按鍵的編碼脈沖序列,破譯出了各按鍵的編碼。截取 16 位鍵碼的 8 位(比如后 8 位)就可達到識別按鍵的目的。當然,要加強遙控系統的抗干擾能力,還需接收全 16 位鍵碼甚至 16 位用戶碼加以識別
以NEC消費型遙控器為例
0x2: 紅外遙控解碼
紅外遙控接收頭解調出的編碼是串行二進制碼,包含着遙控器按鍵信息。但它還不便於CPU 讀取識別,因此需要先對這些串行二進制碼進行解碼。接碼電路主要包括遙控編碼脈沖串並轉換電路與 PLD 解碼電路
0x3: 紅外遙控信號編碼、發射原理
所有紅外遙控器的輸出都是用編碼后串行數據對 38~40kHz 的方波進行脈沖幅度調制(PSW)而產生的。如果直接對已調波進行測量,由於單片機的指令周期是微秒(μs)級,而已調波的脈寬只有 20 多μs,會產生很大的誤差。因此先要對已調波進行解調,對解調后的波形進行測量
用遙控脈沖信號調制 38kHz 方波,然后將已調波放大,驅動紅外發光二極管,就可以得到遙發射信號。調制可用一個或門實現,38kHz 方波可用 8751 的定時器 T1 產生。有些遙控器的載頻可能是 40kHz,只須稍微加大發射功率仍然可用 38kHz 載頻使其接收電路動作
通常,紅外遙控器是將遙控信號(二進制脈沖碼)調制在 38KHz 的載波上,經緩沖放大后送至紅外發光二極管,轉化為紅外信號發射出去的。二進制脈沖碼的形式有多種,其中最為常用的是
1. PWM 碼(脈沖寬度調制碼) 1) 以寬脈沖表示 1 2) 窄脈沖表示 0 2. PPM 碼(脈沖位置調制碼) 1) 脈沖寬度一樣,但是碼位的寬度不一樣,碼位寬的代表 1 2) 碼位窄的代表 0
遙控編碼脈沖信號(以 PPM 碼為例)通常由以下幾部分組成
1. 引導碼: 引導碼也叫起始碼,由寬度為 9ms 的高電平和寬度為 4.5ms的低電平組成(不同的遙控系統在高低電平的寬度上有一定區別),用來標志遙控編碼脈沖信號的開始 2. 系統碼: 系統碼也叫識別碼,它用來指示遙控系統的種類,以區別其它遙控系統,防止各遙控系統的誤動作 3. 系統反碼 4. 功能碼: 功能碼也叫指令碼,它代表了相應的控制功能,接收機中的微控制器可根據功能碼的數值去完成各種功能操作 5. 功能反碼等信號組成: 系統反碼與功能反碼分別是系統碼與功能碼的反碼,反碼的加入是為了能在接收端校對傳輸過程中是否產生差錯
3. 常見紅外遙控器紅外線信號傳輸協議
遙控器和電器之間一般不可能有加密協議,而只能有編碼和解碼的通信,因為受限於成本和制作工藝的原因
1. ITT 協議 2. NEC 協議 3. Nokia NRC 協議 4. Sharp 協議 5. Philips RC - 5 協議 6. Philips RC - 6協議 7. Philips RECS - 80協議 8. Sony SIRC 協議
0x1: NEC碼分析
在東亞地區比較常用的紅外線傳輸協議是NEC協議(即6122協議)
編碼采用脈沖位置調制方式(PPM),利用脈沖之間的時間間隔來區分"0"和"1"
Relevant Link:
http://wenku.baidu.com/link?url=9-h-kANSeuxa_OZKyBRU6gRcvWadTGXDOf9ejGLO11NHPBNAeyh37F6Eg7X5cWLJ4UMjP-dOfpDsM8ZN8_6isz3gsozC1v7G8_2k8wiitGa file:///C:/Users/zhenghan.zh/Desktop/%E7%BA%A2%E5%A4%96%E7%BA%BF%E9%81%A5%E6%8E%A7%E5%99%A8(nec%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F)%E4%BB%8B%E7%BB%8D.pdf
4. 遙控器的發展
0x1: 單一遙控器
0x2: 萬能及學習型遙控器
1. 固定碼式學習型遙控器
對每種類別都預設一種解碼程式和發射程式,學習過程是
1. 學習信號的采集 2. 判別信號的類別(屬於哪一種解碼方案),編碼,存儲到EEPROM //缺點是只能對已知的遙控器(或者說收集到的信號)有效,對於新發現的新型的編碼格式無法自動適配
2. 波形拷貝式學習型遙控器(記錄重放)
把原始遙控器鎖發出的信號進行完全拷貝,而不管遙控器是什么格式,進行適當的壓縮后,存儲在記憶體內,當需要發射時,再由存儲器內讀出解壓后還原原始信號
1. 發射信號波形的測量,需要高速主控芯片和較大的RAM 2. 分析信號 3. 壓縮編碼,根據常用高低電平的時間,特殊高低電平的時間,發送周期,對原始信號進行壓縮編碼 4. 存儲信號,把壓縮編號后的數據存儲到EEPROM中
0x3: 網絡及RF型遙控器
5. 實驗過程
0x0: 紅外信號接收、解碼過程
1. 外部紅外發射器發射紅外射頻信號,通過光波的形式直射 2. 一體化接收器將光波信號進行解調、整流、濾波產生bit流 3. 觸發外部設備中斷,將bit流通過GPIO口傳輸到arduino上 4. arduino進行后續的解碼邏輯
0x1: 實驗器材
1. VS1838B
紅外接收頭
0x2: 引腳接線
1. OUT接模擬口或數字腳11 2. GND接到實驗板的GND 3. VCC接到實驗板上的+5V
0x3: 紅外發射
用arduino軟件模擬發出38K的載波信號配合紅外發射頭,發出帶有載波信號的38K紅外光,使arduino變成紅外遙控器
/* * 發射紅外線信號 * 注意! 紅外線發射器(IR LED)必須接到 pin 3, 不能接其它腳位 Hisense 機頂盒 SD-16127 tested */ //By Leo 2013.02.19 //http://weibo.com/leolite //Update: Pin 3 IR LED test function #include <IRremote.h> // 引用 IRRemote 函式庫 IRsend irsend; // 定義 IRsend 物件來發射紅外線訊號 void setup() { pinMode(3, OUTPUT); digitalWrite(3, HIGH); // 點亮LED測試(需通過手機攝像模式觀察) delay(3000); // 等待3秒 digitalWrite(3, LOW); // 結束測試 } void loop() { Serial.print("SendIR: "); irsend.sendNEC(0x807F18E7, 32); // 記得換成你遙控器的紅外線編碼 delay(3000); // 等待3秒 }
0x4: 打印紅外解調后的binary(0101)信號(未轉化為對應按鍵碼)
// 藍牙串口模塊使用3.3V電源 #include <IRremote.h> #define IR_REC_PIN 11 //IR接收端連數字2口 IRrecv irrecv(IR_REC_PIN); //定義IR接收對象 IRsend irsend; //定義IR發送對象 decode_results results; //定義IR接收到的編碼結果 void setup() { Serial.begin(9600); irrecv.enableIRIn(); //開啟IR接收 Serial.println("IR recieve initialized."); } void loop() { //處理接收到的紅外信號 if (irrecv.decode(&results)) { Serial.print("Recieved IR CODE:"); Serial.println(results.value, HEX); Serial.println(); irrecv.resume(); } }
Relevant Link:
http://www.arduino.cn/thread-1220-1-1.html http://blog.csdn.net/lpwmm/article/details/52014388 http://www.geek-workshop.com/thread-2319-1-1.html http://www.arduino.cn/thread-1220-1-1.html http://blog.sina.com.cn/s/blog_5e3f971b0100m11c.html http://www.geek-workshop.com/thread-3444-1-1.html http://www.geek-workshop.com/thread-3444-1-1.html http://www.geek-workshop.com/thread-12401-1-1.html http://www.arduino.cn/thread-15049-1-1.html
6. 攻擊面
0x1: 重放攻擊
由於每家電器廠商都可能自定一套按鍵編碼標准,因此嗅探重放攻擊是最簡單的一種攻擊方式,且由於遙控器發出的信號為光波信號,很容易在空氣中截獲並保存bit流,通過一定的分析、分類就可以明白對應的指令操作碼,在指定bit位置進行修改,可以很容易制造出對應電器型號的仿真遙控器
7. 基於STM32實現紅外信號解碼
0x1: 基於狀態機機制對PWM(脈寬調試信號)進行解碼
紅外的信號是一串PWM信號(通過脈沖長度調制信號),我們需要自定義STM32的中斷處理函數,基於狀態機機制檢測、解碼接到到的引導碼和實際按鍵信號
//Ò£¿ØÆ÷½ÓÊÕ״̬ //[7]:ÊÕµ½ÁËÒýµ¼Âë±êÖ¾ //[6]:µÃµ½ÁËÒ»¸ö°´¼üµÄËùÓÐÐÅÏ¢ //[5]:±£Áô //[4]:±ê¼ÇÉÏÉýÑØÊÇ·ñÒѾ±»²¶»ñ //[3:0]:Òç³ö¼ÆÊ±Æ÷ u8 RmtSta=0; u16 Dval; //ϽµÑØÊ±¼ÆÊýÆ÷µÄÖµ u32 RmtRec=0; //ºìÍâ½ÓÊÕµ½µÄÊý¾Ý u8 RmtCnt=0; //°´¼ü°´ÏµĴÎÊý //¶¨Ê±Æ÷2ÖжϷþÎñ³ÌÐò void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET) { if(RmtSta&0x80)//ÉÏ´ÎÓÐÊý¾Ý±»½ÓÊÕµ½ÁË { RmtSta&=~0X10; //È¡ÏûÉÏÉýÑØÒѾ±»²¶»ñ±ê¼Ç if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//±ê¼ÇÒѾÍê³ÉÒ»´Î°´¼üµÄ¼üÖµÐÅÏ¢²É¼¯ if((RmtSta&0X0F)<14)RmtSta++; else { RmtSta&=~(1<<7);//Çå¿ÕÒýµ¼±êʶ RmtSta&=0XF0; //Çå¿Õ¼ÆÊýÆ÷ } } } if(TIM_GetITStatus(TIM4,TIM_IT_CC4)!=RESET) { if(RDATA)//ÉÏÉýÑØ²¶»ñ { TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC1P=1 ÉèÖÃΪϽµÑز¶»ñ TIM_SetCounter(TIM4,0); //Çå¿Õ¶¨Ê±Æ÷Öµ RmtSta|=0X10; //±ê¼ÇÉÏÉýÑØÒѾ±»²¶»ñ }else //ϽµÑز¶»ñ { Dval=TIM_GetCapture4(TIM4);//¶ÁÈ¡CCR1Ò²¿ÉÒÔÇåCC1IF±ê־λ TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC4P=0 ÉèÖÃΪÉÏÉýÑØ²¶»ñ if(RmtSta&0X10) //Íê³ÉÒ»´Î¸ßµçƽ²¶»ñ { if(RmtSta&0X80)//½ÓÊÕµ½ÁËÒýµ¼Âë { if(Dval>300&&Dval<800) //560Ϊ±ê×¼Öµ,560us { RmtRec<<=1; //×óÒÆÒ»Î». RmtRec|=0; //½ÓÊÕµ½0 }else if(Dval>1400&&Dval<1800) //1680Ϊ±ê×¼Öµ,1680us { RmtRec<<=1; //×óÒÆÒ»Î». RmtRec|=1; //½ÓÊÕµ½1 }else if(Dval>2200&&Dval<2600) //µÃµ½°´¼ü¼üÖµÔö¼ÓµÄÐÅÏ¢ 2500Ϊ±ê×¼Öµ2.5ms { RmtCnt++; //°´¼ü´ÎÊýÔö¼Ó1´Î RmtSta&=0XF0; //Çå¿Õ¼ÆÊ±Æ÷ } }else if(Dval>4200&&Dval<4700) //4500Ϊ±ê×¼Öµ4.5ms { RmtSta|=1<<7; //±ê¼Ç³É¹¦½ÓÊÕµ½ÁËÒýµ¼Âë RmtCnt=0; //Çå³ý°´¼ü´ÎÊý¼ÆÊýÆ÷ } } RmtSta&=~(1<<4); } } TIM_ClearFlag(TIM4,TIM_IT_Update|TIM_IT_CC4); } //´¦ÀíºìÍâ¼üÅÌ //·µ»ØÖµ: // 0,ûÓÐÈκΰ´¼ü°´Ï //ÆäËû,°´Ïµİ´¼ü¼üÖµ. u8 Remote_Scan(void) { u8 sta=0; u8 t1,t2; if(RmtSta&(1<<6))//µÃµ½Ò»¸ö°´¼üµÄËùÓÐÐÅÏ¢ÁË { t1=RmtRec>>24; //µÃµ½µØÖ·Âë t2=(RmtRec>>16)&0xff; //µÃµ½µØÖ··´Âë //if((t1==(u8)~t2)&&t1==REMOTE_ID)//¼ìÑéÒ£¿ØÊ¶±ðÂë(ID)¼°µØÖ· if(1) { t1=RmtRec>>8; t2=RmtRec; if(t1==(u8)~t2) sta=t1;//¼üÖµÕýÈ· } if((sta==0)||((RmtSta&0X80)==0))//°´¼üÊý¾Ý´íÎó/Ò£¿ØÒѾûÓа´ÏÂÁË { RmtSta&=~(1<<6);//Çå³ý½ÓÊÕµ½ÓÐЧ°´¼ü±êʶ RmtCnt=0; //Çå³ý°´¼ü´ÎÊý¼ÆÊýÆ÷ } } return sta; }
通過逐位接收,並判斷有效性后,通過移位操作,逐位保存接收到的紅外bit流
0x2: 數據包接收
通過打印遙控器的某按鍵的16進制值
確認 E4 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 FF 0C B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 FF D8 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 B1 B1 B1 B1 B1 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B4 B4 B4 B4 34 34 34 B0 B1 B1 B1 B1 FF
發現每次按鍵發出的bit流都不一樣,這可能就需要我們通過黑盒、或者遙控器固件逆向的方式來得到遙控器的編碼方式
Copyright (c) 2016 LittleHann All rights reserved