设备接入主要是开发者要实现设备与云平台进行连接、数据交互(上报、透传)、命令控制等过程。目前平台提供多种接入协议类型供选择,分别是TCP、MQTT、TCP透传、HTTP等,通信网络可以是常见的3G/4G、WIFI、以太网口等;设备接入的方案可以是下图中的任何一种:再实现设备接入之前,需要完成以下设备创建的步骤:
之后根据所创建项目的协议类型选择相应硬件进行开发,记录下设备标识与传输密钥。下面分别针对TCP、MQTT、TCP透传、HTTP等协议进行说明:
鉴权机制优势:
token的组成:
token由以上5个参数值组成,每个参数值以"&"字符相连组合,如mtqqdevice1&50046&md5&1566276142807&B8ABEAE97F97C80C3CE7593F9ECDA63Dtoken中sign参数的生成算法为:需将clientId,projectId,method,timestamp四个参数值按固定排序依次拼接(参数间不需要任何拼接字符),再拼接上平台申请的SecretKey,使用method对应的签名算法加签。假设clientId=mydevice,projectId=50023,method=sha256,timestamp=1566276142807,SecretKey=a5528869647040b4a88bb61dcb566eee,那么使用生成的sign参数如下:sign=sha256("mydevice50023sha2561566276142807a5528869647040b4a88bb61dcb566eee)token="mydevice&50023&sha256&1566276142807&"+sign
/*根据协议定义连接请求的结构体*/con_req.msg_type=PACKET_TYPE_CONN_REQ;con_req.device_id="qiuzhb";con_req.key="677abb3a5ff3456fb831c96482f11536";//普通鉴权直接输入传输密钥con_req.ver="V1.0";/*利用SDK中cloud.h中packet_msg方法封包连接协议*/packet=packet_msg(&con_req);/*发送连接协议包数据*/ret=send_packet(sock,packet,strlen(packet),0);若握手连接成功,云端会发送响应成功信息,在设备管理中会看到一个在线标记:若握手连接失败,云端也会发送响应失败信息,告诉失败原因。
利用SDK中提供的接口函数,编写代码将数据上报到平台。以C语言SDK为例,上传一组温度为30℃,湿度为80%RH的数据。
//数据类型为1(JSON格式1字符串)post_req.msg_type=PACKET_TYPE_POST_DATA;post_req.msg_id++;post_req.data_type=1;post_req.data="{\\"nl_temperature\":\"23\",\\"nl_light\":2000\}";post_req.data_len=strlen(post_req.data);packet=packet_msg(&post_req);if(packet==NULL){ MAIN_ERR("packet_msgJSON1error\n");}else{ MAIN_DBG("POSTJSON1\n"); send_flag=1;}/*发送包数据,上报传感数据*/if(send_flag){ ret=send_packet(sock,packet,strlen(packet),0); if(ret<0){ MAIN_ERR("PACKET_TYPE_POST_DATAerror\n"); } free_packet_msg(packet); send_flag=0;}5.查看上报的数据1)设备管理->传感器管理->下发设备按钮右边下拉菜单点击“实时数据开”2)设备管理->传感器管理->历史数据按钮
MQTTS在MQTT协议的基础上加入了SSL/TLS(在SSL/TLS上的MQTT)来提供物联网设备与云平台直接的安全通信功能,设备携带云平台提供的根证书;在使用8883端口建立TLS连接时,设备客户端既对NLECloud进行单向验证,由此,便对中间人攻击带来了较高的要求。TLS单向验证大致流程如下:云平台和设备从CA证书中心取得CA证书(也称根证书),云平台申请生成自已的私钥和证书,客户端用CA证书对云平台的证书进行验证,验证通过说明服务端是合法的,如果验证不过则不与云平台通信。验证通过之后使用一对公钥和密钥进行加解密通信,中间的报文都是加密的。
设备创建时,平台为每个设备分配了唯一的传输密钥(SecretKey),设备接入时需要使用SecretKey计算出的访问token来进行访问安全认证,设备可通过MQTTconnnect报文进行连接,connect报文中三要素填写方法如下:参数是否必须参数说明clientId是设备序列号username是创建设备时平台分配的设备IDpassword是填写经过SecretKey计算的token
本例中,password=经过SecretKey计算的token=clientId&username&method×tamp&sign
若握手连接成功,云端会发送响应成功信息,在设备管理中会看到一个在线标记:若握手连接失败,云端也会发送响应失败信息,告诉失败原因。
组织相应的传感数据,通过MQTT“发送消息”协议进行数据上报。
1)设备管理->传感器管理->下发设备按钮右边下拉菜单点击“实时数据开”2)设备管理->传感器管理->历史数据按钮
在CoAP协议的基础上加入了DTLS来提供物联网设备与云平台直接的安全通信功能,设备携带云平台提供的根证书;在使用5684端口建立DTLS连接时,设备客户端既对NLECloud进行单向验证,由此,便对中间人攻击带来了较高的要求。
设备鉴权成功后,返回结果状态码,同时返回token,该token为后面每次上传数据都需带上,示例:{"ReturnCode":0,"token":"37hp01w1ssqomz8mdfzo001050****ad2b"}
设备与服务器鉴权后,便可以进行传感数据的上报上传:POST/topic/{clientId}/dataHost:nbiot.nlecloud.comPort:5683Accept:application/jsonContent-Format:application/jsonpayload:{your_data}CustomOptions:token
payload说明
"datas":{"apitag1":"value1","apitag2":value2,…}数据类型为2(JSON格式2字符串):apitag1与value数据格式同上,datetime1须是yyyy-mm-ddhh:mm:ss格式"datas":{"apitag1":{"datetime1":"value1"},"apitag2":{"datetime2":"value2"},…}数据类型为3(JSON格式3字符串)示例:value数据格式同上,dt须是yyyy-mm-ddhh:mm:ss格式"datas":[{"apitag":"temperature","datapoints":[{"dt":"2018-01-2222:22:22",//可选"value":36.5//数字浮点字符串}]},{"apitag":"location","datapoints":[…]},{…}]消息上行成功后,返回成功状态码。
大致原理如下,利用CoAP扩展的订阅/发布协议,客户端通过GET请求(设置Option的Oberser值为0)向服务端订阅一个是否有新命令的主题,当服务端检测到有新命令时,通知客户端,客户端在该请求的Respond中编写接收命令和业务逻辑,订阅请求如下:POST/topic/{clientId}/cmdHost:nbiot.nlecloud.comPort:5683Accept:application/jsonCustomOptions:tokenOberser:0
客户端命令订阅成功后,服务端下发命令(如控制某个传感器的开关),客户端会在上次订阅请求的Response中接收到命令,命令报文格式如下:{"t":5,"cmdid":“123456789”,"apitag":"rgb_open","data":{见下表说明}}
客户端处理好命令后,会上传处理结果给服务端,通用消息类型NONPOST请求上传数据资源:
POST/topic/{clientId}/dataHost:nbiot.nlecloud.comPort:5683Accept:application/jsonContent-Format:application/jsonpayload:{your_data}CustomOptions:token
HTTP协议接入主要是采用RESTful风格的"添加传感数据"API接口实现上报数据,不需要建立“连接请求”等过程;在云端添加好传感器后即可直接以JSON格式进行数据的上报。以下为具体的步骤: