【iOS】smartconfig 廣播實現(xiàn)

一、框架

1.UDP框架 GCDAsyncUdpSocket腐宋;
2.加密方式,采用aes_cfb128 iv為0 ;
3.抓包驗證wireshark

二欺嗤、數(shù)據(jù)初始化

1.初始化UDPSocket

_castSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:_castQueue];

(1)開啟廣播 Broadcast卫枝;

if (![_castSocket enableBroadcast:YES error:&error]) {
     UdpLog(@"enableBroadcast error:%@",error);
}

(2)接收數(shù)據(jù) beginReceiving;

if (![_castSocket beginReceiving:&error]) {
     UdpLog(@"beginReceiving error:%@",error);
}

(3)指定端口 不指定則會隨機(jī)分配吆玖;

三马篮、數(shù)據(jù)發(fā)送

(1)發(fā)送地址

端口與設(shè)備端協(xié)商,這里以60000舉例
local:port -> 192.168.2.255 : 60000 + index

(2)數(shù)據(jù)
說明
dataByte 總長度(1) + flag(1) + ssidLen(1) + pwdLen(1) + ssid + pwd + checkSum(2)
ssid: ssid為中文則采用utf-8編碼翅阵,其他則為ASCII編碼
pwd pwd需要加密
checkSum 校驗和
//判斷中文
- (BOOL)isChinese:(NSString *) str{
    for(int i=0; i< [str length];i++){
        int a = [str characterAtIndex:i];
        if( a > 0x4E00 && a < 0x9FFF){
            return YES;
        }
    }
    return NO;
}
//aes加密
- (NSData *)gnAesEncryptData:(uint8_t *)crypt_data len:(int)crypt_len keyData:(NSData *)keydata{
    unsigned char *keyResult=(Byte*)[keydata bytes];
    AES_KEY aes_key;
    unsigned char *outByte = NULL;
    outByte = (unsigned char *)malloc(crypt_len+1);
    memset(outByte, 0, crypt_len+1);
    AES_set_encrypt_key(keyResult, 128, &aes_key);
    int number = 0;
    NSData *ivData = [NSData dataWithBytes:&number length:1];
    unsigned char *ivResult = (Byte*)[ivData bytes];
    NSData *numData = [NSData dataWithBytes:&number length:1];
    int *numResult = (int *)[numData bytes];
    AES_cfb128_encrypt(crypt_data,outByte,crypt_len, &aes_key,ivResult,numResult ,AES_ENCRYPT);
    NSData *Decrydata = [NSData dataWithBytes:outByte length:crypt_len];
    return Decrydata;
}
(3)發(fā)送結(jié)構(gòu)

利用廣播的數(shù)據(jù)長度length發(fā)送數(shù)據(jù) 每次發(fā)送11bit數(shù)據(jù)掷匠,
幀頭與設(shè)備端協(xié)商岖圈,這里以0x480舉例
數(shù)據(jù)分為

說明
幀頭 0x480 , 0x481,0x482,0x483…
幀數(shù)據(jù) index(4bit) + data(7bit)

bit7 幀頭固定為1 蜂科,數(shù)據(jù)幀固定為0;
發(fā)送數(shù)按組發(fā)送 一組是一個幀頭*2 + 8個數(shù)據(jù)幀崇摄;

[self.castClient sendData:[self zeroDataWithCount:value] toHost:_broadcastIP port:60000+_sendCount];
(4)轉(zhuǎn)碼

由于bit7是幀頭位, 所以每次只能發(fā)送6bit數(shù)據(jù),就需要對整個數(shù)據(jù) 進(jìn)行8bit->6bit轉(zhuǎn)碼
例如

 0x 11 22 (0b 0001 0001 0010 0010 (高位到低位)) -> 1000 1000 0100 0100(低位到高位)
-> 100010 000100 010000(低位到高位) -> 010001 001000  0000010(高位到低位) ->0x11 08 02 
    int  bitCount = 6;
    int  dataLength = (int)data.length;
    Byte codeData[dataLength * bitCount];
    int  outLength = (dataLength * 8 + bitCount - 1) /bitCount;
    Byte outData[outLength];
    Byte *dataByte = (Byte *)data.bytes;
    for (int i = 0; i < dataLength; i ++) {
        for (int j = 0; j < 8; j++) {
            codeData[i * 8 + j] = (dataByte[i] >> j) & 0x01;
        }
    }
    for (int i = 0; i < outLength; i++) {
        outData[i] = 0;
        for (int j = 0; j < bitCount; j ++) {
            outData[i] |= codeData[i * bitCount + j] << j;
        }
    }
    NSData *tempCodeData = [NSData dataWithBytes:outData length:sizeof(outData)];
    return  tempCodeData;
(5)傳輸規(guī)則

每包之間間隔20ms;間隔時間可按實際情況調(diào)整
(1) 幀頭*2 (0x480 -> 1152)
(2) 幀數(shù)據(jù) 8 (組序號<<7 + data[index])
(3) 幀頭
2 (0x481 -> 1153)
(4) 幀數(shù)據(jù) 8
(5) 幀頭
2 (0x482 -> 1154)

(6) 幀數(shù)據(jù) *8
...


截屏2021-04-29 15.49.01.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸠儿,一起剝皮案震驚了整個濱河市厕氨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌田晚,老刑警劉巖国葬,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芹壕,死亡現(xiàn)場離奇詭異接奈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睁壁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門互捌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钳降,你說我怎么就攤上這事巢价。” “怎么了壤躲?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵碉克,是天一觀的道長。 經(jīng)常有香客問我漏麦,道長,這世上最難降的妖魔是什么更耻? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任捏膨,我火速辦了婚禮,結(jié)果婚禮上目胡,老公的妹妹穿的比我還像新娘链快。我一直安慰自己,他們只是感情好巨双,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著畏妖,像睡著了一般疼阔。 火紅的嫁衣襯著肌膚如雪半夷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天淘邻,我揣著相機(jī)與錄音湘换,去河邊找鬼。 笑死彩倚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔬蕊。 我是一名探鬼主播哥谷,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猜扮!你這毒婦竟也來了监婶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鲜漩,失蹤者是張志新(化名)和其女友劉穎集惋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刮刑,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年理卑,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔽氨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宇立,死狀恐怖自赔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绍妨,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布毙驯,位于F島的核電站灾测,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏行施。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一稠项、第九天 我趴在偏房一處隱蔽的房頂上張望鲜结。 院中可真熱鬧,春花似錦拗胜、人聲如沸怒允。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽所灸。三九已至炫七,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侠驯,已是汗流浹背奕巍。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乍桂。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓睹酌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親憋沿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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