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