1# HiSpark WiFi-IoT 套件样例开发--消息队列(MessageQueue) 2 3 4 5[HiSpark WiFi-IoT开发套件](https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w5003-23341819265.1.bf644a82Da9PZK&id=622343426064&scene=taobao_shop) 首发于HDC 2020,是首批支持OpenHarmony 2.0的开发套件,亦是官方推荐套件,由润和软件HiHope量身打造,已在OpenHarmony社区和广大OpenHarmony开发者中得到广泛应用。 6 7 8 9## 一、MessageQueue API 10 11| API名称 | 说明 | 12| ------------------------- | ------------------------------------------------------------ | 13| osMessageQueueNew | 创建和初始化一个消息队列 | 14| osMessageQueueGetName | 返回指定的消息队列的名字 | 15| osMessageQueuePut | 向指定的消息队列存放1条消息,如果消息队列满了,那么返回超时 | 16| osMessageQueueGet | 从指定的消息队列中取得1条消息,如果消息队列为空,那么返回超时 | 17| osMessageQueueGetCapacity | 获得指定的消息队列的消息容量 | 18| osMessageQueueGetMsgSize | 获得指定的消息队列中可以存放的最大消息的大小 | 19| osMessageQueueGetCount | 获得指定的消息队列中当前的消息数 | 20| osMessageQueueGetSpace | 获得指定的消息队列中还可以存放的消息数 | 21| osMessageQueueReset | 将指定的消息队列重置为初始状态 | 22| osMessageQueueDelete | 删除指定的消息队列 | 23 24## 二、代码分析 25 26`osMessageQueueNew`创建一个消息队列 27 28发送者每次将自己`count`的值与线程ID发送,并将`count`加1; 29 30接受者从消息队列中获取一条信息,然后将其打印输出 31 32```c 33void sender_thread(void *arg) { 34 static int count=0; 35 message_entry sentry; 36 (void)arg; 37 while(1) { 38 sentry.tid = osThreadGetId(); 39 sentry.count = count; 40 printf("[Message Test] %s send %d to message queue.\r\n", osThreadGetName(osThreadGetId()), count); 41 osMessageQueuePut(qid, (const void *)&sentry, 0, osWaitForever); 42 count++; 43 osDelay(5); 44 } 45} 46 47void receiver_thread(void *arg) { 48 (void)arg; 49 message_entry rentry; 50 while(1) { 51 osMessageQueueGet(qid, (void *)&rentry, NULL, osWaitForever); 52 printf("[Message Test] %s get %d from %s by message queue.\r\n", osThreadGetName(osThreadGetId()), rentry.count, osThreadGetName(rentry.tid)); 53 osDelay(3); 54 } 55} 56``` 57 58主程序创建了三个消息发送者和两个消息接收者,然后调用相关的API确认消息队列的装填 59 60```c 61void rtosv2_msgq_main(void *arg) { 62 (void)arg; 63 64 qid = osMessageQueueNew(QUEUE_SIZE, sizeof(message_entry), NULL); 65 66 osThreadId_t ctid1 = newThread("receiver1", receiver_thread, NULL); 67 osThreadId_t ctid2 = newThread("receiver2", receiver_thread, NULL); 68 osThreadId_t ptid1 = newThread("sender1", sender_thread, NULL); 69 osThreadId_t ptid2 = newThread("sender2", sender_thread, NULL); 70 osThreadId_t ptid3 = newThread("sender3", sender_thread, NULL); 71 72 osDelay(20); 73 uint32_t cap = osMessageQueueGetCapacity(qid); 74 printf("[Message Test] osMessageQueueGetCapacity, capacity: %d.\r\n",cap); 75 uint32_t msg_size = osMessageQueueGetMsgSize(qid); 76 printf("[Message Test] osMessageQueueGetMsgSize, size: %d.\r\n",msg_size); 77 uint32_t count = osMessageQueueGetCount(qid); 78 printf("[Message Test] osMessageQueueGetCount, count: %d.\r\n",count); 79 uint32_t space = osMessageQueueGetSpace(qid); 80 printf("[Message Test] osMessageQueueGetSpace, space: %d.\r\n",space); 81 82 osDelay(80); 83 osThreadTerminate(ctid1); 84 osThreadTerminate(ctid2); 85 osThreadTerminate(ptid1); 86 osThreadTerminate(ptid2); 87 osThreadTerminate(ptid3); 88 osMessageQueueDelete(qid); 89} 90``` 91 92 93 94## 三、如何编译 95 961. 将此目录下的 `message.c` 和 `BUILD.gn` 复制到openharmony源码的`applications\sample\wifi-iot\app\iothardware`目录下, 972. 修改openharmony源码的`applications\sample\wifi-iot\app\BUILD.gn`文件,将其中的 `features` 改为: 98 99``` 100 features = [ 101 "iothardware:message_demo", 102 ] 103``` 104 1053. 在openharmony源码顶层目录执行:`python build.py wifiiot` 106 107## 四、运行结果 108 109截取部分运行结果 110 111``` 112[Message Test] osThreadNew(receiver1) success, thread id: 0xe89d8. 113[Message Test] osThreadNew(receiver2) success, thread id: 0xe8974. 114[Message Test] osThreadNew(sender1) success, thread id: 0xe84c4. 115[Message Test] os[Message Test] sender1 send 0 to message queue. 116[Message Test] sender2 send 1 to message queue. 117ThreadNew(sender2) success, thread id: 0xe871c. 118[Message Test] osThreadNew(sender3) success, thread id: 0xe8910. 119[Message Test] receiver1 get 0 from sender1 by message queue. 120[Message Test] receiver2 get 1 from sender2 by message queue. 121[Message Test] sender3 send 2 to message queue. 122[Message Test] sender1 send 3 to message queue. 123[Message Test] sender2 send 4 to message queue. 124.... 125[Message Test] sender3 send 11 to message queue. 126[Message Test] receiver2 get 11 from sender3 by message queue. 127[Message Test] sender1 send 12 to message queue. 128[Message Test] sender2 send 13 to message queue. 129[Message Test] receiver1 get 12 from sender1 by message queue. 130[Message Test] osMessageQueueGetCapacity, capacity: 3. 131[Message Test] osMessageQueueGetMsgSize, size: 8. 132[Message Test] osMessageQueueGetCount, count: 1. 133[Message Test] osMessageQueueGetSpace, space: 2. 134``` 135 136### 【套件支持】 137 138##### 1. 套件介绍 http://www.hihope.org/pro/pro1.aspx?mtt=8 139 140##### 2. 套件购买 https://item.taobao.com/item.htm?id=622343426064&scene=taobao_shop 141 142##### 3. 技术资料 143 144- Gitee码云网站(OpenHarmony Sample Code等) **https://gitee.com/hihopeorg** 145 146- HiHope官网-资源中心(SDK包、技术文档下载)[**www.hihope.org**](http://www.hihope.org/) 147 148##### 4. 互动交流 149 150- 润和HiHope技术交流-微信群(加群管理员微信13605188699,发送文字#申请加入润和官方群#,予以邀请入群) 151- HiHope开发者社区-论坛 **https://bbs.elecfans.com/group_1429** 152- 润和HiHope售后服务群(QQ:980599547) 153- 售后服务电话(025-52668590) 154 155