蓝牙开发之 IOS AMS
目錄
- 前言
- 什么是 AMS
- 效果展示
- AMS 介紹
- AMS 字節序和字節碼
- 依賴性
- 術語
- AMS Service UUID
- AMS Characteristic
- 實體
- 播放器(Player)屬性表
- 隊列(Queue)屬性表
- 音軌(Track)屬性表
- 遠程命令(Remote Command)
- 實體更新(Entity Update)
- 實體屬性(Entity Attribute)
- 其他
- 錯誤代碼(Error Codes)
- 結語
- 參閱
個人博客
所有文章除特別聲明外,均采用 CC BY-NC-SA 4.0 許可協議。轉載請注明來自 nixgnauhcuy’s blog!
如需轉載,請標明出處!
前言
本篇是針對 IOS 的 AMS(Apple Media Service) 進行記錄并總結,如果對 ANCS(Apple Notification Center Service) 有興趣,可以前往我的另一篇推文 藍牙開發之 IOS ANCS。
文章有誤或有理解不到位的地方,望不吝指教,我會及時改正錯誤。
什么是 AMS
效果展示
播放暫停:
進度獲取:
媒體控制:
gif 太大了,放不了,有興趣可以去我的博客看。
切換音樂:
音量加減:
AMS 介紹
AMS 全稱 Apple Media Service(蘋果媒體服務),是提供給 BLE 設備的一種簡單控制媒體應用程序的方式,并且用于獲取已連接的 IOS 設備的媒體狀態信息。
AMS 字節序和字節碼
除非另有規定,否則通過 AMS 傳輸的所有數值都應是小端格式。
除非另有規定,否則通過 AMS 傳輸的所有字符串值都應是 UTF-8 編碼的 unicode 字符所組成的。
依賴性
除了標準的通用屬性配置文件(GATT)子程序集外,AMS 沒有任何依賴性。作為 GATT 客戶端的設備在使用 AMS 時,可以自由訪問和使用 iOS 設備提供的其他服務。
術語
下面統一使用 媒體源 和 媒體控制器 來描述 IOS 設備和藍牙設備。
AMS Service UUID
AMS 主服務(Service) UUID 為 89D3502B-0F36-433A-8EF4-C502AD55F8DC
AMS 服務下的三個特征(Characteristic) UUID:
遠程命令(Remote Command)(writeable, notifiable)
9B3C81D8-57B1-4A8A-B8DF-0E56F7CA51C2
實體更新(Entity Update)(writeable with response, notifiable)
2F7CABCE-808D-411F-9A0C-BB92BA96C102
實體屬性(Entity Attribute)(readable, writeable)
C6B2F38C-23AB-46D8-A6AB-A3A870BBD5D7
下圖展示了媒體源和媒體控制器間的服務設置:
AMS Characteristic
實體
AMS 定義了 3 個不同的實體,每個實體都有一組不同的屬性:
- 播放器(Player):當前活躍的媒體應用。該實體屬性包括其名稱、播放狀態和播放音量等。
- 隊列(Queue):當前加載的播放隊列。該實體的屬性包括其隊列數及其隨機和重復模式等。
- 音軌(Track):當前加載的音軌。該實體的屬性包括其藝術家、標題和總的播放時間等。
| EntityIDPlayer | 0 |
| EntityIDQueue | 1 |
| EntityIDTrack | 2 |
| Reserved | 3-255 |
播放器(Player)屬性表
| PlayerAttributeIDName | 0 |
| PlayerAttributeIDPlaybackInfo | 1 |
| PlayerAttributeIDVolume | 2 |
| Reserved | 3-255 |
- PlayerAttributeIDName:包含應用的名稱的字符串
- PlayerAttributeIDPlaybackInfo:用三個逗號作為分割,分別有:
- PlaybackState(播放狀態):表示播放狀態的整數值字符串:
- PlaybackStatePaused(0):暫停
- PlaybackStatePlaying(1):播放
- PlaybackStateRewinding(2):倒帶
- PlaybackStateFastForwarding(3):快進
- PlaybackRate(播放速率):播放速率的浮點值字符串
- ElapsedTime(已用時間):一個字符串,表示當前已用時間的浮點值(以秒為單位)
- PlaybackState(播放狀態):表示播放狀態的整數值字符串:
- PlayerAttributeIDVolume:一個字符串,表示音量的浮點值,范圍從(0-1)
通過播放器屬性,我們可以獲取 PlayerAttributeIDName 當前音樂播放器的字符串,例如 IOS 手機使用的網易云音樂,那么媒體源推送的字符串轉換為 unicode 編碼后再轉成中文,實際上就是“網易云音樂”,同理其他的音樂 APP,也會顯示其相應的名稱,非音樂 APP 是不會有推送的。
PlayerAttributeIDPlaybackInfo 可以獲取對應的播放狀態、播放速率以及歌曲經過的時間,例如接收到推送為 49 44 49 46 48 44 55 49 46 49 52 55 表示 1,1.0,71.147,當前狀態為播放、速率 1.0、已過時間 71.147 秒。
PlayerAttributeIDVolume 用于獲取當前的音量浮點值,音量最大時為 1,最小時為 0,IOS 按一次音量按鍵,每次遞進 0.0625。
注:通過上面的信息,我們可以計算出當前經過的時間,公式如下:
CurrentElapsedTime = ElapsedTime + ((TimeNow–TimePlaybackInfoWasReceived) * PlaybackRate)
上方展示的音樂進度條,也是依靠該方式和歌曲總長度計算的
隊列(Queue)屬性表
| QueueAttributeIDIndex | 0 |
| QueueAttributeIDCount | 1 |
| QueueAttributeIDShuffleMode | 2 |
| QueueAttributeIDRepeatMode | 3 |
| Reserved | 4-255 |
- QueueAttributeIDIndex:字符串,包含隊列索引的整數值,從零開始
- QueueAttributeIDCount:字符串,包含隊列中項目總數的整數值
- QueueAttributeIDShuffleMode:字符串,包含隨機播放模式的整數值
- ShuffleModeOff(0):非隨機模式
- ShuffleModeOne(1):單曲隨機(沒見過這種模式)
- ShuffleModeAll(2):隨機播放
- QueueAttributeIDRepeatMode:字符串,包含重復模式的整數值
- RepeatModeOff(0):非重復模式
- RepeatModeOne(1):單曲循環
- RepeatModeAll(2):列表循環
這一塊好理解,就不過多解釋了。切換播放器播放模式時,會通知對應的模式變化。
音軌(Track)屬性表
| TrackAttributeIDArtist | 0 |
| TrackAttributeIDAlbum | 1 |
| TrackAttributeIDTitle | 2 |
| TrackAttributeIDDuration | 3 |
| Reserved | 4-255 |
- QueueAttributeIDIndex:字符串,包含藝術家姓名
- QueueAttributeIDCount:字符串,包含唱片集名稱
- QueueAttributeIDShuffleMode:字符串,包含曲目標題
- QueueAttributeIDRepeatMode:字符串,包含軌道總持續時間的浮點值(以秒為單位)
這一塊包含了歌曲名、歌手名、專輯名稱以及當前音樂總時長。音樂時長假設為 03:02,那么媒體控制器接收到的則是 182.000 秒。
若媒體控制器訂閱了 Track 屬性,那么當媒體源播放音樂時,會將 A 音樂的曲名和歌手名推送給媒體控制器,每次有變動時,都會通知媒體控制器。
遠程命令(Remote Command)
遠程命令這個特征值是用于 媒體控制器 發送給 媒體源 的播放狀態特征,例如播放/暫停、音量加/減、上/下一首、循環播放等。
媒體控制器 發送命令格式如下:
| 1 | RemoteCommandID |
媒體控制器 發現 媒體源 AMS 服務后,可以通過發送控制命令,播放/暫停、音量加/減等操作媒體源播放器。
此特性還用于向 媒體控制器 報告當前 媒體源 支持的命令集,當媒體播放器支持的命令列表發生變化時,媒體源 會使用如下所示的格式,在該特征生產一條通知,通知中包括了支持的命令集:
媒體源 返回支持命令集格式如下:
| 1 | RemoteCommandID1 |
| 2 | RemoteCommandID2 |
| … | RemoteCommandIDx |
RemoteCommandID 對應的命令集:
| RemoteCommandIDPlay | 0 |
| RemoteCommandIDPause | 1 |
| RemoteCommandIDTogglePlayPause | 2 |
| RemoteCommandIDNextTrack | 3 |
| RemoteCommandIDPreviousTrack | 4 |
| RemoteCommandIDVolumeUp | 5 |
| RemoteCommandIDVolumeDown | 6 |
| RemoteCommandIDAdvanceRepeatMode | 7 |
| RemoteCommandIDAdvanceShuffleMode | 8 |
| RemoteCommandIDSkipForward | 9 |
| RemoteCommandIDSkipBackward | 10 |
| RemoteCommandIDLikeTrack | 11 |
| RemoteCommandIDDislikeTrack | 12 |
| RemoteCommandIDBookmarkTrack | 13 |
| Reserved | 14-255 |
通過該命令集,我們的藍牙設備就可以對 IOS 設備的媒體播放器進行控制,該方式的音樂控制,相比較 HID,我覺得更優,因為 HID 控制只能在媒體播放器界面進行控制,模擬按鍵的方式去控制播放,并且 HID 的方式不能獲取歌曲名、歌曲進度等,所以相較下,如果用于控制 IOS 媒體播放器,那么使用 AMS 是最優的方式。
實體更新(Entity Update)
實體更新特性是 媒體控制器 通知 媒體源 其所需實體/屬性對的特征,并在發生更改時告知 媒體控制器,例如 媒體源 媒體播放器變動、當前歌曲變更等。
默認情況下,媒體控制器 不會接收有關實體屬性的任何信息。所以,為了接收此數據,媒體控制器 首先需要訂閱有關實體更新特征的 GATT 通知。然后,媒體控制器 將命令寫入實體更新特征,以通知 媒體源 它想知道哪個實體/屬性對值。
媒體控制器 發送的實體更新命令的格式如下所示:
- EntityID:后續屬性所對應的實體
- AttributeID:媒體控制器 所需的屬性列表
| 1 | EntityID |
| 2 | AttributeID1 |
| 3 | AttributeID2 |
| … | AttributeIDx |
寫入成功后, 媒體控制器 將立即開始獲取其監聽的實體/屬性對的值。
媒體源通知格式如下:
- EntityID:后續屬性所對應的實體。
- AttributeID:在通知中發送其值的屬性。
- EntityUpdateFlags:一個位掩碼,其設置位為 媒體控制器 提供有關通知的特定信息。
- Value:一個字符串,對應于與給定屬性關聯的值。
| 1 | EntityID |
| 2 | AttributeID |
| 3 | EntityUpdateFlags |
| 4… | Value |
實體屬性(Entity Attribute)
實體屬性特征是 媒體控制器 檢索屬性拓展值的特征。理想情況下,僅當實體/屬性對的值在相應的實體更新通知中標記為已截斷,并且 媒體控制器 希望顯示更多關聯值時,才應使用此特征。
要檢索特定實體/屬性對的完整值,媒體控制器 必須先通過寫入實體屬性特征來發送命令。
實體屬性命令的格式如下所示:
| 1 | EntityID |
| 2 | AttributeID |
媒體源需要通知的字符過長,則會截斷發送給媒體控制器,若媒體控制器需要被截斷的部分,則需要通過寫入實體屬性命令,將被截斷的部分發送給媒體控制器。
其他
錯誤代碼(Error Codes)
寫入任何特征或讀取實體屬性時,媒體控制器 可能會收到以下特定于 AMS 的錯誤代碼:
- 無效狀態 (0xA0): 媒體控制器 未正確設置,例如,寫入實體更新或實體屬性時,未先訂閱實體更新特征通知。
- 無效的命令 (0xA1): 該命令的格式不正確。
- 缺省屬性 (0xA2): 相應屬性為空。
結語
關于藍牙的 IOS AMS 的總結就分享到這里了,如果在文中發現有誤,歡迎指出,我會及時修改的,提前感謝🙏!
參閱
- Apple Media Service Reference
總結
以上是生活随笔為你收集整理的蓝牙开发之 IOS AMS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于at89c52单片机温湿度c语言,基
- 下一篇: 全手工制作WIN8PE,WIN7PE 教