TRANXACT.AI 돕다

IoT 계량기: 장치 등록 및 계량값 서명 방법

IoT 장치: AMI 또는 IoT 엔드포인트를 등록하고, 비밀 키를 복사(한 번만 표시됨)하고, 새 비밀 키로 교체하고, 장치가 /api/public/utilities/iot/reads에 대한 각 요청에 서명하는 방법(예시 요청, 제한 사항 및 받을 수 있는 모든 응답 포함)을 설명합니다.

AMI 또는 IoT 계량기는 HTTPS를 통해 TRANXACT 에 자체 측정값을 게시합니다. 각 장치는 서버에서 생성한 키(utd_ 뒤에 24개의 문자와 숫자가 붙음)와 비밀 키를 가지고 있습니다. 장치는 모든 요청에서 자신이 누구인지 증명하므로 다른 누구도 해당 계량기의 측정값을 게시할 수 없습니다.

기기 등록

  1. CRM > 유틸리티 > 유틸리티 계량기 및 판독 > IoT 장치를 열고 새로 만들기를 누르세요.
  2. 레이블을 입력하고, 읽을 계량기를 선택한 다음, 서명 방식으로 hmac(각 요청에 대한 HMAC-SHA256 서명 - 권장), bearer(토큰으로 전송되는 키와 비밀 키) 또는 둘 다를 선택하십시오.
  3. 이 장치의 분당 최대 읽기 횟수를 설정하고, 펌웨어 버전을 알고 있다면 펌웨어 버전도 설정하십시오.
  4. 저장하세요. 답변에 키와 비밀 키가 표시됩니다. "지금 비밀 키를 복사하세요. 다시 표시되지 않습니다." 두 가지 모두 장치 설정에 입력하세요.

비밀 키는 한 번만 표시됩니다. 이후에는 관리자를 포함하여 누구에게도 다시 표시되지 않습니다. 목록에는 마지막 네 글자("비밀 키 끝")만 표시됩니다. 비밀 키를 분실한 경우 새로 발급받으세요.

비밀을 회전시키다

기기 목록에서 '새 비밀번호'를 누르고 확인하세요. 새 비밀번호는 한 번만 표시되며, 이전 비밀번호는 즉시 사용 중지됩니다. 따라서 기기에 새 비밀번호를 즉시 입력하세요. 기기를 회전시키지 않고 사용을 중지하려면 상태를 '사용 중지됨'으로 설정하고, 서비스에서 제외될 때는 '사용 중지됨'으로 설정하세요.

기기가 측정값을 기록하는 방법

  1. JSON 본문을 구성합니다. 이 본문에는 읽기 시간(ISO 8601 시간)과 읽기 데이터가 포함된 읽기 목록이 포함됩니다. 배터리, 신호, 펌웨어 및 알람 정보는 선택 사항입니다.
  2. 현재 유닉스 시간을 초 단위로 타임스탬프로 사용합니다.
  3. 장치 비밀 키를 사용하여 타임스탬프, 마침표, 그리고 본문의 정확한 바이트("<타임스탬프>.<본문>")를 HMAC-SHA256으로 계산합니다. 그 결과를 64자리 소문자 16진수로 출력합니다.
  4. 본문을 /api/public/utilities/iot/reads로 POST하고 헤더에 X-Utility-Device(키), X-Utility-Timestamp 및 X-Utility-Signature(16진수, 선택적으로 sha256= 접두사 추가)를 포함합니다.
POST https://<your-tranxact-host>/api/public/utilities/iot/reads
Content-Type: application/json
X-Utility-Device: <utd_DEVICE_KEY>
X-Utility-Timestamp: <1792252800>
X-Utility-Signature: sha256=<64 hex characters>

{"reads":[{"read_at":"<2026-10-17T09:30:00Z>","reading":<48213.4>}],
 "battery_pct":<87>,"signal_dbm":<-71>,"firmware":"<2.4.1>",
 "alarms":[{"type":"<leak>","detail":"<continuous flow 6 h>"}]}

동일한 서명이 셸에서 작동하여 장치를 설치하기 전에 테스트할 수 있었습니다.

BODY='{"reads":[{"read_at":"<2026-10-17T09:30:00Z>","reading":<48213.4>}]}'
TS=$(date +%s)
SIG=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "<DEVICE_SECRET>" | sed 's/^.* //')
curl -X POST "https://<your-tranxact-host>/api/public/utilities/iot/reads" \
  -H "Content-Type: application/json" \
  -H "X-Utility-Device: <utd_DEVICE_KEY>" \
  -H "X-Utility-Timestamp: $TS" \
  -H "X-Utility-Signature: sha256=$SIG" \
  --data-binary "$BODY"

보내는 바이트에 정확히 서명하십시오. 서명 후 JSON 형식을 변경하거나 다른 줄 바꿈 문자를 사용하여 전송하면 바이트가 변경되어 서명이 더 이상 일치하지 않습니다.

베어러(또는 둘 다)로 설정된 장치는 Authorization: Bearer <utd_DEVICE_KEY>.<DEVICE_SECRET>와 같은 서명 헤더 없이 전송할 수 있습니다. HMAC는 더 안전한 선택입니다. 비밀 키는 전송되지 않으며, 캡처된 요청은 재사용할 수 없습니다.

제한

  • 타임스탬프는 서버 시계와 5분 이내의 오차 범위 내에 있어야 합니다. 기기의 시계는 NTP로 설정해 두십시오.
  • 동일한 서명된 요청이 두 번 전송되면 재전송 요청으로 간주되어 거부됩니다. 이미 파일에 있는 읽기 작업은 중복으로 간주되어 한 번만 저장됩니다.
  • 최대 64KB의 데이터 읽기 및 500회 읽기 요청, 기기 자체의 분당 최대 읽기 횟수, 그리고 한 주소에서 분당 최대 600건의 요청이 허용됩니다.
  • 해당 장치는 작동 중이어야 하며 계량기에 연결되어 있어야 합니다.

기기가 반환하는 값

답변의미
승인됨, 중복됨, 예외, 거부됨, 경고 및 문제가 포함된 201 또는 200요청이 접수되었습니다. 각 읽기 작업은 집계되며, 인덱스가 유효하지 않은 읽기 작업은 문제(problem)로 표시됩니다.
401 device_auth알 수 없거나 비활성화된 키, 잘못된 모드 또는 일치하지 않는 서명입니다. 장치의 거부 횟수가 증가합니다.
401 오래된 타임스탬프타임스탬프가 5분 이상 차이가 납니다.
409 리플레이서명된 요청서는 이미 접수되었습니다.
413 너무 많이 읽었습니다한 번의 요청으로 500회 이상 조회되었습니다.
422 미터 없음해당 장치는 계량기에 연결되어 있지 않습니다.
429 요금 제한됨전송 속도가 제한 속도를 초과했습니다. 잠시 기다렸다가 다시 보내주세요.
400 bad_json본문은 JSON 형식이 아닙니다.
403 유틸리티_꺼짐해당 회사의 공공요금 공급이 중단되었습니다.

건강 및 경보

  • 각 요청은 기기의 마지막 접속 시간, 배터리 잔량(%) 및 신호 강도(dBm)를 업데이트합니다. 배터리 잔량이 15% 미만이면 배터리 부족 경보가 울립니다.
  • 기기가 보낼 수 있는 알람 유형은 배터리 부족, 변조, 누수, 역류, 유량 없음, 오프라인 및 기타가 있습니다. 기기당 각 유형별로 하나의 알람만 활성화할 수 있습니다.
  • 장치 경보 목록에는 경보가 표시되며, '지우기'를 클릭하면 메모와 함께 경보가 종료됩니다. 누출이 발생하면 즉시 우선순위가 높은 누출 조사 서비스 주문이 생성되며, 변조 또는 역류 경보가 발생할 경우에도 서비스 주문이 생성됩니다.
  • 대시보드의 IoT 미터 보고(24시간) 수치는 지난 하루 동안 신호가 수신된 활성 장치 수를 나타냅니다.