10a7ce71fSopenharmony_ci# HiSpark WiFi-IoT 套件样例开发--消息队列(MessageQueue)
20a7ce71fSopenharmony_ci
30a7ce71fSopenharmony_ci![hihope_illustration](https://gitee.com/hihopeorg/hispark-hm-pegasus/raw/master/docs/figures/hihope_illustration.png)
40a7ce71fSopenharmony_ci
50a7ce71fSopenharmony_ci[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开发者中得到广泛应用。
60a7ce71fSopenharmony_ci
70a7ce71fSopenharmony_ci![wifi_iot](https://gitee.com/hihopeorg/hispark-hm-pegasus/raw/master/docs/figures/2.png)
80a7ce71fSopenharmony_ci
90a7ce71fSopenharmony_ci## 一、MessageQueue API
100a7ce71fSopenharmony_ci
110a7ce71fSopenharmony_ci| API名称                   | 说明                                                         |
120a7ce71fSopenharmony_ci| ------------------------- | ------------------------------------------------------------ |
130a7ce71fSopenharmony_ci| osMessageQueueNew         | 创建和初始化一个消息队列                                     |
140a7ce71fSopenharmony_ci| osMessageQueueGetName     | 返回指定的消息队列的名字                                     |
150a7ce71fSopenharmony_ci| osMessageQueuePut         | 向指定的消息队列存放1条消息,如果消息队列满了,那么返回超时  |
160a7ce71fSopenharmony_ci| osMessageQueueGet         | 从指定的消息队列中取得1条消息,如果消息队列为空,那么返回超时 |
170a7ce71fSopenharmony_ci| osMessageQueueGetCapacity | 获得指定的消息队列的消息容量                                 |
180a7ce71fSopenharmony_ci| osMessageQueueGetMsgSize  | 获得指定的消息队列中可以存放的最大消息的大小                 |
190a7ce71fSopenharmony_ci| osMessageQueueGetCount    | 获得指定的消息队列中当前的消息数                             |
200a7ce71fSopenharmony_ci| osMessageQueueGetSpace    | 获得指定的消息队列中还可以存放的消息数                       |
210a7ce71fSopenharmony_ci| osMessageQueueReset       | 将指定的消息队列重置为初始状态                               |
220a7ce71fSopenharmony_ci| osMessageQueueDelete      | 删除指定的消息队列                                           |
230a7ce71fSopenharmony_ci
240a7ce71fSopenharmony_ci## 二、代码分析
250a7ce71fSopenharmony_ci
260a7ce71fSopenharmony_ci`osMessageQueueNew`创建一个消息队列
270a7ce71fSopenharmony_ci
280a7ce71fSopenharmony_ci发送者每次将自己`count`的值与线程ID发送,并将`count`加1;
290a7ce71fSopenharmony_ci
300a7ce71fSopenharmony_ci接受者从消息队列中获取一条信息,然后将其打印输出
310a7ce71fSopenharmony_ci
320a7ce71fSopenharmony_ci```c
330a7ce71fSopenharmony_civoid sender_thread(void *arg) {
340a7ce71fSopenharmony_ci    static int count=0;
350a7ce71fSopenharmony_ci    message_entry sentry;
360a7ce71fSopenharmony_ci    (void)arg;
370a7ce71fSopenharmony_ci    while(1) {
380a7ce71fSopenharmony_ci        sentry.tid = osThreadGetId();
390a7ce71fSopenharmony_ci        sentry.count = count;
400a7ce71fSopenharmony_ci        printf("[Message Test] %s send %d to message queue.\r\n", osThreadGetName(osThreadGetId()), count);
410a7ce71fSopenharmony_ci        osMessageQueuePut(qid, (const void *)&sentry, 0, osWaitForever);
420a7ce71fSopenharmony_ci        count++;
430a7ce71fSopenharmony_ci        osDelay(5);
440a7ce71fSopenharmony_ci    }
450a7ce71fSopenharmony_ci}
460a7ce71fSopenharmony_ci
470a7ce71fSopenharmony_civoid receiver_thread(void *arg) {
480a7ce71fSopenharmony_ci    (void)arg;
490a7ce71fSopenharmony_ci    message_entry rentry;
500a7ce71fSopenharmony_ci    while(1) {
510a7ce71fSopenharmony_ci        osMessageQueueGet(qid, (void *)&rentry, NULL, osWaitForever);
520a7ce71fSopenharmony_ci        printf("[Message Test] %s get %d from %s by message queue.\r\n", osThreadGetName(osThreadGetId()), rentry.count, osThreadGetName(rentry.tid));
530a7ce71fSopenharmony_ci        osDelay(3);
540a7ce71fSopenharmony_ci    }
550a7ce71fSopenharmony_ci}
560a7ce71fSopenharmony_ci```
570a7ce71fSopenharmony_ci
580a7ce71fSopenharmony_ci主程序创建了三个消息发送者和两个消息接收者,然后调用相关的API确认消息队列的装填
590a7ce71fSopenharmony_ci
600a7ce71fSopenharmony_ci```c
610a7ce71fSopenharmony_civoid rtosv2_msgq_main(void *arg) {
620a7ce71fSopenharmony_ci    (void)arg;
630a7ce71fSopenharmony_ci
640a7ce71fSopenharmony_ci    qid = osMessageQueueNew(QUEUE_SIZE, sizeof(message_entry), NULL);
650a7ce71fSopenharmony_ci
660a7ce71fSopenharmony_ci    osThreadId_t ctid1 = newThread("receiver1", receiver_thread, NULL);
670a7ce71fSopenharmony_ci    osThreadId_t ctid2 = newThread("receiver2", receiver_thread, NULL);
680a7ce71fSopenharmony_ci    osThreadId_t ptid1 = newThread("sender1", sender_thread, NULL);
690a7ce71fSopenharmony_ci    osThreadId_t ptid2 = newThread("sender2", sender_thread, NULL);
700a7ce71fSopenharmony_ci    osThreadId_t ptid3 = newThread("sender3", sender_thread, NULL);
710a7ce71fSopenharmony_ci
720a7ce71fSopenharmony_ci    osDelay(20);
730a7ce71fSopenharmony_ci    uint32_t cap = osMessageQueueGetCapacity(qid);
740a7ce71fSopenharmony_ci    printf("[Message Test] osMessageQueueGetCapacity, capacity: %d.\r\n",cap);
750a7ce71fSopenharmony_ci    uint32_t msg_size =  osMessageQueueGetMsgSize(qid);
760a7ce71fSopenharmony_ci    printf("[Message Test] osMessageQueueGetMsgSize, size: %d.\r\n",msg_size);
770a7ce71fSopenharmony_ci    uint32_t count = osMessageQueueGetCount(qid);
780a7ce71fSopenharmony_ci    printf("[Message Test] osMessageQueueGetCount, count: %d.\r\n",count);
790a7ce71fSopenharmony_ci    uint32_t space = osMessageQueueGetSpace(qid);
800a7ce71fSopenharmony_ci    printf("[Message Test] osMessageQueueGetSpace, space: %d.\r\n",space);
810a7ce71fSopenharmony_ci
820a7ce71fSopenharmony_ci    osDelay(80);
830a7ce71fSopenharmony_ci    osThreadTerminate(ctid1);
840a7ce71fSopenharmony_ci    osThreadTerminate(ctid2);
850a7ce71fSopenharmony_ci    osThreadTerminate(ptid1);
860a7ce71fSopenharmony_ci    osThreadTerminate(ptid2);
870a7ce71fSopenharmony_ci    osThreadTerminate(ptid3);
880a7ce71fSopenharmony_ci    osMessageQueueDelete(qid);
890a7ce71fSopenharmony_ci}
900a7ce71fSopenharmony_ci```
910a7ce71fSopenharmony_ci
920a7ce71fSopenharmony_ci
930a7ce71fSopenharmony_ci
940a7ce71fSopenharmony_ci## 三、如何编译
950a7ce71fSopenharmony_ci
960a7ce71fSopenharmony_ci1. 将此目录下的 `message.c` 和 `BUILD.gn` 复制到openharmony源码的`applications\sample\wifi-iot\app\iothardware`目录下,
970a7ce71fSopenharmony_ci2. 修改openharmony源码的`applications\sample\wifi-iot\app\BUILD.gn`文件,将其中的 `features` 改为:
980a7ce71fSopenharmony_ci
990a7ce71fSopenharmony_ci```
1000a7ce71fSopenharmony_ci    features = [
1010a7ce71fSopenharmony_ci        "iothardware:message_demo",
1020a7ce71fSopenharmony_ci    ]
1030a7ce71fSopenharmony_ci```
1040a7ce71fSopenharmony_ci
1050a7ce71fSopenharmony_ci3. 在openharmony源码顶层目录执行:`python build.py wifiiot`
1060a7ce71fSopenharmony_ci
1070a7ce71fSopenharmony_ci## 四、运行结果
1080a7ce71fSopenharmony_ci
1090a7ce71fSopenharmony_ci截取部分运行结果
1100a7ce71fSopenharmony_ci
1110a7ce71fSopenharmony_ci```
1120a7ce71fSopenharmony_ci[Message Test] osThreadNew(receiver1) success, thread id: 0xe89d8.
1130a7ce71fSopenharmony_ci[Message Test] osThreadNew(receiver2) success, thread id: 0xe8974.
1140a7ce71fSopenharmony_ci[Message Test] osThreadNew(sender1) success, thread id: 0xe84c4.
1150a7ce71fSopenharmony_ci[Message Test] os[Message Test] sender1 send 0 to message queue.
1160a7ce71fSopenharmony_ci[Message Test] sender2 send 1 to message queue.
1170a7ce71fSopenharmony_ciThreadNew(sender2) success, thread id: 0xe871c.
1180a7ce71fSopenharmony_ci[Message Test] osThreadNew(sender3) success, thread id: 0xe8910.
1190a7ce71fSopenharmony_ci[Message Test] receiver1 get 0 from sender1 by message queue.
1200a7ce71fSopenharmony_ci[Message Test] receiver2 get 1 from sender2 by message queue.
1210a7ce71fSopenharmony_ci[Message Test] sender3 send 2 to message queue.
1220a7ce71fSopenharmony_ci[Message Test] sender1 send 3 to message queue.
1230a7ce71fSopenharmony_ci[Message Test] sender2 send 4 to message queue.
1240a7ce71fSopenharmony_ci....
1250a7ce71fSopenharmony_ci[Message Test] sender3 send 11 to message queue.
1260a7ce71fSopenharmony_ci[Message Test] receiver2 get 11 from sender3 by message queue.
1270a7ce71fSopenharmony_ci[Message Test] sender1 send 12 to message queue.
1280a7ce71fSopenharmony_ci[Message Test] sender2 send 13 to message queue.
1290a7ce71fSopenharmony_ci[Message Test] receiver1 get 12 from sender1 by message queue.
1300a7ce71fSopenharmony_ci[Message Test] osMessageQueueGetCapacity, capacity: 3.
1310a7ce71fSopenharmony_ci[Message Test] osMessageQueueGetMsgSize, size: 8.
1320a7ce71fSopenharmony_ci[Message Test] osMessageQueueGetCount, count: 1.
1330a7ce71fSopenharmony_ci[Message Test] osMessageQueueGetSpace, space: 2.
1340a7ce71fSopenharmony_ci```
1350a7ce71fSopenharmony_ci
1360a7ce71fSopenharmony_ci### 【套件支持】
1370a7ce71fSopenharmony_ci
1380a7ce71fSopenharmony_ci##### 1. 套件介绍  http://www.hihope.org/pro/pro1.aspx?mtt=8
1390a7ce71fSopenharmony_ci
1400a7ce71fSopenharmony_ci##### 2. 套件购买  https://item.taobao.com/item.htm?id=622343426064&scene=taobao_shop
1410a7ce71fSopenharmony_ci
1420a7ce71fSopenharmony_ci##### 3. 技术资料
1430a7ce71fSopenharmony_ci
1440a7ce71fSopenharmony_ci- Gitee码云网站(OpenHarmony Sample Code等) **https://gitee.com/hihopeorg**
1450a7ce71fSopenharmony_ci
1460a7ce71fSopenharmony_ci- HiHope官网-资源中心(SDK包、技术文档下载)[**www.hihope.org**](http://www.hihope.org/)
1470a7ce71fSopenharmony_ci
1480a7ce71fSopenharmony_ci##### 4. 互动交流
1490a7ce71fSopenharmony_ci
1500a7ce71fSopenharmony_ci- 润和HiHope技术交流-微信群(加群管理员微信13605188699,发送文字#申请加入润和官方群#,予以邀请入群)
1510a7ce71fSopenharmony_ci- HiHope开发者社区-论坛 **https://bbs.elecfans.com/group_1429**
1520a7ce71fSopenharmony_ci- 润和HiHope售后服务群(QQ:980599547)
1530a7ce71fSopenharmony_ci- 售后服务电话(025-52668590)
1540a7ce71fSopenharmony_ci
155