-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1643 lines (927 loc) · 201 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
<link rel="dns-prefetch" href="https://hubin97.github.io">
<title>个人博客</title>
<meta name="generator" content="hexo-theme-yilia-plus">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<!-- <meta name="keywords" content="">
<meta name="description" content=""> -->
<meta property="og:type" content="website">
<meta property="og:title" content="个人博客">
<meta property="og:url" content="https://hubin97.github.io/index.html">
<meta property="og:site_name" content="个人博客">
<meta property="article:author" content="醉疏狂">
<meta name="twitter:card" content="summary">
<link rel="alternative" href="/atom.xml" title="个人博客" type="application/atom+xml">
<link rel="icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon-180x180.png">
<link rel="stylesheet" type="text/css" href="/./main.a5fda8.css">
<style type="text/css">
#container.show {
background: linear-gradient(200deg,#a0cfe4,#e8c37e);
}
</style>
</head>
<body>
<div id="container" q-class="show:isCtnShow">
<canvas id="anm-canvas" class="anm-canvas"></canvas>
<div class="left-col" q-class="show:isShow">
<div class="overlay" style="background: #4d4d4d;"></div>
<div class="intrude-less">
<header id="header" class="inner">
<a href="/" class="profilepic">
<img src="/img/wl.png" class="js-avatar">
</a>
<hgroup>
<h1 class="header-author"><a href="/">醉疏狂</a></h1>
</hgroup>
<nav class="header-menu">
<ul>
<li><a href="/tags/%E6%8A%80%E6%9C%AF%E6%9C%AD%E8%AE%B0" >技术栈</a></li>
<li><a href="/tags/%E9%9A%8F%E7%AC%94" >茶煎集</a></li>
<li><a href="/tags/%E6%B6%82%E9%B8%A6" >涂鸦墙</a></li>
<li><a href="/tags/%E5%B7%A5%E5%85%B7" >百宝箱</a></li>
</ul>
</nav>
<nav class="header-smart-menu">
<a q-on="click: openSlider(e, 'innerArchive')" href="javascript:void(0)">所有文章</a>
<a q-on="click: openSlider(e, 'friends')" href="javascript:void(0)">学习链接</a>
<a q-on="click: openSlider(e, 'aboutme')" href="javascript:void(0)">个人简介</a>
</nav>
<nav class="header-nav">
<div class="social">
<a class="github" href="https://github.com/hubin97" target="_blank" rel="noopener" title="GitHub" ><i class="icon-github"></i></a>
<a class="mail" href="mailto:[email protected]" title="NULL" ><i class="icon-mail"></i></a>
</div>
<div>
<!-- <iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="240" height="86" src="//music.163.com/outchain/player?type=2&type=2&id=857896&auto=1&height=66"></iframe> -->
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=240 height="86" src="//music.163.com/outchain/player?type=2&id=1808066043&auto=1&height=66"></iframe>
</div>
<p style="font-size: 12px;">这似乎是首纯音乐,请尽情的欣赏它吧!<p>
</nav>
</header>
</div>
</div>
<div class="mid-col" q-class="show:isShow,hide:isShow|isFalse">
<nav id="mobile-nav">
<div class="overlay js-overlay" style="background: #4d4d4d"></div>
<div class="btnctn js-mobile-btnctn">
<div class="slider-trigger list" q-on="click: openSlider(e)"><i class="icon icon-sort"></i></div>
</div>
<div class="intrude-less">
<header id="header" class="inner">
<div class="profilepic">
<a href="/">
<img src="/img/wl.png" class="js-avatar">
</a>
</div>
<hgroup>
<h1 class="header-author js-header-author">醉疏狂</h1>
</hgroup>
<nav class="header-nav">
<div class="social">
<a class="github" target="_blank" href="https://github.com/hubin97" title="GitHub"><i class="icon-github"></i></a>
<a class="mail" target="_blank" href="mailto:[email protected]" title="NULL"><i class="icon-mail"></i></a>
</div>
</nav>
<nav class="header-menu js-header-menu">
<ul style="width: 70%">
<li style="width: 25%"><a href="/tags/%E6%8A%80%E6%9C%AF%E6%9C%AD%E8%AE%B0">技术栈</a></li>
<li style="width: 25%"><a href="/tags/%E9%9A%8F%E7%AC%94">茶煎集</a></li>
<li style="width: 25%"><a href="/tags/%E6%B6%82%E9%B8%A6">涂鸦墙</a></li>
<li style="width: 25%"><a href="/tags/%E5%B7%A5%E5%85%B7">百宝箱</a></li>
</ul>
</nav>
</header>
</div>
<div class="mobile-mask" style="display:none" q-show="isShow"></div>
</nav>
<div id="wrapper" class="body-wrap">
<div class="menu-l">
<div class="canvas-wrap">
<canvas data-colors="#eaeaea" data-sectionHeight="100" data-contentId="js-content" id="myCanvas1"
class="anm-canvas"></canvas>
</div>
<div id="js-content" class="content-ll">
<article id="post-TCP四问" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2023/10/11/TCP%E5%9B%9B%E9%97%AE/">TCP四问</a>
</h1>
<a href="/2023/10/11/TCP%E5%9B%9B%E9%97%AE/" class="archive-article-date">
<time datetime="2023-10-11T01:03:01.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2023-10-11</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h4 id="为什么是三次握手-不是两次"><a href="#为什么是三次握手-不是两次" class="headerlink" title="为什么是三次握手, 不是两次?"></a>为什么是三次握手, 不是两次?</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">假设两次握手, 发送SYN超时, 超时后超时重传, </span><br><span class="line">而Server端收到SYN确认后就会建立连接, </span><br><span class="line">如果确认后又收到超时的那个SYN,这个时候Server会又建立一次连接. </span><br><span class="line">而实际Client端只需要建立一次连接. </span><br><span class="line">所以就需要三次握手来规避这种超时重传再次建立连接的情况</span><br></pre></td></tr></table></figure>
<h4 id="为什么连接的时候是三次握手,关闭的时候却是四次握手"><a href="#为什么连接的时候是三次握手,关闭的时候却是四次握手" class="headerlink" title="为什么连接的时候是三次握手,关闭的时候却是四次握手?"></a>为什么连接的时候是三次握手,关闭的时候却是四次握手?</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,</span><br><span class="line">所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。</span><br><span class="line">只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,</span><br><span class="line">因此不能一起发送。故需要四步握手。</span><br><span class="line"></span><br><span class="line">// 补充</span><br><span class="line">4次挥手, 两个方向的FIN(断开)确认. 表示了tcp是全双工的连接通道.</span><br><span class="line">当客户端发送FIN报文后, 服务端接收到FIN报文时, 会返回ACK报文确认, 这时会关闭客户端到服务端连接通道, </span><br><span class="line">但是可能服务端仍有数据在处理.而此时就是一个连接通道半关闭状态. 当服务器数据处理完之后, </span><br><span class="line">才会发送FIN, ACK报文到客户端, 再由客户端返回ACK报文确认, 并关闭连接通道.</span><br></pre></td></tr></table></figure>
<h4 id="如果已经建立了连接,但是客户端突然出现故障了怎么办?"><a href="#如果已经建立了连接,但是客户端突然出现故障了怎么办?" class="headerlink" title="如果已经建立了连接,但是客户端突然出现故障了怎么办?"></a>如果已经建立了连接,但是客户端突然出现故障了怎么办?</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">TCP还设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。</span><br><span class="line">服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,</span><br><span class="line">若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,</span><br><span class="line">以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,</span><br><span class="line">接着就关闭连接</span><br></pre></td></tr></table></figure>
<h4 id="为什么TIME-WAIT状态需要经过2MSL-最大报文段生存时间-才能返回到CLOSE状态?"><a href="#为什么TIME-WAIT状态需要经过2MSL-最大报文段生存时间-才能返回到CLOSE状态?" class="headerlink" title="为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?"></a>为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。</span><br><span class="line">所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。</span><br><span class="line">Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。</span><br><span class="line">Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。</span><br><span class="line">如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。</span><br><span class="line">MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。</span><br><span class="line">如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。</span><br></pre></td></tr></table></figure>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">技术札记</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">iOS</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color3">面试</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">物联网</a>
</li>
</ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-物联网热门协议" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2023/10/10/%E7%89%A9%E8%81%94%E7%BD%91%E7%83%AD%E9%97%A8%E5%8D%8F%E8%AE%AE/">物联网热门协议</a>
</h1>
<a href="/2023/10/10/%E7%89%A9%E8%81%94%E7%BD%91%E7%83%AD%E9%97%A8%E5%8D%8F%E8%AE%AE/" class="archive-article-date">
<time datetime="2023-10-10T02:03:01.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2023-10-10</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h3 id="星闪-又名-绿牙"><a href="#星闪-又名-绿牙" class="headerlink" title="星闪: (又名 绿牙)"></a>星闪: (又名 绿牙)</h3><blockquote>
<p>星闪技术是<strong>新一代近距离无线连接技术,具有更低功耗、更快速度、更低时延、更稳连接、更广覆盖、更大组网等优势</strong>,将为智能终端、智能家居、智能汽车、智能制造等场景带来体验变革。<br>星闪技术支持最大4096台设备互联,远超过蓝牙的8台和WiFi的256台;星闪技术的延迟能做到20微秒延迟,这是人类无线连接技术首次进入微秒级,而Wi-Fi 目前的延迟最低为 10 毫秒。 </p>
</blockquote>
<p>参考: <a href="https://baike.baidu.com/item/星闪技术/59604205" target="_blank" rel="noopener">星闪技术</a></p>
<h3 id="Matter"><a href="#Matter" class="headerlink" title="Matter:"></a>Matter:</h3><blockquote>
<p>Matter 是一种新的<strong>开放式智能家居协议,它使用现有的、熟悉的技术,包括用于设备设置的低功耗蓝牙和用于连接设备的 Wi-Fi、Thread和以太网</strong>。主要的智能家居平台和设备品牌已经承诺升级现有的部分存量设备,因此新的 Matter 设备将与您现有的智能家居无缝协作。</p>
</blockquote>
<h3 id="蓝牙-GATT协议"><a href="#蓝牙-GATT协议" class="headerlink" title="蓝牙: (GATT协议)"></a>蓝牙: (GATT协议)</h3><blockquote>
<p>蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。</p>
</blockquote>
<blockquote>
<p>关于手机蓝牙可以同时连接几个设备<br>蓝牙的逻辑地址由三位 表示,共可以表示8个 ,但其中000代表广播,其他的7位 表示可以同时创建逻辑链接的设备个数。 理论上一个蓝牙主设备(master),也就是你的手机可以连接七个从蓝牙 中的从设备的个数。 但是在同时连接多个蓝牙耳机或 时,只会有一个蓝牙播放设备工作,这是由于手机的 所限制的,声卡只能提供给一个蓝牙耳机或音箱使用。</p>
</blockquote>
<h3 id="蓝牙mesh"><a href="#蓝牙mesh" class="headerlink" title="蓝牙mesh"></a>蓝牙mesh</h3><blockquote>
<p>Mesh网络,就是一个多对多网络(Many to Many)。 每个设备节点都可以和别的节点自由通讯。</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">// mesh拓扑图下的4种特性节点</span><br><span class="line">中继节点, 主要处理消息转发</span><br><span class="line">低功耗和朋友节点(两个搭配使用), 低功耗节点正常大多数时候处于休眠, 而朋友节点会帮它暂存消息, 当低功耗节点需要的时候再去找朋友节点拿</span><br><span class="line">代理节点 (兼容现有的非Mesh设备的方法), 负责把mesh和非mesh的BLE设备两边的报文进行处理转发</span><br></pre></td></tr></table></figure>
<p>参考: <a href="https://www.zhihu.com/column/bluetooth-mesh" target="_blank" rel="noopener">蓝牙 mesh 一起学</a></p>
<h3 id="ZigBee"><a href="#ZigBee" class="headerlink" title="ZigBee"></a>ZigBee</h3><blockquote>
<p>ZigBee,也称紫蜂,是一种低速短距离传输的无线网上协议,底层是采用IEEE 802.15.4标准规范的媒体访问层与物理层。主要特色有低速、低耗电、低成本、支持大量网上节点、支持多种网上拓扑、低复杂度、快速、可靠、安全。<br>它是一种介于无线标记技术和蓝 牙之间的技术提案。</p>
</blockquote>
<blockquote>
<p>优势: <strong>低功耗, 低成本, 低速率, 近距离, 短时延, 高容量, 高安全, 免执照频段</strong></p>
</blockquote>
<blockquote>
<p>Zigbee是一种短距离、低功耗的无线通信技术名称。这一名称来源与蜜蜂的八字舞。其特点是近距离、低复杂度、低功耗、低数据速率、低成本。主要适合用于自动控制和远程控制领域,可以嵌入各种设备。</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Zigbee自身的技术优势:</span><br><span class="line">1、低功耗。在低耗电待机模式下,2 节5 号干电池可支持1个节点工作6~24个月,甚至更长。这是Zigbee的突出优势。相比较,蓝牙能工作数周、WiFi可工作数小时。</span><br><span class="line">2、低成本。通过大幅简化协议(不到蓝牙的1/10) ,降低了对通信控制器的要求,按预测分析,以8051的8位微控制器测算,全功能的主节点需要32KB代码,子功能节点少至4KB代码,而且Zigbee免协议专利费。每块芯片的价格大约为2 美元。</span><br><span class="line">3、低速率。Zigbee工作在20~250 kbps的较低速率,分别提供250 kbps(2.4GHz)、40kbps (915 MHz)和20kbps(868 MHz) 的原始数据吞吐率,满足低速率传输数据的应用需求。</span><br><span class="line">4、近距离。传输范围一般介于10~100 m 之间,在增加RF 发射功率后,亦可增加到1~3 km。这指的是相邻节点间的距离。如果通过路由和节点间通信的接力,传输距离将可以更远。</span><br><span class="line">5、短时延。Zigbee 的响应速度较快,一般从睡眠转入工作状态只需15 ms ,节点连接进入网络只需30 ms ,进一步节省了电能。相比较,蓝牙需要3~10 s、WiFi 需要3 s。</span><br><span class="line">6、高容量。Zigbee 可采用星状、片状和网状网络结构,由一个主节点管理若干子节点,最多一个主节点可管理254 个子节点;同时主节点还可由上一层网络节点管理,最多可组成65000 个节点的大网。</span><br><span class="line">7、高安全。Zigbee 提供了三级安全模式,包括无安全设定、使用接入控制清单(ACL) 防止非法获取数据以及采用高级加密标准(AES 128) 的对称密码,以灵活确定其安全属性。</span><br><span class="line">8、免执照频段。采用直接序列扩频在工业科学医疗( ISM) 频段,2. 4 GHz (全球) 、915 MHz(美国) 和868 MHz(欧洲) 。</span><br></pre></td></tr></table></figure>
<p>参考: <a href="https://baike.c114.com.cn/view.asp?id=8470-7AB9AEFA" target="_blank" rel="noopener">Zigbee</a></p>
<h3 id="MQTT"><a href="#MQTT" class="headerlink" title="MQTT"></a>MQTT</h3><blockquote>
<p>MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),<br>是一种基于发布/订阅(publish/subscribe)模式的”轻量级”通讯协议,<br>该协议构建于TCP/IP协议上,由IBM在1999年发布。</p>
</blockquote>
<blockquote>
<p>MQTT最大优点在于,可以<strong>以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务</strong>。<br>作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">// 概念简述:</span><br><span class="line">MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。</span><br><span class="line"></span><br><span class="line">MQTT传输的消息分为:</span><br><span class="line">主题(Topic)和负载(payload)两部分</span><br><span class="line">Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)</span><br><span class="line">payload,可以理解为消息的内容,是指订阅者具体要使用的内容</span><br><span class="line"></span><br><span class="line">MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输。</span><br><span class="line">当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关连。</span><br><span class="line"></span><br><span class="line">MQTT客户端</span><br><span class="line">一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:</span><br><span class="line">发布其他客户端可能会订阅的信息</span><br><span class="line">订阅其它客户端发布的消息</span><br><span class="line">退订或删除应用程序的消息</span><br><span class="line">断开与服务器连接</span><br><span class="line"></span><br><span class="line">MQTT服务器</span><br><span class="line">MQTT服务器以称为“消息代理”(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:</span><br><span class="line">接受来自客户的网络连接</span><br><span class="line">接受客户发布的应用信息</span><br><span class="line">处理来自客户端的订阅和退订请求</span><br><span class="line">向订阅的客户转发应用程序消息</span><br></pre></td></tr></table></figure>
<p>参考: <a href="https://www.runoob.com/w3cnote/mqtt-intro.html" target="_blank" rel="noopener">MQTT 入门介绍</a></p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">技术札记</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">iOS</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color3">面试</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">物联网</a>
</li>
</ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-一个串行同步问题" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2023/10/08/%E4%B8%80%E4%B8%AA%E4%B8%B2%E8%A1%8C%E5%90%8C%E6%AD%A5%E9%97%AE%E9%A2%98/">一个串行同步问题</a>
</h1>
<a href="/2023/10/08/%E4%B8%80%E4%B8%AA%E4%B8%B2%E8%A1%8C%E5%90%8C%E6%AD%A5%E9%97%AE%E9%A2%98/" class="archive-article-date">
<time datetime="2023-10-08T10:00:00.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2023-10-08</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h4 id="请问下面两个方法的打印结果是什么"><a href="#请问下面两个方法的打印结果是什么" class="headerlink" title="请问下面两个方法的打印结果是什么?"></a>请问下面两个方法的打印结果是什么?</h4><figure class="highlight objc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 案例1</span></span><br><span class="line">- (<span class="keyword">void</span>)serial_queue2</span><br><span class="line">{</span><br><span class="line"> <span class="built_in">dispatch_queue_t</span> q = dispatch_queue_create(<span class="string">"cn.itcast.gcddemo"</span>, DISPATCH_QUEUE_SERIAL);</span><br><span class="line"> <span class="built_in">dispatch_async</span>(q, ^{</span><br><span class="line"> <span class="built_in">NSLog</span>(<span class="string">@"异步任务 %@1111111"</span>, [<span class="built_in">NSThread</span> currentThread]);</span><br><span class="line"> });</span><br><span class="line"> <span class="built_in">dispatch_async</span>(q, ^{</span><br><span class="line"> <span class="built_in">NSLog</span>(<span class="string">@"异步任务 %@22222"</span>, [<span class="built_in">NSThread</span> currentThread]);</span><br><span class="line"> });</span><br><span class="line"> <span class="built_in">dispatch_async</span>(q, ^{</span><br><span class="line"> <span class="built_in">NSLog</span>(<span class="string">@"异步任务 %@3333"</span>, [<span class="built_in">NSThread</span> currentThread]);</span><br><span class="line"> });</span><br><span class="line"> <span class="built_in">dispatch_async</span>(q, ^{</span><br><span class="line"> <span class="built_in">NSLog</span>(<span class="string">@"异步任务 %@44444"</span>, [<span class="built_in">NSThread</span> currentThread]);</span><br><span class="line"> });</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<figure class="highlight objc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 案例2</span></span><br><span class="line">- (<span class="keyword">void</span>)serial_queue1 {</span><br><span class="line"> <span class="built_in">dispatch_queue_t</span> queue = dispatch_queue_create(<span class="string">"zxy"</span>, DISPATCH_QUEUE_SERIAL);</span><br><span class="line"> <span class="built_in">NSLog</span>(<span class="string">@"1"</span>);</span><br><span class="line"> <span class="built_in">dispatch_async</span>(queue, ^{</span><br><span class="line"> <span class="built_in">NSLog</span>(<span class="string">@"2"</span>);</span><br><span class="line"> <span class="built_in">dispatch_async</span>(queue, ^{</span><br><span class="line"> <span class="built_in">NSLog</span>(<span class="string">@"3"</span>);</span><br><span class="line"> });</span><br><span class="line"> <span class="built_in">NSLog</span>(<span class="string">@"4"</span>);</span><br><span class="line"> });</span><br><span class="line"> <span class="built_in">NSLog</span>(<span class="string">@"5"</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<a class="article-more-a" href="/2023/10/08/%E4%B8%80%E4%B8%AA%E4%B8%B2%E8%A1%8C%E5%90%8C%E6%AD%A5%E9%97%AE%E9%A2%98/#more">more >></a>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">技术札记</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">iOS</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color3">面试</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">GCD</a>
</li>
</ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-RN报错总结" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2023/10/08/RN%E6%8A%A5%E9%94%99%E6%80%BB%E7%BB%93/">RN报错总结</a>
</h1>
<a href="/2023/10/08/RN%E6%8A%A5%E9%94%99%E6%80%BB%E7%BB%93/" class="archive-article-date">
<time datetime="2023-10-08T04:33:16.132Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2023-10-08</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<p>#RN项目中Js代码编译有误, 无法运行</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ERROR Invariant Violation: Module AppRegistry is not a registered callable module (calling runApplication). A frequent cause of the error is that the application entry file path is incorrect.</span><br><span class="line"> This can also happen when the JS bundle is corrupt or there is an early initialization error when loading React Native.</span><br></pre></td></tr></table></figure>
<h4 id="1-M1系统运行报错"><a href="#1-M1系统运行报错" class="headerlink" title="1 M1系统运行报错"></a>1 M1系统运行报错</h4><p>Showing All Errors Only<br>Undefined symbol: <em>OBJC_CLASS</em>$_xxx</p>
<p>原因: 必须要(Xcode14.3)模拟器开启 Rosetta 才行</p>
<p>Xcode14之前, 应用程序里面 选择模拟器, 查看简介并勾选 使用Rosetta打开.<br>Xcode14之后, 打开Xcode->Product-> Destination-> Destination Architecturesk-> Show Rosetta Destinations,然后选择有(Rosetta)的模拟器运行</p>
<h4 id="2-Android模拟器编译运行报错"><a href="#2-Android模拟器编译运行报错" class="headerlink" title="2 Android模拟器编译运行报错:"></a>2 Android模拟器编译运行报错:</h4><p>The application could not be installed: INSTALL_FAILED_INSUFFICIENT_STORAGE</p>
<p>解决方案: 虚拟内存不够, 把Android模拟器容量改大点后, 重启再试</p>
</div>
<div class="article-info article-info-index">
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-iOS相关知识梳理(一)" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2023/04/10/iOS%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E6%A2%B3%E7%90%86(%E4%B8%80)/">iOS相关知识梳理(一)</a>
</h1>
<a href="/2023/04/10/iOS%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E6%A2%B3%E7%90%86(%E4%B8%80)/" class="archive-article-date">
<time datetime="2023-04-10T02:03:01.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2023-04-10</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<!--
*Update: 2023-10-9*
-->
<h3 id="基础篇"><a href="#基础篇" class="headerlink" title="基础篇"></a>基础篇</h3><h4 id="1-UIView-不能接收触摸事件的三种情况"><a href="#1-UIView-不能接收触摸事件的三种情况" class="headerlink" title="1. UIView 不能接收触摸事件的三种情况:"></a>1. UIView 不能接收触摸事件的三种情况:</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">1.不接受用户交互: userInteractionEnabled = NO;</span><br><span class="line">2.隐藏: hidden = YES;</span><br><span class="line">3.透明: alpha = 0.0~0.01</span><br></pre></td></tr></table></figure>
<h4 id="2-事件传递"><a href="#2-事件传递" class="headerlink" title="2. 事件传递"></a>2. 事件传递</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">// 核心方法</span><br><span class="line">hitTest:withEvent: </span><br><span class="line">pointInside:withEvent:</span><br><span class="line"></span><br><span class="line">// 传递流程. (由上而下) (找到最终能响应的子视图)</span><br><span class="line"></span><br><span class="line">1. 先判断视图能否交互; `v.hidden && v.userInteractionEnabled && v.alpha > 0.01`</span><br><span class="line">2. 判断是否事件位置是否在视图内, 调用`pointInside:withEvent:`</span><br><span class="line">3. 倒序 遍历(后添加的视图一般显示在视图最前面)`v.subviews`, 并调用`hitTest:withEvent:`寻找能响应的视图</span><br><span class="line">4. 返回最终能响应的子视图</span><br><span class="line"></span><br><span class="line">// 响应流程. (由下而上)</span><br><span class="line">1. 事件的响应由传递链最终找到的子视图先判定是否响应, </span><br><span class="line">2. 如不能响应, 则会由子视图的父视图再去判断能否响应, </span><br><span class="line">3. 依照这个规律, 一直找到最上层的`UIApplication`, </span><br><span class="line">4. 如果仍不响应此处事件, 则这个事件将会被忽略掉</span><br></pre></td></tr></table></figure>
<a class="article-more-a" href="/2023/04/10/iOS%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E6%A2%B3%E7%90%86(%E4%B8%80)/#more">more >></a>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">技术札记</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">iOS</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color3">面试</a>
</li>
</ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-iOS相关知识梳理(二) " class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2023/04/10/iOS%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E6%A2%B3%E7%90%86(%E4%BA%8C)%20/">iOS相关知识梳理(二)</a>
</h1>
<a href="/2023/04/10/iOS%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E6%A2%B3%E7%90%86(%E4%BA%8C)%20/" class="archive-article-date">
<time datetime="2023-04-10T02:03:01.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2023-04-10</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h3 id="基础篇"><a href="#基础篇" class="headerlink" title="基础篇"></a>基础篇</h3><h4 id="SVN和Git各适用于什么场景"><a href="#SVN和Git各适用于什么场景" class="headerlink" title="SVN和Git各适用于什么场景?"></a>SVN和Git各适用于什么场景?</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">svn适用于 低频次, 少数人, 安全性要求更高的场景</span><br><span class="line">git适用于 多人协助, 跨地域性, 离线办公</span><br></pre></td></tr></table></figure>
<h4 id="instancetype和id区别"><a href="#instancetype和id区别" class="headerlink" title="instancetype和id区别"></a>instancetype和id区别</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">id可以作为方法的返回以及参数类型 也可以用来定义变量</span><br><span class="line">instancetype 只能作为函数或者方法的返回值</span><br><span class="line">instancetype对比id的好处就是: 能精确的限制返回值的具体类型</span><br><span class="line">// 解释如下:</span><br><span class="line">id在编译的时候不能判断对象的真实类型</span><br><span class="line">instancetype在编译的时候可以判断对象的真实类型</span><br></pre></td></tr></table></figure>
<h4 id="id类型-nil-Nil-NULL和NSNULL的区别"><a href="#id类型-nil-Nil-NULL和NSNULL的区别" class="headerlink" title="id类型, nil , Nil ,NULL和NSNULL的区别?"></a>id类型, nil , Nil ,NULL和NSNULL的区别?</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">id类型: 是一个独特的数据类型,可以转换为任何数据类型,id类型的变量可以存放任何数据类型的对象,</span><br><span class="line">在内部处理上,这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针; </span><br><span class="line">id 声明的对象具有运行时特性,既可以指向任意类型的对象</span><br><span class="line">nil 是一个实例对象值; 如果我们要把一个对象设置为空的时候,就用nil</span><br><span class="line">Nil 是一个类对象的值, 如果我们要把一个class的对象设置为空的时候,就用Nil</span><br><span class="line">NULL 指向基本数据类型的空指针(C语言的变量的指针为空)</span><br><span class="line">NSNull 是一个对象,它用在不能使用nil的场合</span><br></pre></td></tr></table></figure>
<h4 id="AutoReleasePool什么时候释放池里面的对象"><a href="#AutoReleasePool什么时候释放池里面的对象" class="headerlink" title="AutoReleasePool什么时候释放池里面的对象?"></a>AutoReleasePool什么时候释放池里面的对象?</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">AutoReleasePool实际上是有AutoReleasePage来实现的,而AutoReleasePage有点类似于堆栈,有一个push和pop操作。</span><br><span class="line">在主线程的runloop监听了几个事件,分别是即将进入Loop,准备进入休眠和即将退出Loop,</span><br><span class="line">在即将进入Loop时进行push一个哨兵对象(或者叫边界对象),在即将休眠时是pop哨兵对象操作,然后再次push操作,在即将退出Loop时pop操作。</span><br><span class="line">在push哨兵对象之后,程序运行会push很多autorelease对象到AutoReleasePage中,pop操作就把这些对象释放,一直找到哨兵对象也把它pop掉为止。</span><br><span class="line">所以每次runLoop进入休眠前AutoReleasePool就释放一次。AutoReleasePool堆栈式结构让它可以嵌套,互不影响</span><br></pre></td></tr></table></figure>
<h4 id="JSCore的几个特性"><a href="#JSCore的几个特性" class="headerlink" title="JSCore的几个特性"></a>JSCore的几个特性</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">// 1. 单线程机制</span><br><span class="line">JS代码本身并不存在多线程处理任务的能力. 借助 强大的事件驱动机制. 可以实现多线程处理</span><br><span class="line"></span><br><span class="line">// 2. 事件驱动机制</span><br><span class="line">JS线程和工作线程(WebWorker),以及浏览器事件之间的通信机制叫做事件循环(EventLoop),类似于iOS的runloop。</span><br><span class="line">它有两个概念,一个是Call Stack,一个是Task Queue。当工作线程完成异步任务之后,会把消息推到Task Queue,消息就是注册时的回调函数。</span><br><span class="line">当Call Stack为空的时候,主线程会从Task Queue里取一条消息放入Call Stack来执行,JS主线程会一直重复这个动作直到消息队列为空。</span><br><span class="line"></span><br><span class="line">// 3. JS的GC机制</span><br><span class="line">JS同样也不需要我们去手动管理内存。JS的内存管理使用的是GC机制(Tracing Garbage Collection)。</span><br><span class="line">不同于OC的引用计数,Tracing Garbage Collection是由GCRoot(Context)开始维护的一条引用链,</span><br><span class="line">一旦引用链无法触达某对象节点,这个对象就会被回收掉。</span><br><span class="line"></span><br><span class="line">// 4. 4个大类JSVM,JSContext,JSValue,JSExport。</span><br><span class="line">JSVM: 一个JSVirtualMachine(以下简称JSVM)实例代表了一个自包含的JS运行环境,</span><br><span class="line">或者是一系列JS运行所需的资源。该类有两个主要的使用用途:</span><br><span class="line">一是支持并发的JS调用,二是管理JS和Native之间桥对象的内存。</span><br><span class="line"></span><br><span class="line">JSContext: 一个JSContext表示了一次JS的执行环境。我们可以通过创建一个JSContext去调用JS脚本,</span><br><span class="line">访问一些JS定义的值和函数,同时也提供了让JS访问Native对象,方法的接口。</span><br><span class="line"></span><br><span class="line">JSValue:JSValue实例是一个指向JS值的引用指针。我们可以使用JSValue类,在OC和JS的基础数据类型之间相互转换。</span><br><span class="line">同时我们也可以使用这个类,去创建包装了Native自定义类的JS对象,或者是那些由Native方法或者Block提供实现JS方法的JS对象。</span><br><span class="line"></span><br><span class="line">JSExport: 实现JSExport协议可以开放OC类和它们的实例方法,类方法,以及属性给JS调用。</span><br><span class="line"></span><br><span class="line">>>>总结<<<: JSCore给iOS App提供了JS可以解释执行的运行环境与资源。</span><br><span class="line">对于我们实际开发而言,最主要的就是JSContext和JSValue这两个类。</span><br><span class="line">JSContext提供互相调用的接口,JSValue为这个互相调用提供数据类型的桥接转换。</span><br><span class="line">让JS可以执行Native方法,并让Native回调JS,反之亦然。</span><br></pre></td></tr></table></figure>
<!--![js事件驱动机制](https://awps-assets.meituan.net/mit-x/blog-images-bundle-2018a/f905fe0b.png)
![](https://awps-assets.meituan.net/mit-x/blog-images-bundle-2018a/3ba5f2e8.png)
-->
<p>参考: <a href="https://tech.meituan.com/2018/08/23/deep-understanding-of-jscore.html" target="_blank" rel="noopener">深入理解JSCore</a></p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">技术札记</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">iOS</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color3">面试</a>
</li>
</ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-Siri快捷指令" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2022/07/08/Siri%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4/">Siri快捷指令</a>
</h1>
<a href="/2022/07/08/Siri%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4/" class="archive-article-date">
<time datetime="2022-07-08T09:27:21.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2022-07-08</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>关于<code>Siri Shortcuts</code>集成, 网络上资料大多比较有年代感或者杂乱, 接下来做个大致梳理.</p>
<p>根据业务需求不同, 实现方式可以分为在App内执行(需要启动App)和App外部执行(不需要启动App).</p>
<p>同样的, 与之对应的也就有两种方案, <code>NSUserActivity+intent</code>和<code>intent</code>.</p>
<p><strong>注意: 适用iOS 12.0及以上版本</strong></p>
<h4 id="一-Intents扩展文件配置"><a href="#一-Intents扩展文件配置" class="headerlink" title="(一). Intents扩展文件配置"></a>(一). Intents扩展文件配置</h4><ol>
<li>在<code>TARGETS</code>中创建一个Intent扩展程序</li>
</ol>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4ca322a6fc5646abb39804ed9067a6cd~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<a class="article-more-a" href="/2022/07/08/Siri%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4/#more">more >></a>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">技术札记</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color4">iOS</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color1">Swift</a>
</li>
</ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-RN项目路由相关" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2022/06/16/RN%E9%A1%B9%E7%9B%AE%E8%B7%AF%E7%94%B1%E7%9B%B8%E5%85%B3/">RN项目路由相关</a>
</h1>
<a href="/2022/06/16/RN%E9%A1%B9%E7%9B%AE%E8%B7%AF%E7%94%B1%E7%9B%B8%E5%85%B3/" class="archive-article-date">
<time datetime="2022-06-16T03:11:27.000Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2022-06-16</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h4 id="RN项目构建-二"><a href="#RN项目构建-二" class="headerlink" title="RN项目构建 (二)"></a>RN项目构建 (二)</h4><h4 id="添加路由依赖库"><a href="#添加路由依赖库" class="headerlink" title="添加路由依赖库"></a>添加路由依赖库</h4><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yarn add @react-navigation/native @react-navigation/stack @react-navigation/bottom-tabs</span><br></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context @react-native-community/masked-view</span><br></pre></td></tr></table></figure>
<p>安装完依赖库后, <code>cd ios</code>然后再安装Native相关依赖, <code>cocoapods</code>执行如下</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pod install</span><br></pre></td></tr></table></figure>
<p>导入依赖库, 发现<code>react</code>以及r<code>eact-native</code>库时报错</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm i --save-dev @types/react</span><br><span class="line">npm i --save-dev @types/react-native</span><br></pre></td></tr></table></figure>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<i class="icon-price-tags icon"></i>
<ul class="article-tag-list">
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color5">技术札记</a>
</li>
<li class="article-tag-list-item">
<a href="javascript:void(0)" class="js-tag article-tag-list-link color3">RN</a>
</li>
</ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-RN项目配置相关" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">