A. 如何使用makeblock藍牙
Multipeer connectivity是一個使附近設備通過Wi-Fi網路、P2P Wi-Fi以及藍牙個人區域網進行通信的框架。互相鏈接的節點可以安全地傳遞信息、流或是其他文件資源,而不用通過網路服務。
Advertising & Discovering
通信的第一步是讓大家互相知道彼此,我們通過廣播(Advertising)和發現(discovering)服務來實現。
廣播作為伺服器搜索附近的節點,而節點同時也去搜索附近的廣播。在許多情況下,客戶端同時廣播並發現同一個服務,這將導致一些混亂,尤其是在client-server模式中。
所以,每一個服務都應有一個類型(標示符),它是由ASCII字母、數字和「-」組成的短文本串,最多15個字元。通常,一個服務的名字應該由應用程序的名字開始,後邊跟「-」和一個獨特的描述符號。(作者認為這和 com.apple.*標示符很像),就像下邊:
static NSString * const XXServiceType = @"xx-service";
一個節點有一個唯一標示MCPeerID對象,使用展示名稱進行初始化,它可能是用戶指定的昵稱,或是單純的設備名稱。
MCPeerID *localPeerID = [[MCPeerID alloc] initWithDisplayName:[[UIDevice currentDevice] name]];
節點使用NSNetService或者Bonjour C API進行手動廣播和發現,但這是一個特別深入的問題,關於手動節點管理可具體參見MCSession文檔。
Advertising
服務的廣播通過MCNearbyServiceAdvertiser來操作,初始化時帶著本地節點、服務類型以及任何可與發現該服務的節點進行通信的可選信息。
發現信息使用Bonjour TXT records encoded(according to RFC 6763)發送。
MCNearbyServiceAdvertiser *advertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:localPeerID discoveryInfo:nil serviceType:XXServiceType]; advertiser.delegate = self; [advertiser startAdvertisingPeer];
相關事件由advertiser的代理來處理,需遵從協議。
在下例中,考慮到用戶可以選擇是否接受或拒絕傳入連接請求,並有權以拒絕或屏蔽任何來自該節點的後續請求選項。
#pragma mark - - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void(^)(BOOL accept, MCSession *session))invitationHandler { if ([self.mutableBlockedPeers containsObject:peerID]) { invitationHandler(NO, nil); return; } [[UIActionSheet actionSheetWithTitle:[NSString stringWithFormat:NSLocalizedString(@"Received Invitation from %@", @"Received Invitation from {Peer}"), peerID.displayName] cancelButtonTitle:NSLocalizedString(@"Reject", nil) destructiveButtonTitle:NSLocalizedString(@"Block", nil) otherButtonTitles:@[NSLocalizedString(@"Accept", nil)] block:^(UIActionSheet *actionSheet, NSInteger buttonIndex) { BOOL acceptedInvitation = (buttonIndex == [actionSheet firstOtherButtonIndex]); if (buttonIndex == [actionSheet destructiveButtonIndex]) { [self.mutableBlockedPeers addObject:peerID]; } MCSession *session = [[MCSession alloc] initWithPeer:localPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone]; session.delegate = self; invitationHandler(acceptedInvitation, (acceptedInvitation ? session : nil)); }] showInView:self.view]; }
為了簡單起見,本例中使用了一個帶有block的actionsheet來作為操作框,它可以直接給invitationHandler傳遞信息,用以避免創建和管理delegate造成的過於凌亂的業務邏輯,以避免創建和管理自定義delegate object造成的過於凌亂的業務邏輯。這種方法可以用category來實現,或者改編任何一個CocoaPods里有效的實現。
Creating a Session
在上面的例子中,我們創建了session,並在接受邀請連接時傳遞到節點。一個MCSession對象跟本地節點標識符、securityIdentity以及encryptionPreference參數一起進行初始化。
MCSession *session = [[MCSession alloc] initWithPeer:localPeerID securityIdentity:nil encryptionPreference:MCEncryptionNone]; session.delegate = self;
securityIdentity是一個可選參數。通過X.509證書,它允許節點安全識別並連接其他節點。當設置了該參數時,第一個對象應該是識別客戶端的SecIdentityRef,接著是一個或更多個用以核實本地節點身份的SecCertificateRef objects。
encryptionPreference參數指定是否加密節點之間的通信。MCEncryptionPreference枚舉提供的三種值是:
MCEncryptionOptional:會話更喜歡使用加密,但會接受未加密的連接。
MCEncryptionRequired:會話需要加密。
MCEncryptionNone:會話不應該加密。
啟用加密會顯著降低傳輸速率,所以除非你的應用程序很特別,需要對用戶敏感信息的處理,否則建議使用MCEncryptionNone。
MCSessionDelegate協議將會在發送和接受信息的部分被覆蓋.
Discovering
客戶端使用MCNearbyServiceBrowser來發現廣播,它需要local peer標識符,以及非常類似MCNearbyServiceAdvertiser的服務類型來初始化:
MCNearbyServiceBrowser *browser = [[MCNearbyServiceBrowser alloc] initWithPeer:localPeerID serviceType:XXServiceType]; browser.delegate = self;
可能會有很多節點廣播一個特定的服務,所以為了方便用戶(或開發者),MCBrowserViewController將提供一個內置的、標準的方式來呈現鏈接到廣播節點:
MCBrowserViewController *browserViewController = [[MCBrowserViewController alloc] initWithBrowser:browser session:session]; browserViewController.delegate = self; [self presentViewController:browserViewController animated:YES completion: ^{ [browser startBrowsingForPeers]; }];
當browser完成節點連接後,它將使用它的delegate調用:,以通知展示視圖控制器--它應該更新UI以適應新連接的客戶端。
Sending & Receiving Information
一旦節點彼此相連,它們將能互傳信息。Multipeer Connectivity框架區分三種不同形式的數據傳輸:
Messages是定義明確的信息,比如端文本或者小序列化對象。
Streams 流是可連續傳輸數據(如音頻,視頻或實時感測器事件)的信息公開渠道。
Resources是圖片、電影以及文檔的文件。
Messages
Messages使用-sendData:toPeers:withMode:error::方法發送。
NSString *message = @"Hello, World!"; NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; if (![self.session sendData:data toPeers:peers withMode:MCSessionSendDataReliable error:&error]) { NSLog(@"[Error] %@", error); }
通過MCSessionDelegate方法 -sessionDidReceiveData:fromPeer:收取信息。以下是如何解碼先前示例代碼中發送的消息:
#pragma mark - MCSessionDelegate - (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID { NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@", message); }
另一種方法是發送NSKeyedArchiver編碼的對象:
id <NSSecureCoding> object = // ...; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object]; NSError *error = nil; if (![self.session sendData:data toPeers:peers withMode:MCSessionSendDataReliable error:&error]) { NSLog(@"[Error] %@", error); } #pragma mark - MCSessionDelegate - (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID { NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; unarchiver.requiresSecureCoding = YES; id object = [unarchiver decodeObject]; [unarchiver finishDecoding]; NSLog(@"%@", object); }
為了防範對象替換攻擊,設置requiresSecureCoding為YES是很重要的,這樣如果根對象類沒有遵從<NSSecureCoding>,就會拋出一個異常。欲了解更多信息,請參閱[NSHipster article on NSSecureCoding]。
Streams
Streams 使用 -startStreamWithName:toPeer:創建:
NSOutputStream *outputStream = [session startStreamWithName:name toPeer:peer]; stream.delegate = self; [stream scheleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [stream open]; // ...
Streams通過MCSessionDelegate的方法session:didReceiveStream:withName:fromPeer:來接收:
#pragma mark - MCSessionDelegate - (void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID { stream.delegate = self; [stream scheleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; [stream open]; }
輸入和輸出的streams必須安排好並打開,然後才能使用它們。一旦這樣做,streams就可以被讀出和寫入。
Resources
Resources 發送使用 -sendResourceAtURL:withName:toPeer:withCompletionHandler::
NSURL *fileURL = [NSURL fileURLWithPath:@"path/to/resource"]; NSProgress *progress = [self.session sendResourceAtURL:fileURL withName:[fileURL lastPathComponent] toPeer:peer withCompletionHandler:^(NSError *error) { NSLog(@"[Error] %@", error); }];
返回的NSProgress對象可以是通過KVO(Key-Value Observed)來監視文件傳輸的進度,並且它提供取消傳輸的方法:-cancel。
接收資源實現MCSessionDelegate兩種方法:-session::fromPeer:withProgress: 和 -session::fromPeer:atURL:withError:
#pragma mark - MCSessionDelegate - (void)session:(MCSession *)session :(NSString *)resourceName fromPeer:(MCPeerID *)peerID withProgress:(NSProgress *)progress { // ... } - (void)session:(MCSession *)session :(NSString *)resourceName fromPeer:(MCPeerID *)peerID atURL:(NSURL *)localURL withError:(NSError *)error { NSURL *destinationURL = [NSURL fileURLWithPath:@"/path/to/destination"]; NSError *error = nil; if (![[NSFileManager defaultManager] moveItemAtURL:localURL toURL:destinationURL error:&error]) { NSLog(@"[Error] %@", error); } }
再次說明,在傳輸期間NSProgress parameter in -session::fromPeer:withProgress:允許接收節點來監控文件傳輸進度。在-session::fromPeer:atURL:withError:中,delegate的責任是從臨時localURL移動文件至永久位置。
Multipeer是突破性的API,其價值才剛剛開始被理解。雖然完整的支持功能比如AirDrop目前僅限於最新的設備,你應該會看到它將成為讓所有人盼望的功能。
B. makeblock中雲廣播是什麼意思
雲廣播:CIPAS將節目源和輔助系統放置在雲端,可以獲得無數在線音樂流支持,智能地編輯和分析廣播的內容,優化傳輸的路徑和效率,而傳統的揚聲器和信號放大處理設備將升級為IP的音箱或者智能音箱
C. Makeblock是什麼公司,有什麼產品
童心制物(Makeblock)是深圳市創客工場科技有限公司旗下品牌,成立於2013年,是一家服務全球的 STEAM 教育解決方案提供商。我們面向學校、教培機構、家庭的 STEAM 教育場景和娛樂場景,提供齊全的機器人硬體、編程軟體,輸出優質的教學內容,並打造國際化的青少年機器人賽事。童心制物致力於降低創造的門檻,讓每個人都能實現奇思妙想,享受創造的樂趣。
硬體產品
高創作自由度的 DIY 平台 、金屬機器人套件 mBot 系列 ,Airblock飛行機器人、神經元智能電子積木平台、普及型編程機器人程小奔、無線聯網單板計算機光環板、多形態仿生運動機器人靈躍模組、桌面級智能激光切割機激光寶盒、思維啟蒙機器人童小點、童心制物編程造物盒。
軟體產品
STEAM 教育軟體,包括:基於 Scratch 3.0 開發的圖形化和代碼編程平台慧編程 mBlock 5,機器人產品操控軟體 Makeblock App, 神經元 App。
D. Makeblock的激光切割機的安全性如何
Makeblock的激光切割機激光寶盒採取全封閉的結構設計,給用戶以最佳的保護。且激光寶盒具有開蓋即停功能,如果在激光寶盒工作時打開蓋子,激光寶盒將會暫停工作,保障操作安全。此外,激光寶盒還通過了CE認證、FCC認證、FDA認證,所有電子元器件都符合國家3C標准。還被FAD根據現行的國際標准歸類為一類激光,與日常辦公所使用的激光列印機為同一安全級別,對人體無害。
E. makeblock 電池充多久
電池充電時間與電池本身容量以及充電電充相關。公式是容量除電流,就是充電時間,實際充電時間需要算上預充電和涓流充電的時間,加上一兩個小時就差不多的了。
F. makeblock機器人 中的"激光劍"怎麼拼
makeblock機器人 中的"激光劍"的拼法介紹
* mBot Ranger 是 Makeblock 發布的三合一游俠編程教育機器人,涵蓋 STEAM(科學、技術、工程、藝術和數學)中各領域的知識,能讓孩子快速上手並親身體驗機械學、電子學、控制系統和計算機科學的魅力。
簡單快速搭建
內置的機械零件和電子模塊結合 mBot Ranger 套件,簡單 16 個步驟即可快速搭建屬於自己的激光劍,盡享 DIY 的樂趣。
如果不清楚如何搭建,可向makeblock售後咨詢
G. makeblock 主控板怎麼編程
(1)驅動沒有安裝成功;
(2)沒有選對板子的類型;
(3)沒有選對串列埠號;
(4)主控板前幾次能夠正常上傳程序,再次點擊Arino IDE中的「Upload」選項時就不能上傳程序了。
(5)你使用的主控板是Makeblock Orion,並且主板的5號埠連接了一個電子模塊。
(6)主控板是Me Baseboard,並且Arino IDE無法找到主控板的串列埠號;
(7)主控板在下載後,在編譯窗口出現「avrde: stk500_getsync(): not in sync: resp=0x00」的紅色提示語;
H. makeblock的感測器都有那些
Makeblock是一款專為Makeblock平台電子控制而開發的免費應用,同時您也可以用它來和Arino平台的感測器和執行器進行數據交互,
使用它來和您作品中的電子部分進行交互,控制您機器人的移動,操控機械臂,控制一個倒水機器人,發射小球的機器人,控制相撲機器人和別人對戰,甚至控制一
些家用和競賽,教育的機器人。
makeblock電子方面,目前共上線了13種電子模塊。包括:
1. 主控板
Meino
Baseshield(需要和Meino結合使用,通過RJ11介面改變了Arino的接線方式,超級簡潔)
Baseboard(Meino和Baseshield的合體)
2. 感測器
紅外線接收模塊(需要配合紅外線遙控器使用)
巡線模塊
藍牙模塊
超聲波模塊
限位開關
微型限位開關
RJ11轉換器光線與灰度感測器
快門線模塊
3. 驅動
電機驅動
步進電機驅動
舵機驅動
I. dfrobot 與 makeblock 哪個好
DFRobot家是以開源硬體起家,逐漸發展到創客教育和STEAM教育領域,有專業的創客教育和STEAM教育套件,有創客專業教程教材。有國家一級創客空間-蘑菇雲創客空間;產品類目較多,創客和教育領域產品較成熟。
makeblock重點在steam教育領域,專注兒童STEAM教育開發;研發STEAM教育課程體系;
兩者相比各有千秋,有重合點也有各自的優勝項目;從產品線和領域來講,dfrobot更勝一籌。