# Instrucoes de Integracao: Cameras JC181 e JC400D para SmartGPS **Data:** 25/02/2026 **Servidor IoTHub:** 144.76.103.132 **API de Comandos:** http://144.76.103.132:10088/api/device/sendInstruct --- ## Resumo Rapido | | JC181 | JC400D | |---|---|---| | **Protocolo** | JT/T 808/1078 | JIMI Nativo | | **Gateway (porta)** | 21122 | 21100 | | **Iniciar stream** | `proNo=37121` + JSON | `proNo=128` + `RTMP,ON,IN` ou `OUT` | | **Parar stream** | `proNo=37122` + JSON | `proNo=128` + `RTMP,OFF` | | **Transporte video** | RTP (porta 10002) | RTMP (porta 1936) | | **URL consumo** | `/1/{IMEI}.flv` ou `/2/{IMEI}.flv` | `/live/{IMEI}.flv` | | **Cameras simultaneas** | Sim (canais independentes) | Nao (uma de cada vez) | --- ## 1. Parametros Comuns da API Todas as chamadas usam o mesmo endpoint: ``` POST http://144.76.103.132:10088/api/device/sendInstruct Content-Type: application/x-www-form-urlencoded ``` Parametros obrigatorios em todas as chamadas: | Parametro | Valor | |-----------|-------| | `token` | `a12341234123` | | `platform` | `web` | | `serverFlagId` | ID unico por requisicao (use timestamp ou sequencial) | --- ## 2. JC181 - Streaming ao Vivo ### 2.1 Iniciar Stream (proNo=37121) ```bash curl -X POST http://144.76.103.132:10088/api/device/sendInstruct \ -d "deviceImei={IMEI}" \ -d "proNo=37121" \ -d 'cmdContent={"channel":1,"dataType":0,"codeStreamType":1,"videoIP":"144.76.103.132","videoTCPPort":10002,"videoUDPPort":0}' \ -d "token=a12341234123" \ -d "serverFlagId={ID_UNICO}" \ -d "platform=web" ``` **Parametros do cmdContent (JSON):** | Campo | Valores | Descricao | |-------|---------|-----------| | `channel` | `1` = frontal, `2` = cabine | Canal da camera | | `dataType` | `0` = audio+video, `1` = somente video | Tipo de midia | | `codeStreamType` | `0` = HD (main), `1` = SD (sub) | Qualidade | | `videoIP` | `"144.76.103.132"` | IP do servidor de midia (fixo) | | `videoTCPPort` | `10002` | Porta RTP (fixo) | | `videoUDPPort` | `0` | Nao utilizado | **Para abrir as duas cameras simultaneamente**, envie duas requisicoes: - Uma com `"channel":1` (frontal) - Outra com `"channel":2` (cabine) ### 2.2 Parar Stream (proNo=37122) ```bash curl -X POST http://144.76.103.132:10088/api/device/sendInstruct \ -d "deviceImei={IMEI}" \ -d "proNo=37122" \ -d 'cmdContent={"cmd":0,"channel":1,"dataType":0,"codeStreamType":1}' \ -d "token=a12341234123" \ -d "serverFlagId={ID_UNICO}" \ -d "platform=web" ``` ### 2.3 URL de Consumo (JC181) ``` Camera frontal: http://144.76.103.132:8881/1/{IMEI}.flv Camera cabine: http://144.76.103.132:8881/2/{IMEI}.flv ``` **Exemplo real (IMEI 860112070124823):** ``` http://144.76.103.132:8881/1/860112070124823.flv http://144.76.103.132:8881/2/860112070124823.flv ``` ### 2.4 Playback de Gravacoes (JC181) **Listar gravacoes (proNo=37381):** ```bash curl -X POST http://144.76.103.132:10088/api/device/sendInstruct \ -d "deviceImei={IMEI}" \ -d "proNo=37381" \ -d 'cmdContent={"channel":0,"beginTime":"260225000000","endTime":"260225235959","alarmType":0,"resourceType":0,"codeType":0,"instructionID":"query001"}' \ -d "token=a12341234123" \ -d "serverFlagId={ID_UNICO}" \ -d "platform=web" ``` Formato do `beginTime`/`endTime`: `AAMMDDHHMMSS` (ex: `260225143000` = 2026-02-25 14:30:00) A lista de arquivos e enviada via push no endpoint `/pushresourcelist`. **Iniciar playback (proNo=37377):** ```bash curl -X POST http://144.76.103.132:10088/api/device/sendInstruct \ -d "deviceImei={IMEI}" \ -d "proNo=37377" \ -d 'cmdContent={"channel":1,"beginTime":"260225100000","endTime":"260225103000","videoIP":"144.76.103.132","videoTCPPort":10003,"videoUDPPort":0,"playMethod":0,"forwardRewind":0,"codeType":0}' \ -d "token=a12341234123" \ -d "serverFlagId={ID_UNICO}" \ -d "platform=web" ``` **URL de playback:** ``` http://144.76.103.132:8881/1/{IMEI}.history.flv ``` --- ## 3. JC400D - Streaming ao Vivo ### 3.1 Iniciar Stream (proNo=128) **Camera interna (IN):** ```bash curl -X POST http://144.76.103.132:10088/api/device/sendInstruct \ -d "deviceImei={IMEI}" \ -d "proNo=128" \ -d "cmdContent=RTMP,ON,IN" \ -d "token=a12341234123" \ -d "serverFlagId={ID_UNICO}" \ -d "platform=web" ``` **Camera frontal/externa (OUT):** ```bash curl -X POST http://144.76.103.132:10088/api/device/sendInstruct \ -d "deviceImei={IMEI}" \ -d "proNo=128" \ -d "cmdContent=RTMP,ON,OUT" \ -d "token=a12341234123" \ -d "serverFlagId={ID_UNICO}" \ -d "platform=web" ``` **IMPORTANTE - Restricoes do firmware antigo (V2.3.1):** - NAO usar `RTMP,ON,INOUT` (nao funciona nesta versao) - Apenas UMA camera de cada vez - Para trocar de camera: envie `RTMP,OFF`, aguarde 3 segundos, depois `RTMP,ON,{IN ou OUT}` ### 3.2 Parar Stream ```bash curl -X POST http://144.76.103.132:10088/api/device/sendInstruct \ -d "deviceImei={IMEI}" \ -d "proNo=128" \ -d "cmdContent=RTMP,OFF" \ -d "token=a12341234123" \ -d "serverFlagId={ID_UNICO}" \ -d "platform=web" ``` ### 3.3 URL de Consumo (JC400D) ``` http://144.76.103.132:8881/live/{IMEI}.flv ``` **Exemplo real (IMEI 862798050567391):** ``` http://144.76.103.132:8881/live/862798050567391.flv ``` **ATENCAO:** Para o firmware antigo, NAO usar canal na URL. A mesma URL serve para IN e OUT (muda conforme o comando enviado). ### 3.4 Playback/Download de Gravacoes (JC400D) **Download de video da memoria interna (HVIDEO):** ```bash curl -X POST http://144.76.103.132:10088/api/device/sendInstruct \ -d "deviceImei={IMEI}" \ -d "proNo=128" \ -d "cmdContent=HVIDEO,2026_02_25_14_30_00,1" \ -d "token=a12341234123" \ -d "serverFlagId={ID_UNICO}" \ -d "platform=web" ``` Formato: `HVIDEO,YYYY_MM_DD_HH_MM_SS,{Camera}` (Camera: 1=frontal, 2=interna) **Recorte do cartao SD (EVIDEO):** ```bash curl -X POST http://144.76.103.132:10088/api/device/sendInstruct \ -d "deviceImei={IMEI}" \ -d "proNo=128" \ -d "cmdContent=EVIDEO,2026-02-25 14:30:00,1,30" \ -d "token=a12341234123" \ -d "serverFlagId={ID_UNICO}" \ -d "platform=web" ``` Formato: `EVIDEO,YYYY-MM-DD HH:MM:SS,{Camera},{Duracao_seg}` (Duracao: 10-60 segundos) Apos upload, o IoTHub notifica via `/pushalarm` com `alertType: 105`. Download: ``` http://144.76.103.132:23010/download/{nome_do_arquivo} ``` **Streaming de playback (REPLAYLIST):** ```bash # 1. Configurar webhook para receber lista de arquivos curl -X POST ... -d "cmdContent=FILELIST,http://{SEU_SERVIDOR}/api/filelist" # 2. Solicitar lista de arquivos do cartao SD curl -X POST ... -d "cmdContent=TFFILELIST,20260225,0" # Formato: TFFILELIST,YYYYMMDD,{Camera} (0=ambas, 1=frontal, 2=interna) # 3. Iniciar playback do arquivo recebido na lista curl -X POST ... -d "cmdContent=REPLAYLIST,2026_02_25_14_30_00_01.mp4" # 4. Encerrar playback curl -X POST ... -d "cmdContent=REPLAYLIST,OFF" ``` --- ## 4. Codigos de Resposta | Codigo | Significado | Acao | |--------|-------------|------| | `100` | Sucesso | Stream deve iniciar em 2-5 segundos | | `200` | Parametros invalidos | Verificar formato do comando | | `300` | Dispositivo offline | Dispositivo nao conectado ao gateway | | `301` | Nao encontrado na tabela de roteamento | IMEI nunca conectou ao IoTHub | | `302` | Dispositivo ocupado | Aguardar 5s e tentar novamente | | `400` | Erro de rede | Tentar novamente apos 2s | | `500` | Erro interno | Verificar status dos servicos | | `600` | Timeout (60s) | Dispositivo nao respondeu | --- ## 5. Fluxo de Integracao no Frontend ### 5.1 Logica para Iniciar Stream ``` 1. Identificar modelo do dispositivo (JC181 ou JC400D) 2. Enviar comando de inicio conforme o modelo: - JC181: proNo=37121, cmdContent=JSON com channel - JC400D: proNo=128, cmdContent=RTMP,ON,IN ou OUT 3. Verificar resposta (_code=100 = sucesso) 4. Aguardar 2-3 segundos para o dispositivo estabelecer conexao 5. Conectar player na URL de consumo: - JC181: http://144.76.103.132:8881/{channel}/{IMEI}.flv - JC400D: http://144.76.103.132:8881/live/{IMEI}.flv 6. Se player nao conectar em 15s, tentar novamente ``` ### 5.2 Player de Video (mpegts.js) ```javascript // Usando mpegts.js para reproduzir FLV const player = mpegts.createPlayer({ type: 'flv', isLive: true, url: streamUrl // URL conforme modelo do dispositivo }); player.attachMediaElement(document.getElementById('video')); player.load(); player.play(); ``` ### 5.3 Logica para Parar Stream ``` 1. Destruir player de video 2. Enviar comando de parada: - JC181: proNo=37122, cmdContent=JSON com cmd:0 - JC400D: proNo=128, cmdContent=RTMP,OFF 3. Stream tambem para automaticamente se ninguem assistir por 20 segundos ``` --- ## 6. Configuracao Inicial de Dispositivos ### JC181 (so precisa configurar o servidor gateway) ```bash curl -X POST http://144.76.103.132:10088/api/device/sendInstruct \ -d "deviceImei={IMEI}" \ -d "proNo=128" \ -d "cmdContent=SERVER,0,144.76.103.132,21122,0#" \ -d "token=a12341234123" \ -d "serverFlagId=1" \ -d "platform=web" ``` ### JC400D (precisa de 4 comandos) ```bash # 1. Ativar modo integracao cmdContent=COREKITSW,0 # 2. Apontar para o gateway cmdContent=SERVER,0,144.76.103.132,21100 # 3. Configurar servidor de upload cmdContent=UPLOAD,http://144.76.103.132:23010/upload # 4. Configurar servidor RTMP cmdContent=RSERVICE,144.76.103.132:1936/live ``` (Todos com `proNo=128`, mesmos parametros de token/platform) --- ## 7. Portas que Devem Estar Acessiveis | Porta | Servico | Direcao | Uso | |-------|---------|---------|-----| | 21100 | Gateway JIMI | Dispositivo -> Servidor | Comunicacao JC400D | | 21122 | Gateway JT/T | Dispositivo -> Servidor | Comunicacao JC181 | | 1936 | RTMP Ingestao | Dispositivo -> Servidor | Video RTMP (JC400D) | | 10002 | RTP Live | Dispositivo -> Servidor | Video RTP (JC181) | | 10003 | RTP Playback | Dispositivo -> Servidor | Playback RTP (JC181) | | 8881 | HTTP-FLV | Cliente -> Servidor | Consumo de video (frontend) | | 10088 | API Comandos | Cliente -> Servidor | Envio de comandos | | 23010 | Upload | Dispositivo -> Servidor | Upload de fotos/videos | --- ## 8. Endpoints Push (Recepcao de Dados) O IoTHub envia dados para o servidor configurado no `msg-dispatch-iothub`. A SmartGPS precisa implementar estes endpoints: | Endpoint | Dados | |----------|-------| | `POST /pushgps` | Posicao GPS | | `POST /pushhb` | Heartbeat (bateria, ACC, sinal) | | `POST /pushevent` | Login/logout do dispositivo | | `POST /pushalarm` | Alarmes (velocidade, SOS, colisao, ADAS, DMS) | | `POST /pushAlarmFile` | Notificacao de foto/video de alarme | | `POST /pushresourcelist` | Lista de arquivos do cartao SD | **Formato da requisicao:** ``` Content-Type: application/x-www-form-urlencoded token=a12341234123&data_list=[{...dados JSON...}] ``` **Resposta esperada:** ```json {"code": 0, "msg": "success"} ``` --- **Fim das Instrucoes**