OpenWrt 电信elink协议实现

e-Link(翼联)协议是中国电信在智能家居领域面向合作伙伴提供的对外开放协议和接口,在终端联网、平台对接等方面开放互联互通的基础能力。借助中国电信光宽和渠道优势,串联合作伙伴优质产品和服务,共同创造优秀的用户体验。目前e-Link协议主要包括两类:

智能组网

一类是以中国电信智能网关为基础开放e-Link快速连接协议,解决家庭终端接入家庭网络的配置复杂、技术门槛高的问题。通过开放连接,实现无线AP、电力猫、无线中继以及具备WiFi能力的EOC终端等设备的自配置接入家庭网络,达到用户终端零配置。截止目前业界主流的组网终端厂商TP-Link、中兴、华为、H3C、腾达、磊科、必联、烽火、海亿康等已完成了10余款组网终端的产品开发,2016年已启动智能组网产品的全国推广试点,为用户提供无线覆盖分析报告,家庭组网终端推荐,组网方案设计等相关服务,在上海、四川、广东、浙江、江苏等省公司采购累计超过20万台。

基于中国电信定义的e-Link智能组网协议,支持e-Link的无线组网设备可以与天翼网关配合,实现:

Ø无线组网设备自动学习并同步天翼网关的Wi-Fi配置,无需用户配置,即插即用

Ø同一个SSID下的家庭Wi-Fi无缝覆盖

  • 用户在不同房间漫游时无需重新登录

  • 一键配置智能家居设备联网,一次加入,随处使用

Ø只需安装一个手机APP(天翼网关APP)就可以实时了解并管理家庭内所有的终端,如拉黑蹭网设备、对各无线组网设备Wi-Fi进行个性化设置等

智能物联

另一类是面向第三方智能家居云平台,提供云互通OpenAPI及开发指南,进行开放对接,实现互联互通,为中国电信智慧家庭引入丰富的智能家居应用。中国电信目前已经初步建成智能家居开放平台,并与海尔、南京物联进行了智能家居平台互联互通的技术验证和产品对接开发。并与京东、博联、中兴等业界智能应用和平台厂家确定了平台对接的开发计划。


代码框架

function send2GwDH()
    local reqinfo={}
    reqinfo.type="dh"
    reqinfo.sequence=devinfo.sequence
    reqinfo.mac=devinfo.mac
    reqinfo.data={}

    local p, pub, priv=dh.gkey()
    devinfo.pubkey=pub
    devinfo.privkey=priv

    reqinfo.data.dh_key=encodeBase64(devinfo.pubkey)
    reqinfo.data.dh_p=encodeBase64(p)
    reqinfo.data.dh_g=encodeBase64(string.pack('B','5'))
    print("sendto gw dh")

    data=json.encode(reqinfo)
    print(json.encode(reqinfo))
    tcpSendData(data)
    print("recive from gw dh")
end

function reg()
    while true do
        local recdata = tcpRecivedData()
        if recdata then
            recjson = json.decode(recdata)
            if recjson then
                if recjson.type == "keyngack" then
                    send2GwDH() --第四,五步
                elseif recjson.type == "dh" then 
                devinfo.secret=dh.gsecret(decodeBase64(recjson.data.dh_key), devinfo.privkey)
--第六步根据网关的公钥和自己的私钥生成共享密钥(共享密钥同网关共享密钥),组网终端与智能家庭网关采用共享密钥加解密通讯参数。
                    send2GwReg() --发送设备注册信息
                    return keepRun()
                end
            end
        else
            return nil
        end
    end
end
--第三步
function send2GwKeyngreq()
    local reqinfo={}
    reqinfo.type="keyngreq"
    reqinfo.sequence=devinfo.sequence
    reqinfo.mac=devinfo.mac
    reqinfo.keymodelist={}
    reqinfo.keymodelist[1]={}
    reqinfo.keymodelist[1].keymode="dh"

    data=json.encode(reqinfo)
    print(json.encode(reqinfo))
    tcpSendData(data)
    print("recive from gw Keyngreq")
    --print(tcpRecivedData())
end
--第三步
while true do
    if buildDevinfo() then
        if fromSysGet("uttcli get sysConf brideg_mode_flag") == "0" then
            os.execute("uttcli set  sysConf  sysConf brideg_mode_flag 1 ")
            os.execute("elink_route_bridge.sh ")
        end
        send2GwKeyngreq()
        reg()
        tcp:close()
    end
    sleep(2)
end

第三步开始,如上图发送的协商密钥生成方式格式组包lua代码如下:

function send2GwKeyngreq()
    local reqinfo={}
    reqinfo.type="keyngreq"
    reqinfo.sequence=devinfo.sequence
    reqinfo.mac=devinfo.mac
    reqinfo.keymodelist={}
    reqinfo.keymodelist[1]={}
    reqinfo.keymodelist[1].keymode="dh"

    data=json.encode(reqinfo)
    print(json.encode(reqinfo))
    tcpSendData(data)
    print("recive from gw Keyngreq")
    --print(tcpRecivedData())
end

第四步,智能家庭网关完成双方密钥协商,组网终端采用DH加密算法,发送组网终端公钥给智能家庭网关:

function send2GwDH()
    local reqinfo={}
    reqinfo.type="dh"
    reqinfo.sequence=devinfo.sequence
    reqinfo.mac=devinfo.mac
    reqinfo.data={}
    --生成公钥和私钥
    local p, pub, priv=dh.gkey() 
    devinfo.pubkey=pub
    devinfo.privkey=priv
    --生成公钥和私钥
    --经过base64编码后根据指定格式发送数据给家庭智能网关
    reqinfo.data.dh_key=encodeBase64(devinfo.pubkey)
    reqinfo.data.dh_p=encodeBase64(p)
    reqinfo.data.dh_g=encodeBase64(string.pack('B','5'))
    print("sendto gw dh")
    --经过base64编码后根据指定格式发送数据给家庭智能网关

    data=json.encode(reqinfo)
    print(json.encode(reqinfo))
    tcpSendData(data)
    print("recive from gw dh")
end

协商前发送数据代码:

function tcpSendData(data)
    devinfo.sequence=devinfo.sequence+1
    tcp:send(string.pack('>I>I',0x3f721fb5,#data)..data)
end

接收数据代码:

function tcpRecivedData()
    local data=tcp:receive(8)
    if data then
        flag, datalen=string.unpack('>I>I',data)
        --print("tcp recive 4 byte len "..datalen)
        data=tcp:receive(datalen)
        return data
    else
        return nil
    end
end

协商后发送加密数据代码:

function sendSecretData(reqinfo)
    local jsondata= json.encode(reqinfo)
    print("send:  "..jsondata)
    local aesdata= aes.encrypt_cbc(jsondata,devinfo.secret)
    --私钥devinfo.secret参与加密
    tcpSendData(aesdata)
end

解密收到数据代码:

function recivedSecretData()
    local data = tcpRecivedData()    if data then
        local respjson=aes.decrypt_cbc(data, devinfo.secret) 
        --私钥devinfo.secret参与解密
        print("get:"..respjson)        local jsondata= json.decode(respjson)        return jsondata    else
        print("get rec error")        return nil
    endend


本文章由作者:佐须之男 整理编辑,原文地址: OpenWrt 电信elink协议实现
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐