Arduino와의 이더넷 TCP 연결

Arduino와의 이더넷 TCP 연결

Arduino와의 이더넷 TCP 연결

소프트웨어 관점에서 연결 설정 Ethernet아두 이노 그것은 매우 간단합니다. 이렇게 하려면 이더넷 라이브러리. 이 라이브러리는 다음을 위해 설계되었습니다. 이더넷 실드 통합을 기반으로 한 것입니다. W5100그러나 다른 보드나 모듈이 있고/또는 다음과 같은 다른 통합 보드나 모듈을 사용합니다. ENC28J60. 사용을 단순화하고 호환성을 높이기 위해 다른 라이브러리도 (거의) 동일한 것을 사용합니다. API이더넷 라이브러리, 코드에서 동일한(또는 매우 유사한) 함수가 사용되더라도 대체 라이브러리를 원본 라이브러리로 바꾸거나 이름이 다른 경우 해당 위치에 포함시키기만 하면 됩니다. 내 경우에는 UIP이더넷 라이브러리 de 노버트 트루크세스 이 텍스트에서 설명할 것과 동일한 프로세스를 따릅니다.

UIPEthernet 라이브러리와 함께 사용하기 위한 ENC28J60 모듈

1. 이더넷 연결 정의

당신이 다음 역할을 맡을 것인지 여부 고객 그 중 하나처럼 서버, 먼저 함수와의 연결을 정의해야 합니다. 시작 () 이는 매개변수로만 전달될 수 있습니다. MAC 주소 그리고 서버를 기다려요 DHCP 네트워크에서 IP 주소 구성의 나머지 부분 또는 전체 구성이 정의될 때까지 (선택적으로) 더 많은 매개변수를 표시할 수도 있습니다.

  1. Dirección MAC (이미 언급한 내용)
  2. IP 주소 쉴드 또는 모듈의
  3. 서버 IP 주소 DNS (단 하나의 서버만)
  4. IP 주소 게이트웨이
  5. 넷 마스크

구성이 올바르지 않은 경우(예: 게이트웨이가 네트워크의 첫 번째 주소가 아닌 경우)를 방지하기 위해 일반적인 추론이 아닌 한 모든 매개변수를 표시하는 것이 좋습니다.

위에서 보면 IP 주소를 나타내는 데이터가 꽤 자주 사용되어야 한다는 것이 분명해 보입니다. 이것이 바로 라이브러리에 클래스가 포함된 이유입니다. IP 주소 IP 주소 객체를 인스턴스화하는 데 사용됩니다. 이를 정의하는 매개변수는 주소의 4바이트입니다. IPV4

La MAC 주소 이 라이브러리에 대해 6바이트 배열로 정의됩니다. MAC 주소는 첫 번째 바이트가 제조업체와 모델을 나타내고 마지막 바이트가 특정 장치를 나타내는 고유 식별자입니다. 통합된 ENC28J60 구매를 선택하지 않는 한 MAC 주소는 포함되지 않습니다. Microchip의 통합 MAC 주소 (또는 전체 블록 OUI 주소의 IEEE 장치 실행이 가치가 있을 만큼 충분히 큰 경우). MAC 주소가 없는 경우 장치가 있는 네트워크의 다른 주소와 충돌하지 않도록 주의하면서 MAC 주소를 만들 수 있습니다.

"수동" 대신 DHCP 서버를 사용하여 구성을 수행한 경우 해당 기능은 로컬IP() 서버가 모듈에 할당한 주소를 참조하는 것이 유용합니다. 할당된 주소를 갱신하려면(해당 시간이 만료된 경우) 이더넷 라이브러리 기능을 제공합니다 유지하다() 또한 갱신 상태에 해당하는 코드를 반환하여 알려줍니다.

  1. 수술은 효과가 없었습니다
  2. IP 주소를 갱신하는 중 오류가 발생했습니다.
    동일한 서버에서 할당된 IP 주소의 사용을 확장할 수 없습니다.
  3. IP 주소가 성공적으로 갱신되었습니다.
  4. IP 주소 리바인드 실패
    할당된 IP 주소의 사용을 어떤 서버에서도 확장할 수 없습니다.
  5. IP 주소가 성공적으로 재할당되었습니다

지금까지 본 정보를 바탕으로 네트워크의 DHCP 서버를 통해 IP 주소를 구성하여 이더넷 연결이 시작되는 방법에 대한 예를 작성할 수 있습니다. 다음 예제 코드는 특정 기간마다 IP 주소 갱신을 시도하고 결과를 보고합니다.

아래 예에서는 객체를 사용하여 IP 주소와 나머지 구성을 수동으로 할당합니다. IP 주소 읽기가 더 편해지고 (더 복잡한 코드의 경우) 주소가 사용될 때마다 주소가 (잘못) 쓰여지면 발생할 수 있는 오류를 방지합니다.

2. 클라이언트 또는 서버 모드에서 연결을 시작합니다.

서버 모드에서 연결을 시작할 때 다른 시스템의 요청을 수신하는 것은 개발 중인 마이크로 제어 시스템입니다. 서버로 연결을 시작하려면 다음을 사용하십시오. 이더넷서버() 서버가 수신할 포트가 매개변수로 표시됩니다. 이더넷서버() 클래스의 생성자입니다 서버, 서버로서 모든 이더넷 작업을 지원합니다. 가장 전통적인 것은 생성자를 호출하는 것이지만 이더넷서버(), 클래스를 직접 사용하는 몇 가지 예를 찾는 것은 드문 일이 아닙니다. 서버 또는 해당 인스턴스화 시스템을 사용하기로 선택한 이더넷 연결을 위한 대체 라이브러리입니다.

클라이언트로서의 연결은 서버 시스템에 요청을 하고, 서버 시스템은 이를 기다리고 그에 따라 응답하는 것입니다. 클라이언트로 연결을 시작하려면 다음을 사용하십시오. 이더넷클라이언트() 클래스의 생성자는 무엇입니까 Client 모든 이더넷 작업의 근원지는 클라이언트입니다.

클래스가 인스턴스화되는 순간부터 작동한다고 가정되는 서버 모드의 경우와는 달리(실제로 클라이언트에 응답하더라도) 사용하기 전에 클라이언트 연결이 준비되었는지 확인해야 합니다. 연결이 시작될 때 생성된 클라이언트 개체를 쿼리하여 사용 가능한지 확인할 수 있습니다. 예를 들어 쿼리 작업은 구조에 포함될 수 있습니다. if(이더넷클라이언트) 클라이언트 연결이 가능한 경우에만 실행합니다.

3. 클라이언트로 연결 설정

앞서 말했듯이 일단 연결이 생성되면 쿼리를 주도적으로 수행하는 사람은 클라이언트입니다. 서버는 해당 이니셔티브를 기다리고 그에 따라 응답합니다. 따라서 서버에 연결하는 것은 클라이언트입니다. 이를 위해 우리는 다음을 사용합니다. 잇다() 서버를 매개변수(IP 주소 또는 URL)와 포트 듣는 사람에게.

작업 결과에 따라 함수는 값을 반환합니다.

  1. (성공) 연결이 성공적으로 설정되었습니다.
  2. 연결 설정
  3. (시간 초과) 연결이 설정되지 않은 채 시간 초과가 경과했습니다.
  4. (INVALID_SERVER) 서버를 찾을 수 없거나 올바르게 응답하지 않습니다.
  5. (잘림) 연결이 완전히 설정되기 전에 끊어졌습니다.
  6. (INVALID_RESPONSE) 서버 응답이 올바르지 않습니다.

쿼리를 시작하기 전에 해당 기능을 사용하여 연결이 작동하는지 확인해야 합니다. 연결됨() 그게 돌아올거야 참된 이미 사용 가능한 경우 또는 그릇된 그렇지 않으면.

아래 예는 클라이언트로서의 연결을 보여줍니다. 매 10초마다 서버에 대한 연결이 있는지 확인합니다(생산적인 의도는 없으며 단지 함수의 구문을 표시하기 위한 것임). 프로덕션 웹 서버는 그다지 좋아하지 않을 것입니다.

4. 데이터 보내기

다음과 같이 더 잘 알려진 다른 클래스와 마찬가지로 일련의, 그리고 비슷한 용도로 클래스 Client y 서버 기능을 가지고 있다

  • 쓰다(사실) o 쓰다(버퍼, 길이)

    호출된 클라이언트 또는 서버 개체를 사용하여 정보를 보냅니다. "data" 매개변수는 단일 바이트 o 이륜 전차 "버퍼"는 다음의 배열입니다. 바이트 o 이륜 전차 그 중 "길이"와 동일한 양이 전송됩니다. 이 함수는 일반적으로 텍스트 전송을 위해 예약된 다음 두 함수와 비교하여 이진 연산에 사용되는 함수입니다.

  • 인쇄(데이터, 베이스)

    "데이터"에 해당하는 정보를 텍스트로 클라이언트 또는 서버(사용되는 클래스에 따라 다름)로 보냅니다. 정보가 텍스트로 표현되지 않는 경우(예: 정수) 선택적 매개변수 "base"를 사용하여 각각 나타내는 상수 BIN, OCT, DEC 또는 HEX 중 하나일 수 있는 변환을 선택할 수 있습니다. 2진수(진수 8), 10진수(진수 16), XNUMX진수(진수 XNUMX) 및 XNUMX진수(진수 XNUMX)에 해당하는 진수

  • 인쇄(데이터, 베이스)

    작업은 "data" 매개변수로 명시적으로 표시된 정보 뒤에 캐리지 리턴(\r로 표시될 수 있는 코드 13)과 줄 끝(코드 10, 표시될 수 있음)을 보내는 것을 제외하면 이전 작업과 동일합니다. \n으로 표시됨) 이러한 코드는 각각 약어로 자주 참조됩니다. CR(캐리지 리턴) 및 LF(줄 바꿈)

이전 세 함수는 클래스의 동등한 함수와 마찬가지로 전송된 바이트 수를 반환합니다. 일련의; 위에서 말했듯이 작업은 비슷합니다.

5. 데이터 수신

데이터 전송 작업의 경우와 마찬가지로 수신 작업도 널리 사용되는 작업과 비슷합니다. 일련의. 수신 프로토콜도 유사합니다. 사용 가능한 데이터가 (충분한) 있는지 확인하십시오.가능) 그런 경우에는 읽어보세요


  • 사용 가능 ()

    읽을 수 있는 바이트 수를 반환합니다. 이 함수는 두 클래스 모두에 존재합니다. Client 으로 서버; 첫 번째 경우에는 서버가 요청에 대한 응답으로 보냈고 클라이언트가 읽을 수 있는 바이트 수를 보고합니다(읽기), 두 번째 경우에는 작업을 수행한 클라이언트(객체)이거나 없으면 false입니다.

  • 읽다()

    수신된 정보를 읽는 데 사용됩니다. 이 기능은 수업에서만 사용할 수 있습니다. Client. 개발 중인 애플리케이션이 서버 역할을 수행하는 경우 도착한 정보를 읽으려면 클라이언트 개체가 함수의 응답으로 인스턴스화되어야 합니다. 사용 가능 () 이전 섹션에서 논의했습니다.

다음 예는 포트 2000에서 수신 대기하고 가능한 경우 모든 대문자로 전송된 요청에 응답하는 "caps 서버"입니다. 예를 들어 다음과 같이 테스트할 수 있습니다. 퍼티 아니면 단순히 텔넷 2000 확실히 그다지 실용적이지는 않습니다. 그 목적은 단지 서버에서 클라이언트가 보낸 데이터를 얻는 방법을 보여주는 것입니다.

6. 연결 종료

서버 응용 프로그램이 무기한 실행되는 것이 일반적이지만 클라이언트 연결이 설정되고 연결되고 종료되므로 리소스를 복구하여 다른 연결에서 사용하거나 프로그램의 다른 용도로 전용할 수 있습니다. 함수 중지() 수업의 Client 클라이언트 연결을 종료하고 사용 중인 모든 리소스를 해제하는 데 사용됩니다.

서버의 경우 쿼리의 정보 개체가 전송되거나 수신될 때 클라이언트가 연결을 종료한다는 사실을 통해 리소스를 확보하여 다른 연결이나 다른 목적에 할당할 수도 있습니다. 즉, 사소해 보이지만 클라이언트의 작업이 끝나면 연결을 종료하는 것이 좋습니다.

클라이언트 연결을 종료할 때 또 다른 좋은 방법은 연결을 비우는 것입니다. 클래스에서 사용하는 것입니다. 이를 위해 해당 기능을 사용할 수 있습니다. 플러시() 클라이언트 연결을 종료한 후 호출해야 합니다. 중지()

HTTP GET 쿼리 예

위의 모든 내용을 더 명확하게 하기 위해 아래에 더 완전한 요청 예가 포함되어 있습니다. TCP GET 요청을 사용하여 HTTP 프로토콜. 이 예에서는 Arduino 보드에 연결된 아날로그 센서에서 얻은 값을 웹 서버로 전송하여 데이터베이스에 저장합니다.

코멘트 남기기

당신은 놓쳤을 수도 있습니다