EDP KIT from OneNet

Committer:
ws1992108
Date:
Wed Apr 08 04:00:12 2020 +0000
Revision:
1:bfbe3a09a808
Parent:
0:79de700849c5
by ws

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TaylorGy 0:79de700849c5 1 #include <stdlib.h>
TaylorGy 0:79de700849c5 2 #include <stdio.h>
TaylorGy 0:79de700849c5 3 #include <string.h>
TaylorGy 0:79de700849c5 4 #include <time.h>
TaylorGy 0:79de700849c5 5 #include <assert.h>
TaylorGy 0:79de700849c5 6 #include "EdpKit.h"
TaylorGy 0:79de700849c5 7
TaylorGy 0:79de700849c5 8 #define MKFUN_PACKET_SAVE_DATA(TYPE, NAME) \
TaylorGy 0:79de700849c5 9 EdpPacket* PacketSavedata##NAME(SaveDataType type, \
TaylorGy 0:79de700849c5 10 const char* dst_devid, \
TaylorGy 0:79de700849c5 11 const char* ds_id, \
TaylorGy 0:79de700849c5 12 TYPE value, \
TaylorGy 0:79de700849c5 13 time_t at, \
TaylorGy 0:79de700849c5 14 const char* token){ \
TaylorGy 0:79de700849c5 15 EdpPacket* pkg = NULL; \
TaylorGy 0:79de700849c5 16 switch (type){ \
TaylorGy 0:79de700849c5 17 case kTypeFullJson: \
TaylorGy 0:79de700849c5 18 pkg = PacketSavedataType1##NAME(dst_devid, ds_id, \
TaylorGy 0:79de700849c5 19 value, at, token); \
TaylorGy 0:79de700849c5 20 break; \
TaylorGy 0:79de700849c5 21 case kTypeSimpleJsonWithoutTime: \
TaylorGy 0:79de700849c5 22 pkg = PacketSavedataType2##NAME(dst_devid, ds_id, \
TaylorGy 0:79de700849c5 23 value, at, token); \
TaylorGy 0:79de700849c5 24 break; \
TaylorGy 0:79de700849c5 25 case kTypeSimpleJsonWithTime: \
TaylorGy 0:79de700849c5 26 pkg = PacketSavedataType3##NAME(dst_devid, ds_id, \
TaylorGy 0:79de700849c5 27 value, at, token); \
TaylorGy 0:79de700849c5 28 break; \
TaylorGy 0:79de700849c5 29 default: \
TaylorGy 0:79de700849c5 30 break; \
TaylorGy 0:79de700849c5 31 } \
TaylorGy 0:79de700849c5 32 \
TaylorGy 0:79de700849c5 33 return pkg; \
TaylorGy 0:79de700849c5 34 }
TaylorGy 0:79de700849c5 35
TaylorGy 0:79de700849c5 36 #define MKFUN_PACKET_SAVE_DATA_TYPE1(TYPE, NAME, MED) \
TaylorGy 0:79de700849c5 37 static EdpPacket* PacketSavedataType1##NAME(const char* dst_devid, \
TaylorGy 0:79de700849c5 38 const char* ds_id, \
TaylorGy 0:79de700849c5 39 TYPE value, \
TaylorGy 0:79de700849c5 40 time_t at, \
TaylorGy 0:79de700849c5 41 const char* token){ \
TaylorGy 0:79de700849c5 42 cJSON* json_obj = NULL; \
TaylorGy 0:79de700849c5 43 cJSON* ds_array = NULL; \
TaylorGy 0:79de700849c5 44 cJSON* json_obj_ds = NULL; \
TaylorGy 0:79de700849c5 45 cJSON* dp_array = NULL; \
TaylorGy 0:79de700849c5 46 cJSON* dp_item = NULL; \
TaylorGy 0:79de700849c5 47 char ss[100] = {0}; \
TaylorGy 0:79de700849c5 48 EdpPacket* pkg = NULL; \
TaylorGy 0:79de700849c5 49 \
TaylorGy 0:79de700849c5 50 json_obj = cJSON_CreateObject(); \
TaylorGy 0:79de700849c5 51 \
TaylorGy 0:79de700849c5 52 if(token) { \
TaylorGy 0:79de700849c5 53 cJSON_AddStringToObject(json_obj, "token", token); \
TaylorGy 0:79de700849c5 54 } \
TaylorGy 0:79de700849c5 55 \
TaylorGy 0:79de700849c5 56 ds_array = cJSON_CreateArray(); \
TaylorGy 0:79de700849c5 57 json_obj_ds = cJSON_CreateObject(); \
TaylorGy 0:79de700849c5 58 \
TaylorGy 0:79de700849c5 59 cJSON_AddStringToObject(json_obj_ds, "id", ds_id); \
TaylorGy 0:79de700849c5 60 \
TaylorGy 0:79de700849c5 61 dp_array = cJSON_CreateArray(); \
TaylorGy 0:79de700849c5 62 dp_item = cJSON_CreateObject(); \
TaylorGy 0:79de700849c5 63 \
TaylorGy 0:79de700849c5 64 FormatAt(ss, 100, at); \
TaylorGy 0:79de700849c5 65 cJSON_AddStringToObject(dp_item, "at", ss); \
TaylorGy 0:79de700849c5 66 cJSON_Add##MED##ToObject(dp_item, "value", value); \
TaylorGy 0:79de700849c5 67 cJSON_AddItemToArray(dp_array, dp_item); \
TaylorGy 0:79de700849c5 68 \
TaylorGy 0:79de700849c5 69 cJSON_AddItemToObject(json_obj_ds, "datapoints", dp_array); \
TaylorGy 0:79de700849c5 70 cJSON_AddItemToArray(ds_array, json_obj_ds); \
TaylorGy 0:79de700849c5 71 cJSON_AddItemToObject(json_obj, "datastreams", ds_array); \
TaylorGy 0:79de700849c5 72 \
TaylorGy 0:79de700849c5 73 pkg = PacketSavedataJson(dst_devid, json_obj, \
TaylorGy 0:79de700849c5 74 kTypeFullJson); \
TaylorGy 0:79de700849c5 75 cJSON_Delete(json_obj); \
TaylorGy 0:79de700849c5 76 \
TaylorGy 0:79de700849c5 77 return pkg; \
TaylorGy 0:79de700849c5 78 }
TaylorGy 0:79de700849c5 79
TaylorGy 0:79de700849c5 80 #define MKFUN_PACKET_SAVE_DATA_TYPE2(TYPE, NAME, MED) \
TaylorGy 0:79de700849c5 81 static EdpPacket* PacketSavedataType2##NAME(const char* dst_devid, \
TaylorGy 0:79de700849c5 82 const char* ds_id, \
TaylorGy 0:79de700849c5 83 TYPE value, \
TaylorGy 0:79de700849c5 84 time_t at, \
TaylorGy 0:79de700849c5 85 const char* token) \
TaylorGy 0:79de700849c5 86 { \
TaylorGy 0:79de700849c5 87 cJSON* json_obj = NULL; \
TaylorGy 0:79de700849c5 88 EdpPacket* pkg = NULL; \
TaylorGy 0:79de700849c5 89 \
TaylorGy 0:79de700849c5 90 json_obj = cJSON_CreateObject(); \
TaylorGy 0:79de700849c5 91 cJSON_Add##MED##ToObject(json_obj, ds_id, value); \
TaylorGy 0:79de700849c5 92 \
TaylorGy 0:79de700849c5 93 pkg = PacketSavedataJson(dst_devid, json_obj, \
TaylorGy 0:79de700849c5 94 kTypeSimpleJsonWithoutTime); \
TaylorGy 0:79de700849c5 95 cJSON_Delete(json_obj); \
TaylorGy 0:79de700849c5 96 \
TaylorGy 0:79de700849c5 97 return pkg; \
TaylorGy 0:79de700849c5 98 }
TaylorGy 0:79de700849c5 99
TaylorGy 0:79de700849c5 100
TaylorGy 0:79de700849c5 101 #define MKFUN_PACKET_SAVE_DATA_TYPE3(TYPE, NAME, MED) \
TaylorGy 0:79de700849c5 102 static EdpPacket* PacketSavedataType3##NAME(const char* dst_devid, \
TaylorGy 0:79de700849c5 103 const char* ds_id, \
TaylorGy 0:79de700849c5 104 TYPE value, \
TaylorGy 0:79de700849c5 105 time_t at, \
TaylorGy 0:79de700849c5 106 const char* token){ \
TaylorGy 0:79de700849c5 107 cJSON* json_obj = NULL; \
TaylorGy 0:79de700849c5 108 cJSON* json_obj_ds = NULL; \
TaylorGy 0:79de700849c5 109 char ss[100] = {0}; \
TaylorGy 0:79de700849c5 110 EdpPacket* pkg = NULL; \
TaylorGy 0:79de700849c5 111 \
TaylorGy 0:79de700849c5 112 json_obj = cJSON_CreateObject(); \
TaylorGy 0:79de700849c5 113 FormatAt(ss, 100, at); \
TaylorGy 0:79de700849c5 114 json_obj_ds = cJSON_CreateObject(); \
TaylorGy 0:79de700849c5 115 cJSON_Add##MED##ToObject(json_obj_ds, ss, value); \
TaylorGy 0:79de700849c5 116 cJSON_AddItemToObject(json_obj, ds_id, json_obj_ds); \
TaylorGy 0:79de700849c5 117 \
TaylorGy 0:79de700849c5 118 pkg = PacketSavedataJson(dst_devid, json_obj, \
TaylorGy 0:79de700849c5 119 kTypeSimpleJsonWithTime); \
TaylorGy 0:79de700849c5 120 cJSON_Delete(json_obj); \
TaylorGy 0:79de700849c5 121 \
TaylorGy 0:79de700849c5 122 return pkg; \
TaylorGy 0:79de700849c5 123 }
TaylorGy 0:79de700849c5 124
TaylorGy 0:79de700849c5 125 #define MKFUN_UNPACK_SAVE_DATA(TYPE, NAME) \
TaylorGy 0:79de700849c5 126 int32 UnpackSavedata##NAME(SaveDataType type, \
TaylorGy 0:79de700849c5 127 EdpPacket* pkg, \
TaylorGy 0:79de700849c5 128 char** ds_id, \
TaylorGy 0:79de700849c5 129 TYPE* value) \
TaylorGy 0:79de700849c5 130 { \
TaylorGy 0:79de700849c5 131 int ret = -1; \
TaylorGy 0:79de700849c5 132 switch (type){ \
TaylorGy 0:79de700849c5 133 case kTypeFullJson: \
TaylorGy 0:79de700849c5 134 ret = UnpackSavedataType1##NAME(pkg, ds_id, value); \
TaylorGy 0:79de700849c5 135 break; \
TaylorGy 0:79de700849c5 136 case kTypeSimpleJsonWithoutTime: \
TaylorGy 0:79de700849c5 137 ret = UnpackSavedataType2##NAME(pkg, ds_id, value); \
TaylorGy 0:79de700849c5 138 break; \
TaylorGy 0:79de700849c5 139 case kTypeSimpleJsonWithTime: \
TaylorGy 0:79de700849c5 140 ret = UnpackSavedataType3##NAME(pkg, ds_id, value); \
TaylorGy 0:79de700849c5 141 break; \
TaylorGy 0:79de700849c5 142 default: \
TaylorGy 0:79de700849c5 143 break; \
TaylorGy 0:79de700849c5 144 } \
TaylorGy 0:79de700849c5 145 \
TaylorGy 0:79de700849c5 146 return ret; \
TaylorGy 0:79de700849c5 147 }
TaylorGy 0:79de700849c5 148
TaylorGy 0:79de700849c5 149 #define MKFUN_UNPACK_SAVE_DATA_TYPE1(TYPE, NAME, MED) \
TaylorGy 0:79de700849c5 150 static int32 UnpackSavedataType1##NAME(EdpPacket* pkg, \
TaylorGy 0:79de700849c5 151 char** ds_id, \
TaylorGy 0:79de700849c5 152 TYPE* value) \
TaylorGy 0:79de700849c5 153 { \
TaylorGy 0:79de700849c5 154 cJSON* json_obj = NULL; \
TaylorGy 0:79de700849c5 155 cJSON* ds_array = NULL; \
TaylorGy 0:79de700849c5 156 cJSON* ds_item = NULL; \
TaylorGy 0:79de700849c5 157 char* id = NULL; \
TaylorGy 0:79de700849c5 158 cJSON* dp_array = NULL; \
TaylorGy 0:79de700849c5 159 cJSON* dp_item = NULL; \
TaylorGy 0:79de700849c5 160 char* valuestring = NULL; \
TaylorGy 0:79de700849c5 161 \
TaylorGy 0:79de700849c5 162 if(0 != UnpackSavedataJson(pkg, &json_obj)) \
TaylorGy 0:79de700849c5 163 return ERR_UNPACK_SAVED_JSON; \
TaylorGy 0:79de700849c5 164 \
TaylorGy 0:79de700849c5 165 ds_array = cJSON_GetObjectItem(json_obj, "datastreams"); \
TaylorGy 0:79de700849c5 166 if((0 == ds_array) || (1 != cJSON_GetArraySize(ds_array))) \
TaylorGy 0:79de700849c5 167 return ERR_UNPACK_SAVED_JSON; \
TaylorGy 0:79de700849c5 168 \
TaylorGy 0:79de700849c5 169 ds_item = cJSON_GetArrayItem(ds_array, 0); \
TaylorGy 0:79de700849c5 170 if(0 == ds_item) \
TaylorGy 0:79de700849c5 171 return ERR_UNPACK_SAVED_JSON; \
TaylorGy 0:79de700849c5 172 \
TaylorGy 0:79de700849c5 173 id = cJSON_GetObjectItem(ds_item, "id")->valuestring; \
TaylorGy 0:79de700849c5 174 *ds_id = (char*)malloc(strlen(id)+1); \
TaylorGy 0:79de700849c5 175 memcpy((char*)(*ds_id), id, strlen(id)+1); \
TaylorGy 0:79de700849c5 176 \
TaylorGy 0:79de700849c5 177 dp_array = cJSON_GetObjectItem(ds_item, "datapoints"); \
TaylorGy 0:79de700849c5 178 if((0 == dp_array) || (1 != cJSON_GetArraySize(dp_array))) \
TaylorGy 0:79de700849c5 179 return ERR_UNPACK_SAVED_JSON; \
TaylorGy 0:79de700849c5 180 \
TaylorGy 0:79de700849c5 181 dp_item = cJSON_GetArrayItem(dp_array, 0); \
TaylorGy 0:79de700849c5 182
TaylorGy 0:79de700849c5 183
TaylorGy 0:79de700849c5 184 #define UNPACK_SAVE_DATA_TYPE1_END_STRING \
TaylorGy 0:79de700849c5 185 valuestring = cJSON_GetObjectItem(dp_item, "value")->valuestring; \
TaylorGy 0:79de700849c5 186 *value = (char*)malloc(strlen(valuestring)+1); \
TaylorGy 0:79de700849c5 187 memcpy((char*)(*value), valuestring, strlen(valuestring)+1); \
TaylorGy 0:79de700849c5 188 cJSON_Delete(json_obj); \
TaylorGy 0:79de700849c5 189 return 0; \
TaylorGy 0:79de700849c5 190 }
TaylorGy 0:79de700849c5 191
TaylorGy 0:79de700849c5 192 #define UNPACK_SAVE_DATA_TYPE1_END_NUMBER(TYPE) \
TaylorGy 0:79de700849c5 193 *value = cJSON_GetObjectItem(dp_item, "value")->value##TYPE; \
TaylorGy 0:79de700849c5 194 cJSON_Delete(json_obj); \
TaylorGy 0:79de700849c5 195 return 0; \
TaylorGy 0:79de700849c5 196 }
TaylorGy 0:79de700849c5 197
TaylorGy 0:79de700849c5 198 #define MKFUN_UNPACK_SAVE_DATA_TYPE2(TYPE, NAME, MED) \
TaylorGy 0:79de700849c5 199 static int32 UnpackSavedataType2##NAME(EdpPacket* pkg, \
TaylorGy 0:79de700849c5 200 char** ds_id, \
TaylorGy 0:79de700849c5 201 TYPE* value) \
TaylorGy 0:79de700849c5 202 { \
TaylorGy 0:79de700849c5 203 cJSON* json_obj = NULL; \
TaylorGy 0:79de700849c5 204 cJSON* json_child = NULL; \
TaylorGy 0:79de700849c5 205 size_t len = 0; \
TaylorGy 0:79de700849c5 206 char* valuestring = NULL; \
TaylorGy 0:79de700849c5 207 \
TaylorGy 0:79de700849c5 208 if(0 != UnpackSavedataJson(pkg, &json_obj)) \
TaylorGy 0:79de700849c5 209 return ERR_UNPACK_SAVED_JSON; \
TaylorGy 0:79de700849c5 210 if (!json_obj->child){ \
TaylorGy 0:79de700849c5 211 cJSON_Delete(json_obj); \
TaylorGy 0:79de700849c5 212 return ERR_UNPACK_SAVED_JSON; \
TaylorGy 0:79de700849c5 213 } \
TaylorGy 0:79de700849c5 214 json_child = json_obj->child; \
TaylorGy 0:79de700849c5 215 len = strlen(json_child->string) + 1; \
TaylorGy 0:79de700849c5 216 *ds_id = (char*)malloc(len); \
TaylorGy 0:79de700849c5 217 memcpy((char*)(*ds_id), json_child->string, len); \
TaylorGy 0:79de700849c5 218
TaylorGy 0:79de700849c5 219 #define UNPACK_SAVE_DATA_TYPE23_END_NUMBER(TYPE) \
TaylorGy 0:79de700849c5 220 *value = json_child->value##TYPE; \
TaylorGy 0:79de700849c5 221 cJSON_Delete(json_obj); \
TaylorGy 0:79de700849c5 222 return 0; \
TaylorGy 0:79de700849c5 223 }
TaylorGy 0:79de700849c5 224
TaylorGy 0:79de700849c5 225 #define UNPACK_SAVE_DATA_TYPE23_END_STRING() \
TaylorGy 0:79de700849c5 226 valuestring = json_child->valuestring; \
TaylorGy 0:79de700849c5 227 *value = (char*)malloc(strlen(valuestring)+1); \
TaylorGy 0:79de700849c5 228 memcpy((char*)(*value), valuestring, strlen(valuestring)+1); \
TaylorGy 0:79de700849c5 229 cJSON_Delete(json_obj); \
TaylorGy 0:79de700849c5 230 return 0; \
TaylorGy 0:79de700849c5 231 }
TaylorGy 0:79de700849c5 232
TaylorGy 0:79de700849c5 233 #define MKFUN_UNPACK_SAVE_DATA_TYPE3(TYPE, NAME, MED) \
TaylorGy 0:79de700849c5 234 static int32 UnpackSavedataType3##NAME(EdpPacket* pkg, \
TaylorGy 0:79de700849c5 235 char** ds_id, \
TaylorGy 0:79de700849c5 236 TYPE* value) \
TaylorGy 0:79de700849c5 237 { \
TaylorGy 0:79de700849c5 238 cJSON* json_obj = NULL; \
TaylorGy 0:79de700849c5 239 cJSON* json_child = NULL; \
TaylorGy 0:79de700849c5 240 char* valuestring = NULL; \
TaylorGy 0:79de700849c5 241 size_t len = 0; \
TaylorGy 0:79de700849c5 242 \
TaylorGy 0:79de700849c5 243 if(0 != UnpackSavedataJson(pkg, &json_obj)) \
TaylorGy 0:79de700849c5 244 return ERR_UNPACK_SAVED_JSON; \
TaylorGy 0:79de700849c5 245 \
TaylorGy 0:79de700849c5 246 json_child = json_obj->child; \
TaylorGy 0:79de700849c5 247 if (!json_child || !json_child->string){ \
TaylorGy 0:79de700849c5 248 cJSON_Delete(json_obj); \
TaylorGy 0:79de700849c5 249 return ERR_UNPACK_SAVED_JSON; \
TaylorGy 0:79de700849c5 250 } \
TaylorGy 0:79de700849c5 251 \
TaylorGy 0:79de700849c5 252 len = strlen(json_child->string) + 1; \
TaylorGy 0:79de700849c5 253 *ds_id = (char*)malloc(len); \
TaylorGy 0:79de700849c5 254 memcpy(*ds_id, json_child->string, len); \
TaylorGy 0:79de700849c5 255 \
TaylorGy 0:79de700849c5 256 json_child = json_child->child; \
TaylorGy 0:79de700849c5 257 if (!json_child){ \
TaylorGy 0:79de700849c5 258 cJSON_Delete(json_obj); \
TaylorGy 0:79de700849c5 259 return ERR_UNPACK_SAVED_JSON; \
TaylorGy 0:79de700849c5 260 }
TaylorGy 0:79de700849c5 261
TaylorGy 0:79de700849c5 262
TaylorGy 0:79de700849c5 263 static void FormatAt(char* buffer, int len, time_t now)
TaylorGy 0:79de700849c5 264 {
TaylorGy 0:79de700849c5 265 struct tm timinfo;
TaylorGy 0:79de700849c5 266
TaylorGy 0:79de700849c5 267 if (now == 0){
TaylorGy 0:79de700849c5 268 now = 0; //time(0);
TaylorGy 0:79de700849c5 269 }
TaylorGy 0:79de700849c5 270
TaylorGy 0:79de700849c5 271 #if defined(linux) || defined(__linux) || defined(__linux__)
TaylorGy 0:79de700849c5 272 strftime(buffer, len, "%F %T", localtime_r(&now, &timinfo));
TaylorGy 0:79de700849c5 273 #elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
TaylorGy 0:79de700849c5 274 localtime_s(&timinfo, &now);
TaylorGy 0:79de700849c5 275 strftime(buffer, len, "%F %T", &timinfo);
TaylorGy 0:79de700849c5 276 #endif
TaylorGy 0:79de700849c5 277 }
TaylorGy 0:79de700849c5 278
TaylorGy 0:79de700849c5 279 /*---------------------------------------------------------------------------*/
TaylorGy 0:79de700849c5 280 Buffer* NewBuffer()
TaylorGy 0:79de700849c5 281 {
TaylorGy 0:79de700849c5 282 Buffer* buf = (Buffer*)malloc(sizeof(Buffer));
TaylorGy 0:79de700849c5 283 buf->_data = (uint8*)malloc(sizeof(uint8) * BUFFER_SIZE);
TaylorGy 0:79de700849c5 284 buf->_write_pos = 0;
TaylorGy 0:79de700849c5 285 buf->_read_pos = 0;
TaylorGy 0:79de700849c5 286 buf->_capacity = BUFFER_SIZE;
TaylorGy 0:79de700849c5 287 return buf;
TaylorGy 0:79de700849c5 288 }
TaylorGy 0:79de700849c5 289
TaylorGy 0:79de700849c5 290 void DeleteBuffer(Buffer** buf)
TaylorGy 0:79de700849c5 291 {
TaylorGy 0:79de700849c5 292 uint8* pdata = (*buf)->_data;
TaylorGy 0:79de700849c5 293 free(pdata);
TaylorGy 0:79de700849c5 294 free(*buf);
TaylorGy 0:79de700849c5 295 *buf = 0;
TaylorGy 0:79de700849c5 296 }
TaylorGy 0:79de700849c5 297
TaylorGy 0:79de700849c5 298 int32 CheckCapacity(Buffer* buf, uint32 len)
TaylorGy 0:79de700849c5 299 {
TaylorGy 0:79de700849c5 300 uint32 cap_len = buf->_capacity;
TaylorGy 0:79de700849c5 301 int32 flag = 0;
TaylorGy 0:79de700849c5 302 uint8* pdata = NULL;
TaylorGy 0:79de700849c5 303
TaylorGy 0:79de700849c5 304 while (cap_len - buf->_write_pos < len) /* remain len < len */
TaylorGy 0:79de700849c5 305 {
TaylorGy 0:79de700849c5 306 cap_len = cap_len << 1;
TaylorGy 0:79de700849c5 307 if (++flag > 32)
TaylorGy 0:79de700849c5 308 break; /* overflow */
TaylorGy 0:79de700849c5 309 }
TaylorGy 0:79de700849c5 310 if (flag > 32)
TaylorGy 0:79de700849c5 311 return -1;
TaylorGy 0:79de700849c5 312 if (cap_len > buf->_capacity)
TaylorGy 0:79de700849c5 313 {
TaylorGy 0:79de700849c5 314 pdata = (uint8*)malloc(sizeof(uint8) * cap_len);
TaylorGy 0:79de700849c5 315 memcpy(pdata, buf->_data, buf->_write_pos);
TaylorGy 0:79de700849c5 316 free(buf->_data);
TaylorGy 0:79de700849c5 317 buf->_data = pdata;
TaylorGy 0:79de700849c5 318 buf->_capacity = cap_len;
TaylorGy 0:79de700849c5 319 }
TaylorGy 0:79de700849c5 320 return 0;
TaylorGy 0:79de700849c5 321 }
TaylorGy 0:79de700849c5 322
TaylorGy 0:79de700849c5 323 /*---------------------------------------------------------------------------*/
TaylorGy 0:79de700849c5 324 int32 ReadByte(EdpPacket* pkg, uint8* val)
TaylorGy 0:79de700849c5 325 {
TaylorGy 0:79de700849c5 326 if (pkg->_read_pos+1 > pkg->_write_pos)
TaylorGy 0:79de700849c5 327 return -1;
TaylorGy 0:79de700849c5 328 *val = pkg->_data[pkg->_read_pos];
TaylorGy 0:79de700849c5 329 pkg->_read_pos += 1;
TaylorGy 0:79de700849c5 330 return 0;
TaylorGy 0:79de700849c5 331 }
TaylorGy 0:79de700849c5 332
TaylorGy 0:79de700849c5 333 int32 ReadBytes(EdpPacket* pkg, uint8** val, uint32 count)
TaylorGy 0:79de700849c5 334 {
TaylorGy 0:79de700849c5 335 if (pkg->_read_pos+count > pkg->_write_pos)
TaylorGy 0:79de700849c5 336 return -1;
TaylorGy 0:79de700849c5 337 *val = (uint8*)malloc(sizeof(uint8) * count);
TaylorGy 0:79de700849c5 338 memcpy(*val, pkg->_data + pkg->_read_pos, count);
TaylorGy 0:79de700849c5 339 pkg->_read_pos += count;
TaylorGy 0:79de700849c5 340 return 0;
TaylorGy 0:79de700849c5 341 }
TaylorGy 0:79de700849c5 342
TaylorGy 0:79de700849c5 343 int32 ReadUint16(EdpPacket* pkg, uint16* val)
TaylorGy 0:79de700849c5 344 {
TaylorGy 0:79de700849c5 345 uint8 msb, lsb;
TaylorGy 0:79de700849c5 346 if (pkg->_read_pos+2 > pkg->_write_pos)
TaylorGy 0:79de700849c5 347 return -1;
TaylorGy 0:79de700849c5 348 msb = pkg->_data[pkg->_read_pos];
TaylorGy 0:79de700849c5 349 pkg->_read_pos++;
TaylorGy 0:79de700849c5 350 lsb = pkg->_data[pkg->_read_pos];
TaylorGy 0:79de700849c5 351 pkg->_read_pos++;
TaylorGy 0:79de700849c5 352 *val = (msb<<8) + lsb;
TaylorGy 0:79de700849c5 353 return 0;
TaylorGy 0:79de700849c5 354 }
TaylorGy 0:79de700849c5 355
TaylorGy 0:79de700849c5 356 int32 ReadUint32(EdpPacket* pkg, uint32* val)
TaylorGy 0:79de700849c5 357 {
TaylorGy 0:79de700849c5 358 int32 i = 0;
TaylorGy 0:79de700849c5 359 uint32 tmpval = 0;
TaylorGy 0:79de700849c5 360 if (pkg->_read_pos+4 > pkg->_write_pos)
TaylorGy 0:79de700849c5 361 return -1;
TaylorGy 0:79de700849c5 362 while (i++ < 4) {
TaylorGy 0:79de700849c5 363 tmpval = (tmpval << 8) | (pkg->_data[pkg->_read_pos]);
TaylorGy 0:79de700849c5 364 pkg->_read_pos++;
TaylorGy 0:79de700849c5 365 }
TaylorGy 0:79de700849c5 366 *val = tmpval;
TaylorGy 0:79de700849c5 367 return 0;
TaylorGy 0:79de700849c5 368 }
TaylorGy 0:79de700849c5 369
TaylorGy 0:79de700849c5 370 int32 ReadStr(EdpPacket* pkg, char** val)
TaylorGy 0:79de700849c5 371 {
TaylorGy 0:79de700849c5 372 uint16 len = 0;
TaylorGy 0:79de700849c5 373 int rc = 0;
TaylorGy 0:79de700849c5 374 /* read str len */
TaylorGy 0:79de700849c5 375 rc = ReadUint16(pkg, &len);
TaylorGy 0:79de700849c5 376 if (rc)
TaylorGy 0:79de700849c5 377 return rc;
TaylorGy 0:79de700849c5 378 if (pkg->_read_pos+len > pkg->_write_pos)
TaylorGy 0:79de700849c5 379 return -1;
TaylorGy 0:79de700849c5 380 /* copy str val */
TaylorGy 0:79de700849c5 381 *val = (char*)malloc(sizeof(char) * (len + 1));
TaylorGy 0:79de700849c5 382 memset(*val, 0, len+1);
TaylorGy 0:79de700849c5 383 strncpy(*val, (const char *)(pkg->_data + pkg->_read_pos), len);
TaylorGy 0:79de700849c5 384 pkg->_read_pos += len;
TaylorGy 0:79de700849c5 385 return 0;
TaylorGy 0:79de700849c5 386 }
TaylorGy 0:79de700849c5 387
TaylorGy 0:79de700849c5 388 int32 ReadRemainlen(EdpPacket* pkg, uint32* len_val)
TaylorGy 0:79de700849c5 389 {
TaylorGy 0:79de700849c5 390 uint32 multiplier = 1;
TaylorGy 0:79de700849c5 391 uint32 len_len = 0;
TaylorGy 0:79de700849c5 392 uint8 onebyte = 0;
TaylorGy 0:79de700849c5 393 int32 rc;
TaylorGy 0:79de700849c5 394 *len_val = 0;
TaylorGy 0:79de700849c5 395 do {
TaylorGy 0:79de700849c5 396 rc = ReadByte(pkg, &onebyte);
TaylorGy 0:79de700849c5 397 if (rc)
TaylorGy 0:79de700849c5 398 return rc;
TaylorGy 0:79de700849c5 399
TaylorGy 0:79de700849c5 400 *len_val += (onebyte & 0x7f) * multiplier;
TaylorGy 0:79de700849c5 401 multiplier *= 0x80;
TaylorGy 0:79de700849c5 402
TaylorGy 0:79de700849c5 403 len_len++;
TaylorGy 0:79de700849c5 404 if (len_len > 4) {
TaylorGy 0:79de700849c5 405 return -1;/*len of len more than 4;*/
TaylorGy 0:79de700849c5 406 }
TaylorGy 0:79de700849c5 407 } while((onebyte & 0x80) != 0);
TaylorGy 0:79de700849c5 408 return 0;
TaylorGy 0:79de700849c5 409 }
TaylorGy 0:79de700849c5 410
TaylorGy 0:79de700849c5 411 /*---------------------------------------------------------------------------*/
TaylorGy 0:79de700849c5 412 int32 WriteByte(Buffer* buf, uint8 byte)
TaylorGy 0:79de700849c5 413 {
TaylorGy 0:79de700849c5 414 assert(buf->_read_pos == 0);
TaylorGy 0:79de700849c5 415 if (CheckCapacity(buf, 1))
TaylorGy 0:79de700849c5 416 return -1;
TaylorGy 0:79de700849c5 417 buf->_data[buf->_write_pos] = byte;
TaylorGy 0:79de700849c5 418 buf->_write_pos++;
TaylorGy 0:79de700849c5 419 return 0;
TaylorGy 0:79de700849c5 420 }
TaylorGy 0:79de700849c5 421
TaylorGy 0:79de700849c5 422 int32 WriteBytes(Buffer* buf, const void* bytes, uint32 count)
TaylorGy 0:79de700849c5 423 {
TaylorGy 0:79de700849c5 424 assert(buf->_read_pos == 0);
TaylorGy 0:79de700849c5 425 if (CheckCapacity(buf, count))
TaylorGy 0:79de700849c5 426 return -1;
TaylorGy 0:79de700849c5 427 memcpy(buf->_data + buf->_write_pos, bytes, count);
TaylorGy 0:79de700849c5 428 buf->_write_pos += count;
TaylorGy 0:79de700849c5 429 return 0;
TaylorGy 0:79de700849c5 430 }
TaylorGy 0:79de700849c5 431
TaylorGy 0:79de700849c5 432 int32 WriteUint16(Buffer* buf, uint16 val)
TaylorGy 0:79de700849c5 433 {
TaylorGy 0:79de700849c5 434 assert(buf->_read_pos == 0);
TaylorGy 0:79de700849c5 435 return WriteByte(buf, MOSQ_MSB(val))
TaylorGy 0:79de700849c5 436 || WriteByte(buf, MOSQ_LSB(val));
TaylorGy 0:79de700849c5 437 }
TaylorGy 0:79de700849c5 438
TaylorGy 0:79de700849c5 439 int32 WriteUint32(Buffer* buf, uint32 val)
TaylorGy 0:79de700849c5 440 {
TaylorGy 0:79de700849c5 441 assert(buf->_read_pos == 0);
TaylorGy 0:79de700849c5 442 return WriteByte(buf, (val >> 24) & 0x00FF)
TaylorGy 0:79de700849c5 443 || WriteByte(buf, (val >> 16) & 0x00FF)
TaylorGy 0:79de700849c5 444 || WriteByte(buf, (val >> 8) & 0x00FF)
TaylorGy 0:79de700849c5 445 || WriteByte(buf, (val) & 0x00FF);
TaylorGy 0:79de700849c5 446 }
TaylorGy 0:79de700849c5 447
TaylorGy 0:79de700849c5 448 int32 WriteStr(Buffer* buf, const char *str)
TaylorGy 0:79de700849c5 449 {
TaylorGy 0:79de700849c5 450 uint16 length = 0;
TaylorGy 0:79de700849c5 451 assert(buf->_read_pos == 0);
TaylorGy 0:79de700849c5 452 length = strlen(str);
TaylorGy 0:79de700849c5 453 return WriteUint16(buf, length)
TaylorGy 0:79de700849c5 454 || WriteBytes(buf, str, length);
TaylorGy 0:79de700849c5 455 }
TaylorGy 0:79de700849c5 456
TaylorGy 0:79de700849c5 457 int32 WriteRemainlen(Buffer* buf, uint32 len_val)
TaylorGy 0:79de700849c5 458 {
TaylorGy 0:79de700849c5 459 uint32 remaining_length = len_val;
TaylorGy 0:79de700849c5 460 int32 remaining_count = 0;
TaylorGy 0:79de700849c5 461 uint8 byte = 0;
TaylorGy 0:79de700849c5 462
TaylorGy 0:79de700849c5 463 assert(buf->_read_pos == 0);
TaylorGy 0:79de700849c5 464
TaylorGy 0:79de700849c5 465 do {
TaylorGy 0:79de700849c5 466 byte = remaining_length % 128;
TaylorGy 0:79de700849c5 467 remaining_length = remaining_length / 128;
TaylorGy 0:79de700849c5 468 /* If there are more digits to encode, set the top bit of this digit */
TaylorGy 0:79de700849c5 469 if (remaining_length > 0) {
TaylorGy 0:79de700849c5 470 byte = byte | 0x80;
TaylorGy 0:79de700849c5 471 }
TaylorGy 0:79de700849c5 472 buf->_data[buf->_write_pos++] = byte;
TaylorGy 0:79de700849c5 473 remaining_count++;
TaylorGy 0:79de700849c5 474 }while(remaining_length > 0 && remaining_count < 5);
TaylorGy 0:79de700849c5 475 assert(remaining_count != 5);
TaylorGy 0:79de700849c5 476 return 0;
TaylorGy 0:79de700849c5 477 }
TaylorGy 0:79de700849c5 478
TaylorGy 0:79de700849c5 479 /*---------------------------------------------------------------------------*/
TaylorGy 0:79de700849c5 480 /* connect1 (C->S): devid + apikey */
TaylorGy 0:79de700849c5 481 EdpPacket* PacketConnect1(const char* devid, const char* auth_key)
TaylorGy 0:79de700849c5 482 {
TaylorGy 0:79de700849c5 483 EdpPacket* pkg = NewBuffer();
TaylorGy 0:79de700849c5 484 uint32 remainlen;
TaylorGy 0:79de700849c5 485 /* msg type */
TaylorGy 0:79de700849c5 486 WriteByte(pkg, CONNREQ);
TaylorGy 0:79de700849c5 487 /* remain len */
TaylorGy 0:79de700849c5 488 remainlen = (2+3)+1+1+2+(2+strlen(devid))+(2+strlen(auth_key));
TaylorGy 0:79de700849c5 489 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 490 /* protocol desc */
TaylorGy 0:79de700849c5 491 WriteStr(pkg, PROTOCOL_NAME);
TaylorGy 0:79de700849c5 492 /* protocol version */
TaylorGy 0:79de700849c5 493 WriteByte(pkg, PROTOCOL_VERSION);
TaylorGy 0:79de700849c5 494 /* connect flag */
TaylorGy 0:79de700849c5 495 WriteByte(pkg, 0x40);
TaylorGy 0:79de700849c5 496 /* keep time */
TaylorGy 0:79de700849c5 497 WriteUint16(pkg, 0x0080);
TaylorGy 0:79de700849c5 498 /* DEVID */
TaylorGy 0:79de700849c5 499 WriteStr(pkg, devid);
TaylorGy 0:79de700849c5 500 /* auth key */
TaylorGy 0:79de700849c5 501 WriteStr(pkg, auth_key);
TaylorGy 0:79de700849c5 502 return pkg;
TaylorGy 0:79de700849c5 503 }
TaylorGy 0:79de700849c5 504
TaylorGy 0:79de700849c5 505 /* connect2 (C->S): userid + auth_info */
TaylorGy 0:79de700849c5 506 EdpPacket* PacketConnect2(const char* userid, const char* auth_info)
TaylorGy 0:79de700849c5 507 {
TaylorGy 0:79de700849c5 508 EdpPacket* pkg = NULL;
TaylorGy 0:79de700849c5 509 uint32 remainlen;
TaylorGy 0:79de700849c5 510
TaylorGy 0:79de700849c5 511 pkg = NewBuffer();
TaylorGy 0:79de700849c5 512 /* msg type */
TaylorGy 0:79de700849c5 513 WriteByte(pkg, CONNREQ);
TaylorGy 0:79de700849c5 514 /* remain len */
TaylorGy 0:79de700849c5 515 remainlen = (2+3)+1+1+2+2+(2+strlen(userid))+(2+strlen(auth_info));
TaylorGy 0:79de700849c5 516 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 517 /* protocol desc */
TaylorGy 0:79de700849c5 518 WriteStr(pkg, PROTOCOL_NAME);
TaylorGy 0:79de700849c5 519 /* protocol version */
TaylorGy 0:79de700849c5 520 WriteByte(pkg, PROTOCOL_VERSION);
TaylorGy 0:79de700849c5 521 /* connect flag */
TaylorGy 0:79de700849c5 522 WriteByte(pkg, 0xC0);
TaylorGy 0:79de700849c5 523 /* keep time */
TaylorGy 0:79de700849c5 524 WriteUint16(pkg, 0x0080);
TaylorGy 0:79de700849c5 525 /* devid */
TaylorGy 0:79de700849c5 526 WriteByte(pkg, 0x00);
TaylorGy 0:79de700849c5 527 WriteByte(pkg, 0x00);
TaylorGy 0:79de700849c5 528 /* USERID */
TaylorGy 0:79de700849c5 529 WriteStr(pkg, userid);
TaylorGy 0:79de700849c5 530 /* auth info */
TaylorGy 0:79de700849c5 531 WriteStr(pkg, auth_info);
TaylorGy 0:79de700849c5 532 return pkg;
TaylorGy 0:79de700849c5 533 }
TaylorGy 0:79de700849c5 534
TaylorGy 0:79de700849c5 535 /* push_data (C->S) */
TaylorGy 0:79de700849c5 536 EdpPacket* PacketPushdata(const char* dst_devid, const char* data, uint32 data_len)
TaylorGy 0:79de700849c5 537 {
TaylorGy 0:79de700849c5 538 EdpPacket* pkg = NULL;
TaylorGy 0:79de700849c5 539 uint32 remainlen;
TaylorGy 0:79de700849c5 540
TaylorGy 0:79de700849c5 541 pkg = NewBuffer();
TaylorGy 0:79de700849c5 542 /* msg type */
TaylorGy 0:79de700849c5 543 WriteByte(pkg, PUSHDATA);
TaylorGy 0:79de700849c5 544 /* remain len */
TaylorGy 0:79de700849c5 545 remainlen = (2+strlen(dst_devid))+data_len;
TaylorGy 0:79de700849c5 546 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 547 /* dst devid */
TaylorGy 0:79de700849c5 548 WriteStr(pkg, dst_devid);
TaylorGy 0:79de700849c5 549 /* data */
TaylorGy 0:79de700849c5 550 WriteBytes(pkg, data, data_len);
TaylorGy 0:79de700849c5 551 return pkg;
TaylorGy 0:79de700849c5 552 }
TaylorGy 0:79de700849c5 553
TaylorGy 0:79de700849c5 554 /* sava_data (C->S) */
TaylorGy 0:79de700849c5 555 EdpPacket* PacketSavedataJson(const char* dst_devid, cJSON* json_obj, int type)
TaylorGy 0:79de700849c5 556 {
TaylorGy 0:79de700849c5 557 EdpPacket* pkg = NULL;
TaylorGy 0:79de700849c5 558 uint32 remainlen = 0;
TaylorGy 0:79de700849c5 559 char* json_out = NULL;
TaylorGy 0:79de700849c5 560 uint32 json_len = 0;
TaylorGy 0:79de700849c5 561
TaylorGy 0:79de700849c5 562 pkg = NewBuffer();
ws1992108 1:bfbe3a09a808 563
TaylorGy 0:79de700849c5 564 json_out = cJSON_Print(json_obj);
TaylorGy 0:79de700849c5 565 json_len = strlen(json_out);
TaylorGy 0:79de700849c5 566
TaylorGy 0:79de700849c5 567 /* msg type */
TaylorGy 0:79de700849c5 568 WriteByte(pkg, SAVEDATA);
TaylorGy 0:79de700849c5 569 if (dst_devid)
TaylorGy 0:79de700849c5 570 {
TaylorGy 0:79de700849c5 571 /* remain len */
TaylorGy 0:79de700849c5 572 remainlen = 1+(2+strlen(dst_devid))+1+(2+json_len);
TaylorGy 0:79de700849c5 573 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 574 /* translate address flag */
TaylorGy 0:79de700849c5 575 WriteByte(pkg, 0x80);
TaylorGy 0:79de700849c5 576 /* dst devid */
TaylorGy 0:79de700849c5 577 WriteStr(pkg, dst_devid);
TaylorGy 0:79de700849c5 578 }
TaylorGy 0:79de700849c5 579 else
TaylorGy 0:79de700849c5 580 {
TaylorGy 0:79de700849c5 581 /* remain len */
TaylorGy 0:79de700849c5 582 remainlen = 1+1+(2+json_len);
TaylorGy 0:79de700849c5 583 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 584 /* translate address flag */
TaylorGy 0:79de700849c5 585 WriteByte(pkg, 0x00);
TaylorGy 0:79de700849c5 586 }
TaylorGy 0:79de700849c5 587 /* json flag */
TaylorGy 0:79de700849c5 588 WriteByte(pkg, type);
TaylorGy 0:79de700849c5 589 /* json */
TaylorGy 0:79de700849c5 590 WriteStr(pkg, json_out);
TaylorGy 0:79de700849c5 591 free(json_out);
TaylorGy 0:79de700849c5 592 return pkg;
TaylorGy 0:79de700849c5 593 }
TaylorGy 0:79de700849c5 594
TaylorGy 0:79de700849c5 595 /*
TaylorGy 0:79de700849c5 596 * 定义3种JSON格式的打包和解包函数,
TaylorGy 0:79de700849c5 597 * 每种格式都支持int,double和char*三种类型
TaylorGy 0:79de700849c5 598 */
TaylorGy 0:79de700849c5 599 MKFUN_PACKET_SAVE_DATA_TYPE1(int, Int, Number)
TaylorGy 0:79de700849c5 600 MKFUN_PACKET_SAVE_DATA_TYPE1(double, Double, Number)
TaylorGy 0:79de700849c5 601 MKFUN_PACKET_SAVE_DATA_TYPE1(const char*, String, String)
TaylorGy 0:79de700849c5 602
TaylorGy 0:79de700849c5 603 MKFUN_PACKET_SAVE_DATA_TYPE2(int, Int, Number)
TaylorGy 0:79de700849c5 604 MKFUN_PACKET_SAVE_DATA_TYPE2(double, Double, Number)
TaylorGy 0:79de700849c5 605 MKFUN_PACKET_SAVE_DATA_TYPE2(const char*, String, String)
TaylorGy 0:79de700849c5 606
TaylorGy 0:79de700849c5 607 MKFUN_PACKET_SAVE_DATA_TYPE3(int, Int, Number)
TaylorGy 0:79de700849c5 608 MKFUN_PACKET_SAVE_DATA_TYPE3(double, Double, Number)
TaylorGy 0:79de700849c5 609 MKFUN_PACKET_SAVE_DATA_TYPE3(const char*, String, String)
TaylorGy 0:79de700849c5 610
TaylorGy 0:79de700849c5 611 MKFUN_PACKET_SAVE_DATA(int, Int)
TaylorGy 0:79de700849c5 612 MKFUN_PACKET_SAVE_DATA(double, Double)
TaylorGy 0:79de700849c5 613 MKFUN_PACKET_SAVE_DATA(const char*, String)
TaylorGy 0:79de700849c5 614
TaylorGy 0:79de700849c5 615 /* 解包函数 */
TaylorGy 0:79de700849c5 616 MKFUN_UNPACK_SAVE_DATA_TYPE1(int, Int, Number)
TaylorGy 0:79de700849c5 617 UNPACK_SAVE_DATA_TYPE1_END_NUMBER(int)
TaylorGy 0:79de700849c5 618 MKFUN_UNPACK_SAVE_DATA_TYPE1(double, Double, Number)
TaylorGy 0:79de700849c5 619 UNPACK_SAVE_DATA_TYPE1_END_NUMBER(double)
TaylorGy 0:79de700849c5 620 MKFUN_UNPACK_SAVE_DATA_TYPE1(char*, String, String)
TaylorGy 0:79de700849c5 621 UNPACK_SAVE_DATA_TYPE1_END_STRING
TaylorGy 0:79de700849c5 622
TaylorGy 0:79de700849c5 623 MKFUN_UNPACK_SAVE_DATA_TYPE2(int, Int, Number)
TaylorGy 0:79de700849c5 624 UNPACK_SAVE_DATA_TYPE23_END_NUMBER(int)
TaylorGy 0:79de700849c5 625 MKFUN_UNPACK_SAVE_DATA_TYPE2(double, Double, Number)
TaylorGy 0:79de700849c5 626 UNPACK_SAVE_DATA_TYPE23_END_NUMBER(double)
TaylorGy 0:79de700849c5 627 MKFUN_UNPACK_SAVE_DATA_TYPE2(char*, String, String)
TaylorGy 0:79de700849c5 628 UNPACK_SAVE_DATA_TYPE23_END_STRING()
TaylorGy 0:79de700849c5 629
TaylorGy 0:79de700849c5 630 MKFUN_UNPACK_SAVE_DATA_TYPE3(int, Int, Number)
TaylorGy 0:79de700849c5 631 UNPACK_SAVE_DATA_TYPE23_END_NUMBER(int)
TaylorGy 0:79de700849c5 632 MKFUN_UNPACK_SAVE_DATA_TYPE3(double, Double, Number)
TaylorGy 0:79de700849c5 633 UNPACK_SAVE_DATA_TYPE23_END_NUMBER(double)
TaylorGy 0:79de700849c5 634 MKFUN_UNPACK_SAVE_DATA_TYPE3(char*, String, String)
TaylorGy 0:79de700849c5 635 UNPACK_SAVE_DATA_TYPE23_END_STRING()
TaylorGy 0:79de700849c5 636
TaylorGy 0:79de700849c5 637 MKFUN_UNPACK_SAVE_DATA(int, Int)
TaylorGy 0:79de700849c5 638 MKFUN_UNPACK_SAVE_DATA(double, Double)
TaylorGy 0:79de700849c5 639 MKFUN_UNPACK_SAVE_DATA(char*, String)
TaylorGy 0:79de700849c5 640
TaylorGy 0:79de700849c5 641 int32 UnpackSavedataAck(EdpPacket* pkg, char** json_ack){
TaylorGy 0:79de700849c5 642 uint32 remainlen = 0;
TaylorGy 0:79de700849c5 643 uint8 flag = 0;
TaylorGy 0:79de700849c5 644 uint16 json_len = 0;
TaylorGy 0:79de700849c5 645
TaylorGy 0:79de700849c5 646 if (ReadRemainlen(pkg, &remainlen))
TaylorGy 0:79de700849c5 647 return ERR_UNPACK_SAVEDATA_ACK;
TaylorGy 0:79de700849c5 648
TaylorGy 0:79de700849c5 649 if (ReadByte(pkg, &flag))
TaylorGy 0:79de700849c5 650 return ERR_UNPACK_SAVEDATA_ACK;
TaylorGy 0:79de700849c5 651
TaylorGy 0:79de700849c5 652 if (ReadUint16(pkg, &json_len))
TaylorGy 0:79de700849c5 653 return ERR_UNPACK_SAVEDATA_ACK;
TaylorGy 0:79de700849c5 654
TaylorGy 0:79de700849c5 655 if (ReadBytes(pkg, (uint8**)(json_ack), json_len))
TaylorGy 0:79de700849c5 656 return ERR_UNPACK_SAVEDATA_ACK;
TaylorGy 0:79de700849c5 657
TaylorGy 0:79de700849c5 658 return 0;
TaylorGy 0:79de700849c5 659 }
TaylorGy 0:79de700849c5 660
TaylorGy 0:79de700849c5 661 /* sava_data bin (C->S) */
TaylorGy 0:79de700849c5 662 EdpPacket* PacketSavedataBin(const char* dst_devid,
TaylorGy 0:79de700849c5 663 cJSON* desc_obj, const uint8* bin_data, uint32 bin_len)
TaylorGy 0:79de700849c5 664 {
TaylorGy 0:79de700849c5 665 EdpPacket* pkg = NULL;
TaylorGy 0:79de700849c5 666 uint32 remainlen = 0;
TaylorGy 0:79de700849c5 667 char* desc_out = NULL;
TaylorGy 0:79de700849c5 668 uint32 desc_len = 0;
TaylorGy 0:79de700849c5 669
TaylorGy 0:79de700849c5 670 /* check arguments */
TaylorGy 0:79de700849c5 671 desc_out = cJSON_Print(desc_obj);
TaylorGy 0:79de700849c5 672 desc_len = strlen(desc_out);
TaylorGy 0:79de700849c5 673 if (desc_len > (0x01 << 16) || bin_len > (3 * (0x01 << 20))
TaylorGy 0:79de700849c5 674 /* desc < 2^16 && bin_len < 3M*/
TaylorGy 0:79de700849c5 675 || cJSON_GetObjectItem(desc_obj, "ds_id") == 0)
TaylorGy 0:79de700849c5 676 /* desc_obj MUST has ds_id */
TaylorGy 0:79de700849c5 677 {
TaylorGy 0:79de700849c5 678 free(desc_out);
TaylorGy 0:79de700849c5 679 return 0;
TaylorGy 0:79de700849c5 680 }
TaylorGy 0:79de700849c5 681 pkg = NewBuffer();
TaylorGy 0:79de700849c5 682 /* msg type */
TaylorGy 0:79de700849c5 683 WriteByte(pkg, SAVEDATA);
TaylorGy 0:79de700849c5 684 if (dst_devid)
TaylorGy 0:79de700849c5 685 {
TaylorGy 0:79de700849c5 686 /* remain len */
TaylorGy 0:79de700849c5 687 remainlen = 1+(2+strlen(dst_devid))+1+(2+desc_len)+(4+bin_len);
TaylorGy 0:79de700849c5 688 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 689 /* translate address flag */
TaylorGy 0:79de700849c5 690 WriteByte(pkg, 0x80);
TaylorGy 0:79de700849c5 691 /* dst devid */
TaylorGy 0:79de700849c5 692 WriteStr(pkg, dst_devid);
TaylorGy 0:79de700849c5 693 }
TaylorGy 0:79de700849c5 694 else
TaylorGy 0:79de700849c5 695 {
TaylorGy 0:79de700849c5 696 /* remain len */
TaylorGy 0:79de700849c5 697 remainlen = 1+1+(2+desc_len)+(4+bin_len);
TaylorGy 0:79de700849c5 698 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 699 /* translate address flag */
TaylorGy 0:79de700849c5 700 WriteByte(pkg, 0x00);
TaylorGy 0:79de700849c5 701 }
TaylorGy 0:79de700849c5 702 /* bin flag */
TaylorGy 0:79de700849c5 703 WriteByte(pkg, 0x02);
TaylorGy 0:79de700849c5 704 /* desc */
TaylorGy 0:79de700849c5 705 WriteStr(pkg, desc_out);
TaylorGy 0:79de700849c5 706 free(desc_out);
TaylorGy 0:79de700849c5 707 /* bin data */
TaylorGy 0:79de700849c5 708 WriteUint32(pkg, bin_len);
TaylorGy 0:79de700849c5 709 WriteBytes(pkg, bin_data, bin_len);
TaylorGy 0:79de700849c5 710 return pkg;
TaylorGy 0:79de700849c5 711 }
TaylorGy 0:79de700849c5 712
TaylorGy 0:79de700849c5 713 EdpPacket* PacketSavedataBinStr(const char* dst_devid,
TaylorGy 0:79de700849c5 714 const char* desc_str, const uint8* bin_data, uint32 bin_len)
TaylorGy 0:79de700849c5 715 {
TaylorGy 0:79de700849c5 716 EdpPacket* pkg = NULL;
TaylorGy 0:79de700849c5 717 uint32 remainlen = 0;
TaylorGy 0:79de700849c5 718 uint32 desc_len = 0;
TaylorGy 0:79de700849c5 719
TaylorGy 0:79de700849c5 720 /* check arguments */
TaylorGy 0:79de700849c5 721 desc_len = strlen(desc_str);
TaylorGy 0:79de700849c5 722 if (desc_len > (0x01 << 16) || bin_len > (3 * (0x01 << 20)))
TaylorGy 0:79de700849c5 723 { /* desc < 2^16 && bin_len < 3M*/
TaylorGy 0:79de700849c5 724 return 0;
TaylorGy 0:79de700849c5 725 }
TaylorGy 0:79de700849c5 726 pkg = NewBuffer();
TaylorGy 0:79de700849c5 727 /* msg type */
TaylorGy 0:79de700849c5 728 WriteByte(pkg, SAVEDATA);
TaylorGy 0:79de700849c5 729 if (dst_devid)
TaylorGy 0:79de700849c5 730 {
TaylorGy 0:79de700849c5 731 /* remain len */
TaylorGy 0:79de700849c5 732 remainlen = 1+(2+strlen(dst_devid))+1+(2+desc_len)+(4+bin_len);
TaylorGy 0:79de700849c5 733 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 734 /* translate address flag */
TaylorGy 0:79de700849c5 735 WriteByte(pkg, 0x80);
TaylorGy 0:79de700849c5 736 /* dst devid */
TaylorGy 0:79de700849c5 737 WriteStr(pkg, dst_devid);
TaylorGy 0:79de700849c5 738 }
TaylorGy 0:79de700849c5 739 else
TaylorGy 0:79de700849c5 740 {
TaylorGy 0:79de700849c5 741 /* remain len */
TaylorGy 0:79de700849c5 742 remainlen = 1+1+(2+desc_len)+(4+bin_len);
TaylorGy 0:79de700849c5 743 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 744 /* translate address flag */
TaylorGy 0:79de700849c5 745 WriteByte(pkg, 0x00);
TaylorGy 0:79de700849c5 746 }
TaylorGy 0:79de700849c5 747 /* bin flag */
TaylorGy 0:79de700849c5 748 WriteByte(pkg, 0x02);
TaylorGy 0:79de700849c5 749 /* desc */
TaylorGy 0:79de700849c5 750 WriteStr(pkg, desc_str);
TaylorGy 0:79de700849c5 751 /* bin data */
TaylorGy 0:79de700849c5 752 WriteUint32(pkg, bin_len);
TaylorGy 0:79de700849c5 753 WriteBytes(pkg, bin_data, bin_len);
TaylorGy 0:79de700849c5 754 return pkg;
TaylorGy 0:79de700849c5 755 }
TaylorGy 0:79de700849c5 756
TaylorGy 0:79de700849c5 757 EdpPacket* PacketCmdResp(const char* cmdid, uint16 cmdid_len,
TaylorGy 0:79de700849c5 758 const char* resp, uint32 resp_len)
TaylorGy 0:79de700849c5 759 {
TaylorGy 0:79de700849c5 760 EdpPacket* send_pkg = NULL;
TaylorGy 0:79de700849c5 761 unsigned remainlen = 0;
TaylorGy 0:79de700849c5 762
TaylorGy 0:79de700849c5 763 send_pkg = NewBuffer();
TaylorGy 0:79de700849c5 764 /* 6 = 2 + 4 = len(cmdid_len) + len(resp_len) */
TaylorGy 0:79de700849c5 765 remainlen = cmdid_len + resp_len + (resp_len ? 6 : 2);
TaylorGy 0:79de700849c5 766 WriteByte(send_pkg, CMDRESP);
TaylorGy 0:79de700849c5 767 WriteRemainlen(send_pkg, remainlen);
TaylorGy 0:79de700849c5 768 WriteUint16(send_pkg, cmdid_len);
TaylorGy 0:79de700849c5 769 WriteBytes(send_pkg, cmdid, cmdid_len);
TaylorGy 0:79de700849c5 770 if (resp_len){
TaylorGy 0:79de700849c5 771 WriteUint32(send_pkg, resp_len);
TaylorGy 0:79de700849c5 772 WriteBytes(send_pkg, resp, resp_len);
TaylorGy 0:79de700849c5 773 }
TaylorGy 0:79de700849c5 774 return send_pkg;
TaylorGy 0:79de700849c5 775 }
TaylorGy 0:79de700849c5 776
TaylorGy 0:79de700849c5 777 /* ping (C->S) */
TaylorGy 0:79de700849c5 778 EdpPacket* PacketPing(void)
TaylorGy 0:79de700849c5 779 {
TaylorGy 0:79de700849c5 780 EdpPacket* pkg = NULL;
TaylorGy 0:79de700849c5 781
TaylorGy 0:79de700849c5 782 pkg = NewBuffer();
TaylorGy 0:79de700849c5 783 /* msg type */
TaylorGy 0:79de700849c5 784 WriteByte(pkg, PINGREQ);
TaylorGy 0:79de700849c5 785 /* remain len */
TaylorGy 0:79de700849c5 786 WriteRemainlen(pkg, 0);
TaylorGy 0:79de700849c5 787 return pkg;
TaylorGy 0:79de700849c5 788 }
TaylorGy 0:79de700849c5 789
TaylorGy 0:79de700849c5 790 /*---------------------------------------------------------------------------*/
TaylorGy 0:79de700849c5 791 /* recv stream to a edp packet (S->C) */
TaylorGy 0:79de700849c5 792 EdpPacket* GetEdpPacket(RecvBuffer* buf)
TaylorGy 0:79de700849c5 793 {
TaylorGy 0:79de700849c5 794 EdpPacket* pkg = NULL;
TaylorGy 0:79de700849c5 795 int32 flag = 0;
TaylorGy 0:79de700849c5 796
TaylorGy 0:79de700849c5 797 assert(buf->_read_pos == 0);
TaylorGy 0:79de700849c5 798 flag = IsPkgComplete(buf);
TaylorGy 0:79de700849c5 799 if (flag <= 0)
TaylorGy 0:79de700849c5 800 return pkg;
TaylorGy 0:79de700849c5 801 pkg = NewBuffer();
TaylorGy 0:79de700849c5 802 WriteBytes(pkg, buf->_data, flag);
TaylorGy 0:79de700849c5 803 /* shrink buffer */
TaylorGy 0:79de700849c5 804 memmove(buf->_data, buf->_data + flag, buf->_write_pos - flag);
TaylorGy 0:79de700849c5 805 buf->_write_pos -= flag;
TaylorGy 0:79de700849c5 806 return pkg;
TaylorGy 0:79de700849c5 807 }
TaylorGy 0:79de700849c5 808
TaylorGy 0:79de700849c5 809 /* is the recv buffer has a complete edp packet? */
TaylorGy 0:79de700849c5 810 int32 IsPkgComplete(RecvBuffer* buf)
TaylorGy 0:79de700849c5 811 {
TaylorGy 0:79de700849c5 812 uint8* data = NULL;
TaylorGy 0:79de700849c5 813 uint32 data_len = 0;
TaylorGy 0:79de700849c5 814 uint32 multiplier = 1;
TaylorGy 0:79de700849c5 815 uint32 len_val = 0;
TaylorGy 0:79de700849c5 816 uint32 len_len = 1;
TaylorGy 0:79de700849c5 817 uint8* pdigit = NULL;
TaylorGy 0:79de700849c5 818 uint32 pkg_total_len = 0;
TaylorGy 0:79de700849c5 819
TaylorGy 0:79de700849c5 820 data = buf->_data;
TaylorGy 0:79de700849c5 821 data_len = buf->_write_pos;
TaylorGy 0:79de700849c5 822
TaylorGy 0:79de700849c5 823 if (data_len <= 1) {
TaylorGy 0:79de700849c5 824 return 0; /* continue receive */
TaylorGy 0:79de700849c5 825 }
TaylorGy 0:79de700849c5 826 /* recevie remaining len */
TaylorGy 0:79de700849c5 827 pdigit = data;
TaylorGy 0:79de700849c5 828
TaylorGy 0:79de700849c5 829 do {
TaylorGy 0:79de700849c5 830 if (len_len > 4) {
TaylorGy 0:79de700849c5 831 return -1; /* protocol error; */
TaylorGy 0:79de700849c5 832 }
TaylorGy 0:79de700849c5 833 if (len_len > data_len - 1) {
TaylorGy 0:79de700849c5 834 return 0; /* continue receive */
TaylorGy 0:79de700849c5 835 }
TaylorGy 0:79de700849c5 836 len_len++;
TaylorGy 0:79de700849c5 837 pdigit++;
TaylorGy 0:79de700849c5 838 len_val += ((*pdigit) & 0x7f) * multiplier;
TaylorGy 0:79de700849c5 839 multiplier *= 0x80;
TaylorGy 0:79de700849c5 840 }while(((*pdigit) & 0x80) != 0);
TaylorGy 0:79de700849c5 841
TaylorGy 0:79de700849c5 842 pkg_total_len = len_len + len_val;
TaylorGy 0:79de700849c5 843 /* receive payload */
TaylorGy 0:79de700849c5 844 if (pkg_total_len <= (uint32)data_len){
TaylorGy 0:79de700849c5 845 #ifdef _DEBUG
TaylorGy 0:79de700849c5 846 printf("a complete packet len:%d\n", pkg_total_len);
TaylorGy 0:79de700849c5 847 #endif
TaylorGy 0:79de700849c5 848 return pkg_total_len; /* all data for this pkg is read */
TaylorGy 0:79de700849c5 849 }else{
TaylorGy 0:79de700849c5 850 return 0; /* continue receive */
TaylorGy 0:79de700849c5 851 }
TaylorGy 0:79de700849c5 852 }
TaylorGy 0:79de700849c5 853
TaylorGy 0:79de700849c5 854 /* get edp packet type, client should use this type to invoke Unpack??? function */
TaylorGy 0:79de700849c5 855 uint8 EdpPacketType(EdpPacket* pkg)
TaylorGy 0:79de700849c5 856 {
TaylorGy 0:79de700849c5 857 uint8 mtype = 0x00;
TaylorGy 0:79de700849c5 858 ReadByte(pkg, &mtype);
TaylorGy 0:79de700849c5 859 return mtype;
TaylorGy 0:79de700849c5 860 }
TaylorGy 0:79de700849c5 861
TaylorGy 0:79de700849c5 862 /* connect_resp (S->C)*/
TaylorGy 0:79de700849c5 863 int32 UnpackConnectResp(EdpPacket* pkg)
TaylorGy 0:79de700849c5 864 {
TaylorGy 0:79de700849c5 865 uint8 flag, rtn;
TaylorGy 0:79de700849c5 866 uint32 remainlen;
TaylorGy 0:79de700849c5 867 if (ReadRemainlen(pkg, &remainlen))
TaylorGy 0:79de700849c5 868 return ERR_UNPACK_CONNRESP_REMAIN;
TaylorGy 0:79de700849c5 869 if (ReadByte(pkg, &flag))
TaylorGy 0:79de700849c5 870 return ERR_UNPACK_CONNRESP_FLAG;
TaylorGy 0:79de700849c5 871 if (ReadByte(pkg, &rtn))
TaylorGy 0:79de700849c5 872 return ERR_UNPACK_CONNRESP_RTN;
TaylorGy 0:79de700849c5 873 assert(pkg->_read_pos == pkg->_write_pos);
TaylorGy 0:79de700849c5 874 return (int32)rtn;
TaylorGy 0:79de700849c5 875 }
TaylorGy 0:79de700849c5 876
TaylorGy 0:79de700849c5 877 /* push_data (S->C) */
TaylorGy 0:79de700849c5 878 int32 UnpackPushdata(EdpPacket* pkg, char** src_devid, char** data, uint32* data_len)
TaylorGy 0:79de700849c5 879 {
TaylorGy 0:79de700849c5 880 uint32 remainlen;
TaylorGy 0:79de700849c5 881 if (ReadRemainlen(pkg, &remainlen))
TaylorGy 0:79de700849c5 882 return ERR_UNPACK_PUSHD_REMAIN;
TaylorGy 0:79de700849c5 883 if (ReadStr(pkg, src_devid))
TaylorGy 0:79de700849c5 884 return ERR_UNPACK_PUSHD_DEVID;
TaylorGy 0:79de700849c5 885 remainlen -= (2 + strlen(*src_devid));
TaylorGy 0:79de700849c5 886 if (ReadBytes(pkg, (uint8**)data, remainlen))
TaylorGy 0:79de700849c5 887 return ERR_UNPACK_PUSHD_DATA;
TaylorGy 0:79de700849c5 888 *data_len = remainlen;
TaylorGy 0:79de700849c5 889 assert(pkg->_read_pos == pkg->_write_pos);
TaylorGy 0:79de700849c5 890 return 0;
TaylorGy 0:79de700849c5 891 }
TaylorGy 0:79de700849c5 892
TaylorGy 0:79de700849c5 893 /* save_data (S->C) */
TaylorGy 0:79de700849c5 894 int32 UnpackSavedata(EdpPacket* pkg, char** src_devid, uint8* jb_flag)
TaylorGy 0:79de700849c5 895 {
TaylorGy 0:79de700849c5 896 uint32 remainlen;
TaylorGy 0:79de700849c5 897 uint8 ta_flag;
TaylorGy 0:79de700849c5 898 if (ReadRemainlen(pkg, &remainlen))
TaylorGy 0:79de700849c5 899 return ERR_UNPACK_SAVED_REMAIN;
TaylorGy 0:79de700849c5 900 /* translate address flag */
TaylorGy 0:79de700849c5 901 if (ReadByte(pkg, &ta_flag))
TaylorGy 0:79de700849c5 902 return ERR_UNPACK_SAVED_TANSFLAG;
TaylorGy 0:79de700849c5 903 if (ta_flag == 0x80)
TaylorGy 0:79de700849c5 904 {
TaylorGy 0:79de700849c5 905 if (ReadStr(pkg, src_devid))
TaylorGy 0:79de700849c5 906 return ERR_UNPACK_SAVED_DEVID;
TaylorGy 0:79de700849c5 907 }
TaylorGy 0:79de700849c5 908 else
TaylorGy 0:79de700849c5 909 {
TaylorGy 0:79de700849c5 910 *src_devid = 0;
TaylorGy 0:79de700849c5 911 }
TaylorGy 0:79de700849c5 912 /* json or bin */
TaylorGy 0:79de700849c5 913 if (ReadByte(pkg, jb_flag))
TaylorGy 0:79de700849c5 914 return ERR_UNPACK_SAVED_DATAFLAG;
TaylorGy 0:79de700849c5 915 return 0;
TaylorGy 0:79de700849c5 916 }
TaylorGy 0:79de700849c5 917
TaylorGy 0:79de700849c5 918 int32 UnpackSavedataJson(EdpPacket* pkg, cJSON** json_obj)
TaylorGy 0:79de700849c5 919 {
TaylorGy 0:79de700849c5 920 char* json_str;
TaylorGy 0:79de700849c5 921 if (ReadStr(pkg, &json_str))
TaylorGy 0:79de700849c5 922 return ERR_UNPACK_SAVED_JSON;
TaylorGy 0:79de700849c5 923 *json_obj = cJSON_Parse(json_str);
TaylorGy 0:79de700849c5 924 free(json_str);
TaylorGy 0:79de700849c5 925 if (*json_obj == 0)
TaylorGy 0:79de700849c5 926 return ERR_UNPACK_SAVED_PARSEJSON;
TaylorGy 0:79de700849c5 927 assert(pkg->_read_pos == pkg->_write_pos);
TaylorGy 0:79de700849c5 928 return 0;
TaylorGy 0:79de700849c5 929 }
TaylorGy 0:79de700849c5 930
TaylorGy 0:79de700849c5 931 int32 UnpackSavedataBin(EdpPacket* pkg, cJSON** desc_obj,
TaylorGy 0:79de700849c5 932 uint8** bin_data, uint32* bin_len)
TaylorGy 0:79de700849c5 933 {
TaylorGy 0:79de700849c5 934 char* desc_str;
TaylorGy 0:79de700849c5 935 if (ReadStr(pkg, &desc_str))
TaylorGy 0:79de700849c5 936 return ERR_UNPACK_SAVED_BIN_DESC;
TaylorGy 0:79de700849c5 937 *desc_obj = cJSON_Parse(desc_str);
TaylorGy 0:79de700849c5 938 free(desc_str);
TaylorGy 0:79de700849c5 939 if (*desc_obj == 0)
TaylorGy 0:79de700849c5 940 return ERR_UNPACK_SAVED_PARSEDESC;
TaylorGy 0:79de700849c5 941 if (ReadUint32(pkg, bin_len))
TaylorGy 0:79de700849c5 942 return ERR_UNPACK_SAVED_BINLEN;
TaylorGy 0:79de700849c5 943 if (ReadBytes(pkg, bin_data, *bin_len))
TaylorGy 0:79de700849c5 944 return ERR_UNPACK_SAVED_BINDATA;
TaylorGy 0:79de700849c5 945 assert(pkg->_read_pos == pkg->_write_pos);
TaylorGy 0:79de700849c5 946 return 0;
TaylorGy 0:79de700849c5 947 }
TaylorGy 0:79de700849c5 948
TaylorGy 0:79de700849c5 949 int32 UnpackSavedataBinStr(EdpPacket* pkg, char** desc_str,
TaylorGy 0:79de700849c5 950 uint8** bin_data, uint32* bin_len)
TaylorGy 0:79de700849c5 951 {
TaylorGy 0:79de700849c5 952 if (ReadStr(pkg, desc_str))
TaylorGy 0:79de700849c5 953 return ERR_UNPACK_SAVED_BIN_DESC;
TaylorGy 0:79de700849c5 954 if (ReadUint32(pkg, bin_len))
TaylorGy 0:79de700849c5 955 return ERR_UNPACK_SAVED_BINLEN;
TaylorGy 0:79de700849c5 956 if (ReadBytes(pkg, bin_data, *bin_len))
TaylorGy 0:79de700849c5 957 return ERR_UNPACK_SAVED_BINDATA;
TaylorGy 0:79de700849c5 958 assert(pkg->_read_pos == pkg->_write_pos);
TaylorGy 0:79de700849c5 959 return 0;
TaylorGy 0:79de700849c5 960 }
TaylorGy 0:79de700849c5 961
TaylorGy 0:79de700849c5 962 int32 UnpackCmdReq(EdpPacket* pkg, char** cmdid, uint16* cmdid_len,
TaylorGy 0:79de700849c5 963 char** req, uint32* req_len)
TaylorGy 0:79de700849c5 964 {
TaylorGy 0:79de700849c5 965 uint32 remainlen;
TaylorGy 0:79de700849c5 966 int rc;
TaylorGy 0:79de700849c5 967 if (ReadRemainlen(pkg, &remainlen))
TaylorGy 0:79de700849c5 968 return ERR_UNPACK_CMDREQ;
ws1992108 1:bfbe3a09a808 969
TaylorGy 0:79de700849c5 970 rc = ReadUint16(pkg, cmdid_len);
TaylorGy 0:79de700849c5 971 if (rc)
TaylorGy 0:79de700849c5 972 return rc;
TaylorGy 0:79de700849c5 973 if (ReadBytes(pkg, (uint8**)cmdid, *cmdid_len))
TaylorGy 0:79de700849c5 974 return ERR_UNPACK_CMDREQ;
ws1992108 1:bfbe3a09a808 975
TaylorGy 0:79de700849c5 976 rc = ReadUint32(pkg, req_len);
TaylorGy 0:79de700849c5 977 if (rc)
TaylorGy 0:79de700849c5 978 return rc;
TaylorGy 0:79de700849c5 979 if (ReadBytes(pkg, (uint8**)req, *req_len))
TaylorGy 0:79de700849c5 980 return ERR_UNPACK_CMDREQ;
TaylorGy 0:79de700849c5 981
TaylorGy 0:79de700849c5 982 assert(pkg->_read_pos == pkg->_write_pos);
TaylorGy 0:79de700849c5 983 return 0;
TaylorGy 0:79de700849c5 984 }
TaylorGy 0:79de700849c5 985
TaylorGy 0:79de700849c5 986 /* ping_resp (S->C) */
TaylorGy 0:79de700849c5 987 int32 UnpackPingResp(EdpPacket* pkg)
TaylorGy 0:79de700849c5 988 {
TaylorGy 0:79de700849c5 989 uint32 remainlen;
TaylorGy 0:79de700849c5 990 if (ReadRemainlen(pkg, &remainlen))
TaylorGy 0:79de700849c5 991 return ERR_UNPACK_PING_REMAIN;
TaylorGy 0:79de700849c5 992 assert(pkg->_read_pos == pkg->_write_pos);
TaylorGy 0:79de700849c5 993 return 0;
TaylorGy 0:79de700849c5 994 }
TaylorGy 0:79de700849c5 995
TaylorGy 0:79de700849c5 996 /* sava_data (C->S) */
TaylorGy 0:79de700849c5 997 EdpPacket* PacketSavedataSimpleString(const char* dst_devid, const char* input)
TaylorGy 0:79de700849c5 998 {
TaylorGy 0:79de700849c5 999 EdpPacket* pkg = NULL;
TaylorGy 0:79de700849c5 1000 uint32 remainlen = 0;
TaylorGy 0:79de700849c5 1001 uint32 input_len = 0;
TaylorGy 0:79de700849c5 1002
TaylorGy 0:79de700849c5 1003 pkg = NewBuffer();
TaylorGy 0:79de700849c5 1004 input_len = strlen(input);
TaylorGy 0:79de700849c5 1005 /* msg type */
TaylorGy 0:79de700849c5 1006 WriteByte(pkg, SAVEDATA);
TaylorGy 0:79de700849c5 1007 if (dst_devid)
TaylorGy 0:79de700849c5 1008 {
TaylorGy 0:79de700849c5 1009 /* remain len */
TaylorGy 0:79de700849c5 1010 remainlen = 1+(2+strlen(dst_devid))+1+(2+input_len);
TaylorGy 0:79de700849c5 1011 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 1012 /* translate address flag */
TaylorGy 0:79de700849c5 1013 WriteByte(pkg, 0x80);
TaylorGy 0:79de700849c5 1014 /* dst devid */
TaylorGy 0:79de700849c5 1015 WriteStr(pkg, dst_devid);
TaylorGy 0:79de700849c5 1016 }
TaylorGy 0:79de700849c5 1017 else
TaylorGy 0:79de700849c5 1018 {
TaylorGy 0:79de700849c5 1019 /* remain len */
TaylorGy 0:79de700849c5 1020 remainlen = 1+1+(2+input_len);
TaylorGy 0:79de700849c5 1021 WriteRemainlen(pkg, remainlen);
TaylorGy 0:79de700849c5 1022 /* translate address flag */
TaylorGy 0:79de700849c5 1023 WriteByte(pkg, 0x00);
TaylorGy 0:79de700849c5 1024 }
TaylorGy 0:79de700849c5 1025 /* json flag */
TaylorGy 0:79de700849c5 1026 WriteByte(pkg, kTypeString);
TaylorGy 0:79de700849c5 1027 /* json */
TaylorGy 0:79de700849c5 1028 WriteStr(pkg, input);
TaylorGy 0:79de700849c5 1029
TaylorGy 0:79de700849c5 1030 return pkg;
TaylorGy 0:79de700849c5 1031 }
TaylorGy 0:79de700849c5 1032
TaylorGy 0:79de700849c5 1033 int32 UnpackSavedataSimpleString(EdpPacket* pkg, char** output)
TaylorGy 0:79de700849c5 1034 {
TaylorGy 0:79de700849c5 1035 if (ReadStr(pkg, output))
TaylorGy 0:79de700849c5 1036 return ERR_UNPACK_SAVED_JSON;
TaylorGy 0:79de700849c5 1037 return 0;
TaylorGy 0:79de700849c5 1038 }
TaylorGy 0:79de700849c5 1039