demo.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. #include <rtthread.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include "jiot_std.h"
  6. #include "jiot_code.h"
  7. #include "jiot_err.h"
  8. #include "jiot_log.h"
  9. #include "jiot_pthread.h"
  10. #include <string.h>
  11. #ifdef PKG_USING_JIOT_PRODUCT_KEY
  12. #define PRODUCT_KEY PKG_USING_JIOT_PRODUCT_KEY
  13. #else
  14. #define PRODUCT_KEY ""
  15. #endif
  16. #ifdef PKG_USING_JIOT_DEVICE_NAME
  17. #define DEVICE_NAME PKG_USING_JIOT_DEVICE_NAME
  18. #else
  19. #define DEVICE_NAME ""
  20. #endif
  21. #ifdef PKG_USING_JIOT_DEVICE_SECRET
  22. #define DEVICE_SECRET PKG_USING_JIOT_DEVICE_SECRET
  23. #else
  24. #define DEVICE_SECRET ""
  25. #endif
  26. typedef struct DEV
  27. {
  28. long long seq_no;
  29. int desired_version ;
  30. int version ;
  31. int oldVersion;
  32. Property *pProperty;
  33. Event *pEvent;
  34. char app_ver[32];
  35. char msg[2048];
  36. }DEV;
  37. #define D_DECSEPER 1000000000ULL // 10^9
  38. #define D_DECSEPER2 1000000000000000000ULL // 10^18
  39. int lltoa(char* buf, long long num) //need a buf with 21 bytes
  40. {
  41. char symble[2] = {0};
  42. if(num < 0)
  43. {
  44. symble[0] = '-';
  45. num = llabs(num);
  46. }
  47. int ret = -1;
  48. if(num < D_DECSEPER)
  49. {
  50. ret = sprintf(buf, "%s%d", symble, (unsigned int)(num%D_DECSEPER) &0xFFFFFFFF);
  51. }
  52. else if(num >= D_DECSEPER && num < D_DECSEPER2)
  53. {
  54. ret = sprintf(buf, "%s%u%09u", symble, (unsigned int)(num/D_DECSEPER) &0xFFFFFFFF, (unsigned int)(num%D_DECSEPER) &0xFFFFFFFF);
  55. }
  56. else if(num >= D_DECSEPER2)
  57. {
  58. ret = sprintf(buf, "%s%u%09u%09u", symble, (unsigned int)(num/D_DECSEPER2) &0xFFFFFFFF, (unsigned int)((num/D_DECSEPER)%D_DECSEPER) &0xFFFFFFFF, (unsigned int)(num%D_DECSEPER) &0xFFFFFFFF);
  59. }
  60. return ret;
  61. }
  62. #define PRINT_SEQNO(seqNo)\
  63. do\
  64. {\
  65. char buf[21] = {0};\
  66. lltoa(buf, seqNo);\
  67. printf("message seqNo:[%s]\n", buf);\
  68. }\
  69. while(0)
  70. int propertyReportReq(JHandle handle, DEV* pDev,Property * property,int size)
  71. {
  72. PropertyReportReq req ;
  73. req.seq_no = 0;
  74. req.version = pDev->version;
  75. req.property_size= size;
  76. Property * tempProperty = (Property*)malloc(sizeof(Property)*size);
  77. memset((void*)tempProperty,0,sizeof(Property)*size);
  78. int i =0 ;
  79. for (i = 0; i < size; ++i)
  80. {
  81. tempProperty[i].name = property[i].name;
  82. tempProperty[i].value = property[i].value;
  83. tempProperty[i].time = property[i].time;
  84. }
  85. req.pProperty = tempProperty;
  86. JiotResult JRet = jiotPropertyReportReq(handle,&req);
  87. if (tempProperty != NULL)
  88. {
  89. free(tempProperty);
  90. }
  91. if(JRet.errCode == 0)
  92. {
  93. PRINT_SEQNO(JRet.seqNo);
  94. }
  95. return JRet.errCode;
  96. }
  97. int eventReportReq(JHandle handle,DEV* pDev,Event *event )
  98. {
  99. EventReportReq req ;
  100. req.seq_no = 0;
  101. Event tempEvent ;
  102. tempEvent.name = event->name;
  103. tempEvent.content = event->content;
  104. tempEvent.time = event->time;
  105. req.pEvent = &tempEvent;
  106. JiotResult JRet = jiotEventReportReq(handle,&req);
  107. if(JRet.errCode == 0)
  108. {
  109. PRINT_SEQNO(JRet.seqNo);
  110. }
  111. return JRet.errCode;
  112. }
  113. int versionReportReq(JHandle handle,DEV*pDev,char* app_ver)
  114. {
  115. VersionReportReq req ;
  116. req.seq_no = 0;
  117. req.app_ver= app_ver;
  118. JiotResult JRet = jiotVersionReportReq(handle,&req);
  119. if(JRet.errCode == 0)
  120. {
  121. PRINT_SEQNO(JRet.seqNo);
  122. }
  123. return JRet.errCode;
  124. }
  125. int propertyReportRsp(void* pContext,JHandle handle,const PropertyReportRsp * Rsp,int errcode)
  126. {
  127. if (errcode != 0)
  128. {
  129. printf("propertyReportRsp err code:[%d]\n",errcode);
  130. return 0;
  131. }
  132. printf("propertyReportRsp:\n");
  133. DEV* pDev = (DEV*)pContext;
  134. if (Rsp->code != 0)
  135. {
  136. if(Rsp->version != 0)
  137. {
  138. pDev->version = Rsp->version+1;
  139. pDev->oldVersion = pDev->version;
  140. }
  141. printf("ERR: code [%d]\n", Rsp->code );
  142. }
  143. else
  144. {
  145. pDev->oldVersion = pDev->version;
  146. printf("OK\n");
  147. }
  148. return 0;
  149. }
  150. int eventReportRsp(void* pContext,JHandle handle,const EventReportRsp * Rsp,int errcode)
  151. {
  152. if (errcode != 0)
  153. {
  154. printf("eventReportRsp err code:[%d]\n",errcode);
  155. }
  156. printf("eventReportRsp:\n");
  157. //DEV* pDev = (DEV*)pContext;
  158. if (Rsp->code != 0)
  159. {
  160. printf("ERR: code [%d]\n", Rsp->code );
  161. return 0;
  162. }
  163. printf("OK\n");
  164. return 0;
  165. }
  166. int versionReportRsp(void* pContext,JHandle handle,const VersionReportRsp * Rsp,int errcode)
  167. {
  168. if (errcode != 0)
  169. {
  170. printf("versionReportRsp err code:[%d]\n",errcode);
  171. }
  172. printf("versionReportRsp:\n");
  173. //DEV* pDev = (DEV*)pContext;
  174. if (Rsp->code != 0)
  175. {
  176. printf("ERR: code [%d]\n", Rsp->code );
  177. return 0;
  178. }
  179. printf("OK\n");
  180. return 0;
  181. }
  182. int propertySetReq(void* pContext,JHandle handle,PropertySetReq *Req,int errcode)
  183. {
  184. if (errcode != 0)
  185. {
  186. printf("propertySetReq msg err code:[%d]\n",errcode);
  187. }
  188. printf("propertySetReq:\n");
  189. DEV* pDev = (DEV*)pContext;
  190. pDev->desired_version = Req->version;
  191. Property * pProperty = malloc(sizeof(Property)*Req->property_size);
  192. int i =0;
  193. for (i=0; i < Req->property_size; ++i)
  194. {
  195. printf("property.name:[%s]\nproperty.value:[%s]\n", Req->pProperty[i].name,Req->pProperty[i].value);
  196. struct tm *tblock;
  197. time_t timer = Req->pProperty[i].time/1000;
  198. tblock = localtime(&timer);
  199. printf("property.time:[%d/%d/%d %d:%d:%d]\n", tblock->tm_year+1900,tblock->tm_mon+1,tblock->tm_mday,tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
  200. pProperty->name = Req->pProperty[i].name;
  201. pProperty->value = Req->pProperty[i].value;
  202. pProperty->time = Req->pProperty[i].time;
  203. }
  204. if (pDev->version == pDev->oldVersion)
  205. {
  206. pDev->version ++ ;
  207. }
  208. free(pProperty);
  209. return 0;
  210. }
  211. int msgDeliverReq(void* pContext,JHandle handle,MsgDeliverReq *Req,int errcode)
  212. {
  213. if (errcode != 0)
  214. {
  215. printf("msgDeliverReq msg err code:[%d]\n",errcode);
  216. }
  217. printf("msgDeliverReq:\n");
  218. //pContext 之前注册的上下文信息
  219. //DEV* pDev = (DEV*)pContext;
  220. printf("message:[%s]\n", Req->message);
  221. struct tm *tblock;
  222. time_t timer = Req->time;
  223. tblock = localtime(&timer);
  224. printf("time:[%d/%d/%d %d:%d:%d]\n", tblock->tm_year+1900,tblock->tm_mon+1,tblock->tm_mday,tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
  225. return 0;
  226. }
  227. int connectedHandle(void* pContext)
  228. {
  229. printf("\nJclient connected \n");
  230. return 0;
  231. }
  232. int connectFailHandle(void* pContext,int errCode)
  233. {
  234. printf("\nJclient connect fail . Code:[%d] \n",errCode);
  235. return 0;
  236. }
  237. int disconnectHandle(void* pContext)
  238. {
  239. printf("\nJclient disconnect . \n");
  240. return 0;
  241. }
  242. int subscribeFailHandle(void* pContext,char * TopicFilter)
  243. {
  244. printf("\nJclient subscribe topic fail .Topic[%s] \n",TopicFilter);
  245. return 0;
  246. }
  247. int messageTimeoutHandle(void* pContext,long long seqNo)
  248. {
  249. printf("\nJclient message time out ");
  250. PRINT_SEQNO(seqNo);
  251. return 0;
  252. }
  253. int check(JHandle handle)
  254. {
  255. while(1)
  256. {
  257. JClientStatus status = jiotGetConnStatus(handle);
  258. if(status != CLIENT_CONNECTED )
  259. {
  260. printf(".");
  261. fflush(stdout);
  262. jiot_sleep(1 * 1000);
  263. }
  264. else
  265. {
  266. break ;
  267. }
  268. }
  269. return 0;
  270. }
  271. static int start_demo_test()
  272. {
  273. int ret = 0 ;
  274. jiotSetLogLevel(DEBUG_LOG_LEVL);
  275. DeviceInfo devinfo ;
  276. {
  277. strcpy(devinfo.szProductKey, PRODUCT_KEY);
  278. strcpy(devinfo.szDeviceName, DEVICE_NAME);
  279. strcpy(devinfo.szDeviceSecret, DEVICE_SECRET);
  280. }
  281. DEV Dev ;
  282. Dev.seq_no = 1 ;
  283. Dev.version = 1 ;
  284. memset((void*)Dev.app_ver,0,32);
  285. memset((void*)Dev.msg,0,1024);
  286. JClientMessageCallback cb;
  287. cb._cbPropertyReportRsp = propertyReportRsp ;
  288. cb._cbEventReportRsp = eventReportRsp;
  289. cb._cbVersionReportRsp = versionReportRsp;
  290. cb._cbPropertySetReq = propertySetReq;
  291. cb._cbMsgDeliverReq = msgDeliverReq;
  292. JClientHandleCallback handleCb;
  293. handleCb._cbConnectedHandle = connectedHandle;
  294. handleCb._cbConnectFailHandle = connectFailHandle;
  295. handleCb._cbDisconnectHandle = disconnectHandle;
  296. handleCb._cbSubscribeFailHandle = subscribeFailHandle;
  297. handleCb._cbPublishFailHandle = NULL ;
  298. handleCb._cbMessageTimeoutHandle= messageTimeoutHandle;
  299. int nProperty_size = 1;
  300. Dev.pProperty = (Property*)malloc(sizeof(Property)*nProperty_size);
  301. Dev.pEvent = (Event*)malloc(sizeof(Event));
  302. JHandle handle = jiotInit();
  303. if (handle ==NULL)
  304. {
  305. printf("jClient init err \n");
  306. return 0;
  307. }
  308. jiotRegister(handle,&Dev,&cb,&handleCb);
  309. ret = jiotConn(handle,&devinfo);
  310. if(ret != 0)
  311. {
  312. printf("connect err,errno:%d\n",ret);
  313. return 0;
  314. }
  315. printf("Connection, please later \n");
  316. check(handle);
  317. for(int i = 0; i < 1; ++i)
  318. {
  319. /* 属性上报*/
  320. {
  321. printf("property report:\n");
  322. Dev.pProperty->name = "senduo_test_property";
  323. Dev.pProperty->value="1";
  324. Dev.pProperty->time = (long long )time(NULL)*1000; //毫秒
  325. ret = propertyReportReq(handle,&Dev,Dev.pProperty,1);
  326. if(ret == 0)
  327. {
  328. printf("send property report\n");
  329. }
  330. else
  331. {
  332. printf("send property report err,code:[%d]\n",ret);
  333. }
  334. }
  335. /* 事件上报*/
  336. {
  337. printf("event report:\n");
  338. Dev.pEvent->name = "senduo_test_event";
  339. Dev.pEvent->content = "This content of event!";
  340. Dev.pEvent->time = (long long)time(NULL);
  341. int ret = eventReportReq(handle,&Dev,Dev.pEvent);
  342. if(ret == 0)
  343. {
  344. printf("send event report \n");
  345. }
  346. else
  347. {
  348. printf("send event report err,code:[%d]\n",ret);
  349. }
  350. }
  351. /* 版本上报 */
  352. {
  353. printf("version report:\n");
  354. strncpy(Dev.app_ver,"dengdeng1.1.0",32);
  355. ret = versionReportReq(handle,&Dev,Dev.app_ver);
  356. if(ret == 0)
  357. {
  358. printf("send version report \n");
  359. }
  360. else
  361. {
  362. printf("send version report err,code:[%d]\n",ret);
  363. }
  364. }
  365. jiot_sleep(10 * 1000);
  366. }
  367. // waiting to accept message
  368. for(int i = 0; i < 5; ++i)
  369. {
  370. printf("waiting to accept message \n");
  371. jiot_sleep(10 * 1000);
  372. }
  373. jiotDisConn(handle);
  374. printf("jiotDisConn \n");
  375. jiotUnRegister(handle);
  376. printf("jiotUnRegister \n");
  377. jiotRelease(&handle);
  378. printf("jiotRelease \n");
  379. free(Dev.pProperty);
  380. free(Dev.pEvent);
  381. printf("demo exit \n");
  382. return 0;
  383. }
  384. #ifdef PKG_USING_JIOT-C-SDK
  385. #include <finsh.h>
  386. MSH_CMD_EXPORT_ALIAS(start_demo_test, start_demo_test,Example: start_demo_test);
  387. #endif