buttplugio / docs.buttplug.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Document Galaku Protocol

blackspherefollower opened this issue · comments

BT Name: GX29

0x2381bbabd2ecXXX3bba33bYY where

  • XXX is speed: not linear, likely encoded
  • YY seems to be a checksum

--

BT Name: GK36

Value: 0x2381bbabd24b47202ba33b46

Implementation Sample

Classify Product Type

  • one-engine device
  • two-engine device
  • electric-shock device (dianji device)

Sample Code

function isTwoEngineDevice(e) {
    var i = e.indexOf("GS08");
    return -1 != i || -1 != (i = e.indexOf("GSA8")) || -1 != (i = e.indexOf("GS13")) || -1 != (i = e.indexOf("G29A")) || -1 != (i = e.indexOf("GK36")) || -1 != (i = e.indexOf("K311")) || -1 != (i = e.indexOf("G311")) || -1 != (i = e.indexOf("G317")) || -1 != (i = e.indexOf("G312")) || -1 != (i = e.indexOf("G307")) || -1 != (i = e.indexOf("G320"))
}

function isDianjiDevice(e) {
    var i = e.indexOf("GK36");
    return -1 != i || -1 != (i = e.indexOf("K311")) || -1 != (i = e.indexOf("G311"))
}

/** All devices **/
function getDisplayNameByName(e) {
    var i = e.indexOf("EJX-Para");
    return -1 != i ? "觅雅Miya" : -1 != (i = e.indexOf("GK03")) ? "胶囊跳蛋" : -1 != (i = e.indexOf("GK10085")) ? "夏娜" : -1 != (i = e.indexOf("GS03")) ? "胶囊跳蛋" : -1 != (i = e.indexOf("GS07")) ? "觅雅Miya" : -1 != (i = e.indexOf("GS85")) ? "夏娜" : -1 != (i = e.indexOf("GS02")) ? "超薄穿戴" : -1 != (i = e.indexOf("GS10")) ? "贝拉" : -1 != (i = e.indexOf("GS01")) ? "进阶后庭" : -1 != (i = e.indexOf("GS08")) ? "线控双跳" : -1 != (i = e.indexOf("GSA8")) ? "线控双跳" : -1 != (i = e.indexOf("GS04")) ? "章鱼" : -1 != (i = e.indexOf("GS17")) ? "胶囊口红" : -1 != (i = e.indexOf("GS13")) ? "元气章鱼Mini" : -1 != (i = e.indexOf("GS21")) ? "元气猫" : -1 != (i = e.indexOf("GS23")) ? "异次元1号" : -1 != (i = e.indexOf("GS22")) ? "幻影X" : -1 != (i = e.indexOf("GS16")) ? "元气草莓" : -1 != (i = e.indexOf("GS19")) ? "觅喜mini" : -1 != (i = e.indexOf("AK04")) ? "Doris 朵丽丝" : -1 != (i = e.indexOf("AS67")) ? "振动棒" : -1 != (i = e.indexOf("AS90")) ? "飞机杯" : -1 != (i = e.indexOf("K020")) ? "蘑菇跳蛋" : -1 != (i = e.indexOf("GS25")) ? "花季系列" : -1 != (i = e.indexOf("GH28")) ? "后庭战士" : -1 != (i = e.indexOf("GS28")) ? "后庭战士" : -1 != (i = e.indexOf("LL18")) ? "角斗士" : -1 != (i = e.indexOf("GK23")) ? "元气萌宠" : -1 != (i = e.indexOf("GK27")) ? "小钢炮Cannon-GT" : -1 != (i = e.indexOf("G29B")) ? "小魔盒" : -1 != (i = e.indexOf("G29A")) ? "小魔方" : -1 != (i = e.indexOf("GA23")) ? "小鲸鱼" : -1 != (i = e.indexOf("L26H")) ? "角斗士" : -1 != (i = e.indexOf("GA25")) ? "丁丁穿戴" : -1 != (i = e.indexOf("GA26")) ? "小豌豆pea" : -1 != (i = e.indexOf("GK22")) ? "觅糖 META" : -1 != (i = e.indexOf("GX85")) ? "夏娜" : -1 != (i = e.indexOf("GX07")) ? "觅雅" : -1 != (i = e.indexOf("GX17")) ? "胶囊口红" : -1 != (i = e.indexOf("GX21")) ? "元气猫" : -1 != (i = e.indexOf("GX33")) ? "异次元1号" : -1 != (i = e.indexOf("GX22")) ? "幻影X" : -1 != (i = e.indexOf("GX16")) ? "元气草莓" : -1 != (i = e.indexOf("GX29")) ? "小魔盒" : -1 != (i = e.indexOf("GX23")) ? "小鲸鱼" : -1 != (i = e.indexOf("GX25")) ? "丁丁穿戴" : -1 != (i = e.indexOf("GX26")) ? "小豌豆" : -1 != (i = e.indexOf("GX36")) ? "电击跳蛋" : -1 != (i = e.indexOf("GX39")) ? "雪糕筒miniAV棒" : -1 != (i = e.indexOf("GK36")) ? "小捣蛋" : -1 != (i = e.indexOf("K311")) ? "芙蕾雅" : -1 != (i = e.indexOf("G311")) ? "芙蕾雅" : -1 != (i = e.indexOf("GX25")) ? "快乐制动器" : -1 != (i = e.indexOf("G317")) ? "扎古飞机杯" : -1 != (i = e.indexOf("G312")) ? "机甲-原主飞机杯" : -1 != (i = e.indexOf("G326")) ? "爱丽丝" : -1 != (i = e.indexOf("G335")) ? "独角兽肛塞" : -1 != (i = e.indexOf("G307")) ? "蜂后炮机" : -1 != (i = e.indexOf("G320")) ? "雅典娜" : e
}

Send Intentsity

Sample Code

Call sendIntentsity()

function sendIntentsity(e) {
    var t = wx.getStorageSync("ble-params").localName,
        i = n.isDianjiDevice(t),
        a = n.isTwoEngineDevice(t);
    if (n.isDianjiDeviceSingle(t) && (a = !1), this.cWrite) {
        if (a) return void this.didSendIntensityTwo(e);
        if (this.intensity1 != e && !i) {
            var r = this.getValue1(e);
            this.intensity1 = r, this.didSendIntensity(r)
        }
    }
    if (i) {
        var s = e,
            c = this.getDianjiInfo();
        if (c.intensity != this.currentDianjiInfo.intensity || c.frequency != this.currentDianjiInfo.frequency) {
            this.currentDianjiInfo = c;
            var o = this,
                u = c.frequency,
                e = c.intensity;
            o.sendDianji(u, e), setTimeout(function() {
                o.didSendIntensity(s)
            }, 100)
        }
    }
}

function didSendIntensity(e) {
    var t = [90, 0, 0, 1, 49, 0, 0, 0, 0, 0];
    t[5] = e;
    var n = i.sendBytes(t, 10),
        a = new Uint8Array(n.length);
    n.forEach(function(e, t) {
        return a[t] = e
    });
    var r = wx.getStorageSync("ble-params"),
        s = r.deviceId,
        c = r.serviceId,
        o = this.cWrite;
    r.localName;
    console.log("serviceId:" + c), console.log("characteristicId:" + o), this.cmd = "set-intensity", wx.writeBLECharacteristicValue({
        deviceId: s,
        serviceId: c,
        characteristicId: o,
        value: a.buffer,
        success: function(e) {}
    })
}

function didSendIntensityTwo(e) {
    var t = e,
        n = e;
    this.madaAEnable || (t = 0), this.madaBEnable || (n = 0);
    var a = [90, 0, 0, 1, 64, 3, t, n, 0, 0];
    a[5] = e;
    var r = i.sendBytes(a, 10),
        s = new Uint8Array(r.length);
    r.forEach(function(e, t) {
        return s[t] = e
    });
    var c = wx.getStorageSync("ble-params"),
        o = c.deviceId,
        u = c.serviceId,
        l = this.cWrite;
    c.localName;
    console.log("serviceId:" + u), console.log("characteristicId:" + l), this.cmd = "set-intensity", wx.writeBLECharacteristicValue({
        deviceId: o,
        serviceId: u,
        characteristicId: l,
        value: s.buffer,
        success: function(e) {}
    })
}

function sendDianji(e, t) {
    console.log("sendDianji fequency:" + e), console.log("sendDianji intensity:" + t);
    var n = [90, 0, 0, 1, 144, 0, 0, 0, 0, 0];
    n[5] = e, n[6] = t;
    var a = i.sendBytes(n, 10),
        r = new Uint8Array(a.length);
    a.forEach(function(e, t) {
        return r[t] = e
    });
    var s = wx.getStorageSync("ble-params"),
        c = s.deviceId,
        o = s.serviceId,
        u = this.cWrite;
    console.log("serviceId:" + o), console.log("characteristicId:" + u), this.cmd = "set-intensity", wx.writeBLECharacteristicValue({
        deviceId: c,
        serviceId: o,
        characteristicId: u,
        value: r.buffer,
        success: function(e) {
            console.log("writeBLECharacteristicValue"), console.log(e)
        }
    })
}

Get Battery Level

Sample Code

Call sendCommandGetBattery() before readValue(e)

function sendCommandGetBattery() {
    console.log("sendCommandGetBattery");
    var e = [90, 0, 0, 1, 19, 0, 0, 0, 0, 0],
        t = i.sendBytes(e, 10),
        n = new Uint8Array(t.length);
    t.forEach(function(e, t) {
        return n[t] = e
    });
    var a = wx.getStorageSync("ble-params"),
        r = a.deviceId,
        s = a.serviceId,
        c = this.cWrite;
    this.cmd = "get-battery", wx.writeBLECharacteristicValue({
        deviceId: r,
        serviceId: s,
        characteristicId: c,
        value: n.buffer,
        success: function(e) {
            console.log("sendCommandGetBattery success", e.errMsg)
        }
    })
}

function readValue(e) {
    var t = this.ab2hex(e),
        i = this.stringToHex(t),
        n = enDesCommand.decrypt(i),
        s = 0;
    if (n.length > 0 && (s = n[4]), s > 0)
        for (var r = getCurrentPages(), o = 0; o < r.length; o++)(u = r[o]).updateBattery && u.updateBattery(s);
    for (var r = getCurrentPages(), a = 0; a < r.length; a++) {
        var u = r[a];
        u.didReadValue && u.didReadValue(this.cmd)
    }
    this.cmd = "", i = []
}

Some shared encrypt/decrypt functions

Sample Code

function ab2hex(e) {
    return Array.prototype.map.call(new Uint8Array(e), function(e) {
        return ("00" + e.toString(16)).slice(-2)
    })
}

function stringToHex(e) {
    for (var t = e.length, i = [], n = 0; n < t; n++) {
        var s = e[n],
            r = parseInt(s, 16);
        i.push(r)
    }
    return i
}

function getKeyTab() {
    return [
        [0, 24, 152, 247, 165, 61, 13, 41, 37, 80, 68, 70],
        [0, 69, 110, 106, 111, 120, 32, 83, 45, 49, 46, 55],
        [0, 101, 120, 32, 84, 111, 121, 115, 10, 142, 157, 163],
        [0, 197, 214, 231, 248, 10, 50, 32, 111, 98, 13, 10]
    ]
}

function getTabKey(r, t) {
    var e = 3 & r;
    return this.getKeyTab()[e][t]
}

function parseIntToByte(r) {
    var t = r;
    return r > 256 ? t = r - 256 : r < 0 && (t = 256 + r), t
}

function calcCheckSum(r, t) {
    for (var e = 0, n = 0; n < t; n++) e += r[n];
    return e
}

function encrypt(r) {
    var t = [],
        e = r[0];
    t.push(e);
    for (var n = 1; n < 12; n++) {
        var a = this.getTabKey(t[n - 1], n),
            u = (a ^ e ^ r[n]) + a,
            s = this.parseIntToByte(u);
        t.push(s)
    }
    return t
}

function decrypt(r) {
    var t = [],
        e = r[0];
    t.push(e);
    for (var n = 1; n < 12; n++) {
        var a = this.getTabKey(r[n - 1], n),
            u = r[n] - a ^ e ^ a,
            s = this.parseIntToByte(u);
        t.push(s)
    }
    return t
}

function sendBytes(r, t) {
    var e = [];
    e[0] = 35;
    for (var n = 0; n < t; n++) {
        var a = r[n];
        e[n + 1] = a
    }
    var u = this.calcCheckSum(e, 11);
    return e[11] = u, this.encrypt(e)
}
{
    "localName": "TFG1",
    "displayName": "Aurora Aircraft Cup",
    "deviceType": 2,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GK27",
    "displayName": "Cannon-GT",
    "deviceType": 2,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GK25",
    "displayName": "Phantom PLUS",
    "deviceType": 2,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "AC695X_1(BLE)",
    "displayName": "vision",
    "deviceType": 2,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "V415",
    "displayName": "Nebula",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GK22",
    "displayName": "Mitang META",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": false,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G29B",
    "displayName": "Little Magic Box",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": false,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GA25",
    "displayName": "Ding Ding wears",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": false,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G29A",
    "displayName": "Little Rubik's Cube",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": false,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GA23",
    "displayName": "Little Whale",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": false,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GA26",
    "displayName": "Little Pea",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": false,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX85",
    "displayName": "Shana",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX07",
    "displayName": "Miya",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX17",
    "displayName": "Capsule lipstick",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX21",
    "displayName": "Vitality Cat",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX33",
    "displayName": "Dimension No. 1",
    "deviceType": 2,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX22",
    "displayName": "Phantom X",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX16",
    "displayName": "Vitality Strawberry",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX29",
    "displayName": "Little Magic Box",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX23",
    "displayName": "Little Whale",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX25",
    "displayName": "Happy Vibrator",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX26",
    "displayName": "Xiaobao Beans",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GK03",
    "displayName": "Capsule Vibrator",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX36",
    "displayName": "Electric Vibrator",
    "deviceType": 3,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GX39",
    "displayName": "Ice cone miniAV stick",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G311",
    "displayName": "Freya",
    "deviceType": 4,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GK36",
    "displayName": "Little Troublemaker",
    "deviceType": 3,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G317",
    "displayName": "Zaku Aircraft Cup",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": true,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G312",
    "displayName": "Mecha-Original Owner's Aircraft Cup",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": true,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G302",
    "displayName": "Little Devil",
    "deviceType": 1,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G321",
    "displayName": "mini ice cream cone",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G304",
    "displayName": "Shia's Collar",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G320",
    "displayName": "Athena",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": true
}, {
    "localName": "G314",
    "displayName": "Vitality Octopus II",
    "deviceType": 1,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G228",
    "displayName": "Little Dolphin",
    "deviceType": 1,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G315",
    "displayName": "Unicorn",
    "deviceType": 1,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G307",
    "displayName": "Queen Bee Gun",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": true
}, {
    "localName": "K311",
    "displayName": "Freya",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G336",
    "displayName": "The Second Generation of Vitality Bird",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G331",
    "displayName": "Octopus glans massager",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G326",
    "displayName": "Alice",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G335",
    "displayName": "Unicorn Butt Plug",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GXA3",
    "displayName": "Whale Test",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": false,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": true,
    "isTelescoping": false
}, {
    "localName": "A456",
    "displayName": "Ace",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": false,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G341",
    "displayName": "Ace",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G324",
    "displayName": "Athena Pulse",
    "deviceType": 6,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G339",
    "displayName": "Rhino Prostate Massager",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G350",
    "displayName": "Vitality Whale",
    "deviceType": 5,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G355",
    "displayName": "Little cute turtle",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G349",
    "displayName": "Little Bullet",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G354",
    "displayName": "Double-A Aircraft Cup",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": true,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G303",
    "displayName": "Little Dinosaur",
    "deviceType": 6,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G407",
    "displayName": "Joy Vibrator",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G204",
    "displayName": "Bowling",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G171",
    "displayName": "Mixin Controller",
    "deviceType": 0,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G12D",
    "displayName": "Hua Chao Brush",
    "deviceType": 0,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G123",
    "displayName": "花sai",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G12B",
    "displayName": "Flower Season",
    "deviceType": 1,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G231",
    "displayName": "Dream Pulse",
    "deviceType": 7,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G23A",
    "displayName": "Dream Vibration",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G29C",
    "displayName": "Little Rubik's Cube",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G29D",
    "displayName": "Small powder cake",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G336",
    "displayName": "The Second Generation of Vitality Bird",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GKML",
    "displayName": "Milly",
    "deviceType": 1,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G348",
    "displayName": "Rhinoceros Back Court",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G23A",
    "displayName": "Dream Vibration",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "A073",
    "displayName": "Joy Vibrator",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "GLMT",
    "displayName": "Rogue Rabbit",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G901",
    "displayName": "Suck the vibrator",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G912",
    "displayName": "Donut",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G913",
    "displayName": "Unicorn II",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G213",
    "displayName": "Phantom",
    "deviceType": 1,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "TFF1",
    "displayName": "F1 Aircraft Cup",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G310",
    "displayName": "Scepter AV Stick",
    "deviceType": 1,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G901",
    "displayName": "Suck the vibrator",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G20B",
    "displayName": "Ballet Vibrator",
    "deviceType": 0,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K112",
    "displayName": "Donut",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K113",
    "displayName": "Unicorn II",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G202",
    "displayName": "Flirting Pen",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K118",
    "displayName": "Ball vibrator",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K107",
    "displayName": "Cyberpunk Airplane Cup",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G203",
    "displayName": "Vitality Cute Pet",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "WSXK",
    "displayName": "Starry Sky CUP",
    "deviceType": 2,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G228",
    "displayName": "Little Dolphin",
    "deviceType": 1,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G310",
    "displayName": "Scepter AV Stick",
    "deviceType": 1,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "TFF1",
    "displayName": "F1 Aircraft Cup",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": true
}, {
    "localName": "TXHL",
    "displayName": "Little gourd vibrating egg",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "TXMM",
    "displayName": "little kitten",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "TXKL",
    "displayName": "Little Dinosaur",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "D358",
    "displayName": "Classic vibration-absorbing AV state",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K108",
    "displayName": "Bell sucking",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K109",
    "displayName": "Ring vibration",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G322",
    "displayName": "Unicorn",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "KWL2",
    "displayName": "Erection Booster",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "TFHL",
    "displayName": "Gyoyo-G (meaning Yue-little gourd)",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "TFMM",
    "displayName": "Gyoyo (meaning joy)",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "TFKL",
    "displayName": "Gyoyo (meaning joy)",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "D402",
    "displayName": "New series of vibrators",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G40A",
    "displayName": "New series of vibrators",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G403",
    "displayName": "New series of vibrators",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "G43A",
    "displayName": "New series of vibrators",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K120",
    "displayName": "Pinky stick",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K12A",
    "displayName": "Little Turtle Stick",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K12B",
    "displayName": "Little Turtle Stick",
    "deviceType": 1,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K12C",
    "displayName": "Xiao Xian Wan",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K125",
    "displayName": "Muscular Man",
    "deviceType": 6,
    "isHotDevice": true,
    "isBleDevice": true,
    "madaCount": 2,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "K119",
    "displayName": "Feather Point Tide Brush",
    "deviceType": 0,
    "isHotDevice": true,
    "isBleDevice": false,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}, {
    "localName": "LL18",
    "displayName": "Mitang",
    "deviceType": 0,
    "isHotDevice": false,
    "isBleDevice": true,
    "madaCount": 1,
    "isStrong": false,
    "isNewBroadcast": false,
    "isTelescoping": false
}
]
}
DeviceType Name
0 ShakeOne
1 DeviceShakeTwo
2 DeviceShakeAndPump
3 DeviceShakeAndDianji
4 DeviceShakeTwoAndDianji
5 DeviceShakeAndDianji2
6 DeviceXiAndChouCha
7 DeviceChouCha