상단

Open API

가이드에서 "https://www.obcon.biz/scada/" 등은 사용하고 계신 URL로 변경하여 접속 하여야 합니다.

 

사용자의 인증키 관리

SCADA에 관리자로 로그인하여 사용자의 인증키를 관리 한다.

"관리 > 사용자" 메뉴를 선택 한다. "Access Key/Secret 생성" 버튼을 선택하면 화면 하단에 Access Key와 Access Secret가 다시 생성되어 표시 된다.

  • Access Key : Open API를 사용하기 위한 아이디

  • Access Secret : Open API를 사용하기 위한 비밀번호

  • Open API 제어 : Open API 사용 권한을 관리

 

자신의 인증키 관리

SCADA에 로그인하여 내 정보 메뉴를 선택 한다. "Access Key/Secret 생성" 버튼을 선택하면 화면 하단에 Access Key와 Access Secret가 다시 생성되어 표시 된다.

  • Access Key : Open API를 사용하기 위한 아이디

  • Access Secret : Open API를 사용하기 위한 비밀번호

Open API 권한 관리

글로벌 관리자가 설정에서 사이트별로 OpenAPI 사용 여부를 관리 합니다. 신규로 Open API를 사용하는 사이트를 추가하는 경우에 글로벌 관리자에게 요청 하세요.

 

  • 사용자 정보 중 "Open API 제어" 항목으로 권한 설정을 한다.

    • 사용 불가 : Open API를 사용할 수 없다.

    • 조회 권한 : Open API에서 조회 기능만 사용 한다.

    • 제어 권한 : 모든 기능을 사용할 수 있다.

  • 조회 권한이 있는 경우, 사용할 수 있는 기능

    • Token 요청

    • 장비 목록, 장비 상세

    • 장비 데이터 조회, 최신 장비 데이터 조회

  • 제어 권한이 있는 경우, 사용할 수 있는 기능

    • 조회 권한으로 사용할 수 있는 모든 기능

    • 장비 제어 요청

 

Open API 접속 정보

Open API를 사용하기 위해서는 다음 정보를 알고 있어야 한다.

  • Open API URL : 예) https://www.obcon.biz/scada/api/v1

  • Access Key : Open API를 사용하기 위한 아이디

  • Access Secret : Open API를 사용하기 위한 비밀번호

 

공통 사항

 
timestamp

타임스탬프로 1970-01-01 00:00:00 이후의 시간을 ms로 환산한 값이다. 13자리 숫자로 1/1000초 단위까지 표시 한다.

 
nonce

임의의 랜덤한 문자열

 
hmac

HMAC (Hash-based Message Authentication Code)-SHA256는 보안을 위해서 Open API 서비스로 전달하는 parameters를 사용한 일종의 해시코드 이다.

전달하는 데이터로 QueryString 형태로 변환한 후 Access Secret로 HMAC 처리를 한다. 전달하는 parameter가 없는 경우에는 해당 항목을 제외하고 QueryString을 생성 한다.

//--- Node.js 샘플
//--- params : 서버로 전달하는 데이터를 담은 object
//--- fields : hmac 생성에 사용할 변수 이름을 담은 배열
//--- accessSecret : Access Secret
function makeHmac(params, fields, accessSecret) {
    //--- QueryString 생성
    //---    field에 해당하는 값이 없는 경우 QueryString 생성에서 제외 한다.
    let query = [];
    for (let field of fields) {
        if ((params.hasOwnProperty(field)) && (params[field] != null)) {
            query.push(`${field}=${encodeURIComponent(params[field])}`);
        }
    }
    let queryString = query.join('&');
    
    //--- QueryString로 HMAC 생성
    return crypto.createHmac('sha256', accessSecret).update(queryString, 'utf-8').digest('hex');
}

주의) field에 해당하는 값이 있는 경우에만 QueryString에 추가 한다.

Token 요청

Request

  • Method : POST

  • Path : /services/getToken

  • Parameters

이름타입위치필수설명
accessKeyStringBody필수Access Key
durationIntegerBody옵션Token의 유효 시간(초)
Default 1800초 (30분)
timestampIntegerBody필수타임스탬프 (13자리 숫자)
nonceStringBody필수임의의 랜덤한 문자열
hmacStringBody필수HMA-SHA256
  • HMAC 생성시 fields

    • accessKey, [duration], timestamp, nonce

    • "[ ]"로 표시된 항목은 옵션 항목으로 없는 경우, 제외 하세요.

Response

  • data

    • token : 권한을 얻기 위해 사용하는 JWT(JSON Web Token)

 

장비 목록

Request

  • Method : GET

  • Path : /devices

  • Parameters

이름타입위치필수설명
x-obcon-accessKeyStringHeader필수Access Key
x-authorizationStringHeader필수Bearer ${token}
fieldsStringQuery옵션all. 장비별로 장비 상세에서 반환하는 정보 반환
timestampIntegerQuery필수타임스탬프 (13자리 숫자)
nonceStringQuery필수임의의 랜덤한 문자열
hmacStringQuery필수HMA-SHA256
  • x-authorization 값은 Token 앞에 반드시 "Bearer " 문자를 붙여 주세요.

  • HMAC 생성시 fields

    • x-obcon-accessKey, [fields], timestamp, nonce

    • "[ ]"로 표시된 항목은 옵션 항목으로 없는 경우, 제외 하세요.

 
 

Response

  • data

    • size : 장비 갯수

    • data : 장비 배열

      • deviceList 데이터 구조 참조

      • fields=all 인 경우 device 데이터 구조 참조

 
 

장비 상세

Request

  • Method : GET

  • Path : /devices/{record}

  • Parameters

이름타입위치필수설명
recordIntegerPath필수장비의 레코드 ID
x-obcon-accessKeyStringHeader필수Access Key
x-authorizationStringHeader필수Bearer ${token}
timestampIntegerQuery필수타임스탬프 (13자리 숫자)
nonceStringQuery필수임의의 랜덤한 문자열
hmacStringQuery필수HMA-SHA256
  • x-authorization 값은 Token 앞에 반드시 "Bearer " 문자를 붙여 주세요.

  • HMAC 생성시 fields

    • x-obcon-accessKey, timestamp, nonce

Response

  • data

    • data : device 데이터 구조 참조

 

장비 데이터 조회

Request

  • Method : GET

  • Path : /devices/{record}/data

  • Parameters

    • datetimeFrom <= 조회 대상 데이터 < datetimeTo

이름타입위치필수설명
recordIntegerPath필수장비의 레코드 ID
x-obcon-accessKeyStringHeader필수Access Key
x-authorizationStringHeader필수Bearer ${token}
datetimeFromStringQuery필수조회 시작일시
(YYYYMMDDHHmmss)
datetimeToStringQuery필수조회 종료일시
(YYYYMMDDHHmmss)
timestampIntegerQuery필수타임스탬프 (13자리 숫자)
nonceStringQuery필수임의의 랜덤한 문자열
hmacStringQuery필수HMA-SHA256
  • x-authorization 값은 Token 앞에 반드시 "Bearer " 문자를 붙여 주세요.

  • HMAC 생성시 fields

    • x-obcon-accessKey, datetimeFrom, datetimeTo, timestamp, nonce

Response

  • data

    • hasNext : true인 경우 연속으로 조회할 데이터가 존재함

    • datetimeFrom : 연속으로 조회할 때, 다음 조회에서 사용할 기간 (시작일시)

    • datetimeTo : 연속으로 조회할 때, 다음 조회에서 사용할 기간 (종료일시)

    • size : 데이터 갯수

    • data : 데이터 목록

      • 정류기인 경우 devicedata1s 참조

      • 원격TB인 경우 devicedata2s 참조

      • 두께측정장비인 경우 devicedataAs 참조

 

최신 장비 데이터 조회

Request

  • Method : GET

  • Path : /devices/{record}/latestData

  • Parameters

이름타입위치필수설명
recordIntegerPath필수장비의 레코드 ID
x-obcon-accessKeyStringHeader필수Access Key
x-authorizationStringHeader필수Bearer ${token}
timestampIntegerQuery필수타임스탬프 (13자리 숫자)
nonceStringQuery필수임의의 랜덤한 문자열
hmacStringQuery필수HMA-SHA256
  • x-authorization 값은 Token 앞에 반드시 "Bearer " 문자를 붙여 주세요.

  • HMAC 생성시 fields

    • x-obcon-accessKey, timestamp, nonce

 

Response

  • data

    • size : 데이터 갯수

    • data : 데이터 목록

    • 정류기인 경우 devicedata1s 참조

      • 원격TB인 경우 devicedata2s 참조

      • 두께측정장비인 경우 devicedataAs 참조

 

여러 장비의 최신 장비 데이터 조회

Request

  • Method : GET

  • Path : /devices/latestData

  • Parameters

이름타입위치필수설명
x-obcon-accessKeyStringHeader필수Access Key
x-authorizationStringHeader필수Bearer ${token}
typeStringQuery옵션장비 타입
timestampIntegerQuery필수타임스탬프 (13자리 숫자)
nonceStringQuery필수임의의 랜덤한 문자열
hmacStringQuery필수HMA-SHA256
  • x-authorization 값은 Token 앞에 반드시 "Bearer " 문자를 붙여 주세요.

  • HMAC 생성시 fields

    • x-obcon-accessKey, [type], timestamp, nonce

    • "[ ]"로 표시된 항목은 옵션 항목으로 없는 경우, 제외 하세요.

 

Response

  • data

    • devices : 장비의 레코드 아이디 목록

    • device_${장비의 레코드 아이디}

      • size : 데이터 갯수

      • data : 데이터 목록

        • 정류기인 경우 devicedata1s 참조

        • 원격TB인 경우 devicedata2s 참조

        • 두께측정장비인 경우 devicedataAs 참조

 

장비 제어 요청

Request

  • Method : PUT

  • Path : /devices/{record}/requestS

  • Parameters

이름타입위치필수설명
recordIntegerPath필수장비의 레코드 ID
x-obcon-accessKeyStringHeader필수Access Key
x-authorizationStringHeader필수Bearer ${token}
subCommandStringBody필수설정 명령어
valueFloatBody옵션
statusStringBody옵션
gpsTimeStringBody옵션HHmmss
frequencyModeStringBody옵션1. ELF, 2. ELCD, 3. LFCD
frequencySetting1FloatBody옵션주파수 1 설정값 : 0 ~ 99
frequencySetting2FloatBody옵션주파수 2 설정값 : 0 ~ 99
frequencySetting3FloatBody옵션주파수 3 설정값 : 0 ~ 99
applyCycleStringBody옵션주기 설정
networkCycleIntegerBody옵션통신주기 : 1 ~ 60(분), 1 ~ 24(시)
dataCycleIntegerBody옵션수집주기 : 1 ~ 60(분), 1 ~ 24(시)
timestampIntegerBody필수타임스탬프 (13자리 숫자)
nonceStringBody필수임의의 랜덤한 문자열
hmacStringBody필수HMA-SHA256
  • x-authorization 값은 Token 앞에 반드시 "Bearer " 문자를 붙여 주세요.

  • HMAC 생성시 fields

    • x-obcon-accessKey, subCommand, [옵션 항목], timestamp, nonce

    • "[ ]"로 표시된 항목은 옵션 항목으로 없는 경우, 제외 하세요.

Response

  • data

    • requestId : 요청 아이디

 

subCommand에 따른 사용 옵션

장비 타입인터페이스 버전SubCommand옵션설명
정류기1.000valueDC 전압
1valueDC 전류
2value방식전위
3valueOn Time
4valueOff Time
1valuePCM 전압
bvaluePCM 전류
5statusMode - 정류기/인터럽트 선택 : 1. 인터럽트, 0. 정류기
6statusMode - 자동/수동 선택 : 1. 수동, 0. 자동
7statusMode - Remote/Local 선택 : 1. Remote, 0. Local
8status동작 - 인터럽트 Start/Stop 선택 : 1. Start, 0. Stop
9statusPower - 파워 제어 선택 : 1. Off, 0. On
cstatusPCM ELF 선택 : 1. On, 0. OFF
dstatusPCM ELCD 선택 : 1. On, 0. OFF
estatusPCM LFCD 선택 : 1. On, 0. OFF
fstatus정류기/PCM 선택 : 1. PCM, 0. 정류기
gstatusPCM 상태 : 1. Start, 0. Stop
1.01hgpsTimeHHmmss
ifrequencyMode1. ELF, 2. ELCD, 3. LFCD
frequencySetting1주파수 1 설정값 : 0 ~ 99
frequencySetting2주파수 2 설정값 : 0 ~ 99
frequencySetting3주파수 3 설정값 : 0 ~ 99
원격TB1.00aapplyCycle주기 설정
0 : 통신주기(분)/수집주기(분)
1 :통신주기(시)/수집주기(분)
2 : 통신주기(시)/수집주기(시)
networkCycle통신주기 : 1 ~ 60 (분), 1 ~ 24 (시)
dataCycle수집 주기 : 1 ~ 60 (분), 1 ~ 24 (시)
두께측정장비1.00aapplyCycle주기 설정
3 : 통신주기(분)/수집주기(분)
5 :통신주기(시)/수집주기(분)
6 : 통신주기(시)/수집주기(시)
networkCycle통신주기 : 1 ~ 60 (분), 1 ~ 24 (시)
dataCycle수집 주기 : 1 ~ 60 (분), 1 ~ 24 (시)
  • 정류기 1.01 버전에서는 1.00 버전의 인터페이스도 사용할 수 있다.

 

장비 제어 결과 요청

Request

  • Method : GET

  • Path : /devices/{record}/responseA

  • Parameters

이름타입위치필수설명
recordIntegerPath필수장비의 레코드 ID
x-obcon-accessKeyStringHeader필수Access Key
x-authorizationStringHeader필수Bearer ${token}
subCommandStringQuery필수requestS 요청시 보낸 subCommand
requestIdIntegerQuery필수S 요청시 받은 아이디
timestampIntegerQuery필수타임스탬프 (13자리 숫자)
nonceStringQuery필수임의의 랜덤한 문자열
hmacStringQuery필수HMA-SHA256
  • x-authorization 값은 Token 앞에 반드시 "Bearer " 문자를 붙여 주세요.

  • HMAC 생성시 fields

    • x-obcon-accessKey, subCommand, requestId, timestamp, nonce

Response

  • data

    • datetime : 장비로부터 응답을 받은 시간 (YYYY-MM-DD HH:mm:ss)

    • code : -1. 장비로부터 받은 응답이 없음, 오류 코드 (0. 정상 적용, 1. 적용 실패, 2. 패킷 이상, 99. 기타)

 

Open API 응답 (JSON 데이터)

  • code :응답 코드 (숫자 또는 숫자 배열)

    • 0 : 정상

    • 0이 아닌 숫자 : 오류 코드

  • message : 응답 메시지 (문자열 또는 문자열 배열)

  • data : 반환 데이터 object

    • 요청에 따라 반환 데이터가 다름

  • error 오류 관련 데이터 object (Reserved)

 

응답 데이터 구조

 
deviceList 데이터 구조
이름타입설명
idInteger레코드 ID
nameString장비 이름
typeString장비 타입
1. 정류기, 2. 원격TB, A. 두께측정장비
deviceKeyString장비 아이디
interfaceVersionString인터페이스 버전
1.00. 1.01. 1.02
installDateString설치일 (YYYY-MM-DD)
statusUseString활성 여부
Active, Inactive

device 데이터 구조
이름타입설명
idInteger레코드 ID
nameString장비 이름
typeString장비 타입
1. 정류기, 2. 원격TB, A. 두께측정장비
deviceKeyString장비 아이디
locationString위치
latitudeFloat위도
longitudeFloat경도
networkModeString통신 모드
dataModeString데이터 모드
networkCycleInteger통신주기
networkCycleUnitString통신주기 단위
dataCycleInteger수집주기
dataCycleUnitString수집주기 단위
peakNetworkCycleInteger피크타임 통신주기(분)
peakDataCycleInteger피크타임 수집주기(분)
peakTimeStart1Integer피크타임 시작 1
peakTimeEnd1Integer피크타임 종료 1
peakTimeStart2Integer피크타임 시작 2
peakTimeEnd2Integer피크타임 종료 2
acFloatAC 측정값
ac1FloatAC 1 측정값
ac2FloatAC 2 측정값
preventPotentialFloat방식 전위
preventPotential2Float방식 전위 2
batteryVoltageFloat배터리 전압
temperatureFloat장치 온도
sensitivityFloat수신 감도
sensitivityRsrpInteger수신감도 RSRP
sensitivitySnrFloat수신감도 SNR
sensitivityRsrqInteger수신감도 RSRQ
pressureFloat압력
pressure2Float압력 2
gasConcentration1Integer가스농도 1
gasConcentration2Integer가스농도 2
dcVoltageFloatDC 전압
dcElectricFloatDC 전류
onTimeFloat인터럽트 On time
offTimeFloat인터럽트 Off time
rectifierStatusString문열림: 0. 닫힘, 1. 열림
rtuStatusStringRTU 전원: 0. 정상, 1. 정전
powerStatusString정류기 전원: 0. 정상, 1. 정전
interruptRectifierString정류기/인터럽트: 0. 정류기, 1. 인터럽트
operateModeString자동/수동: 0. 자동, 1. 수동
controlModeString로컬/리모트: 0. 로컬, 1. 리모트
operateStatusStringStop/Start: 0. Stop, 1. Start
statusDatetimeString상태 변경일자
interfaceVersionString인터페이스 버전
installDateString설치일
pipeControlString배관연결: 0. 배관연결 해제, 1. 배관연결
waterSensorControlString제어값: 0. 수위센서 Off, 1. 수위센서 On
acVoltageFloatAC 전압
acElectricFloatAC 전류
deviceModeString정류기/PCM: 0. 정류기, 1. PCM
elfStringELF: 0. OFF, 1. ON
elcdStringELCD: 0. OFF, 1. ON
lfcdStringLFCD: 0. OFF, 1. ON
pcmOperateStatusStringPCM 상태: 0. Stop, 1. Start
usePreventPotentialString전위 사용 여부: 0. 사용 않음, 1. 사용
gpsStatusStringGPS 상태: 0. Not Ready, 1. Ready
gpsTimeStringGPS 시간: HHmmss
frequencyModeString주파수 설정 모드: 1. ELF, 2. ELCD, 3. LFCD
frequencySetting1Float주파수 1 설정값
frequencySetting2Float주파수 2 설정값
frequencySetting3Float주파수 3 설정값
statusUseString활성 여부
humidityInteger습도
electricFloat전류
ai1FloatAnalog Input 1
ai2FloatAnalog Input 2
ai3FloatAnalog Input 3
ai4FloatAnalog Input 4
ai5FloatAnalog Input 5
ai6FloatAnalog Input 6
ai7FloatAnalog Input 7
ai8FloatAnalog Input 8
ai9FloatAnalog Input 9
ai10FloatAnalog Input 10
ai11FloatAnalog Input 11
ai12FloatAnalog Input 12
ai13FloatAnalog Input 13
di1StringDigital Input 1
di2StringDigital Input 2
di3StringDigital Input 3
di4StringDigital Input 4
di5StringDigital Input 5
labelsString이름과 단위
 
device의 labels 데이터 구조

생략

 
devicedata1s 데이터 구조
이름타입설명
idInteger레코드 ID
siteKeyString사이트 키
typeString장비 타입
1. 정류기
deviceKeyString장비 아이디
statusDatetimeString발생일자: YYYYMMDDHHmmss
dcVoltageFloatDC 전압
dcElectricFloatDC 전류
preventPotentialFloat방식 전위
onTimeFloat인터럽트 On time
offTimeFloat인터럽트 Off time
batteryVoltageFloat배터리 전압
temperatureFloat장치 온도
acVoltageFloatAC 전압
acElectricFloatAC 전류
acVoltageControlFloatAC 전압 (제어)
acElectricControlFloatAC 전류 (제어)
rectifierStatusString문열림: 0. 닫힘, 1. 열림
rtuStatusStringRTU 전원: 0. 정상, 1. 정전
deviceModeString정류기/PCM: 0. 정류기, 1. PCM
elfStringELF: 0. OFF, 1. ON
elcdStringELCD: 0. OFF, 1. ON
lfcdStringLFCD: 0. OFF, 1. ON
powerStatusString정류기 전원: 0. 정상, 1. 정전
interruptRectifierString정류기/인터럽트: 0. 정류기, 1. 인터럽트
operateModeString자동/수동: 0. 자동, 1. 수동
controlModeString로컬/리모트: 0. 로컬, 1. 리모트
operateStatusStringStop/Start: 0. Stop, 1. Start
pcmOperateStatusStringPCM 상태: 0. Stop, 1. Start
gpsStatusStringGPS 상태: 0. Not Ready, 1. Ready
gpsTimeStringGPS 시간: HHmmss
interfaceVersionString인터페이스 버전
customDataStringCustom data
 
devicedata2s 데이터 구조
이름타입설명
idInteger레코드 ID
siteKeyString사이트 키
typeString장비 타입
2. 원격TB
deviceKeyString장비 아이디
statusDatetimeString발생일자: YYYYMMDDHHmmss
acFloatAC 측정값
preventPotentialFloat방식 전위
batteryVoltageFloat배터리 전압
sensitivityFloat수신 감도
dataModeString데이터 모드
0. 통신주기(분)/수집주기(분),
1. 통신주기(시)/수집주기(분)
2. 통신주기(시)/수집주기(시)
dataCycleInteger수집주기
networkCycleInteger통신주기
temperatureFloat장치 온도
humidityInteger습도
 
devicedataAs 데이터 구조
이름타입설명
idInteger레코드 ID
siteKeyString사이트 키
typeString장비 타입
A. 두께측정장비
deviceKeyString장비 아이디
statusDatetimeString발생일자: YYYYMMDDHHmmss
dataModeString데이터 모드
3. 통신주기(분)/수집주기(분),
5. 통신주기(시)/수집주기(분)
6. 통신주기(시)/수집주기(시)
dataCycleInteger수집주기
networkCycleInteger통신주기
ai1FloatAnalog Input 1
ai2FloatAnalog Input 2
ai3FloatAnalog Input 3
ai4FloatAnalog Input 4
ai5FloatAnalog Input 5
ai6FloatAnalog Input 6
ai7FloatAnalog Input 7
ai8FloatAnalog Input 8
ai9FloatAnalog Input 9
ai10FloatAnalog Input 10
ai11FloatAnalog Input 11
ai12FloatAnalog Input 12
ai13FloatAnalog Input 13
batteryVoltageFloat배터리 전압
sensitivityFloat수신 감도

Open API 이력 관리

현재의 인터페이스 정의서에 따르면 requestS 요청에 따른 responseA 응답을 서비스에서 정확하게 확인할 수 없습니다. 따라서 다음과 같이 보완을 하였으나 정확한 응답은 아닐 수 있습니다. 정확한 확인이 필요하면 장비의 값을 읽어 추가 확인하시기 바랍니다.

 

Open API 이력 관리를 통한 응답 보완

requestS 요청이 발생하면 Open API 이력에 해당 요청을 저장하고 동일한 장비에서 동일한 요청에 대한 응답이 오면 Open API 이력을 업데이트 합니다. requestA 요청이 발생하면 Open API 이력 테이블에 있는 응답을 반환 합니다.

동일한 장비에서 동일한 요청(subCommand)이 여러번 발생할 수 있기 때문에 정확한 응답을 반환하지 못할 가능성이 있습니다.

 

설정 파일에서 권한 설정

//--- 모든 사이트(고객사)에게 Open API 허용시
//---     true이면 모든 사이트가 Open API를 사용할 수 있습니다.
conf.openAPI.useAll = true;

//--- 특정 사이트(고객사)에만 Open API 허용시
//---     Open API의 사용이 허용된 사이트의 ID 배열
conf.openAPI.sites = [];

관련 사이트

https://www.obcon.biz/cms/api-docs/

​ * 주의: 테스트하고자하는 서비스와 동일한 주소를 사용하여야 합니다.

​ (https://www.obcon.biz/cms/ 사용)

https://www.obcon.biz/cms/apiHistories?action=list

​ 요청 받은 Open API와 처리 결과를 표시 합니다.

https://www.obcon.biz/cms/apiHistories?action=makeHmac

​ 값을 입력한 후 HMAC를 생성하여 볼 수 있습니다.

​ 프로그램에서 생성한 HMAC와 비교하여 검증할 수 있습니다.

 

최종 수정일: 2024-09-30 12:26:19

이전글 :
다음글 :