EDP KIT from OneNet

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers EdpKit.h Source File

EdpKit.h

00001 #ifndef __EDP_KIT_H__
00002 #define __EDP_KIT_H__
00003 
00004 #ifdef EDPKIT_EXPORTS
00005     #define EDPKIT_DLL __declspec(dllexport)
00006 #else
00007     #define EDPKIT_DLL
00008 #endif
00009 
00010 #include "Common.h"
00011 #include "cJSON.h"
00012 #include "time.h"
00013 /*
00014  * history
00015  * 2015-06-01 v1.0.1 wululu fix bug: malloc for string, MUST memset to 0
00016  * 2015-07-10 v1.1.0 wusongwei add UnpackCmdReq() and PacketCmdResp()
00017  * 2015-07-13 v1.1.1 wululu 增加封装json的接口, windows版本dll
00018  * 2015-07-13 v1.1.2 wululu 支持double和string类型的打包函数和解包函数
00019  * 2015-07-15 v1.1.3 wusongwei 添加SAVEACK响应
00020  * 2015-07-20 v1.1.4 wusongwei 添加/修改SAVEDATA消息的打包/解包函数
00021  */
00022 
00023 #ifdef __cplusplus
00024 extern "C" {
00025 #endif
00026 
00027 /*---------------------------------------------------------------------------*/
00028 #define MOSQ_MSB(A)         (uint8)((A & 0xFF00) >> 8)
00029 #define MOSQ_LSB(A)         (uint8)(A & 0x00FF)
00030 #define BUFFER_SIZE         (0x100) 
00031 #define PROTOCOL_NAME       "EDP"
00032 #define PROTOCOL_VERSION    1
00033 /*----------------------------错误码-----------------------------------------*/
00034 #define ERR_UNPACK_CONNRESP_REMAIN              -1000
00035 #define ERR_UNPACK_CONNRESP_FLAG                -1001
00036 #define ERR_UNPACK_CONNRESP_RTN                 -1002
00037 #define ERR_UNPACK_PUSHD_REMAIN                 -1010
00038 #define ERR_UNPACK_PUSHD_DEVID                  -1011
00039 #define ERR_UNPACK_PUSHD_DATA                   -1012
00040 #define ERR_UNPACK_SAVED_REMAIN                 -1020
00041 #define ERR_UNPACK_SAVED_TANSFLAG               -1021
00042 #define ERR_UNPACK_SAVED_DEVID                  -1022
00043 #define ERR_UNPACK_SAVED_DATAFLAG               -1023
00044 #define ERR_UNPACK_SAVED_JSON                   -1024
00045 #define ERR_UNPACK_SAVED_PARSEJSON              -1025
00046 #define ERR_UNPACK_SAVED_BIN_DESC               -1026
00047 #define ERR_UNPACK_SAVED_PARSEDESC              -1027
00048 #define ERR_UNPACK_SAVED_BINLEN                 -1028
00049 #define ERR_UNPACK_SAVED_BINDATA                -1029
00050 #define ERR_UNPACK_PING_REMAIN                  -1030
00051 #define ERR_UNPACK_CMDREQ                       -1031
00052 #define ERR_UNPACK_ENCRYPT_RESP                 -1032
00053 #define ERR_UNPACK_SAVEDATA_ACK                 -1033
00054 
00055 /*----------------------------消息类型---------------------------------------*/
00056 /* 连接请求 */
00057 #define CONNREQ             0x10
00058 /* 连接响应 */
00059 #define CONNRESP            0x20
00060 /* 转发(透传)数据 */
00061 #define PUSHDATA            0x30
00062 /* 存储(转发)数据 */
00063 #define SAVEDATA            0x80
00064 /* 存储确认 */
00065 #define SAVEACK             0x90
00066 /* 命令请求 */
00067 #define CMDREQ              0xA0
00068 /* 命令响应 */
00069 #define CMDRESP             0xB0
00070 /* 心跳请求 */
00071 #define PINGREQ             0xC0
00072 /* 心跳响应 */
00073 #define PINGRESP            0xD0
00074 /* 加密请求 */
00075 #define ENCRYPTREQ          0xE0
00076 /* 加密响应 */
00077 #define ENCRYPTRESP         0xF0
00078 
00079 #ifndef NULL
00080 #define NULL (void*)0
00081 #endif
00082 
00083 /* SAVEDATA消息支持的格式类型 */
00084 typedef enum {
00085     kTypeFullJson = 0x01,
00086     kTypeBin = 0x02,
00087     kTypeSimpleJsonWithoutTime = 0x03,
00088     kTypeSimpleJsonWithTime = 0x04,
00089     kTypeString = 0x05
00090 }SaveDataType;
00091 
00092 /*-------------发送buffer, 接收buffer, EDP包结构定义-------------------------*/
00093 EDPKIT_DLL 
00094 typedef struct Buffer
00095 {
00096     uint8*  _data;          /* buffer数据 */
00097     uint32  _write_pos;     /* buffer写入位置 */
00098     uint32  _read_pos;      /* buffer读取位置 */
00099     uint32  _capacity;      /* buffer容量 */
00100 }Buffer, SendBuffer, RecvBuffer, EdpPacket;
00101 /*-----------------------------操作Buffer的接口------------------------------*/
00102 /* 
00103  * 函数名:  NewBuffer
00104  * 功能:    生成Buffer
00105  * 说明:    一般情况下, NewBuffer和DeleteBuffer应该成对出现
00106  * 参数:    无
00107  * 返回值:  类型 (Buffer*)
00108  *          返回值非空 生成Buffer成功, 返回这个Buffer的指针
00109  *          返回值为空 生成Buffer失败, 内存不够
00110  */
00111 EDPKIT_DLL Buffer* NewBuffer();
00112 /* 
00113  * 函数名:  DeleteBuffer
00114  * 功能:    销毁Buffer
00115  * 说明:    一般情况下, NewBuffer和DeleteBuffer应该成对出现
00116  * 参数:    buf     一个Buffer的指针的指针
00117  * 返回值:  无
00118  */
00119 EDPKIT_DLL void DeleteBuffer(Buffer** buf);
00120 /* 
00121  * 函数名:  CheckCapacity
00122  * 功能:    检查Buffer是否能够写入长度为len的字节流, 
00123  *          如果Buffer的容量不够, 自动成倍扩展Buffer的容量(不影响Buffer数据)
00124  * 参数:    buf     需要写入Buffer的指针
00125  *          len     期望写入的长度
00126  * 返回值:  类型 (int32)
00127  *          <0      失败, 内存不够
00128  *          =0      成功
00129  */
00130 EDPKIT_DLL int32 CheckCapacity(Buffer* buf, uint32 len);
00131 
00132 /*------------------------读取EDP包数据的接口-------------------------------*/
00133 /* 
00134  * 函数名:  ReadByte
00135  * 功能:    按EDP协议, 从Buffer(包)中读取一个字节数据
00136  * 参数:    pkg     EDP包
00137  *          val     数据(一个字节)
00138  * 返回值:  类型 (int32)
00139  *          <0      失败, pkg中无数据
00140  *          =0      成功
00141  */
00142 EDPKIT_DLL int32 ReadByte(EdpPacket* pkg, uint8* val);
00143 /* 
00144  * 函数名:  ReadBytes
00145  * 功能:    按EDP协议, 从Buffer(包)中读取count个字节数据
00146  * 说明:    val是malloc出来的, 需要客户端自己free 
00147  * 参数:    pkg     EDP包
00148  *          val     数据(count个字节)
00149  *          count   字节数
00150  * 返回值:  类型 (int32)
00151  *          <0      失败, pkg中无数据
00152  *          =0      成功
00153  */
00154 EDPKIT_DLL int32 ReadBytes(EdpPacket* pkg, uint8** val, uint32 count);
00155 /* 
00156  * 函数名:  ReadUint16
00157  * 功能:    按EDP协议, 从Buffer(包)中读取uint16值
00158  * 参数:    pkg     EDP包
00159  *          val     uint16值
00160  * 返回值:  类型 (int32)
00161  *          <0      失败, pkg中无数据
00162  *          =0      成功
00163  */
00164 EDPKIT_DLL int32 ReadUint16(EdpPacket* pkg, uint16* val);
00165 /* 
00166  * 函数名:  ReadUint32
00167  * 功能:    按EDP协议, 从Buffer(包)中读取uint32值
00168  * 参数:    pkg     EDP包
00169  *          val     uint32值
00170  * 返回值:  类型 (int32)
00171  *          <0      失败, pkg中无数据
00172  *          =0      成功
00173  */
00174 EDPKIT_DLL int32 ReadUint32(EdpPacket* pkg, uint32* val);
00175 /* 
00176  * 函数名:  ReadStr
00177  * 功能:    按EDP协议, 从Buffer(包)中读取字符串, 以\0结尾
00178  * 参数:    pkg     EDP包
00179  *          val     字符串
00180  * 说明:    val是malloc出来的, 需要客户端自己free 
00181  * 返回值:  类型 (int32)
00182  *          <0      失败, pkg中无数据
00183  *          =0      成功
00184  */
00185 EDPKIT_DLL int32 ReadStr(EdpPacket* pkg, char** val);
00186 /* 
00187  * 函数名:  ReadRemainlen
00188  * 功能:    按EDP协议, 从Buffer(包)中remainlen
00189  * 说明:    remainlen是EDP协议中的概念, 是一个EDP包身的长度
00190  * 参数:    pkg     EDP包
00191  *          len_val remainlen
00192  * 返回值:  类型 (int32)
00193  *          <0      失败, pkg中无数据
00194  *          =0      成功
00195  */
00196 EDPKIT_DLL int32 ReadRemainlen(EdpPacket* pkg, uint32* len_val);
00197 
00198 /*------------------------数据写入EDP包的接口-------------------------------*/
00199 /*
00200  * 说明:    目前不支持一个包即在写入又在读取, 因此, 只有对于_read_pos为0的包才能被写入
00201  */
00202 /* 
00203  * 函数名:  WriteByte
00204  * 功能:    按EDP协议, 将一个字节数据写入Buffer(包)中
00205  * 参数:    pkg     EDP包
00206  *          byte    数据(一个字节)
00207  * 返回值:  类型 (int32)
00208  *          <0      失败, pkg中无数据
00209  *          =0      成功
00210  */
00211 EDPKIT_DLL int32 WriteByte(Buffer* buf, uint8 byte);
00212 /* 
00213  * 函数名:  WriteBytes
00214  * 功能:    按EDP协议, 将count个字节数据写入Buffer(包)中
00215  * 参数:    pkg     EDP包
00216  *          bytes   数据
00217  *          count   字节数
00218  * 返回值:  类型 (int32)
00219  *          <0      失败, pkg中无数据
00220  *          =0      成功
00221  */
00222 EDPKIT_DLL int32 WriteBytes(Buffer* buf, const void* bytes, uint32 count);
00223 /* 
00224  * 函数名:  WriteUint16
00225  * 功能:    按EDP协议, 将uint16写入Buffer(包)中
00226  * 参数:    pkg     EDP包
00227  *          val     uint16数据
00228  * 返回值:  类型 (int32)
00229  *          <0      失败, pkg中无数据
00230  *          =0      成功
00231  */
00232 EDPKIT_DLL int32 WriteUint16(Buffer* buf, uint16 val);
00233 /* 
00234  * 函数名:  WriteUint32
00235  * 功能:    按EDP协议, 将uint32写入Buffer(包)中
00236  * 参数:    pkg     EDP包
00237  *          val     uint32数据
00238  * 返回值:  类型 (int32)
00239  *          <0      失败, pkg中无数据
00240  *          =0      成功
00241  */
00242 EDPKIT_DLL int32 WriteUint32(Buffer* buf, uint32 val);
00243 /* 
00244  * 函数名:  WriteStr
00245  * 功能:    按EDP协议, 将字符串写入Buffer(包)中
00246  * 参数:    pkg     EDP包
00247  *          val     字符串
00248  * 返回值:  类型 (int32)
00249  *          <0      失败, pkg中无数据
00250  *          =0      成功
00251  */
00252 EDPKIT_DLL int32 WriteStr(Buffer* buf, const char *str);
00253 /* 
00254  * 函数名:  WriteRemainlen 
00255  * 功能:    按EDP协议, 将remainlen写入Buffer(包)中
00256  * 说明:    remainlen是EDP协议中的概念, 是一个EDP包身的长度
00257  * 参数:    pkg     EDP包
00258  *          len_val remainlen
00259  * 返回值:  类型 (int32)
00260  *          <0      失败, pkg中无数据
00261  *          =0      成功
00262  */
00263 EDPKIT_DLL int32 WriteRemainlen(Buffer* buf, uint32 len_val);
00264 /* 
00265  * 函数名:  IsPkgComplete 
00266  * 功能:    判断接收到的Buffer, 是否为一个完整的EDP包
00267  * 参数:    buf     接收到的Buffer(二进制流)
00268  * 返回值:  类型 (int32)
00269  *          =0      数据还未收完, 需要继续接收
00270  *          >0      成功
00271  *          <0      数据错误, 不符合EDP协议
00272  */
00273 EDPKIT_DLL int32 IsPkgComplete(RecvBuffer* buf);
00274 
00275 /*-----------------------------客户端操作的接口------------------------------*/
00276 /* 
00277  * 函数名:  GetEdpPacket 
00278  * 功能:    将接收到的二进制流, 分解成一个一个的EDP包
00279  * 说明:    返回的EDP包使用后, 需要删除
00280  * 相关函数:EdpPacketType, Unpack***类函数
00281  * 参数:    buf         接收缓存
00282  * 返回值:  类型 (EdpPacket*) 
00283  *          非空        EDP协议包
00284  *          为空        无完整的EDP协议包
00285  */
00286 EDPKIT_DLL EdpPacket* GetEdpPacket(RecvBuffer* buf);
00287 
00288 /* 
00289  * 函数名:  EdpPacketType 
00290  * 功能:    获取一个EDP包的消息类型, 客户程序根据消息类型做不同的处理
00291  * 相关函数:Unpack***类函数
00292  * 参数:    pkg         EDP协议包
00293  * 返回值:  类型 (uint8) 
00294  *          值          消息类型(详细参见本h的消息类型定义)
00295  */
00296 /* 例子:
00297  * ...
00298  * int8 mtype = EdpPacketType(pkg);
00299  * switch(mtype)
00300  * {
00301  *  case CONNRESP:
00302  *      UnpackConnectResp(pkg);
00303  *      break;
00304  *  case PUSHDATA:
00305  *      UnpackPushdata(pkg, src_devid, data, data_len);
00306  *      break;
00307  *  case SAVEDATA:
00308  *      UnpackSavedata(pkg, src_devid, flag, data);
00309  *      break;
00310  *  case PINGRESP:
00311  *      UnpackPingResp(pkg); 
00312  *      break;
00313  *  ...
00314  * }
00315  */
00316 EDPKIT_DLL uint8 EdpPacketType(EdpPacket* pkg);
00317 
00318 /* 
00319  * 函数名:  PacketConnect1 
00320  * 功能:    打包 由设备到设备云的EDP协议包, 连接设备云的请求(登录认证方式1)
00321  * 说明:    返回的EDP包发送给设备云后, 需要客户程序删除该包
00322  *          设备云会回复连接响应给设备
00323  * 相关函数:UnpackConnectResp
00324  * 参数:    devid       设备ID, 申请设备时平台返回的ID
00325  *          auth_key    鉴权信息(api-key), 在平台申请的可以操作该设备的api-key字符串
00326  * 返回值:  类型 (EdpPacket*) 
00327  *          非空        EDP协议包
00328  *          为空        EDP协议包生成失败 
00329  */
00330 EDPKIT_DLL EdpPacket* PacketConnect1(const char* devid, const char* auth_key);
00331 
00332 /* 
00333  * 函数名:  PacketConnect2 
00334  * 功能:    打包 由设备到设备云的EDP协议包, 连接设备云的请求(登录认证方式2)
00335  * 说明:    返回的EDP包发送给设备云后, 需要客户程序删除该包
00336  *          设备云会回复连接响应给设备
00337  * 相关函数:UnpackConnectResp
00338  * 参数:    userid      用户ID, 在平台注册账号时平台返回的用户ID
00339  *          auth_info   鉴权信息, 在平台申请设备时填写设备的auth_info属性
00340  *                      (json对象字符串), 该属性需要具备唯一性
00341  * 返回值:  类型 (EdpPacket*) 
00342  *          非空        EDP协议包
00343  *          为空        EDP协议包生成失败 
00344  */
00345 EDPKIT_DLL EdpPacket* PacketConnect2(const char* userid, const char* auth_info);
00346 
00347 /* 
00348  * 函数名:  UnpackConnectResp
00349  * 功能:    解包 由设备云到设备的EDP协议包, 连接响应
00350  * 说明:    接收设备云发来的数据, 通过函数GetEdpPacket和EdpPacketType判断出是连接响应后, 
00351  *          将整个响应EDP包作为参数, 由该函数进行解析
00352  * 相关函数:PacketConnect1, PacketConnect2, GetEdpPacket, EdpPacketType
00353  * 参数:    pkg         EDP包, 必须是连接响应包
00354  * 返回值:  类型 (int32) 
00355  *          =0          连接成功
00356  *          >0          连接失败, 具体失败原因见<OneNet接入方案与接口.docx>
00357  *          <0          解析失败, 具体失败原因见本h文件的错误码
00358  */
00359 EDPKIT_DLL int32 UnpackConnectResp(EdpPacket* pkg);
00360 
00361 /* 
00362  * 函数名:  PacketPushdata
00363  * 功能:    打包 设备到设备云的EDP协议包, 设备与设备之间转发数据
00364  * 说明:    返回的EDP包发送给设备云后, 需要删除这个包
00365  * 相关函数:UnpackPushdata
00366  * 参数:    dst_devid   目的设备ID
00367  *          data        数据
00368  *          data_len    数据长度
00369  * 返回值:  类型 (EdpPacket*) 
00370  *          非空        EDP协议包
00371  *          为空        EDP协议包生成失败 
00372  */
00373 EDPKIT_DLL EdpPacket* PacketPushdata(const char* dst_devid, 
00374         const char* data, uint32 data_len);
00375 
00376 /* 
00377  * 函数名:  UnpackPushdata
00378  * 功能:    解包 由设备云到设备的EDP协议包, 设备与设备之间转发数据
00379  * 说明:    接收设备云发来的数据, 通过函数GetEdpPacket和EdpPacketType判断出是pushdata后, 
00380  *          将整个响应EDP包作为参数, 由该函数进行解析 
00381  *          返回的源设备ID(src_devid)和数据(data)都需要客户端释放
00382  * 相关函数:PacketPushdata, GetEdpPacket, EdpPacketType
00383  * 参数:    pkg         EDP包, 必须是pushdata包
00384  *          src_devid   源设备ID
00385  *          data        数据
00386  *          data_len    数据长度
00387  * 返回值:  类型 (int32) 
00388  *          =0          解析成功
00389  *          <0          解析失败, 具体失败原因见本h文件的错误码
00390  */
00391 EDPKIT_DLL int32 UnpackPushdata(EdpPacket* pkg, char** src_devid, 
00392         char** data, uint32* data_len);
00393 
00394 /* 
00395  * 函数名:  PacketSavedataJson
00396  * 功能:    打包 设备到设备云的EDP协议包, 存储数据(json格式数据)
00397  * 说明:    返回的EDP包发送给设备云后, 需要删除这个包
00398  * 相关函数:UnpackSavedata, UnpackSavedataJson
00399  * 参数:    dst_devid   目的设备ID
00400  *          json_obj    json数据
00401  *          type        json的类型         
00402  * 返回值:  类型 (EdpPacket*) 
00403  *          非空        EDP协议包
00404  *          为空        EDP协议包生成失败 
00405  */
00406 EdpPacket* PacketSavedataJson(const char* dst_devid, cJSON* json_obj, int type);
00407 
00408 /* 
00409  * 函数名:  PacketSavedataInt
00410  * 功能:    打包 设备到设备云的EDP协议包, 存储数据(json格式数据)
00411  * 说明:    该函数适用于数据点为int类型的数据流
00412  *          它把参数封装成EDP协议规定的cJSON对象,
00413  *          type类型决定使用哪种JSON格式,具体格式说明见文档《设备终端接入协议2-EDP.docx》
00414  * 相关函数:UnPacketSavedataInt
00415  * 参数:    type        采用的JSON数据类型,可选类型为:kTypeFullJson, 
00416  *                      kTypeSimpleJsonWithoutTime, kTypeSimpleJsonWithTime
00417  *          dst_devid   目的设备ID
00418  *          ds_id       数据流ID
00419  *          value       int型数据点
00420  *          at          如果设置为0,则采用系统当前时间,否则采用给定时间。
00421  *                      如果type选择为kTypeSimpleJsonWithoutTime,由于这种类型的JSON格式不带时间,
00422  *                      服务器端统一采用系统时间,此值将被忽略
00423  *          token       当type为kTypeFullJson时,将根据EDP协议封装token字段,
00424  *                      为其它类型时将被忽略。
00425  * 返回值:  类型 (EdpPacket*) 
00426  *          非空        EDP协议包
00427  *          为空        EDP协议包生成失败 
00428  */
00429 EDPKIT_DLL EdpPacket* PacketSavedataInt(SaveDataType type, const char* dst_devid, 
00430                     const char* ds_id, int value, 
00431                     time_t at, const char* token);
00432 
00433 /* 
00434  * 函数名:  PacketSavedataDouble
00435  * 功能:    打包 设备到设备云的EDP协议包, 存储数据(json格式数据)
00436  * 说明:    该函数适用于数据点为double类型的数据流
00437  *          它把参数封装成EDP协议规定的cJSON对象,
00438  *          type类型决定使用哪种JSON格式,具体格式说明见文档《设备终端接入协议2-EDP.docx》
00439  * 相关函数:UnPacketSavedataDouble
00440  * 参数:    type        采用的JSON数据类型,可选类型为:kTypeFullJson, 
00441  *                      kTypeSimpleJsonWithoutTime, kTypeSimpleJsonWithTime
00442  *          dst_devid   目的设备ID
00443  *          ds_id       数据流ID
00444  *          value       double型数据点
00445  *          at          如果设置为0,则采用系统当前时间,否则采用给定时间。
00446  *                      如果type选择为kTypeSimpleJsonWithoutTime,由于这种类型的JSON格式不带时间,
00447  *                      服务器端统一采用系统时间,此值将被忽略
00448  *          token       当type为kTypeFullJson时,将根据EDP协议封装token字段,
00449  *                      为其它类型时将被忽略。
00450  * 返回值:  类型 (EdpPacket*) 
00451  *          非空        EDP协议包
00452  *          为空        EDP协议包生成失败 
00453  */
00454 EDPKIT_DLL EdpPacket* PacketSavedataDouble(SaveDataType type, const char* dst_devid, 
00455                 const char* ds_id, double value, 
00456                 time_t at, const char* token);
00457 
00458 /* 
00459  * 函数名:  PacketSavedataString
00460  * 功能:    打包 设备到设备云的EDP协议包, 存储数据(json格式数据)
00461  * 说明:    该函数适用于数据点为char*类型的数据流
00462  *          它把参数封装成EDP协议规定的cJSON对象,
00463  *          type类型决定使用哪种JSON格式,具体格式说明见文档《设备终端接入协议2-EDP.docx》
00464  * 相关函数:UnPacketSavedataString
00465  * 参数:    type        采用的JSON数据类型,可选类型为:kTypeFullJson, 
00466  *                      kTypeSimpleJsonWithoutTime, kTypeSimpleJsonWithTime
00467  *          dst_devid   目的设备ID
00468  *          ds_id       数据流ID
00469  *          value       char*型数据点
00470  *          at          如果设置为0,则采用系统当前时间,否则采用给定时间。
00471  *                      如果type选择为kTypeSimpleJsonWithoutTime,由于这种类型的JSON格式不带时间,
00472  *                      服务器端统一采用系统时间,此值将被忽略
00473  *          token       当type为kTypeFullJson时,将根据EDP协议封装token字段,
00474  *                      为其它类型时将被忽略。
00475  * 返回值:  类型 (EdpPacket*) 
00476  *          非空        EDP协议包
00477  *          为空        EDP协议包生成失败 
00478  */
00479 EDPKIT_DLL EdpPacket* PacketSavedataString(SaveDataType type, const char* dst_devid, 
00480                 const char* ds_id, const char* value, 
00481                 time_t at, const char* token);
00482 
00483 /* 
00484  * 函数名:  UnpackSavedataInt
00485  * 功能:    解包 由设备云到设备的EDP协议包, 存储数据
00486  * 说明:    接收设备云发来的数据,将其中的数据流ID及值解析出来。
00487  *
00488  * 相关函数:PacketSavedataInt
00489  *          
00490  * 参数:    type        采用的JSON数据类型,可选类型为:kTypeFullJson, 
00491  *                      kTypeSimpleJsonWithoutTime, kTypeSimpleJsonWithTime
00492  *          pkg         EDP包, 必须是savedata包
00493  *          ds_id       获取数据流ID,使用完后必须释放
00494  *          value       数据流对应的值
00495  * 返回值:  类型 (int32) 
00496  *          =0          解析成功
00497  *          <0          解析失败, -1 type类型不合法,其它值见本h文件的错误码
00498  */
00499 EDPKIT_DLL int32 UnpackSavedataInt(SaveDataType type, EdpPacket* pkg,
00500                      char** ds_id, int* value);
00501 
00502 /* 
00503  * 函数名:  UnpackSavedataDouble
00504  * 功能:    解包 由设备云到设备的EDP协议包, 存储数据
00505  * 说明:    接收设备云发来的数据,将其中的数据流ID及值解析出来。
00506  *
00507  * 相关函数:PacketSavedataDouble
00508  *          
00509  * 参数:    type        采用的JSON数据类型,可选类型为:kTypeFullJson, 
00510  *                      kTypeSimpleJsonWithoutTime, kTypeSimpleJsonWithTime
00511  *          pkg         EDP包, 必须是savedata包
00512  *          ds_id       获取数据流ID,使用完后必须释放
00513  *          value       数据流对应的值
00514  * 返回值:  类型 (int32) 
00515  *          =0          解析成功
00516  *          <0          解析失败, -1 type类型不合法,其它值见本h文件的错误码
00517  */
00518 EDPKIT_DLL int32 UnpackSavedataDouble(SaveDataType type, EdpPacket* pkg,
00519                     char** ds_id, double* value);
00520 
00521 /* 
00522  * 函数名:  UnpackSavedataString
00523  * 功能:    解包 由设备云到设备的EDP协议包, 存储数据
00524  * 说明:    接收设备云发来的数据,将其中的数据流ID及值解析出来。
00525  *
00526  * 相关函数:PacketSavedataString
00527  *          
00528  * 参数:    type        采用的JSON数据类型,可选类型为:kTypeFullJson, 
00529  *                      kTypeSimpleJsonWithoutTime, kTypeSimpleJsonWithTime
00530  *          pkg         EDP包, 必须是savedata包
00531  *          ds_id       获取数据流ID,使用完后需要释放
00532  *          value       数据流对应的值,使用完后需要释放
00533  * 返回值:  类型 (int32) 
00534  *          =0          解析成功
00535  *          <0          解析失败, -1 type类型不合法,其它值见本h文件的错误码
00536  */
00537 EDPKIT_DLL int32 UnpackSavedataString(SaveDataType type, EdpPacket* pkg,
00538                     char** ds_id, char** value);
00539 
00540 
00541 /* 
00542  * 函数名:  UnpackSavedataAck
00543  * 功能:    解包 由设备云到设备的EDP协议包, 存贮(转发)消息的响应
00544  * 说明:    当存贮(转发)消息带token时,平台会响应一个SAVE_ACK消息,
00545  *          用作存储消息的确认。
00546  * 相关函数: PacketSavedataDoubleWithToken PacketSavedataStringWithToken
00547  * 参数:    pkg         EDP包, 必须是连接响应包
00548  *          json_ack    获取响应的json字符串,使用完后需要释放
00549  * 返回值:  类型 (int32) 
00550  *          =0          心跳成功
00551  *          <0          解析失败, 具体失败原因见本h文件的错误码
00552  */
00553 EDPKIT_DLL int32 UnpackSavedataAck(EdpPacket* pkg, char** json_ack);
00554 
00555 /* 
00556  * 函数名:  PacketSavedataSimpleString
00557  * 功能:    打包 设备到设备云的EDP协议包, 存储数据(以分号分隔的简单字符串形式)
00558  * 说明:    返回的EDP包发送给设备云后, 需要删除这个包
00559  * 相关函数:UnpackSavedataSimpleString
00560  * 参数:    dst_devid   目的设备ID
00561  *          input       以分号分隔的简单字符串形式,
00562  *                      详见《设备终端接入协议2-EDP.docx》
00563  * 返回值:  类型 (EdpPacket*) 
00564  *          非空        EDP协议包
00565  *          为空        EDP协议包生成失败 
00566  */
00567 EDPKIT_DLL EdpPacket* PacketSavedataSimpleString(const char* dst_devid, const char* input);
00568 
00569 /* 
00570  * 函数名:  UnpackSavedataSimpleString
00571  * 功能:    解包 由设备云到设备的EDP协议包, 存储数据
00572  * 说明:    接收设备云发来的数据, 通过函数GetEdpPacket和EdpPacketType判断出是savedata后,
00573  *          将整个响应EDP包作为参数, 由该函数进行解析,
00574  *          获取源端发送来的以分号作为分隔符的字符串。
00575  * 相关函数: PacketSavedataSimpleString
00576  *          
00577  * 参数:    pkg         EDP包, 必须是savedata包
00578  *          output      存储发送来的字符串
00579  * 返回值:  类型 (int32) 
00580  *          =0          解析成功
00581  *          <0          解析失败, 具体失败原因见本h文件的错误码
00582  */
00583 EDPKIT_DLL int32 UnpackSavedataSimpleString(EdpPacket* pkg, char** output);
00584 
00585 /* 
00586  * 函数名:  PacketSavedataBin
00587  * 功能:    打包 设备到设备云的EDP协议包, 存储数据(bin格式数据)
00588  * 说明:    返回的EDP包发送给设备云后, 需要删除这个包
00589  * 相关函数:UnpackSavedata, UnpackSavedataBin
00590  * 参数:    dst_devid   目的设备ID
00591  *          desc_obj    数据描述 json格式
00592  *          bin_data    二进制数据
00593  *          bin_len     二进制数据长度
00594  * 返回值:  类型 (EdpPacket*) 
00595  *          非空        EDP协议包
00596  *          为空        EDP协议包生成失败 
00597  */
00598 EdpPacket* PacketSavedataBin(const char* dst_devid, 
00599         cJSON* desc_obj, const uint8* bin_data, uint32 bin_len);
00600 /* 
00601  * 函数名:  PacketSavedataBinStr
00602  * 功能:    打包 设备到设备云的EDP协议包, 存储数据(bin格式数据)
00603  * 说明:    返回的EDP包发送给设备云后, 需要删除这个包
00604  * 相关函数:UnpackSavedata, UnpackSavedataBin
00605  * 参数:    dst_devid   目的设备ID
00606  *          desc_obj    数据描述 字符串格式
00607  *          bin_data    二进制数据
00608  *          bin_len     二进制数据长度
00609  * 返回值:  类型 (EdpPacket*) 
00610  *          非空        EDP协议包
00611  *          为空        EDP协议包生成失败 
00612  */
00613 EDPKIT_DLL EdpPacket* PacketSavedataBinStr(const char* dst_devid, 
00614         const char* desc_str, const uint8* bin_data, uint32 bin_len);
00615 
00616 /* 
00617  * 函数名:  UnpackSavedata
00618  * 功能:    解包 由设备云到设备的EDP协议包, 存储数据
00619  * 说明:    接收设备云发来的数据, 通过函数GetEdpPacket和EdpPacketType判断出是savedata后,
00620  *          将整个响应EDP包作为参数, 由该函数进行解析 
00621  *          然后再根据json和bin的标识(jb_flag), 调用相应的解析函数
00622  *          返回的源设备ID(src_devid)需要客户端释放
00623  * 相关函数:PacketSavedataJson, PacketSavedataBin, GetEdpPacket, 
00624  *          UnpackSavedataJson, UnpackSavedataBin
00625  * 参数:    pkg         EDP包, 必须是savedata包
00626  *          src_devid   源设备ID
00627  *          jb_flag     json or bin数据, 1: json, 2: 二进制
00628  * 返回值:  类型 (int32) 
00629  *          =0          解析成功
00630  *          <0          解析失败, 具体失败原因见本h文件的错误码
00631  */
00632 EDPKIT_DLL int32 UnpackSavedata(EdpPacket* pkg, char** src_devid, uint8* jb_flag);
00633 
00634 /* 
00635  * 函数名:  UnpackSavedataJson
00636  * 功能:    解包 由设备云到设备的EDP协议包, 存储数据(json格式数据)
00637  * 说明:    返回的json数据(json_obj)需要客户端释放
00638  * 相关函数:PacketSavedataJson, GetEdpPacket, EdpPacketType, UnpackSavedata
00639  * 参数:    pkg         EDP包, 必须是savedata包的json数据包
00640  *          json_obj    json数据 
00641  * 返回值:  类型 (int32) 
00642  *          =0          解析成功
00643  *          <0          解析失败, 具体失败原因见本h文件的错误码
00644  */
00645 int32 UnpackSavedataJson(EdpPacket* pkg, cJSON** json_obj);
00646 
00647 /* 
00648  * 函数名:  UnpackSavedataBin
00649  * 功能:    解包 由设备云到设备的EDP协议包, 存储数据(bin格式数据)
00650  * 说明:    返回的数据描述(desc_obj)和bin数据(bin_data)需要客户端释放
00651  * 相关函数:PacketSavedataBin, GetEdpPacket, EdpPacketType, UnpackSavedata
00652  * 参数:    pkg         EDP包, 必须是savedata包的bin数据包
00653  *          desc_obj    数据描述 json格式
00654  *          bin_data    二进制数据
00655  *          bin_len     二进制数据长度
00656  * 返回值:  类型 (int32) 
00657  *          =0          解析成功
00658  *          <0          解析失败, 具体失败原因见本h文件的错误码
00659  */
00660 int32 UnpackSavedataBin(EdpPacket* pkg, cJSON** desc_obj, 
00661         uint8** bin_data, uint32* bin_len);
00662 /* 
00663  * 函数名:  UnpackSavedataBinStr
00664  * 功能:    解包 由设备云到设备的EDP协议包, 存储数据(bin格式数据)
00665  * 说明:    返回的数据描述(desc_obj)和bin数据(bin_data)需要客户端释放
00666  * 相关函数:PacketSavedataBin, GetEdpPacket, EdpPacketType, UnpackSavedata
00667  * 参数:    pkg         EDP包, 必须是savedata包的bin数据包
00668  *          desc_obj    数据描述 string格式
00669  *          bin_data    二进制数据
00670  *          bin_len     二进制数据长度
00671  * 返回值:  类型 (int32) 
00672  *          =0          解析成功
00673  *          <0          解析失败, 具体失败原因见本h文件的错误码
00674  */
00675 EDPKIT_DLL int32 UnpackSavedataBinStr(EdpPacket* pkg, char** desc_str, 
00676         uint8** bin_data, uint32* bin_len);
00677 /* 
00678  * 函数名:  PacketCmdResp
00679  * 功能:    向接入机发送命令响应
00680  * 说明:    返回的EDP包发送给设备云后, 需要客户程序删除该包
00681  *          
00682  * 相关函数:UnpackCmdReq
00683  * 参数:    cmdid       命令id
00684  *          cmdid_len   命令id长度
00685  *          resp        响应的消息
00686  *          resp_len    响应消息长度
00687  * 返回值:  类型 (EdpPacket*) 
00688  *          非空        EDP协议包
00689  *          为空        EDP协议包生成失败 
00690  */
00691 EDPKIT_DLL EdpPacket* PacketCmdResp(const char* cmdid, uint16 cmdid_len, 
00692         const char* resp, uint32 resp_len);
00693 
00694 /* 
00695  * 函数名:  UnpackCmdReq
00696  * 功能:    解包 由设备云到设备的EDP协议包, 命令请求消息
00697  * 说明:    接收设备云发来的数据, 解析命令请求消息包
00698  *          获取的cmdid以及req需要在使用后释放。
00699  * 相关函数:PacketCmdResp
00700  * 参数:    pkg         EDP包
00701  *          cmdid       获取命令id
00702  *          cmdid_len   cmdid的长度
00703  *          req         用户命令的起始位置
00704  *          req_len     用户命令的长度
00705  * 返回值:  类型 (int32) 
00706  *          =0          解析成功
00707  *          <0          解析失败, 具体失败原因见本h文件的错误码
00708  */
00709 EDPKIT_DLL int32 UnpackCmdReq(EdpPacket* pkg, char** cmdid, uint16* cmdid_len, 
00710                   char** req, uint32* req_len);
00711 
00712 /* 
00713  * 函数名:  PacketPing
00714  * 功能:    打包 由设备到设备云的EDP协议包, 心跳
00715  * 说明:    返回的EDP包发送给设备云后, 需要客户程序删除该包
00716  *          设备云会回复心跳响应给设备
00717  * 相关函数:UnpackPingResp
00718  * 参数:    无
00719  * 返回值:  类型 (EdpPacket*) 
00720  *          非空        EDP协议包
00721  *          为空        EDP协议包生成失败 
00722  */
00723 EDPKIT_DLL EdpPacket* PacketPing(void);
00724 
00725 /* 
00726  * 函数名:  UnpackPingResp
00727  * 功能:    解包 由设备云到设备的EDP协议包, 心跳响应
00728  * 说明:    接收设备云发来的数据, 通过函数GetEdpPacket和EdpPacketType判断出是连接响应后, 
00729  *          将整个响应EDP包作为参数, 由该函数进行解析
00730  * 相关函数:PacketPing, GetEdpPacket, EdpPacketType
00731  * 参数:    pkg         EDP包, 必须是连接响应包
00732  * 返回值:  类型 (int32) 
00733  *          =0          心跳成功
00734  *          >0          心跳失败, 具体失败原因见<OneNet接入方案与接口.docx>
00735  *          <0          解析失败, 具体失败原因见本h文件的错误码
00736  */
00737 EDPKIT_DLL int32 UnpackPingResp(EdpPacket* pkg);
00738 
00739 #ifdef __cplusplus
00740 }
00741 #endif
00742 
00743 #endif /* __EDP_KIT_H__ */