Mac開發(fā)之USB HID 通訊

框架:IOKit.framework

簡介:用于Mac OS 上位機(jī)軟件根據(jù)USB線連接下位機(jī)硬件喧半,與之進(jìn)行數(shù)據(jù)交互秧骑,通訊霎奢。

開發(fā)步驟:

1、導(dǎo)入依賴頭文件

#include <IOKit/hid/IOHIDLib.h>

2份乒、初始化IOHIDManager

IOHIDManagerRef managerRef = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);

3恕汇、進(jìn)行配對(duì)設(shè)置,可以過濾其他USB設(shè)備或辖。

1).無配對(duì)設(shè)備

IOHIDManagerSetDeviceMatching(HIDManager, NULL);

2).單類設(shè)備配對(duì)

NSMutableDictionary* dict= [NSMutableDictionary dictionary];
[dict setValue:pid forKey:[NSString stringWithCString:kIOHIDProductIDKey encoding:NSUTF8StringEncoding]];
[dict setValue:vid forKey:[NSString stringWithCString:kIOHIDVendorIDKey encoding:NSUTF8StringEncoding]];
IOHIDManagerSetDeviceMatching(managerRef, (__bridge CFMutableDictionaryRef)dict);

3).多種設(shè)備配對(duì)設(shè)置

NSMutableArray *arr = [NSMutableArray array];
[arr addObject:dict];
IOHIDManagerSetDeviceMatchingMultiple(managerRef, (__bridge CFMutableArrayRef)arr);

4瘾英、注冊插拔設(shè)備的callback

    //注冊插入callback
    IOHIDManagerRegisterDeviceMatchingCallback(managerRef, &Handle_DeviceMatchingCallback, NULL);
    //注冊拔出callback
    IOHIDManagerRegisterDeviceRemovalCallback(managerRef, &Handle_DeviceRemovalCallback, NULL);

5、加入RunLoop

IOHIDManagerScheduleWithRunLoop(managerRef, CFRunLoopGetMain(), kCFRunLoopDefaultMode);

6颂暇、打開IOHIDManager

IOReturn ret = IOHIDManagerOpen(managerRef, kIOHIDOptionsTypeNone);
    if (ret == kIOReturnSuccess) {
      NSLog(@"IOHIDManager打開成功");
    }

7缺谴、實(shí)現(xiàn)插拔callback

static void Handle_DeviceMatchingCallback(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) {
      NSLog(@"插入:%p",(void *)inIOHIDDeviceRef);
}
static void Handle_DeviceRemovalCallback(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) {
      NSLog(@"拔出:%p設(shè)備",(void *)inIOHIDDeviceRef);
}

8、插入設(shè)備獲取到IOHIDDeviceRef inIOHIDDeviceRef后耳鸯,打開IOHIDDeviceRef

IOOptionBits options = 0;
    IOReturn ret = IOHIDDeviceOpen(inIOHIDDeviceRef,options);
    if (ret == kIOReturnSuccess) {
        NSLog(@"打開成功");
    }

9湿蛔、注冊的接收數(shù)據(jù)callback

IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, (uint8_t*)inputbuffer, 64, MyInputCallback, NULL);

10、實(shí)現(xiàn)接收數(shù)據(jù)callback方法县爬,即可接收數(shù)據(jù)

static void MyInputCallback(void* context, IOReturn result, void* sender, IOHIDReportType type, uint32_t reportID, uint8_t *report,CFIndex reportLength) {
     RobotPenUSBLog(@"%s",report);
}

11阳啥、向USB設(shè)備發(fā)送指令

IOReturn ret = IOHIDDeviceSetReport(inIOHIDDeviceRef, kIOHIDReportTypeOutput, 0, (uint8_t*)buffer, length);
    if (ret != kIOReturnSuccess) {
         NSLog(@"指令發(fā)送失敗");
    }

12、斷開設(shè)備

IOReturn ret = IOHIDDeviceClose(inIOHIDDeviceRef,0L);
  if (ret == kIOReturnSuccess) {
     NSLog(@"斷開成功");
    }

更多內(nèi)容請參考:蘋果官方開發(fā)者文檔

因?yàn)橛泻芏嗯笥阉叫盼襀ID 開發(fā)過程中遇到的一些問題财喳,有的涉及到公司的具體業(yè)務(wù)察迟,不便透露斩狱,這篇文章寫的有點(diǎn)雜亂籠統(tǒng),所以我整理了一篇新的帶實(shí)例的文章扎瓶,封裝好的工程修改對(duì)應(yīng)ID之后應(yīng)該可以直接連接下位機(jī)設(shè)備進(jìn)行測試的 ??

time:20190926
我新整理的 帶實(shí)例demo的 USB HID 通訊文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末所踊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子概荷,更是在濱河造成了極大的恐慌秕岛,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,835評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件误证,死亡現(xiàn)場離奇詭異继薛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)雷厂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門惋增,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人改鲫,你說我怎么就攤上這事×质” “怎么了像棘?”我有些...
    開封第一講書人閱讀 156,481評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長壶冒。 經(jīng)常有香客問我缕题,道長,這世上最難降的妖魔是什么胖腾? 我笑而不...
    開封第一講書人閱讀 56,303評(píng)論 1 282
  • 正文 為了忘掉前任烟零,我火速辦了婚禮,結(jié)果婚禮上咸作,老公的妹妹穿的比我還像新娘锨阿。我一直安慰自己,他們只是感情好记罚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評(píng)論 5 384
  • 文/花漫 我一把揭開白布墅诡。 她就那樣靜靜地躺著,像睡著了一般桐智。 火紅的嫁衣襯著肌膚如雪末早。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評(píng)論 1 289
  • 那天说庭,我揣著相機(jī)與錄音然磷,去河邊找鬼。 笑死刊驴,一個(gè)胖子當(dāng)著我的面吹牛姿搜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,877評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼痪欲,長吁一口氣:“原來是場噩夢啊……” “哼悦穿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起业踢,我...
    開封第一講書人閱讀 37,633評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤栗柒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后知举,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體总寒,經(jīng)...
    沈念sama閱讀 44,088評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評(píng)論 2 326
  • 正文 我和宋清朗相戀三年刁赖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贬蛙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,563評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锰提,死狀恐怖曙痘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情立肘,我是刑警寧澤边坤,帶...
    沈念sama閱讀 34,251評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站谅年,受9級(jí)特大地震影響茧痒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜融蹂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評(píng)論 3 312
  • 文/蒙蒙 一旺订、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧超燃,春花似錦区拳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洽瞬,卻和暖如春本涕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伙窃。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評(píng)論 1 264
  • 我被黑心中介騙來泰國打工菩颖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人为障。 一個(gè)月前我還...
    沈念sama閱讀 46,240評(píng)論 2 360
  • 正文 我出身青樓晦闰,卻偏偏與公主長得像放祟,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呻右,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1 Runloop機(jī)制原理 深入理解RunLoop http://www.cocoachina.com/ios/2...
    Kevin_Junbaozi閱讀 3,993評(píng)論 4 30
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理跪妥,服務(wù)發(fā)現(xiàn),斷路器声滥,智...
    卡卡羅2017閱讀 134,626評(píng)論 18 139
  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling閱讀 1,436評(píng)論 0 13
  • 前言 RunLoop是iOS和OSX開發(fā)中非趁寄欤基礎(chǔ)的一個(gè)概念,這篇文章將從CFRunLoop的源碼入手落塑,介紹Run...
    暮年古稀ZC閱讀 2,232評(píng)論 1 19
  • (三) “宋天嬌纽疟,你都試了多少雙鞋了!到底有完沒完憾赁?” “我才試了幾雙啊污朽,你這就不耐煩了?小心以后找不到女朋友龙考◇∷粒”...
    非凡的Nancy閱讀 412評(píng)論 5 1