277 lines
6.7 KiB
C
277 lines
6.7 KiB
C
#include "farm_ai_demo.h"
|
||
#include "tos_farm_ai_config.h"
|
||
#include "cJSON.h"
|
||
#include "E53_IA1.h"
|
||
#include "mcu_init.h"
|
||
|
||
//#define USE_NB_BC35
|
||
#define USE_ESP8266
|
||
|
||
|
||
int sock_id = 0;
|
||
|
||
double math_keep_ndot(double num,char dot){
|
||
char temp[100];
|
||
sprintf((char *)temp,"%.*lf",dot,num);
|
||
sscanf(temp,"%lf",&num);
|
||
return num;
|
||
|
||
}
|
||
|
||
static int str_to_hex(const char *bufin, int len, char *bufout)
|
||
{
|
||
int i = 0;
|
||
unsigned char tmp2 = 0x0;
|
||
unsigned int tmp = 0;
|
||
if (NULL == bufin || len <= 0 || NULL == bufout)
|
||
{
|
||
return -1;
|
||
}
|
||
for(i = 0; i < len; i = i+2)
|
||
{
|
||
tmp2 = bufin[i];
|
||
tmp2 = tmp2 <= '9'?tmp2-0x30:tmp2-0x37;
|
||
tmp = bufin[i+1];
|
||
tmp = tmp <= '9'?tmp-0x30:tmp-0x37;
|
||
bufout[i/2] =(tmp2<<4)|(tmp&0x0F);
|
||
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int mq_dev_report(void)
|
||
{
|
||
char *data;
|
||
char topic[50]={0};
|
||
cJSON *root = NULL;
|
||
mqtt_pub_opt_t pub_opt;
|
||
pub_opt.dup = 0;
|
||
pub_opt.qos = 0;
|
||
pub_opt.retained = 0;
|
||
pub_opt.id = 0;
|
||
pub_opt.topic = MQTT_PUBLISH_TOPIC;
|
||
|
||
// {"motor":0,"light":1,"temperature":22.22,"humidity":55.55,"light_intensity":100.00}
|
||
// printf("motor:%d,light:%d,tem:%f,humi:%f,lux:%f\n",E53_IA1_Data.MotorMode,E53_IA1_Data.LightMode,E53_IA1_Data.Temperature,E53_IA1_Data.Humidity,E53_IA1_Data.Lux);
|
||
root = cJSON_CreateObject();
|
||
cJSON_AddNumberToObject(root, "motor",E53_IA1_Data.MotorMode);
|
||
cJSON_AddNumberToObject(root, "light",E53_IA1_Data.LightMode);
|
||
cJSON_AddNumberToObject(root, "temperature",math_keep_ndot((double)E53_IA1_Data.Temperature,2));
|
||
cJSON_AddNumberToObject(root, "humidity",math_keep_ndot((double)E53_IA1_Data.Humidity,2));
|
||
cJSON_AddNumberToObject(root, "light_intensity",math_keep_ndot((double)E53_IA1_Data.Lux,2));
|
||
/* formatted print */
|
||
//data = cJSON_Print(root);
|
||
data=cJSON_PrintUnformatted(root);
|
||
|
||
pub_opt.topic = MQTT_PUBLISH_TOPIC;
|
||
pub_opt.payload =(unsigned char *)data;
|
||
pub_opt.payload_len = strlen(data);
|
||
printf("\r\nreport--->topic:%s\r\ndata(%d):%s", pub_opt.topic,pub_opt.payload_len,pub_opt.payload);
|
||
if (tos_mqtt_publish(sock_id, &pub_opt) != 0) {
|
||
printf("publish failed!!!\n");
|
||
}
|
||
tos_mmheap_free(data);
|
||
cJSON_Delete(root);
|
||
return 0;
|
||
}
|
||
|
||
int parse_dev_cmd(char *data)
|
||
{
|
||
//{"motor":0,"light":1}
|
||
//JSON字符串到cJSON格式
|
||
cJSON* cjson = cJSON_Parse(data);
|
||
cJSON *cjsonret=NULL;
|
||
int motor;
|
||
int light;
|
||
char *str;
|
||
printf("parse_dev_cmd...\n");
|
||
//判断cJSON_Parse函数返回值确定是否打包成<E58C85>??
|
||
if(cjson == NULL){
|
||
printf("json pack into cjson error...");
|
||
return -1;
|
||
}
|
||
else{//打包成功调用cJSON_Print打印输出
|
||
cJSON_Print(cjson);
|
||
}
|
||
|
||
cjsonret = NULL;
|
||
cjsonret = cJSON_GetObjectItem(cjson,"motor");
|
||
if(cjsonret!=NULL)
|
||
{
|
||
//打印输出
|
||
motor=cjsonret->valueint;
|
||
printf("motor=%d\n",motor);
|
||
if(motor==1)
|
||
{//power on relay
|
||
motor_control(1);
|
||
}
|
||
else if(motor==0)
|
||
{//power off relay
|
||
motor_control(0);
|
||
}
|
||
}
|
||
cjsonret = NULL;
|
||
cjsonret = cJSON_GetObjectItem(cjson,"light");
|
||
if(cjsonret!=NULL)
|
||
{
|
||
//打印输出
|
||
light=cjsonret->valueint;
|
||
//打印输出
|
||
printf("light=%d\n",light);
|
||
if(light==1)
|
||
{//power on relay
|
||
light_control(1);
|
||
}
|
||
else if(light==0)
|
||
{//power off relay
|
||
light_control(0);
|
||
}
|
||
}
|
||
|
||
cjsonret = cJSON_GetObjectItem(cjson,"speaker");
|
||
if(cjsonret!=NULL)
|
||
{
|
||
//打印输出
|
||
printf("parse speaker:%s\n",cjsonret->valuestring);
|
||
str=tos_mmheap_alloc(strlen(cjsonret->valuestring));
|
||
if(str!=NULL)
|
||
{
|
||
memset(str,0x00,strlen(cjsonret->valuestring));
|
||
str_to_hex(cjsonret->valuestring,strlen(cjsonret->valuestring),str);
|
||
extern void speaker(char *str);
|
||
speaker(str);
|
||
tos_mmheap_free(str);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
//delete cjson
|
||
cJSON_Delete(cjson);
|
||
return 0;
|
||
}
|
||
|
||
int mq_dev_receiv(void){
|
||
static int count = 1;
|
||
uint8_t read_data[100];
|
||
int read_len;
|
||
char topic[50];
|
||
mqtt_sub_opt_t sub_opt;
|
||
|
||
sub_opt.count = 1;
|
||
sub_opt.dup = 0;
|
||
sub_opt.id = 1;
|
||
sub_opt.req_qos = 0;
|
||
sub_opt.topic = MQTT_SUBSCRIBE_TOPIC;
|
||
|
||
printf("MQTT count: %d\r\n",count);
|
||
printf("read buf1,\r\n");
|
||
read_len = tos_mqtt_receive(sub_opt.topic, strlen(sub_opt.topic), read_data, sizeof(read_data));
|
||
if (read_len >= 0) {
|
||
printf("---------->topic: %s, payload: %s, payload_len: %d\n", sub_opt.topic, read_data, read_len);
|
||
parse_dev_cmd(read_data);
|
||
}
|
||
count++;
|
||
}
|
||
|
||
int mq_dev_subscribe(void){
|
||
char topic[50];
|
||
mqtt_sub_opt_t sub_opt;
|
||
|
||
sub_opt.count = 1;
|
||
sub_opt.dup = 0;
|
||
sub_opt.id = 1;
|
||
sub_opt.req_qos = 0;
|
||
sub_opt.topic = MQTT_SUBSCRIBE_TOPIC;
|
||
|
||
printf("subscribe topic1:%s",sub_opt.topic);
|
||
if (tos_mqtt_subscribe(sock_id, &sub_opt) != 0) {
|
||
printf("subscribe failed!!!\n");
|
||
}
|
||
|
||
}
|
||
void ai_demo(void)
|
||
{
|
||
mqtt_con_opt_t con_opt;
|
||
#ifdef USE_ESP8266
|
||
extern int esp8266_sal_init(hal_uart_port_t uart_port);
|
||
extern int esp8266_join_ap(const char *ssid, const char *pwd);
|
||
esp8266_sal_init(HAL_UART_PORT_0);
|
||
esp8266_join_ap("test", "12345678");
|
||
#endif
|
||
|
||
#ifdef USE_M26
|
||
int m26_sal_init(hal_uart_port_t uart_port);
|
||
m26_power_on();
|
||
m26_sal_init(HAL_UART_PORT_0);
|
||
#endif
|
||
|
||
#ifdef USE_NB_BC35
|
||
int bc35_28_95_sal_init(hal_uart_port_t uart_port);
|
||
bc35_28_95_sal_init(HAL_UART_PORT_0);
|
||
#endif
|
||
|
||
con_opt.keep_alive_interval = 2000;
|
||
con_opt.cleansession = 1;
|
||
con_opt.username = MQTT_USR_NAME;
|
||
con_opt.password = MQTT_PASSWORD;
|
||
con_opt.client_id = MQTT_CLIENT_ID;
|
||
|
||
sock_id = tos_mqtt_connect(MQTT_SERVER_IP, MQTT_SERVER_PORT, &con_opt);
|
||
printf("socke id id %d \r\n",sock_id);
|
||
mq_dev_subscribe();
|
||
while (1)
|
||
{
|
||
mq_dev_report();
|
||
mq_dev_receiv();
|
||
osDelay(1000);
|
||
}
|
||
}
|
||
|
||
void sensor_read(void){
|
||
while(1){
|
||
E53_IA1_Read_Data();
|
||
osDelay(100);
|
||
}
|
||
}
|
||
|
||
#define welcomspeak "<22><>ӭTOS"
|
||
//#define welcomspeak "<22><>ӭ"
|
||
//FD 00 06 01 01 BB B6 D3 AD
|
||
void speaker(char *str){
|
||
char data[100];
|
||
int16_t len=0;
|
||
char code=0;
|
||
char times=10;
|
||
int ret;
|
||
|
||
len=2+strlen(str);
|
||
printf("speaker(%s)\n",str);
|
||
data[0]=0xFD;
|
||
data[1]=len>>16;
|
||
data[2]=len&0x00FF;
|
||
data[3]=0x01;
|
||
data[4]=0x01;
|
||
memcpy(&data[5],str,len-2);
|
||
HAL_UART_Transmit(&huart3,data,len+3,1000);
|
||
}
|
||
|
||
#define SENSOR_READ_TASK_STK_SIZE 2048
|
||
extern void sensor_read(void);
|
||
osThreadDef(sensor_read, osPriorityNormal, 1, SENSOR_READ_TASK_STK_SIZE);
|
||
|
||
void application_entry(void *arg)
|
||
{
|
||
printf("mqtt demo run!\r\n");
|
||
Init_E53_IA1();
|
||
speaker(welcomspeak);
|
||
osThreadCreate(osThread(sensor_read), NULL);
|
||
ai_demo();
|
||
while (1) {
|
||
printf("This is a mqtt demo!\r\n");
|
||
tos_task_delay(1000);
|
||
}
|
||
}
|
||
|