SSL/TLS embedded for IoT #6

Embedded SSL 2017.06.17 17:19 Posted by Dwarp

SSL/TLS embedded for IoT


이 글은 embedded IoT device의 보안에 관한 글입니다.


embedded SSL/TLS 여섯번째입니다.



너무 몰아붙이나요? ㅎㅎ 아니겠죠 ㅎㅎ 저만 ㅠㅠ 여러분들은 시간날 때 보면 되니까 ㅠㅠ 암튼 전 주말이지만 기다리시는 분들이 계셔서 계속 진행합니다. 오늘은 W5500 iolibrary와 mbedTLS를 이어 붙이는 시간이 될 거에요. 하지만 그 전에 SSL/TLS라는 게 서버든 클라이언트든 있어야 하잖아요?


또 그러기 위해서는 뭔가... 그 뭐냐... 그그그그그.... Application!이 있어야 하겠죠? 제가 건망증이 좀 있습니다. 양해 좀 ㅎㅎ


우리가 지금 IoT 하고 있잖아요? 그래서 네트워크 어플리케이션으로 MQTT를 정하겠습니다. MQTT는 뭐냐고요? 그건 뭐..... IoT에 특화된 네트워크 프로토콜입니다. 찾아보시면 금방 자료 나와요. 전 라즈베리파이에 MQTT 서버를 SSL 모드로 열어놨습니다. 특별한 문제가 없으면 오픈해 놓으려고 하니 테스트 해보셔요. 아래는 제가 open 해놓은 MQTT Broker(서버) 주소 입니다.


<라즈베리 파이>


IP: 222.98.173.239

Port 일반 TCP: 1883

Port 보안 TCP: 1884

Port 일반 websocket: 8883

Port 보안 websocket: 8884


** 경고!!!!!!!! 아시겠지만 테스트 용도로만 사용하시고 상업적인 용도로 사용하지 마세요. 제가 손해봐서 그러는게 아닙니다. 여러분들이 고생합니다. ㅠㅠ 사전 경고 없이 서버가 꺼지거나 할 수 있는데 정작 저는 모를 수 있어요.



<제 책상의 라즈베리파이 MQTT 서버 - 언제나 꺼질 지 모르는 완벽한 불안정 속에 위치해 있다.>


** 리눅스에 MQTT 서버 설치/Open SSL 인증서 만드는 법 등 요청하시면 따로 포스팅 하겠습니다.


자 그럼 다시 코드로 넘어가겠습니다. mbedTLS와 관련하여 만들어야 할 함수가 존재하겠죠? 근데 뭐가 필요하죠? mbedTLS 코드를 다운로드 받으면 여러 예제가 있긴 하지만 보고 있으면 괴롭기만 할 뿐입니다. 괴로운건 ㅠㅠ 제가 이미 봤으니까 여러분들은 핵심만 가져가세요. (왜 남 좋은 일 하냐구요? 뭐 고마운신 분들은 댓글 주세요. 계좌번호 드릴테니까 돈 좀 주세요. 아니면 연봉 1억쯤 주시고 데려가서 노예로 쓰시면 됩니다.)


자! 쓸데없는 소리 그만하고 만들어야 할 함수를 설명하겠습니다.


wiz_mbedtls_ssl_init();

먼저 SSL이라고 피해갈 수 없겠죠? 초기화를 해야만 합니다. 각종 메모리 할당, callback 등록 등의 과정이 들어 있을 겁니다.


wiz_mbedtls_ssl_deinit();

뭐 이건 초기화의 반대네요. mbedtls가 malloc/free를 쓰는 이상 리소스 관리를 하지 않을 수가 없겠죠? init가 malloc을 했다면 deinit은 free를 주로 하겠네요.


wiz_mbedtls_ssl_handshake();

handshake를 처음에 설명드렸는지 안했는지 기억이 안납니다. ㅎ 암튼 SSL은 암호화된 통신을 하기 전에 서버와 클라이언트 사이의 암호화 방법을 결정하고 인증서를 교환하는 등의 과정을 거칩니다. 이 과정을 handshake라고 부르는데요 이 과정도 약간 프로그래밍을 해줘야 합니다. 대놓고 mbedtls_ssl_handshake()라는 함수를 사용해도 되지만 전 일단 감싸주려고 합니다. 처리해야 할 것도 약간 있구요.


wiz_mbedtls_ssl_random();

거의 모든 보안 알고리즘들은 난수를 필요로 합니다. 완벽한 난수일 수록 좋지요. 어쨌든 mbedTLS도 random 함수를 callback으로 묶어줘야 합니다. 없으면 기본적으로 내장된 rand()함수를 사용하게 프로그래밍 되어 있겠지만 음.. analog 입력을 받아(open 상태로) 그거라도 SEED를 줘서 rand()를 돌리는 게 훨씬 좋을 것 같습니다.


wiz_mbedtls_ssl_send();

기본적인 send()라고 보시면 됩니다. 일반적인 socket프로그램을 사용하면 mbedtls option질로 안 만들어도 되는 함수가 되겠지만 iolibrary는 일반적인 socket 프로그래밍 방식과는 약간 차이가 있기 때문에 iolibrary의 send를 한 번 감싸준 함수입니다.


wiz_mbedtls_ssl_recv();

wiz_mbed_ssl_send() 함수와 같은 역할입니다. 기본적인 recv함수 입니다.


wiz_mbedtls_ssl_recvtimeout();

동작은 wiz_mbedtls_ssl_recv와 같지만 time out 값을 지정해 시간내 응답이 없으면 TIME_OUT ERROR를 발생시키기 위한 목적입니다. wiz_mbedtls_ssl_recv와 wiz_mbedtls_ssl_recvtimeout 둘 중 하나만 콜벡으로 등록하면 된다고 기억하고 있지만 어쨌든 둘 다 만들어 봅시다.


아~~ 오늘은 토요일이라서 하기 싫다~~~ 그냥 소주나 한잔 먹고 싶다~


그래서 오늘은 이만 여기까지 쓰겠습니다. ㅎㅎ 다음 시간에는 함수 구현해 봅시다~~


안녕~

저작자 표시
신고

'Embedded SSL' 카테고리의 다른 글

SSL/TLS embedded for IoT #8  (0) 2017.06.27
SSL/TLS embedded for IoT #7  (0) 2017.06.19
SSL/TLS embedded for IoT #6  (0) 2017.06.17
SSL/TLS embedded for IoT #5  (0) 2017.06.16
SSL/TLS embedded for IoT #4  (0) 2017.06.15
SSL/TLS embedded for IoT #3  (6) 2016.12.28

SSL/TLS embedded for IoT #5

Embedded SSL 2017.06.16 16:37 Posted by Dwarp

SSL/TLS embedded for IoT


이 글은 embedded IoT device의 보안에 관한 글입니다.


embedded SSL/TLS 다섯번째입니다.


업로드가 느려 죄송한 마음에 하나 더 포스팅을 하도록 하겠습니다. 계속 본격적이라고 해놓고는 SSL 포팅은 맛도 못봤기 때문에 이번 시간에 SSL 포팅 바로 전까지 마무리하고 이후에는 SSL 포팅과 application을 진행하도록 하겠습니다.


저번 시간에는 main에 W5500만 초기화하는 코드를 넣었습니다. 이제는 W5500을 초기화 하고 network 정보를 입력할 시간입니다.


W5500HardwareDriver.c에 W5500Initialize() 함수를 추가해 줄 거에요.


void W5500Initialize(void)
{
	unsigned char temp;
	unsigned int randSeed = 0;
	unsigned char W5500FifoSize[2][8] = {{2,8,1,1,1,1,1,1,},{2,8,1,1,1,1,1,1}};
	W5500DeSelect();

	/* spi function register */
	reg_wizchip_spi_cbfunc(W5500ReadByte, W5500WriteByte);

	/* CS function register */
	reg_wizchip_cs_cbfunc(W5500Select,W5500DeSelect);

	if(ctlwizchip(CW_INIT_WIZCHIP,(void*)W5500FifoSize) == -1)
	{
		printf("W5500 initialized fail.\r\n");
	}

//	do{//check phy status.
//		if(ctlwizchip(CW_GET_PHYLINK,(void*)&temp) == -1){
//			printf("Unknown PHY link status.\r\n");
//		}
//	}while(temp == PHY_LINK_OFF);
}


하단에 주석처리해 놓은 부분은 Ethernet LINK가 성립되길 기다리는 구문있데 있어도 되고 없어도 됩니다.

W5500HardwareDriver.h에도 함수 추가해 주시는 거 잊지 마시구요 ^^

그리고 나면 이 함수로 초기화를 시켜줄 수 있을 거에요.


이 다음에는 네트워크 정보를 입력해야겠죠? iolibrary에 있는 wizchip_setnetinfo() 함수를 사용할 거에요. 뭐 간단합니다. 아래와 같은 방식으로 사용하시면 됩니다. 구조체 선언하고 쓰면 됩니다.


wiz_NetInfo gWIZNETINFO = { .mac = {0x00,0x08,0xdc,0xff,0x11,0xff}, .ip = {192, 168, 0, 222}, .sn = {255, 255, 255, 0}, .gw = {192, 168, 0, 1}, .dns = {8,8,8,8}, .dhcp = NETINFO_STATIC}; wizchip_setnetinfo(&gWIZNETINFO);


각각에 맞는 네트워크 정보를 넣으셔야 하는데 공유기 있으시면 192.168.0.XXX로 하는 네트워크 정보를 넣으시면 되겠죠? 아니면 DHCP(IP 자동할당)을 사용하셔도 되는데 프로그램을 추가하셔야 해요. 일단은 고정 IP로 각자 집이나 회사에 가지고 있는 공유기 밑에 붙여보도록 합시다. 대부분의 공유기 default 값이 ip는 192.168.0.XXX subnet mask는 255.255.255.0, 그리고 gate way는 공유기 주소니까 192.168.0.1이 될거에요. dns는 그다지 상관없으니 구글꺼 쓰죠 뭐 8.8.8.8입니다. 그리고 mac은 남는 네트워크 카드나 PC 등등에서 빼오셔야 합니다. 내부망 통신은 상관없지만 외부망 통신하실 때 문제가 생깁니다.


이렇게 모두 설정하셨으면 main에 합쳐봅시다.


#include "W5500HardwareDriver.h"
#include "wizchip_conf.h"

wiz_NetInfo gWIZNETINFO = { .mac = {0x00,0x08,0xdc,0xff,0x11,0xff},
							.ip = {192, 168, 0, 222},
							.sn = {255, 255, 255, 0},
							.gw = {192, 168, 0, 1},
							.dns = {8, 8, 8, 8},
							.dhcp = NETINFO_STATIC};

int main(void)
{
	W5500HardwareInitilize();	//hardware init

	W5500Initialize();			//w5500 init

	wizchip_setnetinfo(&gWIZNETINFO);	//set network information
	
    while(1)
    {
    }
}


여기까지 다 했으면 F7번이나 컴파일 버튼을 눌러서 컴파일을 해봅시다. 에러가 없나요? 전 없군요. 그래서 다운로드 해보겠습니다.

음! 잘 되는 것 같군요. 그러면 network가 되는지  Ping 명령으로 확인해 볼까요? 설마 모르시려나? CMD 창에서 ping 192.168.XX.XXX -t 엔터


응? 안되네요? 왜 안되죠? 뭐죠? 멘붕멘붕. 멘붕... 멘붕은 안하지요 대신 디버그를 할 뿐 ㅋ.


음 디버그를 해보니 항상 HAL_GetTick()이 0을 반환하는 군요 ㅎㅎ Time 관련된 함수가 넘어가질 않고 있었습니다. STM에서 왜 그랬느지 모르겠지만 HAL_GetTick, HAL_IncTick 등을 weak으로 선언해서 모든 HAL library에 사용하고 있습니다. 음.. 어쨌든 그러면 uwTick이라는 global 변수가 1씩 증가하게 해야겠습니다. HAL_IncTick은 Systick을 활용하도록 설계되어 있는 것 같은데 전 OS가 Systick을 사용하도록 하게 하고 싶습니다. 그렇다면 간단하게 weak으로 선언되어 있는 HAL_Tick을 override 시킵시다. 재선언 하는 것이지요. 그래서 uwTick이 아닌 OS의 Tick 값을 가져오도록 하겠습니다. 우후훗


점점 짬뽕이 되어 가고 있군요 ㅠㅠ SSL하다가 OS까지 오신 여러분 환영합니다. ㅠㅠ 그래도 힘내세요 ㅎㅎ 하다보면 이정도는 껌입니다.


자 그럼 main.c로 돌아가서 아래 코드를 추가해줍니다.

uint32_t HAL_GetTick(void)
{
	return CoGetOSTime();
}


지금 사용하는 CoOS는 CoGetOSTime()이라는 함수로 OS tick을 리턴합니다. 그럼 Main.c 전체는 다음과 같아질 거에요.


#include "W5500HardwareDriver.h"
#include "wizchip_conf.h"

wiz_NetInfo gWIZNETINFO = { .mac = {0x00,0x08,0xdc,0xff,0x11,0xff},
							.ip = {192, 168, 77, 123},
							.sn = {255, 255, 255, 0},
							.gw = {192, 168, 77, 1},
							.dns = {8, 8, 8, 8},
							.dhcp = NETINFO_STATIC};

int main(void)
{
	CoInitOS();

	W5500HardwareInitilize();	//hardware init

	W5500Initialize();			//w5500 init

	wizchip_setnetinfo(&gWIZNETINFO);	//set network information

	//CoStartOS();

	while(1)
    {
    }
}

uint32_t HAL_GetTick(void)
{
	return CoGetOSTime();
}


여기서 주의할 것은 CoInitOS() 인데요. 이 함수에서 Systick을 Enable 해줘요. 그래서 가장 처음에 call 했습니다.


그럼 컴파일/다운로드 하시고 Ping이 가는지 확인해 볼까요? 설마 모르시려나? CMD 창에서 ping 192.168.XX.XXX -t 엔터


!!!!!!!!!!!!! 여기서 IP 여러분 것으로 바꾸세요~ !!!!!!!!!!!!!



음... 으흐흐흐 잘 되는 군요..


이제는 정말 SSL 포팅만 남은 것 같습니다.



앞으로는 임베디드에서 보기 힘들었던 malloc, free뿐만 아니라 함수포인터 그리고 OS 개념들이 난무할거에요. 하아....

(여러분들은 한 번만 하면 되지 전 수십번은 한 것 같아요 ㅠㅠ 하아...)


암튼 주말은 푹 쉬시고 다음 주에 다시 달려봅시다.


화이팅!!! 하아....



저작자 표시
신고

'Embedded SSL' 카테고리의 다른 글

SSL/TLS embedded for IoT #7  (0) 2017.06.19
SSL/TLS embedded for IoT #6  (0) 2017.06.17
SSL/TLS embedded for IoT #5  (0) 2017.06.16
SSL/TLS embedded for IoT #4  (0) 2017.06.15
SSL/TLS embedded for IoT #3  (6) 2016.12.28
SSL/TLS embedded for IoT #2  (0) 2016.12.27

SSL/TLS embedded for IoT #4

Embedded SSL 2017.06.15 10:43 Posted by Dwarp

SSL/TLS embedded for IoT


이 글은 embedded IoT device의 보안에 관한 글입니다.


embedded SSL/TLS 네번째입니다.


이번 글쓰기는 시간이 오래걸렸습니다. 기다려주시는 분들께 죄송한 마음뿐입니다.


바로 시작하겠습니다.



저번 포스팅까지는 기본적인 환경 구축을 완료했습니다. mbedTLS 소스와 ioLibrary도 추가했지요. 본격적으로 소스를 보겠습니다.




아무것도 없는 main을 보니 공허하네요 ㅠㅠ 저도 갑자기 하는 포팅이라 약간 가슴이 답답합니다. ㅎㅎㅎ 그래도 해보도록 하시지요~


먼저 iolibrary부터 포팅해서 ethernet이 원활하게 되는지 확인하도록 하겠습니다.


W5500을 사용하기 위해서는 3단계 정도만 거치면 됩니다.



1. SPI를 위한 GPIO 초기화


2. SPI 초기화


3. Read/Write 등록.



간단하지요? 우선 보드 초기화를 하기 위해 board.h라는 파일을 하나 만들겠습니다. (새로운 파일은 어떻게 만드나요? 같은 질문을 하시는 분들은 없으시겠지요?) 아래와 같이 작성합니다. 대략적으로 설명드리면 SPI1 사용하고 GPIOA 5,6,7 번이 SPI1으로 사용됩니다. reset port도 정의해주고, interrupt 핀도 정의 합니다.

#ifndef __BOARD_H_
#define __BOARD_H_

#define W5500_SPI			SPI1

#define W5500_RESET_PORT		GPIOC
#define W5500_RESET_PIN			GPIO_PIN_7

#define W5500_INT_PORT 			GPIOB
#define W5500_INT_PIN			GPIO_PIN_5

#define W5500_CS_PORT			GPIOB
#define W5500_CS_PIN			GPIO_PIN_6

#define W5500_SPI_GPIO_PORT		GPIOA
#define W5500_CLK_PIN			GPIO_PIN_5

#define W5500_MISO_PIN			GPIO_PIN_6

#define W5500_MOSI_PIN			GPIO_PIN_7

#endif


작성이 되었으면 이제 W5500를 위한 Peripheral을 초기화하는 W5500HardwareDriver.c를 작성해 봅시다.

#include "Board.h"

/*Include: Header file*/
#include "W5500HardwareDriver.h"

/*Include: W5500 Library*/
#include "wizchip_conf.h"

/*include: Standard IO library*/
#include <stdio.h>

SPI_HandleTypeDef hspi1W5500;

void W5500HardwareInitilize(void)
{
  __GPIOH_CLK_ENABLE();
  /*W5500 CS/INT/RST Clock enable*/
  __GPIOB_CLK_ENABLE();
  __GPIOC_CLK_ENABLE();
  
  /*W5500 GPIO&SPI1 Clock enable*/
  __GPIOA_CLK_ENABLE();
  
  /*Initialize GPIO Structure*/
  GPIO_InitTypeDef	GPIO_InitStructure;

  /*Initialize CS Pin*/
  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  GPIO_InitStructure.Pin = W5500_CS_PIN;
  GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStructure.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(W5500_CS_PORT,&GPIO_InitStructure);
  
  /*Initialize INT Pin*/
  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  GPIO_InitStructure.Pin = W5500_INT_PIN;
  GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
  GPIO_InitStructure.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(W5500_INT_PORT,&GPIO_InitStructure);

  /*Ethernet shield does not have individual reset pin*/
  /* ==> Remove R23 and connect RSTN - D9 pin
        Now D9 is Reset pin.*/
  GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  GPIO_InitStructure.Pin = W5500_RESET_PIN;
  GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStructure.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(W5500_RESET_PORT,&GPIO_InitStructure);
  
  /*SPI init*/
  hspi1W5500.Instance = W5500_SPI;
  hspi1W5500.Init.Mode = SPI_MODE_MASTER;
  hspi1W5500.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1W5500.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1W5500.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi1W5500.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi1W5500.Init.NSS = SPI_NSS_SOFT;
  hspi1W5500.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  hspi1W5500.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1W5500.Init.TIMode = SPI_TIMODE_DISABLED;
  hspi1W5500.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
  hspi1W5500.Init.CRCPolynomial = 10;
  HAL_SPI_Init(&hspi1W5500);
  
  W5500HardwareReset();
}

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(hspi->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspInit 0 */

  /* USER CODE END SPI1_MspInit 0 */
    /* Peripheral clock enable */
    __SPI1_CLK_ENABLE();
  
    /**SPI1 GPIO Configuration    
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI 
    */
    GPIO_InitStruct.Pin = W5500_CLK_PIN|W5500_MISO_PIN|W5500_MOSI_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(W5500_SPI_GPIO_PORT, &GPIO_InitStruct);

  /* USER CODE BEGIN SPI1_MspInit 1 */

  /* USER CODE END SPI1_MspInit 1 */
  }
}

void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
{

  if(hspi->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspDeInit 0 */

  /* USER CODE END SPI1_MspDeInit 0 */
    /* Peripheral clock disable */
    __SPI1_CLK_DISABLE();
  
    /**SPI1 GPIO Configuration    
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI 
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);

  }
  /* USER CODE BEGIN SPI1_MspDeInit 1 */

  /* USER CODE END SPI1_MspDeInit 1 */
} 

void W5500HardwareReset(void)
{
  uint32_t tempTick;
  HAL_GPIO_WritePin(W5500_RESET_PORT,W5500_RESET_PIN,GPIO_PIN_RESET);
  tempTick = HAL_GetTick();
  while((HAL_GetTick() - tempTick) < W5500_RESET_TIME){/*1 ms Delay: Do nothing*/}
  HAL_GPIO_WritePin(W5500_RESET_PORT,W5500_RESET_PIN,GPIO_PIN_SET);
}

void W5500WriteByte(unsigned char txByte)
{
  unsigned char rtnByte;
  while (HAL_SPI_GetState(&hspi1W5500) != HAL_SPI_STATE_READY);
  HAL_SPI_TransmitReceive(&hspi1W5500,&txByte,&rtnByte,1,10);
}

unsigned char W5500ReadByte(void)
{
  unsigned char txByte = 0xff;//dummy
  unsigned char rtnByte;
  while (HAL_SPI_GetState(&hspi1W5500) != HAL_SPI_STATE_READY);
  HAL_SPI_TransmitReceive(&hspi1W5500,&txByte,&rtnByte,1,10);
  return rtnByte;
}

void W5500Select(void)
{
  HAL_GPIO_WritePin(W5500_CS_PORT,W5500_CS_PIN,GPIO_PIN_RESET);
}

void W5500DeSelect(void)
{
  HAL_GPIO_WritePin(W5500_CS_PORT,W5500_CS_PIN,GPIO_PIN_SET);
}


.c 파일을 만들었으니 .h 파일도 만들어 볼까요?


#ifndef __W5500HARDWAREDRIVER_H_
#define __W5500HARDWAREDRIVER_H_

#ifdef __cplusplus
 extern "C" {
#endif
   
#include "stm32f4xx_hal.h"

#define W5500_RESET_TIME	1 //ms
extern SPI_HandleTypeDef hspi1W5500;

void W5500HardwareInitilize(void);
void W5500Initialze(void);
void W5500HardwareReset(void);
void W5500WriteByte(unsigned char byte);
unsigned char W5500ReadByte(void);
void W5500Select(void);
void W5500DeSelect(void);
unsigned char wizchip_read(void);
void  wizchip_write(unsigned char wb);

#ifdef __cplusplus
}
#endif
#endif /*__W5500HARDWAREDRIVER_H_ */


이제 main()문에 살짝 넣어보고 시험 삼아 컴파일을 해볼게요.


#include "W5500HardwareDriver.h"

int main(void)
{

	W5500HardwareInitilize();

    while(1)
    {
    }
}


에러가 많이 나네요 ㅠㅠ;; 하지만 내용을 보시면 거의다 mbedtls와 관련된 내용입니다.



이제부터 조금 짜증 나는 내용입니다. mbedtls를 include 시킨 적도 없는데 에러가 나는 건 컴파일 에러가 나는 거라고 보시면 됩니다. 옵션이 안맞으니 #error를 통해서 에러를 주라고 프로그래밍 되어 있는 것이죠. 그럼 한번 고쳐 봅시다 ㅎㅎ


아마 여기에서 포기하시는 분들이 많을 거라고 생각됩니다. 왜냐하면 config.h를 수정해야하는데 2600줄짜리 config입니다. 각종 옵션과 암호화 방식, 인증 방식 등 수많은 것들이 우릴 기다리고 있으니까요. 언제 공부해서 언제 코딩합니까? ㅎㅎ


결론은!!!! config.h를 버립시다!


mbedTLS의 모든 파일들은 다음과 같이 시작합니다. 굳이 해설하자면

#if !defined(MBEDTLS_CONFIG_FILE)
#include "mbedtls/config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif

"MBEDTLS_CONFIG_FILE이 없으면 mbedtls/config.h를 include합시다. 그렇지 않다면 MBEDTLS_CONFIG_FILE을 참조합시다~"

라고 되어 있습니다.


따라서 MBEDTLS_CONFIG_FILE를 다시 define하면 그만입니다. 2600줄짜리 코드가지고 한줄한줄 읽어가면서 고생하지 마세요.


그래서 새로운 config 파일을 하나 더 만들도록 하겠습니다. 이름은 SSLConfig.h라는 이름으로 하고 생성한 후에 저를 믿고 그냥 복붙하세요.!!컨트롤 + c, 컨트롤 + v~ 고고!!


#ifndef MBEDTLS_CONFIG_H
#define MBEDTLS_CONFIG_H

/************************ macro define ***********************************/
#define MBEDTLS_SSL_CLI_C   //complie SSL cleint protocols

/*
   The following setting is base on the protocol for gmail & yahoo servers (TLS v1.2)
*/

//#defien SSL_CLIENT_SUPPOR_AILPAY

/************************ ssl config *************************************/

/* System supports functions */
//#define MBEDTLS_FS_IO    //

/* ssl features supports functions */
//#define MBEDTLS_PROTO_TLS1    //supports TLS v1.0
//#define MBEDTLS_PROTO_TLS1_1  //supports TLS v1.1
#define MBEDTLS_SSL_PROTO_TLS1_2        //supports TL v1.2
//#define MBEDTLS_PROTO_SSL3         //supports SSL v3.0

#define MBEDTLS_CIPHER_MODE_CBC //Use verify certificate function
#define MBEDTLS_PKCS1_V15       //define public key padding method

//#define MBEDTLS_SRV_SUPPORT_SSLV2_CLIENT_HELLO //define suppots SSL v2

/* ssl function supports */
//#define MBEDTLS_CERTS_C             //define to use certication testing function
#define MBEDTLS_RSA_C               //define public key encryption method (Using RSA) !!!

//#define MBEDTLS_ECDH_C  //LIU
//#define MBEDTLS_ECP_C

//#define #define MBEDTLS_ARC4_C      //define public key encryption method (Using RC4)

#define MBEDTLS_X509_USE_C          //Using X509 frame function
#define MBEDTLS_X509_CRT_PARSE_C    //define supporting ssl x.509 certificate analyze !!!
#define MBEDTLS_PK_C                //Using private key encryption function
#define MBEDTLS_PK_PARSE_C          //Using private key encryption analyze function

#define MBEDTLS_BIGNUM_C            //define using Big number function !!!
#define MBEDTLS_CIPHER_C            //define using certificate function

//#define MBEDTLS_ENTROPY_C           //define using Entropy calcuation !!!
#define MBEDTLS_SHA512_C            //define using SHA512 calcuation
#define MBEDTLS_SHA1_C            //define using SHA128 calcuation
#define MBEDTLS_SHA256_C          //define using SHA256 calcuation

#define MBEDTLS_MD_C              //define using MD calculation
#define MBEDTLS_MD5_C             //define using MD5 calculation

#define MBEDTLS_CTR_DRBG_C          //define using random number function !!!

#define MBEDTLS_AES_C               //define using AES function (after handshake - communicate stage)
//#define MBEDTLS_DES_C                     //define using DES function
#define MBEDTLS_ASN1_PARSE_C        //define using ASN analysis function
#define MBEDTLS_ASN1_WRITE_C        //define using ASN write function
#define MBEDTLS_OID_C              //define using OID function

#define MBEDTLS_SSL_TLS_C           //define using TLS support function !!!

//#define MBEDTLS_ERROR_C             //define using ERROR function (Showing error message)
//#define MBEDTLS_DEBUG_C             //define using debug function (Showing debug message)

/* Testing certificate procedure */
#define MBEDTLS_CERTS_C        //define using certificate testing function
#define MBEDTLS_PEM_PARSE_C    //define testing certifcate will use ASCII format (Sending PEM file)
#define MBEDTLS_BASE64_C       //define testing certificate is in ASCII format

//define communicate encrytion methods 
//#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
//#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSDEBUG_DFL_MODEA_ENABLED

#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED        //
//#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED   //
//#define MBEDTLS_GCM_C    //AES in GCM mode짙짭base on parallel design짙짭therefore it can good performance on speed,cost and less delay
//#define MBEDTLS_CCM_C    //

//define encryption and discrete methods
#define MBEDTLS_SSL_CIPHERSUITES                    \
        MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA,       \
		    MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA,       \
			  MBEDTLS_TLS_RSA_WITH_RC4_128_SHA
				//TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
			 // TLS_RSA_WITH_AES_128_GCM_SHA256

//Save RAM 
#define MBEDTLS_MPI_MAX_SIZE   256
//#define MBEDTLS_ENTROPY_MAX_SOURCES   2

//#define SSL_MAX_CONTENT_LEN    4096

//According to SSL requested data length to define, if the data is long, it takes a larger RAM space 

#if defined (MBEDTLS_CLIENT_SUPPOR_AILPAY) //defines for alipay
		#define MBEDTLS_SSL_MAX_CONTENT_LEN   5120   //define SSL client for connection to AILPAY
#else
		#define MBEDTLS_SSL_MAX_CONTENT_LEN    4096 //2048
#endif

#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION

#include "mbedtls/check_config.h"
#endif /* ssl_config */

새로운 config 파일을 만들었으면 이제 조건에 맞게 define을 해줘야 하겠죠? 컴파일러 옵션으로 이동해서 추가하도록 하겠습니다.



위 그림처럼 Configuration -> Compile -> Advance setting에서 Misc Controls에 -DMBEDTLS_CONFIG_FILE=<SSLConfig>를 추가합니다. 그리고 나면 preview에서 뒤가 짤리는데 신경쓰지 마세요. 거기서만 안보일 뿐이지 컴파일은 정상적으로 됩니다.


그리고 C99 옵션 선택합니다. 추후에 Time 함수같은거 사용할 수도 있으니까요 ㅎㅎ 그리고 컴파일을 해봅시~~~드아~~~~~


컴파일이 정상적으로 되나요? 휴휴~ 그러면 한숨은 돌렸습니다.


힘드네요.. 오늘은 여기까지만 하고 다음 포스팅은 최대한 빠르게 진행하도록 하겠습니다.(저도 오랜만에 하다보니 자꾸 까먹어서 ㅎ


그럼 안녕~~

저작자 표시
신고

'Embedded SSL' 카테고리의 다른 글

SSL/TLS embedded for IoT #6  (0) 2017.06.17
SSL/TLS embedded for IoT #5  (0) 2017.06.16
SSL/TLS embedded for IoT #4  (0) 2017.06.15
SSL/TLS embedded for IoT #3  (6) 2016.12.28
SSL/TLS embedded for IoT #2  (0) 2016.12.27
SSL/TLS for embedded IoT #1  (0) 2016.12.27

IoT Project 3. 회로 설계 - C


겁나 죄송하다는 말씀부터 드리겠습니다.

4월에 포스팅하고 7월에 포스팅을 하다니 ㅠㅠ 죄송합니다. 뭐 문제가 생긴거 아니냐라고 하시는 분들도 계신데;;;

그냥 제가 게을러서 그런겁니다. 좀더 의무감을 가지고 진행하도록 하겠습니다.


사실 보드는 제작이 이미 완료되어 테스트까지 마치고 제 직장에서 강의 용도로 사용하고 있습니다.

위즈네트라는 회사구요, 강의는 무료로 진행되니까;;;오시던지~ 마시던지! 

(사실 회사 홍보하는 거 같아서 간지럽습니다.)


그리고 이 프로젝트에서 사용된 회로도 및 아트웍 그리고 PCB 용도의 거버 파일까지 몽땅 다 드릴 수 있어요.

필요하신 분들은 방명록이나 다른 어디라도 e-mail주소 남겨주시면 보내드리도록 하겠습니다.

이 보드 모양 그대로 판매만 안한다고 약속하시면 됩니다. 조금이라도 바꾸시면 괜찮습니다. ^^


어쨌든 회로 설계 세번째 시간! 시작하겠습니다.


저번 시간에 MCU 뜯어 보았는데요. 별 다른게 없습니다.

아날로그 회로가 아닌 이상 요세 디지털 회로는 선 긋기에 불과합니다. 그래도 기본적인 회로 이론 지식은 있어야합니다.

(제가 쉽다쉽다 이야기는 했지만 그래도 비전공자는 힘들겠죠... ㅠㅠ 거짓말쟁이로 몰지 말았으면 좋겠습니다.)


먼저 아래 회로도는 W5500 파트입니다. Ethernet이 되게 해주는 IC입니다.

<IoT 프로젝트 W5500 파트>


자세히 보겠습니다. 딱 보면 아시겠지만 좌측 상단의 케페시터들은 디커플링 케페시터입니다.

디커플링 케페시터는 DC 전원을 노이즈를 저감시키는 역할을 합니다. 아트웍할때에는 각각의 VDD 핀과 가깝게 붙여줍니다.

<W5500 Decoupling capacitors>


그리고 MCU와 똑같이 아날로그 전원에 Bead와 Clock용 Crystal 회로가 있습니다. 거의 똑같습니다.

한가지 차이점이 있다면 Crystal에 1M옴짜리 저항이 하나 있습니다. 피드백 저항이라고 하는데요. IC 내부에 있는 경우에는 달아줄 필요가 없으나 없는 경우에는 외부에 별도로 달아주는게 안정적이라고 합니다. 그래서 보통 IC 제조사의 레퍼런스 회로를 따릅니다. 당연히 저도 Wiznet의 레퍼런스 회로를 보고 따라한 겁니다. ^^


<W5500 Analog bead>



<W5500 Clock - Crystal circuit with 1M feedback resistor>


그리고 나머지는 MDI라고 부르는 신호선의 회로로 구성됩니다. MDI라인은 Differential line입니다. 한국말로는 차동 신호라고 부르는데 두 가닥 사이 전압의 차로 1,0을 판별합니다. RS485랑 비슷하죠? 사실 거의 모든 통신라인은 차동입니다. USB도 CAN도 모두 차동입니다. -_-+ 노이즈에 강하기 때문이죠.

아래 회로에서 보이는 저항이나 케페시터 들은 임피던스를 50옴에 맞추기 위한 것들인데 왜 그렇게 하는지 까먹었다....

아하하하하 뭐 초보자들을 위한 IoT 보드 만들기 이므로 패스!

<W5500 Ethernet 임피던스 매칭회로>


그리고 RD1-125BAG1A라는 RJ-45(트렌스포머 포함) 커넥터가 있습니다. W5500에 이거 쓰시면 안됩니다. 이거 쓰시면 아래 사진처럼 됩니다. 잘못된 정보를 드리는게 아니라 디버그 과정도 블로깅하려고 하는 거에요~ 주의 주의!!!!!


<RJ-45 대강 했다가 망한 IoT 보드>


물론 디버그 과정을 거치고 난 후 회로는 다시 그리게 됩니다. 이 블로깅의 목적은 완성된 회로를 드리는 것이 아니라 프로젝트를 진행하는 전체적인 과정을 보는 것에 목적이 있습니다. 다시 한번 주의 주의!!


같은 의미로 우측 하단의 Shield 회로도 마찬가지로 틀린 회로입니다.


<잘못된 Shield 처리>


저항을 달아 놓았지만 Ethernet의 Shield(CHGND)는 케페시터를 통해 System GND와 연결되어야 합니다. 여러 가지 방법이 있지만 Wiznet의 레퍼런스 회로는 2kV/1nF을 사용하게 되어 있습니다. 여러 회사의 Ethernet 회로를 검토해본 결과 아트웍하는 방식에 따라 회로가 틀려지게 되어 있습니다. 참고하시기 바랍니다.


정상 동작하는 회로는 디버그하는 포스팅이 끝난 후에 다루도록 하겠습니다.


아래는 Wiznet에서 제공하는 레퍼런스 회로가 있는 LINK이며 PDF로 다운로드 받으실 수 있습니다.


http://wizwiki.net/wiki/doku.php?id=products:w5500:refschematic


레퍼런스 회로가 있음에도 왜 다르게 하느냐라고 하시는 분들이 있을 텐데요.. ㅎㅎ 그건 제 개취입니다.

그거 말고는 딱히 명쾌하게 설명할 수 있는 말이 없네요.

그리고 레퍼런스라는 것도 기준이라는 뜻이지 똑같이 하라는 말은 아닙니다. 취향에 따라 틀려질 수 있어요.

모두가 똑같으면 재미없잖아요? ㅎㅎ 비록 실패하더라도... ^^


다음 시간에는 회로 설계 마지막으로 FTDI를 뜯어 보도록 하겠습니다.


다시 한번 죄송하다는 말씀드리구요~ ㅠㅠ 이제는 정말 못해도 1주일에 한번은 포스팅하도록 하겠습니다.


다음 시간에 뵈요~


- Dwarp -

저작자 표시
신고

'IoT - Internet Of Things' 카테고리의 다른 글

IoT Project 3. 회로설계 - D  (0) 2015.08.04
IoT Project 3. 회로설계 - C  (0) 2015.07.13
IoT Project 3. 회로설계 - B  (1) 2015.04.09
IoT Project 3. 회로설계 - A  (0) 2015.04.02
IoT Project 2. 소자 선정.  (0) 2015.02.20
IoT Project 1. 컨셉 작업.  (0) 2015.02.20

IoT Project 2. 소자 선정.

IoT - Internet Of Things 2015.02.20 22:41 Posted by Dwarp


IoT Project 2. 소자 선정



주요 소자를 선정하는 시간입니다. 보통은 컨셉 작업 단계에서 거의 선정되는데요.


왜 그런 소자를 선택했는지? 정도가 될 것 같습니다.


그럼 바로 시작하죠.


저번 컨셉 작업 단계에서 몇 가지 기준을 정했습니다.



우선 필수 요소인 Main MCU는 우리 경준씨가 바라던데로 Cortex M3로 결정했습니다.

(요세 Cortex M4도 꽤 많이 나오는데 마우져나 디지키에서 구매가 불가능하더라구요. 국가 정책이라나 뭐라나.)


Cortex M3는 단지 ARM에서 설계한 코어로 해당 설계를 사서 여러 제조사가 주변기기(Peripheral)를 붙여 IC로 만들죠.


제조사는 굉장히 많이 있습니다. 또 Ethernet Interface에 따라 다르게 적용될 수도 있으니 일단 넘어가죠.



그러면 Ethernet Interface용도의 소자를 선택해 볼까요? 어쩌면 이게 핵심입니다. ㅎ


MCU에 MAC+PHY가 포함된 방식도 있었고, MCU에 MAC만 포함되어 PHY IC를 외부에 붙이는 방법도 있었습니다.


또 MAC+PHY+TCP/IP IC를 사용하는 방법도 말씀드렸었죠?


전 MAC+PHY+TCP/IP 칩인 W5500을 선택했습니다. 왜 그랬을까요?


<W5500 Hardwired TCP/IP Ethernet IC>



Ethernet Interface 소자 선정에 우선적으로 고려했던 사항은 성과 획득 시간이었습니다.


평소 시간이 부족한 경준씨를 위해 저는 성과 획득 시간이 30분을 초과하면 안된다는 규칙을 세웠습니다.


하지만 저는 소프트웨어 스택을 경준씨 수준에 맞추어 설명하는 과정을 절대 30분 안에 마무리할 자신이 없습니다.


LwIP나 uIP 다운받고 압축 풀고 프로젝트에 포함시키고 library path 추가하고 MCU에 맞추어 포팅하고 Ping이라도 받을 수 있는


Sample Code를 프로그램하는데 직접해도 30분은 커녕 2-3시간은 족히 걸립니다.


하물며 경준씨는 해당 경험이 전무한데 이런 것을 요구한다는 것 자체가 말이 안된다고 봅니다.


처음부터 지루하고 뭐하는 건지도 모르는 것을 하게 되는 거죠. 분명 흥미는 반감하게 될겁니다.


하지만 W5500을 사용하면 Main MCU와는 SPI로 통신하도록 되어 있으니 어려운 설명은 필요없습니다.


Main MCU의 SPI를 초기화 시키고 Wiznet에서 제공하는 라이브러리를 사용하면 금세 샘플 코드가 완성됩니다.


이런 과정이라면 충분히 30분 내외로 읽고 실습 할 수 있는 문서를 제공할 수 있으며


이 프로젝트의 목적인 "IoT의 기술적 접근성이 좋아졌다는 증명"에도 다가갈 수 있습니다.


가격적인 측면을 살펴본다 해도 3500원으로 비싸지 않다고 판단했습니다. 보통 PHY IC들이 1~2,000원 정도 하니까요.


<Microchip 사의 RMII Ethernet Interface IC>


PIC18F97J60 같은 Ethernet이 포함된 MCU도 있긴 하지만 글쎄요...


프로젝트의 목적으로도 이 글의 목적으로도 부합되지 않는다 판단됩니다.



- 삼천포 -


사실 제 이야기를 해보자면 첫 시간에 말씀드렸다시피 LM8962나 PIC18F97J60 같은 MCU+MAC+PHY IC를 사용해 보았습니다.


제 입장에서는 MCU에 MAC만 붙어 있어도 감지덕진데... MAC + PHY라니요. 믿을 만한 회사에 예제는 당연하구요.


그래서 LM8962로 처음 프로젝트를 할 때는 신기했습니다. 아무것도 없이 MCU에 RJ-45만 있으며 Ethernet이 되었으니까요.


하지만 MCU가 개판이라 고생을 엄청했습니다. 근데 조금 있다가 단종까지 해버리더군요. ㅠㅠ


그 고생을 해가며 양산까지 했건만...... 정말 회사 목 내놓고 다녔습니다.


그 이후로 TI의 Stellaris는 쳐다보지도 않습니다. 신상이 무조건 좋은게 아니라는 교훈을... 훌쩍.. ㅠㅠ


또 PIC18F97J60의 경우도 Microchip에서 제공하는 TCP/IP Stack을 사용해 공유기에 붙이고 IP도 할당받고 해보았습니다.


하지만 TCP/IP가 Microchip의 제공이고 10Mbps만 지원했으며 MCU가 종속된다는 점에서 찜찜했습니다.


또 그에 따라 뒤쳐질것이라는 느낌도 강하게 들었기 때문에 더 이상 진행하지 않았습니다.

(그리고 Microchip의 MPLAB은 개인적으로 최악의 IDE 툴이라고 생각합니다.)


- 끝 -



따라서 결론은 주요 소자는 Cortex M3 + W5500으로 진행하고자 합니다.


추가 비용은 없다고 했으니 지켜야겠죠? 따라서 전원도 Micro USB Connector로만 공급합니다.


설마 집에 Micro USB 충전기 없는 집 없겠죠? -_- 아이폰을 제외한 모든 스마트폰 충전기 말하는 겁니다.


혹시 모르니 아래쪽에 사진을....



  

<Micro USB Connector Female / Male>


그리고 추가 비용도 없다고 했으니 별도의 JTAG을 구매할 필요가 없도록 JTAG을 내장하도록 합니다.


ISP도 생각해 보았으나 저의 경우 디버그가 안되면 상당히 괴롭습니다.


암튼 이런 용도의 IC가 FTDI 사의 FT2232입니다. USB로 JTAG 프로그램 및 디버깅을 할 수 있습니다.


개당 가격이 8000원 정도로 꽤 비싸긴 하지만 간편하게 프로그램과 디버깅을 할 수 있으니 교육용으로는 딱! 이라고 생각합니다.


FT2232D 에는 JTAG과 더불어 한 채널의 UART를 제공하므로 우리 경준씨에게 친숙하리라 판단이 됩니다.


환경은 교육용 보드 하나 USB 케이블 하나 끝입니다. 아 IoT니까 LAN선이 더 있어야 겠네요.



마지막으로 추가하려고 생각하는 것은 Mac address IC입니다. 원래 Ethernet 장비 모두는 고유의 Mac 주소를 가지고 하죠.


Mac 주소는 IEEE에서 판매합니다. 4096개에 550불이고 1670만개에 1600불에 판매합니다. ㅎ 못사겠죠?


이런 경우에 사용하라고 Microchip사에서 Mac 주소가 담긴 eeprom을 판매합니다. 아래는 해당 제품 링크입니다.


LINK -> http://www.microchip.com/pagehandler/en-us/products/memory/serialEEPROM/mac/MAC.html


<Microchip사의 MAC Address EEPROMs page>


가격도 몇 백원 수준으로 부담되지 않으니 혹시나 MAC 주소 때문에 고민하시는 분들은 참고하시기 바랍니다.



휴.. 그럼 주요 IC들은 다 된 것 같습니다. 아 아직 MCU를 정하지 않았군요!! 네! 알고 있습니다.


사실 아직 진짜 못 정했거든요. STM F1 스트림 중 메모리나 페키지 사이즈로 고민 중입니다.



이 밖에 전원쪽 파트나 Reset 버튼, Status LED는 따로 언급하지 않겠습니다.


머리만 아프니까요. ㅎㅎ 자세한 건 회로 작성을 하며 언급하도록 하겠습니다.


그리고 한가지 더~ IDE를 이야기 하지 않았는데 IDE는 CoIDE라는 Eclipse 기반의 IDE를 사용하도록 하겠습니다.


하지만 CoIDE를 여기서 소개하면 글이 너무 길어지므로 OpenSource 카테고리에 포스팅하고 링크 올리겠습니다.

(CoIDE가 Free 거든요.)


CoIDE 소개 Link -> http://engschool.tistory.com/entry/CoIDE


남은 명절 알차게 보내세요~. 다음 시간에 뵈여~


-Dwarp-



저작자 표시
신고

요세 핫한 Item IoT - Internet Of Things 에 관해 생각해 보려고 합니다.


이번에는 기술적인 내용을 다루지 않을 생각이므로 편하게 읽어보셔도 될 것 같습니다.


영어로 IoT, 한글로 사물인터넷. ㅎ


음... 사실 이미 핸드폰도 인터넷이 되고 TV도 인터넷이 되고 문도 인터넷으로 열리고 뭐 기타 등등 다 됩니다.


저는 예전부터 있었다고 사물 인터넷은 존재하고 있었다고 봅니다.


단지 이름이 없었을 뿐이라고 생각합니다.


"내가 이름을 불러 주었을 때, 그는 나에게로 와서 꽃이 되었다."


ㅎㅎ 갑자기 이런 시가 생각나네요.



<웹툰 마음의 소리의 주연 꽃 - 슬픈 표정 연기가 일품이다.>



우리 나라의 삭막한 IT는 이런 문학적인 요소가 중요하다고 개인적으로 생각합니다만 이게 중요한 것이 아니고


이름이 생겼다는 것은 "본격적으로 활성화될 준비가 되었다"는 것을 의미합니다.


그럼 본격적으로 활성화될 준비는 무엇을 말하는 것일까요?


필요성에 의한 시장의 성장이나 사람들의 인식 개선 등 많은 요소가 있겠지만 우리는 엔지니어니까~


"기술의 접근성"에 대해 이야기해 보도록 하겠습니다.



일반적인 모든 컴퓨터에는 LAN Port가 있고 그리고 보통 컴퓨터를 구동하는 OS에 TCP/IP Stack이 포함되어 있습니다.


덕분에 우리는 쉽게 인터넷을 할 수 있죠.


하지만 우리가 인터넷으로 문을 여는데 문마다 컴퓨터를 설치해야 한다면 사물인터넷이란 말은 생기지도 않았을 겁니다.


싸고 작고 구현이 쉬워야 합니다. 여기에 바로 우리 전문 분야가 나오는 것이죠.

("우리"의 개념은 음.. 임베디드 시스템을 개발하는 사람들? 정도? 애매하지만 넘어갑시다.)


Ethernet을 구현하기 위해서는 하드웨어적인 측면에서 MCU와 Network Interface(MAC,PHY)등이 필요하고


소프트웨어적인 측면에서는 TCP/IP Stack이 필요합니다.


몇년 전까지만 해도 외부에 별도의 PHY나 MAC+PHY IC가 필요했지만


요세는 MCU에 MAC과 PHY가 포함되어 나오고 있습니다. ㅎㅎ 들리시나요? 점점 사물인터넷이 무르익어가는 소리가?


<MicroChip - MCU+MAC+PHY IC>


<TI - TM4C129x Block Diagram>



저도 Micro Chip의 PIC18F97J60 이나 TI의 LM8962같은 MCU에 Network interface가 포함된 IC를 사용해 보았습니다.


이런 종류의 IC들을 사용하면 아래와 같이 간단하게 구성되므로 단가 하락이나 개발 시간 단축에 이점이 있겠죠?



<PIC18F97J60을 사용한 Ethernet Board>



!!!!하지만!!!!


이렇게 하드웨어를 간단하게 구현했다고 해서 끝난 것이 아니죠.


TCP/IP Stack이 남아 있습니다. Software 입니다.


임베디드 용도의 상용 TCP/IP Stack은 제가 2012년도에 알아보았을 때 한화로 약 1500만원 정도 했습니다. 비싸죠. ㅠㅠ


Microchip에서는 무료로 TCP/IP Stack을 제공하고 있지만 하드웨어적인 측면에서 Microchip에 종속된다는 측면이 있습니다.


Microchip의 제품만 써야한다는 소리입니다. 으음.. 이건 싫은데...


훗! 우리에겐 무료 버전의 TCP/IP Stack도 있습니다. LwIPuIP가 대표적이죠. ㅎㅎ


무료이다 보니 많은 사람이 테스트를 해보고 그에 따른 예제도 웹상에서 쉽게 찾을 수 있습니다.


하지만 무료이다 보니 그 기능도 한계가 있고 예기치 못한 오류에도 쉽게 대응할 수 없다는 문제가 있습니다.



또 다른 선택지도 있습니다. 제가 가장 사랑하는 하드웨어 TCP/IP Stack 입니다.


무료 Stack을 정복하고픈 욕구도 있지만 하드웨어 Stack은 개발 시간을 극단적으로 단축시켜 주기 때문입니다.


국내 기업 중 Wiznet이라는 회사가 하드웨어 TCP/IP Stack을 판매합니다.

(아마 Wiznet 말고는 비슷한 IC가 없을 겁니다. 아마 ㅋ 못봤으니까 ㅋ 있으면 제보 좀. ㅋ)


음.. 한마디로 MAC+PHY+TCP/IP IC라고 보시면 됩니다.


<Wiznet W5500 -http://wiznet.co.kr/sub_modules/kr/product/product_main.asp>



제가 사회 초년생때 음원 스트리밍 프로젝트에 사용되었습니다. 저는 그 때 client 펌웨어를 담당하고 있었는데요.


 SPI로 ARM7과 연결해서 사용했고 Reset pin 하나 연결한 것으로 기억됩니다. 그리고 Wiznet에서


윈도우 소켓(or 버클리 소켓)과 비슷한 라이브러리를 제공해 주기 때문에 어렵지 않게 사용이 가능합니다.


국내 기업이라 한글 데이터 시트를 제공한다는 것도 꽤 큰 도움이 됩니다.


<WIZnet SHOP - http://shop.wiznet.co.kr/>



W5100이 그 당시에 5,500원 했나? 그런데 새로 나온 W5500이 개당 3,500원! -_-+ 더 싸졌네요. ㅎ


엔지니어로써 시간과 돈이 가장 중요하다고 여기는 저로써는 상당히 반갑습니다. ㅎㅎ



IoT를 기술의 접근성 측면에서 봤습니다만 올인원 IC가 많이 출시되는 상황이고 무료 TCP/IP Stack도 있습니다.


이것 저것 다 귀찮으시면 Wiznet IC를 사용하셔도 됩니다.



자 어떻습니까?


모두가 가격도 저렴하고 회로 레퍼런스도 제공하며 예제도 많이 있습니다.


한마디로


"사물인터넷(IoT)은 기술적인 접근성이 상당히 좋다!"


때문에


"사물인터넷이 본격적으로 활성화될 준비가 되었다."




뜬 구름 잡는 소리는 여기까지 하고 다음에는 대략적으로 프로젝트를 설계해 보도록 하겠습니다.


그럼 다들 화이팅 하시고!! 다음 시간에 뵈여~~ 안녕~


- Dwarp -

저작자 표시
신고