HEXA開發日志目錄
上一篇 HEXA娛樂開發日志技術點001——上位機成功獲取彈幕
前言
- 下位機(機器人)也可以獲取彈幕了,可以參考源碼了解一下,源碼有很多不足之處,demo階段暫且忽略。
- 回顧一下當初的計劃,下圖中綠色部分是目前demo成功的。
需求與技術依賴關系
編程框架
上次在上位機實現的核心邏輯(傳送門)沒有變,只要把它的核心邏輯搬到下位機上就行了,現在主要描述下位機的編程框架。上位機的程序完全是面向過程的編程方式,而下位機就是面向對象的編程方式,如果是使用面向對象語言的應用軟件工程師,會很容易理解這個框架。下面就是下位機的編程框架,在創建skill的時候會自動生成,從函數名應該很容易理解了,更具體的可以參考下面注釋、文檔或源碼。
//相當于class
type DanmuDriveMe struct {
skill.Base
//可以再加一些member
}
//相當于構造函數或者單例模式的getInstance
func NewSkill() skill.Interface {
return &DanmuDriveMe{
//增加的member的初始化
}
}
func (d *DanmuDriveMe) OnStart() {
//skill開始運行
}
func (d *DanmuDriveMe) OnClose() {
//skill關閉
}
//這個remote就是瀏覽器或者相當于一個網頁
func (d *DanmuDriveMe) OnConnect() {
//連接到remote
}
func (d *DanmuDriveMe) OnDisconnect() {
//與remote斷開連接
}
func (d *DanmuDriveMe) OnRecvJSON(data []byte) {
//收到remote發送的json
}
func (d *DanmuDriveMe) OnRecvString(data string) {
//收到remote發送的string
}
如果你對OnXxxxx
這種函數名感到費解,可以看一下說明:
OnXxxxx
的簡單理解:Xxxxx是一個事件,當Xxxxx發生時,OnXxxxx
會被調用。比如On開心
就可以理解為,當對象實例開心時,On開心
會被調用。那么誰來調用的呢?這個調用者捕捉這個開心事件靠譜嗎?這些就是SDK內部實現的問題了。在面向對象編程中,這是典型的事件驅動編程用的函數命名方式和框架形式,一般底層編程很少這樣命名,而是用類似callback
的字眼來命名。
上/下位機通信
雖然在這個應用場景中,僅僅機器人的啟動是需要上位機來控制的,其他通信理論上都可以用彈幕搞定,但是這樣很不安全,關鍵的控制不能隨便暴露出去,而且開發與維護都需要上位機或客戶端與下位機互相通信,所以這是一個非常基礎的點。
下位機通信
- 接收數據
下位機可以通過下面兩個接口接收byte數組和string兩種數據
func (d *DanmuDriveMe) OnRecvJSON(data []byte)
func (d *DanmuDriveMe) OnRecvString(data string)
- 發送數據
下位機可以通過下面兩個接口發送json.RawMessage和string兩種數據
func SendJSON(data json.RawMessage)
func SendString(str string)
上位機通信
上位機用onRecvSkillData接收數據,用sendData發送數據。
<html>
<head>
<script src="mind-framework.js"></script>
<script type="text/javascript">
mind.init({
callback: function(robot){
skillID="DanmuDriveMe";
robot.connectSkill({
skillID: skillID
callback: robot.onRecvSkillData(function(skillID, data) {
//接收下位機數據
}
});
document.getElementById("buttonId").onclick = function() {
robot.sendData({
skillID: skillID,
data: "向下位機發送的數據"
})
}
}
});
</script>
</head>
<body>
<button id="buttonId">我是個按鈕</button>
</body>
</html>
總結
- 完成了彈幕相關的demo,機器人可以接收彈幕并轉化為行動指令了。
- 上/下位機通信調通,后面可以進行有效調試了。
- 下一個關鍵任務就是調通OpenCV,來驗證C/C++庫的調用了。
- 還有些事情可以開始種草了,包括彈幕命令集、機器人命名等。