前言:尋找寫作靈感?中文期刊網用心挑選的談HID的開關控制系統設計,希望能為您的閱讀和創作帶來靈感,歡迎大家閱讀并分享。
【摘要】信號源系統在廣播電視發射系統中十分重要,為保證安全播出,應向自動化無人臺站方向改進提升。本文著重研究通過hid控制開關來控制信號源設備,從反匯編入手,學習現有的上位機軟件,研讀HID協議再進行上位機、固件開發。實踐中,可通過讀取臺站主控電腦數據庫數據,判斷信號源設備狀態,實現自動控制。
【關鍵詞】c/c++;反匯編;HID協議;SQL;74HC595
一、概述
廣播電視發射系統中信號源子系統設備繁多,有衛星信號接收機、光纖信號解碼器、信號源切換器等重要設備。若這些設備發生故障,很可能致使廣播電視節目信號中斷,導致頻點靜音靜幀等現象,造成停播事故。臺站原有的電源復位器功能單一,自動化程度低,通道數量少,很多設備電源接入到同一通道上。若某個設備故障需要復位重啟,對該設備接入的通道復位時,整個通道的設備都會被復位重啟,這樣就有可能導致其他設備工作異常,造成停播現象。因此,可以采用一個新的解決方案,即采用USB-HID控制信號源系統設備電源。USB-HID是基于USB通信的,與電源復位器通信方式不同,后者采用網絡通信,兩者互不影響,因此還可以串聯組合運行。USB-HID是UniversalSerialBus-HumanInterfaceDevice的縮寫,HID設備通常是鼠標、鍵盤、游戲手柄等,不過HID設備并不一定要有人機接口,只要符合HID類別規范的設備都是HID設備。HID通信相對簡單,響應快,所以比較適合用作控制設備。交換的數據需要存儲在稱為報表(report)的結構內,設備固件必須支持HID報表格式。相對其他USB設備,HID主要由控制傳輸和中斷傳輸來傳送與接收數據。報表的格式非常有彈性,可以處理任何類別的數據。HID類別設備的規范是DeviceClassDefinitionforHumanInterfaceDe-vices①。另外還有一份文件HIDUsageTables②,用來定義讓主機了解以及使用HID數據的數值。
二、HID底層通信
現有資源為一塊HID繼電器控制板,配套資料是一份DLL及其頭文件,沒有源碼,根據現有資源進行反匯編學習HID通信原理。使用OllyDbg對該DLL進行調試。圖1是OllyDbg調試界面,區域1是反匯編指令窗口,第一列是地址欄,第二列是機器碼,第三列是匯編代碼,第四列是注釋,匯編指令眾多但是常用的很少,這點服從二八定律,少量的指令完成大部分功能。區域2是CPU寄存器窗口,最重要的是前面9個寄存器,這9個寄存器保存著當前程序段的運行參數、結果等重要信息,各個寄存器的說明詳見參考文獻③。區域3是數據窗口,在這里查看內存數據,常量數據一般都存放在此處,例如常用數值、字符串等。在區域1和2中,右鍵一個地址指針即可跟隨轉存到這里查看該地址的內存數據。區域4是棧窗口,棧通常用于保存臨時變量,棧操作push是將目標壓棧,pop將棧頂彈出到目標。除了這兩個操作還有棧對齊,保證棧頂指針為某字節的整數倍;升棧,分配局部變量空間;降棧,刪除棧部分數據。根據頭文件分析DLL的導出函數及其傳入參數類型和返回參數類型。調試過程中DLL所用到的Win32Api會被OllyDbg標示出來,可以從注釋中看到是什么Api,而所用到的HIDDLL的Api沒有標記,要手動添加注釋信息。整個通信的建立過程都是基于Win32Api和HIDDLL的Api完成的。經過耐心的跟蹤調試得到如圖2的通信流程圖。其中SetupDiGetDeviceInterfaceDetailA函數連續調用兩次,第一次獲得required_size參數,第二次將re-quired_size傳入獲得設備詳細信息。CreateFile函數也是連續調用兩次,第一次ShareMode參數為空,如果是鼠標、鍵盤等獨占設備是不能通過CreateFile打開的,將會在此返回失敗,相當于在此過濾鼠標、鍵盤等獨占設備;第二次ShareMode參數為3,函數成功返回HID設備句柄,設備句柄是與設備通信的唯一標識。通信階段使用DeviceIoControl函數向HID設備發起查詢請求,獲得特征報告(FeatureReport),該設備自定義的序列號就在特征報告里面,繼電器狀態也包含在特征報告里。HidD_SetFeature函數用于發送特征報告,設置繼電器狀態。
三、固件
固件開發過程需要用到BusHound。BusHound是一個USB通用的強大的調試工具,類似于網絡抓包工具,用于抓取電腦總線數據,還可以模擬發送請求數據。圖3是BusHound調試界面。21.0表示21號設備端點0,CTL表示主機發送控制請求,請求內容為其后的Da-ta,GETDESCRIPTOR表示該請求為獲取描述符。IN表示設備發送數據到主機。圖中的數據是設備上電枚舉階段發生的數據交換。共四條GETDESCRIPTOR,第一條描述符為設備描述符,第二條獲取配置描述符長度,第三條根據長度再次請求配置描述符,第四條獲取報告描述符。設備描述符和配置描述符為USB通用,報告描述符為HID傳輸的數據用途(usage)上的說明。至此,獲得了HID固件關鍵的三個描述符。報告描述符的用法和修改參照HIDUsageTables。官網還有報告描述符工具提供使用。MCU采用stm32f407vet6,從stc官網獲取HID固件庫④。使用固件庫參照HID協議進行修改調試。這里的主要問題是我們沿用舊設備的數據交換方式,即特征報告(FeatureReport),上位機發送請求特征報告失敗返回0xC0000004,查詢HID協議找到7.2Class-SpecificRe-quests(特殊請求),7.2.2Set_ReportRequest有說明“AdevicemightchoosetoignoreinputSet_Reportrequestsasmeaningless.”,由此得知固件默認不處理特征報告。因此要添加對特征報告的處理,7.2Class-SpecificRequests查找發現7.2.4Set_IdleRequest這一請求是處理成功的。于是在固件庫找到Set_IdleRequest的處理,在其同級增加條件分支完成添加特征報告的處理,使用端點0收發特征報告數據。
四、數據庫
臺站主控電腦使用SQLServer處理數據,各個設備狀態被相應的上位機實時更新到數據庫,通過查詢數據庫獲取設備狀態,相當于借助數據庫與其他上位機進行進程間通信。為模擬相關環境在自己電腦上安裝SQLServer和SSMS。添加數據庫和數據表,添加數據元組示例??蛻舳藢祿斓牟僮髦挥凶x取,因此采用sqlcmd命令行獲取數據比較簡便,使用popen函數執行命令行獲取返回的數據。sqlcmd的使用比較簡單,需要的參數有-S服務器、-U用戶名、-P密碼、-d使用數據庫名稱、-Q查詢命令(sql查詢語句)。圖4為在我的電腦的模擬環境中進行查詢得到的結果。
五、端口拓展
為了獲得更多的控制通道,以及預留IO口做其他用途,使用74HC595進行端口拓展。74HC595是8位串行輸入/輸出或者并行輸出移位寄存器,具有高阻、關、斷狀態。圖5是其真值表。通過將串行數據輸出管腳SQH級聯到下一個74HC595的SI輸入管腳達到加長拓展。OE拉低SCLR拉高,需要控制的有時鐘輸入SCK、鎖存信號RCK和數據源SI,只需要三個MCUIO口即可控制數位寄存器狀態。最后通過ULN2803驅動繼電器。
六、客戶端
客戶端工作流程如圖6所示,實現自動控制和接管控制。綜合考慮數據庫查詢壓力和信號快速恢復,設定每秒查詢一次設備狀態。使用MFC對話框設計一個簡單的界面,添加接管按鈕、各個設備開關按鈕,在初始化函數中鏈接底層通信DLL,完成客戶端的開發工作。
七、總結
自動控制只開發了信號源部分,實現發現切換器故障無輸出關閉切換器電源,發現設備通信異常重啟復位恢復通信等功能。手動控制支持更多端口,可以控制其他設備,例如,鄉鎮熊貓數字電視發射機無輸出,控制其復位。
作者:譚汝浩 韋紅錄 黃冬梅 單位:廣西廣播電視技術中心梧州分中心 廣西廣播電視技術中心南寧分中心