Minicap数据解析(js)

var WebSocketServer = require('ws').Server
  , http = require('http')
  , express = require('express')
  , path = require('path')
  , net = require('net')
  , app = express()

var PORT = process.env.PORT || 9002

app.use(express.static(path.join(__dirname, '/public')))

var server = http.createServer(app)
var wss = new WebSocketServer({ server: server })

wss.on('connection', function(ws) {
  console.info('Got a client')

  var stream = net.connect({
    port: 1717
  })

  stream.on('error', function() {
    console.error('Be sure to run `adb forward tcp:1717 localabstract:minicap`')
    process.exit(1)
  })

  var readBannerBytes = 0
  var bannerLength = 2
  var readFrameBytes = 0
  var frameBodyLength = 0
  var frameBody = new Buffer(0)
  var banner = {
    version: 0
  , length: 0
  , pid: 0
  , realWidth: 0
  , realHeight: 0
  , virtualWidth: 0
  , virtualHeight: 0
  , orientation: 0
  , quirks: 0
  }

  function tryRead() {
    for (var chunk; (chunk = stream.read());) {
      console.info('chunk(length=%d)', chunk.length)
      for (var cursor = 0, len = chunk.length; cursor < len;) {
        if (readBannerBytes < bannerLength) {
          switch (readBannerBytes) {
          case 0:
            // version
            banner.version = chunk[cursor]
            break
          case 1:
            // length
            banner.length = bannerLength = chunk[cursor]
            break
          case 2:
          case 3:
          case 4:
          case 5:
        // pid
        banner.pid +=
          (chunk[cursor] << ((readBannerBytes - 2) * 8)) >>> 0
        break
      case 6:
      case 7:
      case 8:
      case 9:
        // real width
        banner.realWidth +=
          (chunk[cursor] << ((readBannerBytes - 6) * 8)) >>> 0
        break
      case 10:
      case 11:
      case 12:
      case 13:
        // real height
        banner.realHeight +=
          (chunk[cursor] << ((readBannerBytes - 10) * 8)) >>> 0
        break
      case 14:
      case 15:
      case 16:
      case 17:
        // virtual width
        banner.virtualWidth +=
          (chunk[cursor] << ((readBannerBytes - 14) * 8)) >>> 0
        break
      case 18:
      case 19:
      case 20:
      case 21:
        // virtual height
        banner.virtualHeight +=
          (chunk[cursor] << ((readBannerBytes - 18) * 8)) >>> 0
        break
      case 22:
        // orientation
        banner.orientation += chunk[cursor] * 90
        break
      case 23:
        // quirks
        banner.quirks = chunk[cursor]
        break
      }

      cursor += 1
      readBannerBytes += 1

      if (readBannerBytes === bannerLength) {
        console.log('banner', banner)
      }
    }
    else if (readFrameBytes < 4) {
      frameBodyLength += (chunk[cursor] << (readFrameBytes * 8)) >>> 0
      cursor += 1
      readFrameBytes += 1
      console.info('headerbyte%d(val=%d)', readFrameBytes, frameBodyLength)
    }
    else {
      if (len - cursor >= frameBodyLength) {
        console.info('bodyfin(len=%d,cursor=%d)', frameBodyLength, cursor)

        frameBody = Buffer.concat([
          frameBody
        , chunk.slice(cursor, cursor + frameBodyLength)
        ])

        // Sanity check for JPG header, only here for debugging purposes.
        if (frameBody[0] !== 0xFF || frameBody[1] !== 0xD8) {
          console.error(
            'Frame body does not start with JPG header', frameBody)
          process.exit(1)
        }

        ws.send(frameBody, {
          binary: true
        })

        cursor += frameBodyLength
        frameBodyLength = readFrameBytes = 0
        frameBody = new Buffer(0)
      }
      else {
        console.info('body(len=%d)', len - cursor)

        frameBody = Buffer.concat([
          frameBody
        , chunk.slice(cursor, len)
        ])

        frameBodyLength -= len - cursor
        readFrameBytes += len - cursor
        cursor = len
          }
        }
      }
    }
  }

  stream.on('readable', tryRead)

  ws.on('close', function() {
console.info('Lost a client')
stream.end()
  })
})

server.listen(PORT)
console.info('Listening on port %d', PORT)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容