저는 David 이며이 저장소/기사의 목표는 소켓을 가장 간단한 방법으로 설명하여 소켓을 탈취하는 것입니다.
이 예에서는 Nodejs와 Particle (모든 버전이 수행)을 사용하여 하드웨어가 NodeJS와 어떻게 대화 할 수 있는지, 그 반대도 마찬가지입니다. 그러나 실수하지 마십시오. 이것이 제가 선택한 도구가 이것에 대한 유일한 방법이라는 것을 의미하지는 않습니다. 이것이 제가 개인적으로 아는 것입니다.
네트워크 연결이있는 임베디드 장치는 모두 비슷하게 작동하며 소켓 지원이 포함 된 모든 언어도 마찬가지입니다.
리포 구조
나는 소켓 주위에 많은 미스터리 척도가 있다고 생각합니다. 많은 사람들이 수년 동안 그들을 무섭게 만들었으며, 나의 목표는 그들이 신비하거나 복잡하지 않다는 것을 증명하는 것입니다. 결국 소켓에 대해 특정 문제에 대한 간단한 솔루션으로 생각하기를 바랍니다.
특히 모든 바이트가 계산되는 임베디드 시스템에서.
소켓은 모든 네트워크 연결을위한 기초입니다. 모든 연결된 장치는 소켓을 사용합니다. 소켓 외에도 프로토콜이 있습니다.이 프로토콜은 수신 후 데이터를 보내거나 처리하는 방법을 지정하는 규칙 이외의 프로토콜이 있습니다. 인기있는 HTTP 프로토콜이 이에 대한 예입니다. 이를 알면 소켓이 지원하는 모든 언어로 모든 장치를 모방 할 수 있습니다. 어떻게? 특정 프로토콜 (규칙)을 준수하는 바이트를 전송합니다. 이 규칙은 온라인으로 무료로 제공됩니다.
당신은 다음과 같은 척하는 앱을 만들 수 있습니다.
사람들은 소켓이 복잡하다고 믿는 이유는 무엇입니까?
아마도 사람들이 복잡성을 전달하는 단어를 사용하는 경향이 있기 때문일 것입니다.
당신이 생각할 수있는이 몇 가지 요점을 읽는 것만으로도, 이것은 나에게 적합하지 않습니다. 그러나 소켓은 실제로 매우 간단합니다. 예를 들어 웹 서버에서 응답을 얻으려면 다음 텍스트 만 보내야합니다.
GET / HTTP/1.1
이것이 바로입니다. 서버는이 텍스트를 가져 와서 구문 분석하고 다음을 만들고 있음을 이해합니다.
/contact 입니다.더 많은 것이 없습니다. 프린터는 다른 헤더를 이해합니다. 마찬가지로 DNS 서버는 프로토콜 (규칙)과 관련된 것이 필요합니다.
믿기 어렵습니까? Telnet 앱을 사용 하여이 명령을 사용하여 좋아하는 사이트에 연결하십시오 (포트 80을 통해 불안한 연결 만 지원됩니다).
SITE 80GET / HTTP/1.1 입력하십시오안전한 연결을 위해서는 다음과 같이 OpenSSL을 사용할 수 있습니다.
Openssl s_client -connect google.com:443GET / HTTP/1.1또 다른 예는 SMTP 서버에 직접 연결하여 이메일을 보내는 것입니다. 대부분의 최신 SMTP 서버는 암호로 보안 및 암호화를 사용하므로 빠르게 테스트하기가 어렵습니다. 그러나 일반 SMTP 서버에 액세스 할 수 있다면 다음을 입력 할 수 있습니다.
telnet example.com smtpHELO client.example.comMAIL from: <[email protected]>RCPT to: <[email protected]>DATAFrom: [email protected]To: [email protected]Subject: Test messageQUIT보시다시피, 이것은 그렇지 않습니까?
프로토콜을 더 잘 이해 했으므로 커뮤니케이션을위한 공통 구조를 설계해야합니다. 집의 온도를 Nodejs 서버로 보내고 싶다고 가정 해 봅시다. 바이트 스트림은 다음과 같습니다.
45,40.1,50,90,100,102.5
쉼표는 각 측정에 대한 분리기 역할을합니다. 원하는 문자를 선택할 수 있지만, 쉼표는 데이터를 CSV (Comma 분리 값) 형식과 호환시킬 수 있습니다. 다른 한편으로, 분리기를 점검 할 코드가 필요하며, 그러한 일이 발생하면 가치가 있습니다.
이 예에서 볼 수 있듯이 헤더 또는 선택적 데이터가 없습니다. 당신은 당신의 프로토콜에 무엇이 들어가는 지 결정합니다.
위의 예를 바탕으로 다음과 같은 프로토콜에 습도를 추가 할 수 있습니다.
45:80,40:85,32.1:82,50:89
다시, 쉼표는 데이터를 분리하는 반면 결장은 데이터 세트를 구분합니다. 또한 : 프로토콜에는 좋은 문서가 필요하므로 다른 개발자는 관리해야 할 데이터를 이해할 수 있습니다.
또 다른 중요한 것은 그의 예제가 ASCII 프로토 콜에 대해 이야기하고, 이진이 어떻게 작동하는지 배우기 위해 내가 쓴 다음 기사를 읽을 수 있다는 것입니다.
컴퓨터는 1과 0에서 작동하며 이것이 사실입니다. 이 예제가 컴파일 된 응용 프로그램을 일반 데이터와 구별하는 방법은 없습니다. 모든 것은 일련의 비트로 저장됩니다. 인터넷을 통해 전송되는 데이터조차도 1과 0입니다.
당신은 아마 물어볼 것입니다. 왜 내가 유형에 관심을 가져야하는지. 유형에 따라 이진 데이터가 다릅니다. 예를 들어 : 1 의 정수는 00000001 이며, 31 의 정수는 00011111 됩니다.
이것은 연결의 다른 쪽 끝에서 당신이 얻는 것을 알아야한다는 것을 의미합니다. 간단한 비교를하고 싶다고 가정 해 봅시다.
if ( data == 1 ) {
true
} 데이터를 정수 인 것처럼 변환했지만 숯으로 보낸 경우 int 31 int 1 과 비교합니다. 그러나 캐릭터를 보내는 것을 알고 있다면 올바른 유형과 비교할 수 있습니다.
if ( data == '1' ) {
true
} 이제 Char 1 은 실제로 31 이며 비교가 작동합니다. Hardware2NodeJS 예제 폴더에는 실제로 차이를 설명하는 샘플 코드가 있습니다.
인터넷에서 데이터 전송에 가장 인기있는 두 가지 프로토콜은 TCP와 UDP입니다. 사람들이 이름의 끝에 추가 /IP를 추가하는 것을 볼 수 있습니다. IP는 (인터넷 프로토콜)를 나타냅니다. 즉, 인터넷 주소 시스템으로 생각할 수 있습니다. 즉, TCP와 UDP가 데이터가 패키지되는 방식이기 때문에 인터넷에서뿐만 아니라 TCP 또는 UDP를 사용할 수 있음을 의미합니다.
TCP와 UDP는 프로토콜이며, 지금 까지이 단어는 규칙을 의미 하며이 두 프로토콜은 데이터를 패키지하는 방법을 설명하는 규칙에 지나지 않습니다. 다른 쪽 끝은 동일한 규칙을 이해하고 수신 된 정보를 풀 수 있으며 그 반대도 마찬가지입니다.
대부분의 인터넷은 TCP를 사용합니다. 왜냐하면 우리는 다른 쪽 끝에서 우리가 보내는 것이 전체적으로받을 것이라는 확신을 원하기 때문입니다. 예를 들어, 문서를 보내면 문자 나 단어가 누락되기를 원하지 않습니다. 많은 형식의 경우, 파일을 이해하는 방법을 시스템에 알려주는 헤더에서 부품이 누락 된 경우, 시스템은 파일이 손상되어 읽을 수 없음을 알려줍니다.
물론, 더 탄력적이며 데이터의 100 %가 필요하지 않은 형식이 있습니다. 예를 들어 일부 영화, 이미지 및 음악 형식은 콘텐츠가 누락 될 수 있으며 우리는 그와 함께 살고 있습니다. 이미지 나 영화에는 이상한 유물이있을 수 있습니다. 음악에는 약간의 블립과 소음이있을 수 있습니다.
이 프로토콜은 하드웨어 제품에서 데이터를 보낼 때 매우 유용합니다. 셀룰러 모뎀을 사용하여 많은 장치에서 센서 데이터를 수집하고 있으며 보내는 각 바이트에 대해 지불해야합니다. 이 경우 우리는 다음을 고려해야합니다. TCP로 가지고있는 더 높은 충실도에 대해 더 많은 비용을 지불하는 것이 가치가 있습니까? 아니면 일부 측정의 손실을 수락하는 것이 더 낫지 만 데이터 전송에 대해 더 적은 비용을 지불합니까?
일반적으로 TCP에 대한 기본값이지만 사용에 대한 좋은 사례가있는 경우 UDP가 다음으로 가장 좋은 옵션입니다.
이 저장소가 소켓이 무엇인지 더 잘 이해하는 데 도움이 되었기를 바랍니다. 불분명 한 것이 불분명하다면 트위터에서 나를 때리면 프로젝트의 어떤 점이 확실하지 않은지 고려해 보겠습니다.
이 프로젝트를 포함하여 저를 도와 주신 모든 선한 사람들에게 다음을 포함하여 다음을 포함하여 감사합니다.
이 프로젝트를 즐겼다면? 유용하거나 흥미로운 추가 리소스를 찾을 수있는 Github 계정을 확인하십시오.
이 프로젝트는 AWS 위에 맞춤 솔루션을 구축하는 소프트웨어 회사 인 0x4447 LLC에 의해 제공됩니다. 자세한 내용은이 링크를 따르십시오 : https://0x4447.com. 또는 [email protected]로 이메일을 보내십시오.