一猾编、框架
1.UDP框架 GCDAsyncUdpSocket瘤睹;
2.加密方式,采用aes_cfb128 iv為0 ;
3.抓包驗證wireshark
二袍镀、數(shù)據(jù)初始化
1.初始化UDPSocket 與廣播相同
三默蚌、數(shù)據(jù)發(fā)送
(1)發(fā)送地址
端口與設(shè)備端協(xié)商冻晤,這里以60000舉例
local:port -> 239...* : 60000 + index
(2)數(shù)據(jù)
說明 | |
---|---|
dataByte | 總長度(1) + flag(1) + + pwdLen(1) + pwd + randLen(1) + rand+ ssidLen(1) + ssid + bssidLen + bssid + checkSum(1) |
ssid: | ssid為中文則采用utf-8編碼苇羡,其他則為ASCII編碼 |
pwd | pwd需要加密 |
rand | 隨機數(shù) |
bssid | bssid |
checkSum | 校驗和 |
加密編碼方式與廣播相同
//生成隨機數(shù)
- (NSData *)dataFromRand:(int)count{
Byte codeData[count];
for (int i = 0; i < count; i++) {
codeData[i] = arc4random()%255 + 1;
}
return [NSData dataWithBytes:codeData length:sizeof(codeData)];
}
(3)發(fā)送結(jié)構(gòu)
利用組播目的地址的后23bit發(fā)送數(shù)據(jù)
數(shù)據(jù)分為 239.index.data[n].data[n+1]
數(shù)據(jù)分為
說明 | |
---|---|
index | 數(shù)據(jù)序號 |
data | 數(shù)據(jù)按字節(jié)順序 |
//生成地址
- (NSString *)ipStringWithData:(NSString *)dataString count:(int)count{
NSString *ipString = [NSString stringWithFormat:@"239.%d.%@",count,dataString];
return ipString;
}
//發(fā)送數(shù)據(jù)
[self.castClient sendData:[self zeroDataWithCount:1] toHost:ipString port:70000+_sendCount];
(4)傳輸規(guī)則
每包之間間隔20ms;間隔時間可按實際情況調(diào)整
(1) -> 239.0.data[0].data[1]
(2) -> 239.1.data[2].data[3]
(3) -> 239.2.data[4].data[5]
(4) -> 239.3.data[6].data[7]
...