• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2  Copyright (C) 2024 HiHope Open Source Organization .
3  Licensed under the Apache License, Version 2.0 (the "License");
4  you may not use this file except in compliance with the License.
5  You may obtain a copy of the License at
6 
7      http://www.apache.org/licenses/LICENSE-2.0
8 
9  Unless required by applicable law or agreed to in writing, software
10  distributed under the License is distributed on an "AS IS" BASIS,
11  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  See the License for the specific language governing permissions and
13  limitations under the License.
14  */
15 
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #include "ohos_init.h"
20 #include "cmsis_os2.h"
21 #include "unistd.h"
22 
23 #include "MQTTClient.h"     // MQTTClient-C库接口文件
24 #include "mqtt_ohos.h"      // OHOS适配接口文件
25 
26 #include "iot_gpio.h"
27 #include "iot_gpio_ex.h"
28 
29 //要连接热点的名称,根据实际情况修改
30 #define SSID "WIFI-0A02"
31 
32 //要连接热点的密码,根据实际情况修改
33 #define PSK "1234567890"
34 
35 // MQTT服务器IP地址(默认是电脑的地址),请根据实际情况修改
36 #define MQTT_SERVER_IP "192.168.100.198"
37 
38 // MQTT服务器端口,请根据实际情况修改
39 #define MQTT_SERVER_PORT "1888"
40 
41 //交通板红色LED
42 #define RED_GPIO 7
43 
44 // MQTT客户端
45 static MQTTClient client = {0};
46 
47 // MQTT网络连接
48 static Network network = {0};
49 
50 // 发送和接收的数据缓冲区
51 static unsigned char sendbuf[100], readbuf[100];
52 
53 //MQTT消息
54 MQTTMessage message;
55 
56 
57 /// 初始化交通灯板红色LED的引脚
InitLED(void)58 void InitLED(void)
59 {
60     usleep(1000000);
61     // 初始化GPIO模块
62     IoTGpioInit(RED_GPIO);
63     // 设置GPIO7为GPIO功能。
64     IoSetFunc(RED_GPIO, IOT_IO_FUNC_GPIO_7_GPIO);
65     // 设置GPIO7为输出模式(引脚方向为输出)。
66     IoTGpioSetDir(RED_GPIO, IOT_GPIO_DIR_OUT);
67 }
68 
69 // uint16_t state;
70 // uint16_t param;
71 // 接收订阅消息的回调函数
OnMessageArrived(MessageData * data)72 static void OnMessageArrived(MessageData *data)
73 {
74 
75 
76     printf("Message form \r\n%s\r\n",
77     data->topicName->lenstring.data);
78     char* ret = strstr(data->message->payload, "state");
79     char *ptr;
80     uint8_t i = 0;
81     if (ret != NULL){
82 
83     while (ret[i] != '1'&&ret[i] != '0')
84     {
85         i++;
86         if (ret[i] == '1')
87         {
88             printf("LED_ON!!\r\n");
89             IoTGpioSetOutputVal(RED_GPIO,1);
90         }
91         else if(ret[i] == '0'){
92             printf("LED_OFF!!\r\n");
93             IoTGpioSetOutputVal(RED_GPIO,0);
94         }
95 
96     }
97 }
98     else printf("can not find state\n");
99 
100 
101 
102 }
103 
MqttTask(void * arg)104 static void MqttTask(void *arg)
105 {
106     MQTTClient *c = (MQTTClient *)arg;
107     while (c)
108     {
109         mqttMutexLock(&c->mutex);
110         if (c->isconnected)
111         {
112             //接收订阅的数据
113             MQTTYield(c, 1);
114         }
115         mqttMutexUnlock(&c->mutex);
116 
117         osDelay(100);
118     }
119 }
120 
mqttDemoTask(void * arg)121 static void mqttDemoTask(void *arg)
122 {
123     (void)arg;
124 
125     InitLED();
126     // 连接到热点
127     if (ConnectToHotspot(SSID, PSK) != 0)
128     {
129         // 连接到热点失败
130         printf("Connect to AP failed\r\n");
131         return;
132     }
133 
134     // 等待TCP连接完成
135     osDelay(100);
136 
137     //初始化MQTT相关的参数和回调
138     NetworkInit(&network);
139     // 初始化MQTT客户端
140     MQTTClientInit(&client, &network, 200, sendbuf, sizeof(sendbuf), readbuf, sizeof(readbuf));
141 
142     const char *host = MQTT_SERVER_IP;                               // MQTT服务器IP地址
143     unsigned short port = atoi(MQTT_SERVER_PORT);                      // MQTT服务器端口
144     const char *clientId = "client_test";                              // MQTT客户端ID
145     const char *username = NULL;                                        // MQTT服务器用户名
146     const char *passwords = NULL;                                        // MQTT服务器密码
147 
148     // 初始化MQTT连接信息
149     MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;
150     // 用于接收接口返回值
151     int ret = NetworkConnect(&network, (char *)host, port);
152 
153     if(ret != 0){
154         printf("TCP Connect failed!,ret = %d\r\n",ret);
155         return;
156     }
157 
158     // 设置用户名和密码
159     if (username != NULL && passwords != NULL)
160     {
161         connectData.username.cstring = (char *)username;
162         connectData.password.cstring = (char *)passwords;
163     }
164 
165     /* 设置MQTT版本*/
166     // 3 = 3.1
167     // 4 = 3.1.1
168     connectData.MQTTVersion = 3;
169 
170     // 设置MQTT客户端ID
171     connectData.clientID.cstring = (char *)clientId;
172 
173     // 发送MQTT连接包
174     if ((ret = MQTTConnect(&client, &connectData)) != 0)
175     {
176         // 连接失败
177         printf("Connect MQTT Broker failed!,ret = %d\r\n",ret);
178         return;
179     }else{
180        // 成功连接到MQTT服务器
181         printf("MQTT Connected!\r\n");
182     }
183 
184     char *topic = "control_led_topic";            // 订阅主题
185 
186     if ((ret = MQTTSubscribe(&client, topic, QOS2, OnMessageArrived)) != 0)
187     {
188         // 订阅失败
189         printf("MQTTSubscribe failed: %d\r\n", ret);
190         return;
191     }else{
192         // 输出订阅成功信息
193         printf("MQTT Subscribe OK\r\n");
194     }
195 
196     // 创建MQTT任务线程,接收订阅主题的消息
197      ret = ThreadStart(&client.thread, MqttTask, &client);
198 }
199 
200 // 入口函数
mqttDemoEntry(void)201 static void mqttDemoEntry(void)
202 {
203     // 定义线程属性
204     osThreadAttr_t attr;
205     attr.name = "mqttDemoTask";
206     attr.attr_bits = 0U;
207     attr.cb_mem = NULL;
208     attr.cb_size = 0U;
209     attr.stack_mem = NULL;
210     attr.stack_size = 0x1000;
211     attr.priority = osPriorityNormal;
212 
213     // 创建线程
214     if (osThreadNew(mqttDemoTask, NULL, &attr) == NULL)
215     {
216         printf("[mqttDemoEntry] Falied to create mqttDemoTask!\n");
217     }
218 }
219 
220 // 运行入口函数
221 APP_FEATURE_INIT(mqttDemoEntry);
222