1. 程式人生 > >iOS之app直接和硬體互動、wifi、紅外、藍芽、zigbee、監控攝像頭相關

iOS之app直接和硬體互動、wifi、紅外、藍芽、zigbee、監控攝像頭相關

WiFi(短距離):主要還是硬體可以通過wifi連線到路由,通過路由連線上網際網路。app連線硬體,通過socket通訊,通過socket設定ssid和密碼,在各式各樣的硬體上植入軟ap,再利用手機連線軟ap配置路由的ssid和密碼, 然後智慧硬體就可以自行連線了路由器了,也就實現了上網的功能.硬體中的軟ap連線路由器後,通過我們自己的伺服器處理,手機通過4G網路也能夠控制智慧硬體了.

藍芽:coreblooth框架。

ZigBee技術是一種近距離、低複雜度、低功耗、低速率、低成本的雙向無線通訊技術。

主要用於距離短、功耗低且傳輸速率不高的各種電子裝置之間進行資料傳輸以及典型的有周期性資料、間歇性資料和低反應時間資料傳輸的應用。

雲端模式(遠端控制):手機與伺服器互動,伺服器與硬體互動。

方式一 紅外轉發:通過智慧主機可以直接控制空調、電視、機頂盒等通過紅外線遙控的產品
方式二 射頻控制:通過智慧主機發射射頻訊號(RF315/433MHZ、Zigbee、藍芽等)去控制帶有接受訊號的開關、插座、窗簾控制器、開窗器、門鎖、等;同時主機也能將被動的接受自紅外感測器、門磁、煙霧報警、煤氣報警、漏水檢測等傳過來的射頻訊號,轉為手機app的推送訊息告訴使用者資訊。
方式三 Wifi連線:內建wifi 模組,與使用者家裡的路由器相連
方式四 雲端伺服器:擁有雲端伺服器,擁有98%紅外碼庫、市面中的空調、電視、機頂盒等紅外產品都無需學習直接呼叫紅外碼庫、即可直接使用。

ZigBee技術是一種近距離、低複雜度、低功耗、低速率、低成本的雙向無線通訊技術。

主要用於距離短、功耗低且傳輸速率不高的各種電子裝置之間進行資料傳輸以及典型的有周期性資料、間歇性資料和低反應時間資料傳輸的應用。

ZigBee網內使用ZigBee協議進行通訊,資料到ZigBee閘道器(可理解為協調器+乙太網轉換)轉換為TCP報文傳送給指定IP指定埠,遠端伺服器需要建立一個TCP Server對埠號進行監聽,接收到報文後即可提取有效資料寫入資料庫。

單純zigbee是無法將資料發往乙太網的,你需要做一個Zigbee / TCP 閘道器。具體結構可以是用廉價的ESP8266wifi模組,和Zigbee協調器之間通過UART相連,ESP8266負責接受Zigbee協調器的資料,並通過wifi發往具體的TCP Server地址。

感測器通過ZigBee組網再通過閘道器傳送資料給資料庫。

ZigBee使用那種協議?

IEEE802.15.4協議,這是一種低傳送速率的無限PAN的協議。在標準化方面,IEEE802.15.4工作組主要負責制定物理層和MAC層的協議,其餘協議主要參照和採用現有的標準,高層應用、測試和市場推廣等方面的工作將由ZigBee聯盟負責。

在物聯網中,裝置與裝置的通訊存在兩類協議。第一類協議是接入協議(傳輸協議):負責子網內裝置間的組網及通訊。這類協議包括:Zigbee,WiFi,藍芽。第二類協議是通訊協議,負責通過傳統網際網路與伺服器、APP或裝置進行交換資料,包括HTTP,MQTT,websocket、XMPP、COAP。

zigbee和伺服器的資料傳輸原理:伺服器端的資料接收模組主要由串列埠接收程式和tcp服務構成,主要通過串列埠協議、tcp\ip協議和zigbee網路建立連線,通過zigbee協調器和intenet閘道器獲取zigebee網路監測的資料,進行適當的編碼傳給後臺。

監控攝像頭--------

#import <Foundation/Foundation.h>
#import "Cvs2ResEntity.h"


#define SP_ERROR_MSG                        2001    //錯誤的訊息體格式
#define SP_ERROR_PARAM                      2002    //錯誤的引數
#define SP_ERROR_NOT_SUPPORT                2003    //不支援的操作
#define SP_ERROR_VERITY_FAILED              2004    //目標鑑權失敗
#define SP_ERROR_EPID                       2006    //EPID鑑權失敗
#define SP_ERROR_TIMEOUT                    2009    //命令超時
#define SP_ERROR_ROUTE                      2010    //路由失敗
#define SP_ERROR_DISPATCHER                 2018    //沒有可用的分發單元

#define MC_ERROR_INTER_PARAM                3002    //函式引數錯誤
#define MC_ERROR_REQUEST_TIMEOUT            3003    //請求超時
#define MC_ERROR_ADDRESS                    -3002   //伺服器地址或埠不可達
#define MC_ERROR_CONNECT_TIMEOUT            -3003   //命令連線超時
#define MC_ERROR_ROUTE                      -3008   //路由失敗
#define MC_ERROR_CUI                        -3009   //服務為開啟
#define MC_ERROR_CONNECT_ADDRESS            -3010   //地址不可達
#define MC_ERROR_USER                       -3301   //使用者不存在
#define MC_ERROR_USER_DISABLED              -3302   //使用者被禁用
#define MC_ERROR_PASSWORD                   -3306   //密碼錯誤
#define MC_ERROR_CHECK_TIMEOUT              -3309   //認證超時
#define MC_ERROR_ROUTE_CUI                  -3310   //路由失敗
#define MC_ERROR_NO_CUI                     -3503   //沒有線上的使用者接入服務
#define MC_ERROR_REDIRECT_CUI               -3504   //沒有支援重定向的使用者接入服務
#define DC_ERROR_DATA_TIMEOUT               -4005   //資料通道請求超時
#define DC_ERROR_CONNECT                    -4006   //連線錯誤
#define DC_ERROR_TCP_SEND                   -4007   //TCP傳送出錯
#define DC_ERROR_TCP_RECV                   -4008   //TCP接收出錯

typedef enum // 雲臺的轉動的方向
{
    kCvs2PtzUp = 0,
    kCvs2PtzDown,
    kCvs2PtzLeft,
    kCvs2PtzRight,
}Cvs2PtzTurnDirection;

@class Cvs2VideoView;
@protocol MCHelperDelegate;

@interface MCHelper : NSObject

@property (nonatomic, readonly) NSString *version;
@property (nonatomic, assign) id<MCHelperDelegate>delegate;

/**
 *	@brief              連線伺服器
 *
 *	@param 	address     地址
 *	@param 	usPort      埠
 *	@param 	userName 	使用者名稱
 *	@param 	password 	密碼
 *	@param 	epid        epid
 *	@param 	fixedAddr   是否開啟穿透網閘
 *
 *	@return             返回的錯誤碼 0表示登入成功
 */
- (NSInteger)login:(NSString *)address
              port:(unsigned short)usPort
              user:(NSString *)userName
               psd:(NSString *)password
              epid:(NSString *)epid
         fixedAddr:(BOOL)fixed;

/**
 *	@brief	退出伺服器
 */
- (void)loginOut;

/**
 *	@brief	獲取當前伺服器下所有的裝置, 確保之前已經呼叫了fetchDomainNode,獲取成功以後可以在rootDomain的childrenArray集合中查詢
 *          這個函式會去髮網絡遠端命令,一般只需要呼叫一次,除非想重新整理資源.
 *	@param 	pDomain 	域節點
 *
 *	@return	錯誤碼; 0表示成功
 */
- (NSArray *)fetchPeerUnits:(NSInteger *)error;

/**
 *	@brief	獲取攝像頭資源,確保之前已經呼叫了fetchDomainNode和fetchPeerUnits。如果引數peerUnit為空,則獲取所有的裝置。
 *          獲取成功以後,如果想要查詢某個攝像頭,應該用攝像頭的PUID和cIdx在對應的Cvs2PeerUnit例項的childrenArray集合中查詢
 *
 *  @param 	pPU 	可為NULL或者域下某個具體的裝置物件
 *
 *	@return	錯誤碼; 0表示成功
 */
- (NSInteger)fetchCameras:(Cvs2PeerUnit *)peerUnit;

/**
 *	@brief	單獨獲取指定的PUID的裝置和攝像頭資源
 *
 *  @param 	puid
 *  @error 	錯誤碼
 *  @param 	puid
 *
 *	@return	Cvs2PeerUnit 返回的Cvs2PeerUnit需要上層呼叫者釋放。
 */
- (Cvs2PeerUnit *)fetchOnePU:(NSString *)puid error:(NSInteger *)err;

/**
 *	@brief	渲染視訊介面.
 *
 *	@param 	puid 	視訊資源的PUID
 *	@param 	ucIdx 	視訊資源的index
 *	@param 	type 	流型別 0:高清 1:標清 注意:裝置支援高清流,但標清不一定支援。
 *	@param 	renderView 	播放視窗, renderView必須是Cvs2VideoView類的例項.
 *
 *	@return	0 成功
 */
- (NSInteger)rend:(NSString *)puid index:(unsigned char)ucIdx streamType:(NSInteger)type target:(UIView *)renderView;

/**
 *	@brief	停止視訊
 */
- (void)stopRend;

/**
 *	@brief	轉動攝像頭,裝置必須有云臺才能轉動
 *
 *	@param 	pVideo 	攝像頭物件
 *	@param 	direction 	轉動的方向
 *
 *	@return	0表示成功
 */
- (NSInteger)ptzStartTurn:(Cvs2ResEntity *)pCamera direction:(Cvs2PtzTurnDirection)direction;

/**s
 *	@brief	停止轉動攝像頭
 *
 *	@param 	pVideo 	攝像頭物件
 *
 *	@return	0 表示成功
 */
- (NSInteger)ptzStopTurn:(Cvs2ResEntity *)pCamera;

/**s
 *	@brief	移動雲臺至預置位,裝置必須有云臺才能轉動
 *
 *	@param 	pVideo 	攝像頭物件
 *
 *	@return	0 表示成功
 */
- (NSInteger)moveToPresetPos:(uint)pos videoRes:(Cvs2ResEntity *)pCamera;


- (UIImage *)currentImage;

/**s
 *	@brief	錄製當前正在播放的視訊.
 *
 *	@param 	path檔案全路徑,需帶上字尾如.mp4
 *
 *	@return	0 表示成功
 */
- (NSInteger)startRecord:(NSString *)path;
- (void)stopRecord;

/**s
 *	@brief	抓拍.
 *
 *	@param 	path檔案全路徑,需帶上字尾如.png
 *
 *	@return	0 表示成功
 */
- (BOOL)snapshot:(NSString *)path;
@end

/**
 *	@brief	代理類
 */
@protocol MCHelperDelegate <NSObject>

/**
 *	@brief	這個代理方法是執行在子執行緒中,主要是偵測連線伺服器,接受資料出錯時返回的錯誤碼
 *
 *	@param 	error 	返回的錯誤碼
 */
- (void)connectError:(NSInteger)error;

@end