├── LICENSE
├── README.md
├── README_EN.md
├── go.mod
├── go.sum
└── illumi-packet.go
/LICENSE:
--------------------------------------------------------------------------------
1 | Attribution 4.0 International
2 |
3 | =======================================================================
4 |
5 | Creative Commons Corporation ("Creative Commons") is not a law firm and
6 | does not provide legal services or legal advice. Distribution of
7 | Creative Commons public licenses does not create a lawyer-client or
8 | other relationship. Creative Commons makes its licenses and related
9 | information available on an "as-is" basis. Creative Commons gives no
10 | warranties regarding its licenses, any material licensed under their
11 | terms and conditions, or any related information. Creative Commons
12 | disclaims all liability for damages resulting from their use to the
13 | fullest extent possible.
14 |
15 | Using Creative Commons Public Licenses
16 |
17 | Creative Commons public licenses provide a standard set of terms and
18 | conditions that creators and other rights holders may use to share
19 | original works of authorship and other material subject to copyright
20 | and certain other rights specified in the public license below. The
21 | following considerations are for informational purposes only, are not
22 | exhaustive, and do not form part of our licenses.
23 |
24 | Considerations for licensors: Our public licenses are
25 | intended for use by those authorized to give the public
26 | permission to use material in ways otherwise restricted by
27 | copyright and certain other rights. Our licenses are
28 | irrevocable. Licensors should read and understand the terms
29 | and conditions of the license they choose before applying it.
30 | Licensors should also secure all rights necessary before
31 | applying our licenses so that the public can reuse the
32 | material as expected. Licensors should clearly mark any
33 | material not subject to the license. This includes other CC-
34 | licensed material, or material used under an exception or
35 | limitation to copyright. More considerations for licensors:
36 | wiki.creativecommons.org/Considerations_for_licensors
37 |
38 | Considerations for the public: By using one of our public
39 | licenses, a licensor grants the public permission to use the
40 | licensed material under specified terms and conditions. If
41 | the licensor's permission is not necessary for any reason--for
42 | example, because of any applicable exception or limitation to
43 | copyright--then that use is not regulated by the license. Our
44 | licenses grant only permissions under copyright and certain
45 | other rights that a licensor has authority to grant. Use of
46 | the licensed material may still be restricted for other
47 | reasons, including because others have copyright or other
48 | rights in the material. A licensor may make special requests,
49 | such as asking that all changes be marked or described.
50 | Although not required by our licenses, you are encouraged to
51 | respect those requests where reasonable. More considerations
52 | for the public:
53 | wiki.creativecommons.org/Considerations_for_licensees
54 |
55 | =======================================================================
56 |
57 | Creative Commons Attribution 4.0 International Public License
58 |
59 | By exercising the Licensed Rights (defined below), You accept and agree
60 | to be bound by the terms and conditions of this Creative Commons
61 | Attribution 4.0 International Public License ("Public License"). To the
62 | extent this Public License may be interpreted as a contract, You are
63 | granted the Licensed Rights in consideration of Your acceptance of
64 | these terms and conditions, and the Licensor grants You such rights in
65 | consideration of benefits the Licensor receives from making the
66 | Licensed Material available under these terms and conditions.
67 |
68 |
69 | Section 1 -- Definitions.
70 |
71 | a. Adapted Material means material subject to Copyright and Similar
72 | Rights that is derived from or based upon the Licensed Material
73 | and in which the Licensed Material is translated, altered,
74 | arranged, transformed, or otherwise modified in a manner requiring
75 | permission under the Copyright and Similar Rights held by the
76 | Licensor. For purposes of this Public License, where the Licensed
77 | Material is a musical work, performance, or sound recording,
78 | Adapted Material is always produced where the Licensed Material is
79 | synched in timed relation with a moving image.
80 |
81 | b. Adapter's License means the license You apply to Your Copyright
82 | and Similar Rights in Your contributions to Adapted Material in
83 | accordance with the terms and conditions of this Public License.
84 |
85 | c. Copyright and Similar Rights means copyright and/or similar rights
86 | closely related to copyright including, without limitation,
87 | performance, broadcast, sound recording, and Sui Generis Database
88 | Rights, without regard to how the rights are labeled or
89 | categorized. For purposes of this Public License, the rights
90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar
91 | Rights.
92 |
93 | d. Effective Technological Measures means those measures that, in the
94 | absence of proper authority, may not be circumvented under laws
95 | fulfilling obligations under Article 11 of the WIPO Copyright
96 | Treaty adopted on December 20, 1996, and/or similar international
97 | agreements.
98 |
99 | e. Exceptions and Limitations means fair use, fair dealing, and/or
100 | any other exception or limitation to Copyright and Similar Rights
101 | that applies to Your use of the Licensed Material.
102 |
103 | f. Licensed Material means the artistic or literary work, database,
104 | or other material to which the Licensor applied this Public
105 | License.
106 |
107 | g. Licensed Rights means the rights granted to You subject to the
108 | terms and conditions of this Public License, which are limited to
109 | all Copyright and Similar Rights that apply to Your use of the
110 | Licensed Material and that the Licensor has authority to license.
111 |
112 | h. Licensor means the individual(s) or entity(ies) granting rights
113 | under this Public License.
114 |
115 | i. Share means to provide material to the public by any means or
116 | process that requires permission under the Licensed Rights, such
117 | as reproduction, public display, public performance, distribution,
118 | dissemination, communication, or importation, and to make material
119 | available to the public including in ways that members of the
120 | public may access the material from a place and at a time
121 | individually chosen by them.
122 |
123 | j. Sui Generis Database Rights means rights other than copyright
124 | resulting from Directive 96/9/EC of the European Parliament and of
125 | the Council of 11 March 1996 on the legal protection of databases,
126 | as amended and/or succeeded, as well as other essentially
127 | equivalent rights anywhere in the world.
128 |
129 | k. You means the individual or entity exercising the Licensed Rights
130 | under this Public License. Your has a corresponding meaning.
131 |
132 |
133 | Section 2 -- Scope.
134 |
135 | a. License grant.
136 |
137 | 1. Subject to the terms and conditions of this Public License,
138 | the Licensor hereby grants You a worldwide, royalty-free,
139 | non-sublicensable, non-exclusive, irrevocable license to
140 | exercise the Licensed Rights in the Licensed Material to:
141 |
142 | a. reproduce and Share the Licensed Material, in whole or
143 | in part; and
144 |
145 | b. produce, reproduce, and Share Adapted Material.
146 |
147 | 2. Exceptions and Limitations. For the avoidance of doubt, where
148 | Exceptions and Limitations apply to Your use, this Public
149 | License does not apply, and You do not need to comply with
150 | its terms and conditions.
151 |
152 | 3. Term. The term of this Public License is specified in Section
153 | 6(a).
154 |
155 | 4. Media and formats; technical modifications allowed. The
156 | Licensor authorizes You to exercise the Licensed Rights in
157 | all media and formats whether now known or hereafter created,
158 | and to make technical modifications necessary to do so. The
159 | Licensor waives and/or agrees not to assert any right or
160 | authority to forbid You from making technical modifications
161 | necessary to exercise the Licensed Rights, including
162 | technical modifications necessary to circumvent Effective
163 | Technological Measures. For purposes of this Public License,
164 | simply making modifications authorized by this Section 2(a)
165 | (4) never produces Adapted Material.
166 |
167 | 5. Downstream recipients.
168 |
169 | a. Offer from the Licensor -- Licensed Material. Every
170 | recipient of the Licensed Material automatically
171 | receives an offer from the Licensor to exercise the
172 | Licensed Rights under the terms and conditions of this
173 | Public License.
174 |
175 | b. No downstream restrictions. You may not offer or impose
176 | any additional or different terms or conditions on, or
177 | apply any Effective Technological Measures to, the
178 | Licensed Material if doing so restricts exercise of the
179 | Licensed Rights by any recipient of the Licensed
180 | Material.
181 |
182 | 6. No endorsement. Nothing in this Public License constitutes or
183 | may be construed as permission to assert or imply that You
184 | are, or that Your use of the Licensed Material is, connected
185 | with, or sponsored, endorsed, or granted official status by,
186 | the Licensor or others designated to receive attribution as
187 | provided in Section 3(a)(1)(A)(i).
188 |
189 | b. Other rights.
190 |
191 | 1. Moral rights, such as the right of integrity, are not
192 | licensed under this Public License, nor are publicity,
193 | privacy, and/or other similar personality rights; however, to
194 | the extent possible, the Licensor waives and/or agrees not to
195 | assert any such rights held by the Licensor to the limited
196 | extent necessary to allow You to exercise the Licensed
197 | Rights, but not otherwise.
198 |
199 | 2. Patent and trademark rights are not licensed under this
200 | Public License.
201 |
202 | 3. To the extent possible, the Licensor waives any right to
203 | collect royalties from You for the exercise of the Licensed
204 | Rights, whether directly or through a collecting society
205 | under any voluntary or waivable statutory or compulsory
206 | licensing scheme. In all other cases the Licensor expressly
207 | reserves any right to collect such royalties.
208 |
209 |
210 | Section 3 -- License Conditions.
211 |
212 | Your exercise of the Licensed Rights is expressly made subject to the
213 | following conditions.
214 |
215 | a. Attribution.
216 |
217 | 1. If You Share the Licensed Material (including in modified
218 | form), You must:
219 |
220 | a. retain the following if it is supplied by the Licensor
221 | with the Licensed Material:
222 |
223 | i. identification of the creator(s) of the Licensed
224 | Material and any others designated to receive
225 | attribution, in any reasonable manner requested by
226 | the Licensor (including by pseudonym if
227 | designated);
228 |
229 | ii. a copyright notice;
230 |
231 | iii. a notice that refers to this Public License;
232 |
233 | iv. a notice that refers to the disclaimer of
234 | warranties;
235 |
236 | v. a URI or hyperlink to the Licensed Material to the
237 | extent reasonably practicable;
238 |
239 | b. indicate if You modified the Licensed Material and
240 | retain an indication of any previous modifications; and
241 |
242 | c. indicate the Licensed Material is licensed under this
243 | Public License, and include the text of, or the URI or
244 | hyperlink to, this Public License.
245 |
246 | 2. You may satisfy the conditions in Section 3(a)(1) in any
247 | reasonable manner based on the medium, means, and context in
248 | which You Share the Licensed Material. For example, it may be
249 | reasonable to satisfy the conditions by providing a URI or
250 | hyperlink to a resource that includes the required
251 | information.
252 |
253 | 3. If requested by the Licensor, You must remove any of the
254 | information required by Section 3(a)(1)(A) to the extent
255 | reasonably practicable.
256 |
257 | 4. If You Share Adapted Material You produce, the Adapter's
258 | License You apply must not prevent recipients of the Adapted
259 | Material from complying with this Public License.
260 |
261 |
262 | Section 4 -- Sui Generis Database Rights.
263 |
264 | Where the Licensed Rights include Sui Generis Database Rights that
265 | apply to Your use of the Licensed Material:
266 |
267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right
268 | to extract, reuse, reproduce, and Share all or a substantial
269 | portion of the contents of the database;
270 |
271 | b. if You include all or a substantial portion of the database
272 | contents in a database in which You have Sui Generis Database
273 | Rights, then the database in which You have Sui Generis Database
274 | Rights (but not its individual contents) is Adapted Material; and
275 |
276 | c. You must comply with the conditions in Section 3(a) if You Share
277 | all or a substantial portion of the contents of the database.
278 |
279 | For the avoidance of doubt, this Section 4 supplements and does not
280 | replace Your obligations under this Public License where the Licensed
281 | Rights include other Copyright and Similar Rights.
282 |
283 |
284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability.
285 |
286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
296 |
297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
306 |
307 | c. The disclaimer of warranties and limitation of liability provided
308 | above shall be interpreted in a manner that, to the extent
309 | possible, most closely approximates an absolute disclaimer and
310 | waiver of all liability.
311 |
312 |
313 | Section 6 -- Term and Termination.
314 |
315 | a. This Public License applies for the term of the Copyright and
316 | Similar Rights licensed here. However, if You fail to comply with
317 | this Public License, then Your rights under this Public License
318 | terminate automatically.
319 |
320 | b. Where Your right to use the Licensed Material has terminated under
321 | Section 6(a), it reinstates:
322 |
323 | 1. automatically as of the date the violation is cured, provided
324 | it is cured within 30 days of Your discovery of the
325 | violation; or
326 |
327 | 2. upon express reinstatement by the Licensor.
328 |
329 | For the avoidance of doubt, this Section 6(b) does not affect any
330 | right the Licensor may have to seek remedies for Your violations
331 | of this Public License.
332 |
333 | c. For the avoidance of doubt, the Licensor may also offer the
334 | Licensed Material under separate terms or conditions or stop
335 | distributing the Licensed Material at any time; however, doing so
336 | will not terminate this Public License.
337 |
338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
339 | License.
340 |
341 |
342 | Section 7 -- Other Terms and Conditions.
343 |
344 | a. The Licensor shall not be bound by any additional or different
345 | terms or conditions communicated by You unless expressly agreed.
346 |
347 | b. Any arrangements, understandings, or agreements regarding the
348 | Licensed Material not stated herein are separate from and
349 | independent of the terms and conditions of this Public License.
350 |
351 |
352 | Section 8 -- Interpretation.
353 |
354 | a. For the avoidance of doubt, this Public License does not, and
355 | shall not be interpreted to, reduce, limit, restrict, or impose
356 | conditions on any use of the Licensed Material that could lawfully
357 | be made without permission under this Public License.
358 |
359 | b. To the extent possible, if any provision of this Public License is
360 | deemed unenforceable, it shall be automatically reformed to the
361 | minimum extent necessary to make it enforceable. If the provision
362 | cannot be reformed, it shall be severed from this Public License
363 | without affecting the enforceability of the remaining terms and
364 | conditions.
365 |
366 | c. No term or condition of this Public License will be waived and no
367 | failure to comply consented to unless expressly agreed to by the
368 | Licensor.
369 |
370 | d. Nothing in this Public License constitutes or may be interpreted
371 | as a limitation upon, or waiver of, any privileges and immunities
372 | that apply to the Licensor or You, including from the legal
373 | processes of any jurisdiction or authority.
374 |
375 |
376 | =======================================================================
377 |
378 | Creative Commons is not a party to its public
379 | licenses. Notwithstanding, Creative Commons may elect to apply one of
380 | its public licenses to material it publishes and in those instances
381 | will be considered the “Licensor.” The text of the Creative Commons
382 | public licenses is dedicated to the public domain under the CC0 Public
383 | Domain Dedication. Except for the limited purpose of indicating that
384 | material is shared under a Creative Commons public license or as
385 | otherwise permitted by the Creative Commons policies published at
386 | creativecommons.org/policies, Creative Commons does not authorize the
387 | use of the trademark "Creative Commons" or any other trademark or logo
388 | of Creative Commons without its prior written consent including,
389 | without limitation, in connection with any unauthorized modifications
390 | to any of its public licenses or any other arrangements,
391 | understandings, or agreements concerning use of licensed material. For
392 | the avoidance of doubt, this paragraph does not form part of the
393 | public licenses.
394 |
395 | Creative Commons may be contacted at creativecommons.org.
396 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # イルミパケット
2 |
3 | 通信パケットを可視化するLANケーブル
4 |
5 | [English](https://github.com/souring001/illumi-packet/blob/master/README_EN.md)
6 |
7 | 
8 |
9 | [動画 (YouTube)](https://youtu.be/5yJyNpHeRzg)
10 |
11 | ## 概要
12 |
13 | イルミパケットは、通信パケットの種類と方向に合わせて、まるでパケットが流れたかのようにケーブルが光ります。
14 |
15 | ARPのパケットはオレンジ色、DHCPのパケットは水色のように光ります。
16 |
17 | 通常のパケット解析に使われるツールはリアルタイムで目で追うことが難しいのに対し、これはパソコンを操作しながらパケットを観察できるので、「どういう操作」をした時に「どういうパケット」が発生するのかを体感することができます。
18 |
19 | 例えば、ウェブサイトにアクセスした時は、緑(DNS)と青(TCP)の光が複数個流れます。
20 |
21 | 
22 |
23 | ## 準備
24 |
25 | ### 必要なもの
26 | |材料|量|諸注意|
27 | |:-|-:|:-|
28 | |LEDテープ(WS281B)|1m|個別アドレス可能・フルカラーのもの.144LEDs/m 推奨.|
29 | |Raspberry Pi|1台|動作確認: Raspberry Pi 2, 3, 4|
30 | |LANケーブル|1m||
31 | |ジャンパ線 オス-メス|3本||
32 | |結束バンド|4本||
33 |
34 | そのほかに,キーボード,ディスプレイ,HDMIケーブル,ルータ等はご用意ください.
35 |
36 | ### 環境設定
37 | 動作には以下の環境が必要です.
38 | * golang
39 | * libpcap
40 | * SCons
41 | * rpi_ws281x
42 | * illumi-packet
43 |
44 |
45 | #### golangのインストール
46 |
47 | 実行するプログラムはgo言語で記述されています.
48 |
49 | https://golang.org/doc/install#install に従ってインストールします.
50 |
51 | 以下のようにターミナルで実行し,最後にバージョンが表示されることを確認してください.
52 |
53 | ```sh
54 | $ version=1.13.4
55 | $ wget https://storage.googleapis.com/golang/go${version}.linux-armv6l.tar.gz
56 | $ sudo tar -C /usr/local -xzf go${version}.linux-armv6l.tar.gz
57 |
58 | $ echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.profile
59 | $ . ~/.profile
60 |
61 | $ go version
62 | go version go1.13.4 linux/arm
63 | ```
64 |
65 | #### libpcapのインストール
66 | プログラムからパケットキャプチャを行うためにlibpcapをインストールします.
67 |
68 | ```sh
69 | $ sudo apt-get install libpcap-dev
70 | ```
71 |
72 | #### SConsのインストール
73 | rpi_ws281xをビルドするためにSConsをインストールします.
74 |
75 | ```sh
76 | $ sudo apt-get install scons
77 | ```
78 |
79 | #### rpi_ws281xのインストール
80 | LEDテープはrpi_ws281xというライブラリで操作します.
81 |
82 | https://github.com/jgarff/rpi_ws281x に従ってインストールします.
83 |
84 | ```sh
85 | $ git clone https://github.com/jgarff/rpi_ws281x.git
86 | $ cd rpi_ws281x
87 | $ scons
88 |
89 | $ sudo cp -ai ./ws2811.h ./rpihw.h ./pwm.h /usr/local/include/
90 | $ sudo cp -ai ./libws2811.a /usr/local/lib/
91 | ```
92 |
93 | #### イルミパケットのソースコード
94 | このリポジトリのソースコードを適当なディレクトリにダウンロードします.
95 |
96 | ```sh
97 | $ git clone https://github.com/souring001/illumi-packet.git
98 | $ cd illumi-packet
99 | ```
100 |
101 | LEDの個数によって`illumi-packet.go`の以下の変数を適宜変更してください.
102 |
103 | | LEDの個数 | count | speed | series |
104 | | --------:| -----:| -----:| ------:|
105 | |60 個/m | 60 | 1 | 6 |
106 | |144 個/m | 144 | 4 | 12 |
107 | |144 個/m (50cm) | 72 | 1 | 12 |
108 |
109 | ## LANケーブルの作り方
110 |
111 | 1. LANケーブルにLEDテープを乗せて,結束バンドで固定する.
112 | 2. ジャンパワイヤ(オス側)を挿し込む
113 | 3. メス側を Raspberry Pi のGPIOの2(5V), 6(GND), 12(信号) に挿し込む
114 | 4. Raspberry Piとルータに接続する
115 |
116 | 
117 |
118 | 
119 |
120 |
121 | ## ビルド方法
122 | ソースコードを変更するたびにビルドをする必要があります.
123 |
124 | ```sh
125 | $ go build illumi-packet.go
126 | ```
127 |
128 | ## 起動
129 |
130 | ```sh
131 | $ sudo ./illumi-packet
132 | ```
133 |
134 | Ctrl+Cで終了します.
135 |
136 | ### オプション
137 |
138 | |オプション|内容|
139 | |:-|:-|
140 | |-h|オプションの説明|
141 | |-debug |パケット情報等の詳細を出力する(デフォルトは`true`)|
142 | |-device [string]|ネットワークインターフェースを設定(デフォルトは`eth0`)|
143 | |-speed [int]|パケットの流れる速度を設定(デフォルトは`1`)|
144 | |-narp|ARPを表示しない|
145 | |-ntcp|TCPを表示しない|
146 | |-nudp|UDPを表示しない|
147 | |-reset|点灯中のLEDの表示を消す|
148 | |-ipaddr|IPアドレスをLEDに表示する|
149 |
150 | #### 例
151 |
152 | TCP, UDPのパケットを表示しない.
153 | ```sh
154 | $ sudo ./illumi-packet -nudp -ntcp
155 | ```
156 |
157 |
158 |
159 | パケット情報等の詳細を出力しない.
160 |
161 | ```sh
162 | $ sudo ./illumi-packet -debug=false
163 | ```
164 |
165 |
166 |
167 | Wi-Fiの通信を可視化する.
168 | ```sh
169 | $ sudo ./illumi-packet -device wlan0
170 | ```
171 |
172 |
173 |
174 | IPアドレスをLEDに表示する.
175 | ```sh
176 | $ sudo ./illumi-packet -ipaddr
177 | ```
178 | 
179 |
180 | LEDの表示を消す.
181 | ```sh
182 | $ sudo ./illumi-packet -reset
183 | ```
184 |
185 | ## LICENSE
186 |
187 |
188 |
189 | 麻生 航平 作『イルミパケット』はクリエイティブ・コモンズ 表示 4.0 国際 ライセンスで提供されています。
190 |
191 | * 改変・再配布自由
192 | * クレジット表示必須
193 |
194 | 自サイトで使用例を紹介させていただく場合があります。
195 |
クレジット表示・自サイトでの紹介を希望されない場合は、お問い合わせください。
196 |
197 | ## CONTACT
198 |
199 | Twitter: [@souring001](https://twitter.com/souring001)
200 |
201 |
202 | ILLUMI PACKET
203 |
Copyright (c) 2019, Kohei Aso
204 |
--------------------------------------------------------------------------------
/README_EN.md:
--------------------------------------------------------------------------------
1 | # ILLUMI PACKET
2 |
3 | Illuminating Packets on an Ethernet Cable using LED Strip.
4 |
5 | ## Overview
6 |
7 | 
8 |
9 | [Movie (YouTube)](https://youtu.be/5yJyNpHeRzg)
10 |
11 | A packet is visualized by LED lights as it flows in the transmission direction.
12 |
13 | ARP packets glow ORANGE and DHCP packets glow BLUE for example.
14 | 8 LED colors were assigned to each packet type.
15 |
16 | Therefore, Illumi Packet makes the presence of packets familiar and helps to intuitively understand what kind of packets are generated while operating a computer.
17 |
18 | 
19 |
20 | ## Hardware Setup
21 |
22 | ### Requirements
23 |
24 | |Materials|Quantity|Remarks|
25 | |:-|-:|:-|
26 | |LED strip (WS281B)|1m|Recommended > Allowing Individual address, full color. 144LEDs/m|
27 | |Raspberry Pi|1|Operation confirmed > Raspberry Pi 2, 3, 4|
28 | |Ethernet cable|1m||
29 | |Jumper wire male-female|3||
30 | |Cable tie|4||
31 |
32 | You need also Keyboard, Display, HDMI Cable, Routers etc.
33 |
34 | ### Assembly
35 |
36 | 1. Connect an LED strip to the GPIO of a Raspberry Pi.
37 | 2. Fix it to an Ethernet cable.
38 | 3. Connect one end of the Ethernet cable with the Raspberry Pi and the other end with several wired network access points.
39 |
40 | 
41 |
42 | 
43 |
44 |
45 | ### Setup on Raspberry Pi
46 |
47 | 1. Install [golang](https://golang.org/doc/install#install)
48 | 2. Install libpcap `sudo apt-get install libpcap-dev`
49 | 3. Install SCons `sudo apt-get install scons`
50 | 4. Install [rpi_ws281x](https://github.com/jgarff/rpi_ws281x)
51 | 5. Run `git clone https://github.com/souring001/illumi-packet.git`
52 | 6. Change the parameters in `illumi-packet.go` according to the number of LEDs as follows:
53 |
54 | | LEDs/m | count | speed | series |
55 | | ------:| -----:| -----:| ------:|
56 | |60 | 60 | 1 | 6 |
57 | |144 | 144 | 4 | 12 |
58 | |144 (0.5m) | 72 | 1 | 12 |
59 |
60 |
61 | #### 1. Install golang
62 |
63 | The program to be executed is described in go language.
64 | Install golang according to https://golang.org/doc/install#install.
65 | Execute it in the terminal as shown below, and confirm that the version is displayed at the end.
66 | ```sh
67 | $ version=1.13.4
68 | $ wget https://storage.googleapis.com/golang/go${version}.linux-armv6l.tar.gz
69 | $ sudo tar -C /usr/local -xzf go${version}.linux-armv6l.tar.gz
70 |
71 | $ echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.profile
72 | $ . ~/.profile
73 |
74 | $ go version
75 | go version go1.13.4 linux/arm
76 | ```
77 |
78 | #### 4. Install rpi_ws281x
79 | An LED strip is controlled by a library called rpi_ws281x.
80 | Install rpi_ws281x according to https://github.com/jgarff/rpi_ws281x.
81 |
82 | ```sh
83 | $ git clone https://github.com/jgarff/rpi_ws281x.git
84 | $ cd rpi_ws281x
85 | $ scons
86 |
87 | $ sudo cp -ai ./ws2811.h ./rpihw.h ./pwm.h /usr/local/include/
88 | $ sudo cp -ai ./libws2811.a /usr/local/lib/
89 | ```
90 |
91 | ## Build
92 |
93 | ```sh
94 | $ go build illumi-packet.go
95 | ```
96 |
97 | ## Run
98 |
99 | ```sh
100 | $ sudo ./illumi-packet
101 | ```
102 |
103 | Press Ctr-C to quit.
104 |
105 | |Option||
106 | |:-|:-|
107 | |-h|Help command|
108 | |-debug |Print packet details. (default: `true`)|
109 | |-device [string]|Set network interface (default: `eth0`)|
110 | |-speed [int]|Set speed of flowing packet(default: `1`)|
111 | |-narp|Disable visualizing ARP packets|
112 | |-ntcp|Disable visualizing TCP packets|
113 | |-nudp|Disable visualizing UDP packets|
114 | |-reset|Reset LEDs|
115 | |-ipaddr|Show IP address on LED|
116 |
117 | ### Examples
118 |
119 | Not showing TCP/UDP packets.
120 | ```sh
121 | $ sudo ./illumi-packet -nudp -ntcp
122 | ```
123 |
124 |
125 |
126 | Not showing packet details. (recommend on SSH)
127 | ```sh
128 | $ sudo ./illumi-packet -debug=false
129 | ```
130 |
131 |
132 |
133 | Visualize packets on Wi-Fi.
134 | ```sh
135 | $ sudo ./illumi-packet -device wlan0
136 | ```
137 |
138 |
139 |
140 | Show IP address on LED.
141 | ```sh
142 | $ sudo ./illumi-packet -ipaddr
143 | ```
144 | 
145 |
146 | Turn off the LED lights.
147 | ```sh
148 | $ sudo ./illumi-packet -reset
149 | ```
150 |
151 | ## License
152 |
153 | 
ILLUMI PACKET by Kohei Aso is licensed under a Creative Commons Attribution 4.0 International License.
154 |
155 | - Free to modify and redistribute
156 | - Displaying the credits is required
157 |
158 | We may introduce your usage as an examples on our site.
159 | Please contact us if you do not want to give credit.
160 |
161 | ## Contact
162 |
163 | Twitter: [@souring001](https://twitter.com/souring001)
164 |
165 |
166 | ILLUMI PACKET
167 |
Copyright (c) 2019, Kohei Aso
168 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module illumi-packet
2 |
3 | go 1.13
4 |
5 | require (
6 | github.com/google/gopacket v1.1.17
7 | github.com/jgarff/rpi_ws281x v0.0.0-20191106145129-6b01e53c3f8b
8 | )
9 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | github.com/google/gopacket v1.1.17 h1:rMrlX2ZY2UbvT+sdz3+6J+pp2z+msCq9MxTU6ymxbBY=
2 | github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
3 | github.com/jgarff/rpi_ws281x v0.0.0-20191106145129-6b01e53c3f8b h1:9jlrKZ2UJXd3ZVaCw0NmalGgvhtuU61/pUTDWbse0SU=
4 | github.com/jgarff/rpi_ws281x v0.0.0-20191106145129-6b01e53c3f8b/go.mod h1:xbXlgWZjA66nkwNqkT4ol2EqY7jL8v+1efK5ZnOT/MU=
5 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
6 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
7 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
8 | golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
9 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
10 |
--------------------------------------------------------------------------------
/illumi-packet.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "flag"
6 | "strings"
7 | "time"
8 | "log"
9 | "os"
10 | "net"
11 | "errors"
12 | "github.com/jgarff/rpi_ws281x/golang/ws2811"
13 | "github.com/google/gopacket"
14 | "github.com/google/gopacket/pcap"
15 | "github.com/google/gopacket/layers"
16 | )
17 |
18 | type layerMeta struct{
19 | color uint32
20 | show bool
21 | }
22 |
23 | const (
24 | ipv4Len = 4
25 | pin = 18 // GPIO
26 | series = 6 // length of trail
27 | count = 60 // number of LEDs
28 | brightness = 50 // max 255
29 | )
30 |
31 | var (
32 | speed int // speed of flowing packet
33 | device string //eth0
34 | debug = flag.Bool("debug", true, "print packet details")
35 | showip = flag.Bool("ipaddr", false, "display ip address")
36 | reset = flag.Bool("reset", false, "reset LEDs")
37 | narp = flag.Bool("narp", false, "disable arp")
38 | ntcp = flag.Bool("ntcp", false, "disable tcp")
39 | nudp = flag.Bool("nudp", false, "disable udp")
40 | snapshotLen = int32(1024)
41 | promiscuous = false
42 | timeout = 50 * time.Millisecond
43 | colors = []uint32{
44 | // GRB color
45 | 0xFFFFFF, //0 White others
46 | 0x880000, //1 Green
47 | 0x00FF00, //2 Red Anomaly
48 | 0x0000FF, //3 Blue TCP
49 | 0x0066cc, //4 Purple ARP
50 | 0x33FF99, //5 Pink ICMP
51 | 0xFFFF00, //6 Yellow UDP
52 | 0x88FF00, //7 Orange IGMP
53 | 0xFF00FF, //8 Cyan DHCP
54 | 0xFF0000, //9 Lime DNS
55 | 0x888888, //10 GRAY
56 | }
57 | layerMap = map[string]layerMeta{
58 | "ARP": layerMeta{ color: colors[7], show: true },
59 | "ICMP": layerMeta{ color: colors[5], show: true },
60 | "TCP": layerMeta{ color: colors[3], show: true },
61 | "UDP": layerMeta{ color: colors[6], show: true },
62 | "IGMP": layerMeta{ color: colors[4], show: true },
63 | "DNS": layerMeta{ color: colors[9], show: true },
64 | "DHCP": layerMeta{ color: colors[8], show: true },
65 | "Anomaly": layerMeta{ color: colors[2], show: true },
66 | "Others": layerMeta{ color: colors[0], show: true },
67 | }
68 | )
69 |
70 | func main() {
71 | // Option flag
72 | flag.IntVar(&speed, "speed", 1, "set speed of flowing packet")
73 | flag.StringVar(&device, "device", "eth0", "set network interface")
74 | flag.Parse()
75 |
76 | meta := layerMap["ARP"]
77 | meta.show = !*narp
78 | layerMap["ARP"] = meta
79 |
80 | meta = layerMap["TCP"]
81 | meta.show = !*ntcp
82 | layerMap["TCP"] = meta
83 |
84 | meta = layerMap["UDP"]
85 | meta.show = !*nudp
86 | layerMap["UDP"] = meta
87 |
88 | // Open device
89 | handle, err := pcap.OpenLive(device, snapshotLen, promiscuous, timeout)
90 | if err != nil { log.Fatal(err) }
91 | defer handle.Close()
92 |
93 | // Initialize LED strip
94 | errl := ws2811.Init(pin, count, brightness)
95 | if errl != nil { log.Fatal(errl) }
96 | defer ws2811.Fini()
97 |
98 | led := make([]uint32, count)
99 |
100 | if *reset {
101 | resetLeds(led)
102 | os.Exit(0)
103 | }
104 |
105 | // Set IP Address
106 | ipv4Addr, ipv6Addr, macAddr, err := externalIP()
107 | if err != nil { log.Fatal(err) }
108 | if *debug {
109 | fmt.Println("IPv4 address:", ipv4Addr)
110 | fmt.Println("IPv6 address:", ipv6Addr)
111 | fmt.Println("MAC address:", macAddr)
112 | }
113 |
114 | if *showip {
115 | showIPAddress(led, ipv4Addr)
116 | os.Exit(0)
117 | }
118 |
119 | // Use the handle as a packet source to process all packets
120 | packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
121 | if *debug {
122 | fmt.Println("Press Ctr-C to quit.")
123 | fmt.Println("Start capturing...")
124 | }
125 |
126 | for packet := range packetSource.Packets() {
127 | if *debug { fmt.Println("----------------") }
128 |
129 | // Direction of the packet
130 | reverse := true
131 | if net := packet.NetworkLayer(); net != nil {
132 | src, _ := net.NetworkFlow().Endpoints()
133 | if strings.Contains(src.String(), ipv4Addr) || strings.Contains(src.String(), ipv6Addr) {
134 | reverse = false
135 | }
136 | }
137 |
138 | if arpLayer := packet.Layer(layers.LayerTypeARP); arpLayer != nil {
139 | arp := arpLayer.(*layers.ARP)
140 | src := net.HardwareAddr(arp.SourceHwAddress)
141 | if strings.Contains(src.String(), macAddr) {
142 | reverse = false
143 | }
144 | }
145 |
146 | packetName := categorizePacket(packet)
147 | layerMeta := layerMap[packetName]
148 |
149 | if *debug {
150 | fmt.Println(packetName)
151 | fmt.Println(packet)
152 | }
153 |
154 | packetTime := packet.Metadata().Timestamp
155 | nowTime := time.Now()
156 | diffTime := nowTime.Sub(packetTime)
157 | if *debug { fmt.Println("delay:", diffTime) }
158 | if diffTime > 5 * time.Second {
159 | if *debug { fmt.Println("skip\n") }
160 | continue
161 | }
162 |
163 | if layerMeta.show {
164 | castPacket(led, series, layerMeta.color, reverse)
165 | }
166 | }
167 | }
168 |
169 | func reverseLeds(led []uint32) {
170 | for i, j := 0, len(led)-1; i < j; i, j = i+1, j-1 {
171 | led[i], led[j] = led[j], led[i]
172 | }
173 | }
174 |
175 | func initLeds(led []uint32) {
176 | for i, _ := range led {
177 | led[i] = 0
178 | }
179 | }
180 |
181 | func castPacket(led []uint32, k int, color uint32,reverse bool) {
182 | for i := -(k-1); i < len(led)+series+speed; i += speed {
183 | initLeds(led)
184 |
185 | for j := 0; j < k; j++ {
186 | if t := i + j; 0 <= t && t < len(led) {
187 | // packet color gradiation
188 | g := (((color & 0xFF0000) >> 16) * uint32(j+1) / uint32(k)) << 16
189 | r := (((color & 0x00FF00) >> 8)* uint32(j+1) / uint32(k)) << 8
190 | b := (color & 0x0000FF)* uint32(j+1) / uint32(k)
191 | led[t] = g|r|b
192 | }
193 | }
194 |
195 | if reverse {
196 | reverseLeds(led)
197 | }
198 |
199 | setLeds(led)
200 | err := ws2811.Render()
201 | if err != nil {
202 | ws2811.Clear()
203 | fmt.Println("Error during wipe " + err.Error())
204 | os.Exit(-1)
205 | }
206 | }
207 | }
208 |
209 | func setLeds(led []uint32) {
210 | for i := 0; i < count; i++ {
211 | ws2811.SetLed(i, led[i])
212 | }
213 | }
214 |
215 | func isAnomaly(packet gopacket.Packet) bool {
216 | anml := false
217 | if tcp := packet.Layer(layers.LayerTypeTCP); tcp != nil {
218 | tcpl, _ := tcp.(*layers.TCP)
219 | // Bool flags: FIN, SYN, RST, PSH, ACK, URG, ECE, CWR, NS
220 | if tcpl.FIN && tcpl.URG && tcpl.PSH {
221 | anml = true
222 | }
223 | }
224 | return anml
225 | }
226 |
227 | func externalIP() (string, string, string, error) {
228 | ifaces, err := net.Interfaces()
229 | if err != nil {
230 | return "", "", "", err
231 | }
232 | var ipv4Addr net.IP
233 | var ipv6Addr net.IP
234 | var macAddr string
235 |
236 | for _, iface := range ifaces {
237 | if iface.Name != device {
238 | continue // select device "eth0" or something
239 | }
240 | macAddr = iface.HardwareAddr.String()
241 | addrs, err := iface.Addrs()
242 | if err != nil {
243 | return "", "", "", err
244 | }
245 | for _, addr := range addrs {
246 | var ip net.IP
247 | switch v := addr.(type) {
248 | case *net.IPNet:
249 | ip = v.IP
250 | case *net.IPAddr:
251 | ip = v.IP
252 | }
253 | if ip == nil || ip.IsLoopback() {
254 | continue
255 | }
256 | if ipv4 := ip.To4(); ipv4 != nil {
257 | ipv4Addr = ipv4
258 | }else if ipv6 := ip.To16(); ipv6 != nil {
259 | ipv6Addr = ipv6
260 | }
261 | }
262 | }
263 |
264 | if ipv4Addr == nil{
265 | return "", "", "", errors.New("are you connected to the network?")
266 | }else{
267 | return ipv4Addr.String(), ipv6Addr.String(), macAddr, nil
268 | }
269 | }
270 |
271 | func showIPAddress(led []uint32, ipaddr string) {
272 | ip := net.ParseIP(ipaddr)
273 | ipv4 := ip.To4()
274 |
275 | initLeds(led)
276 | for i := 0; i < ipv4Len; i++ {
277 |
278 | // number
279 | for j := 0; j < 8; j++ {
280 | t := i * 9 + j
281 | if (ipv4[i]>>uint(7-j))&1 == 1 { // nth bit of Y = (X>>n)&1;
282 | led[t] = colors[10]
283 | }
284 | }
285 |
286 | // period
287 | led[(i+1) * 9 - 1] = colors[1]
288 | }
289 | setLeds(led)
290 | err := ws2811.Render()
291 | if err != nil {
292 | ws2811.Clear()
293 | fmt.Println("Error during wipe " + err.Error())
294 | os.Exit(-1)
295 | }
296 | }
297 |
298 | func resetLeds(led []uint32) {
299 | initLeds(led)
300 | setLeds(led)
301 | err := ws2811.Render()
302 | if err != nil {
303 | ws2811.Clear()
304 | fmt.Println("Error during wipe " + err.Error())
305 | os.Exit(-1)
306 | }
307 | }
308 |
309 | func categorizePacket(packet gopacket.Packet) string {
310 | packetName := "Others";
311 | if isAnomaly(packet) {
312 | packetName = "Anomaly"
313 | }else if lldp := packet.Layer(layers.LayerTypeLinkLayerDiscovery); lldp != nil {
314 | packetName = "LLDP"
315 | }else if dns := packet.Layer(layers.LayerTypeDNS); dns != nil {
316 | packetName = "DNS"
317 | }else if icmpv4 := packet.Layer(layers.LayerTypeICMPv4); icmpv4 != nil {
318 | packetName = "ICMP"
319 | }else if icmpv6 := packet.Layer(layers.LayerTypeICMPv6); icmpv6 != nil {
320 | packetName = "ICMP"
321 | }else if dhcpv4 := packet.Layer(layers.LayerTypeDHCPv4); dhcpv4 != nil {
322 | packetName = "DHCP"
323 | }else if arp := packet.Layer(layers.LayerTypeARP); arp != nil {
324 | packetName = "ARP"
325 | }else if igmp := packet.Layer(layers.LayerTypeIGMP); igmp != nil {
326 | packetName = "IGMP"
327 | }else if udp := packet.Layer(layers.LayerTypeUDP); udp != nil {
328 | packetName = "UDP"
329 | }else if tcp := packet.Layer(layers.LayerTypeTCP); tcp != nil {
330 | packetName = "TCP"
331 | }
332 | return packetName
333 | }
334 |
--------------------------------------------------------------------------------