引入mqtt 引入cjson

This commit is contained in:
2584532475@qq.com committed 2023-11-30 08:10:01 +08:00
1 parent a69c1a58d6
commit f8591b8b99
86 files changed
+12141 -2157

No files matched your search

+295 -82
View File
@@ -10,107 +10,320 @@
#include <string.h>
#include "usart-board.h"
#include "mqtt-board.h"
#include "network.h"
#include "netdrv.h"
#include "proto.h"
#include "util.h"
#include "data.h"
#include "disdefine.h"
#include "jsonpacket.h"
#include "jsonunpack.h"
#include <stdlib.h>
ALIGN(RT_ALIGN_SIZE)
ALIGN (RT_ALIGN_SIZE)
static char thread_stack[4096];
static struct rt_thread netapp_thread;
static rt_event_t gnetEvents;
#define EVENT_COMM_TX (1U << 0)
#define EVENT_COMM_RX (1U << 1) //
extern MqttDrv_t gMqttDrv;
// case ssKHYSet:
// {
// vv = value*10;
// dbg_printf ("MbusSetValue vv:%d\r\n",vv);
// sendcmd[type][4] = ((vv >> 8) & 0xff);
// sendcmd[type][5] = (vv & 0xff);
// vv = bsp_crc_calc16((uint8_t *)sendcmd[type],6);
// sendcmd[type][7] = ((vv >> 8) & 0xff);
// sendcmd[type][6] = (vv & 0xff);
// for(int i = 0;i < 8;i++)
// {
// dbg_printf("%02X ",sendcmd[type][i]);
// }
// dbg_printf("\r\n");
// }
static rt_timer_t timer;
// {0x01, 0x03, 0x00, 0x00, 0x00, 0x06, 0xC5, 0xC8}, // 闸位计读取开度
// {0x01, 0x06, 0x00, 0x07, 0x00, 0x02, 0xE6, 0x69}, // 闸位计设置开度
// {0x01, 0x06, 0x00, 0x04, 0x01, 0x00, 0xC9, 0x9B}, // 启动闸位计
// {0x01, 0x06, 0x00, 0x04, 0x00, 0x00, 0xC8, 0x0B}, // 停止闸位计
static enum {
netDrvInit = 0, // 初始化网络驱动
netDrvJoin = 1, // 等待网络注册成功
netDrvSend = 2, // 发送数据
netDrvRecv = 3, // 读取数据
netDrvIdle = 4, // 读取数据
}eDrvStatus;
static netWorkInterface_t interface;
static uint32_t g_net_5min_timer[SLUICE_COUTN] = {0};
static uint32_t g_net_1min_timer[SLUICE_COUTN] = {0};
static void net_send_frame(void)
static void timerouter (void * parameter)
{
rt_event_send(gnetEvents,EVENT_COMM_TX) ;
}
// 网络链接成功
static void net_connected(void)
{
}
static void thread_entry(void * argument)
{
eDrvStatus = netDrvInit;
rt_kprintf("%s was start!\r\n",__FILE__);
gnetEvents = rt_event_create("gnetEvents", RT_IPC_FLAG_FIFO) ;
// 读取网络驱动类型
char * drv = ef_get_env ("net_drv"); // 读取网络类型
if(strcmp("dtu",drv) == 0) // 驱动程序位DTU模式,就是不通过本地配置,直接透传
TypeIndexMail_t mail;
for (int i = 0; i < SLUICE_COUTN; i++)
{
DTUThreadStart();
// 初始化串口驱动
// interface.Init = NULL;
// interface.IsConnected = NULL;
// interface.IsIdle = NULL;
// interface.IsReady = NULL;
// interface.ReadData = NULL;
// interface.ReSubTopic = NULL;
// interface.WriteData = NULL;
if (g_net_1min_timer[i] == 1)
{
g_net_1min_timer[i] = 60;
mail.Type = MAIL_COMM_HEART;
mail.index = i + 1;
rt_mb_send (gTCommMail, * ( (uint32_t *) &mail));
}
if (g_net_5min_timer[i] == 1)
{
g_net_5min_timer[i] = 60 * 5;
mail.Type = MAIL_COMM_STAND;
mail.index = i + 1;
rt_mb_send (gTCommMail, * ( (uint32_t *) &mail));
}
if (g_net_1min_timer[i] > 1)
g_net_1min_timer[i]--;
if (g_net_5min_timer[i] > 1)
g_net_5min_timer[i]--;
}
// 注册网络驱动
// 注册网络驱动
while (1)
{
// 发送数据
if( RT_EOK == rt_event_recv( gnetEvents, EVENT_COMM_TX,RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL ))
{
}
if ( RT_EOK == rt_event_recv( gnetEvents, EVENT_COMM_RX,RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL ))
{
}
rt_thread_delay(10);
}
}
void NET_APPThreadStart(void )
const static char upinfo[][10] = {"heart", "regist", "stand", "sluice", "upack", "slack","readcfg"} ;
static void thread_entry (void * argument)
{
rt_kprintf ("%s was start!\r\n", __FILE__);
TypeIndexMail_t mail;
timer = rt_timer_create ("timer", timerouter, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC);
// 读取网络驱动类型
netdrv_init();
MQTTThreadStart();
char data[100] = {0};
int tx_size = 0;
#ifndef USER_JSON_PACKET
char rxdata_decode[256];
int rxdata_decode_size = 0;
uint32_t datak;
#endif
// 判断站点类型
//site_type
char * p = ef_get_env ("site_type") ;
int site_type = cSiteType2Index(p);
rt_kprintf ("site_type:%d\r\n", site_type);
//CommTMail_t mail;
// 注册网络驱动
// 注册网络驱动
while (1)
{
INIT:
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_COMM_RST, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
{
rt_kprintf ("net work lost\r\n");
mail.Type = MAIL_VIEW_NET_STE;
mail.index = DIS_STE_ERROR;
rt_mb_send (gViewMail, * ( (uint32_t*) &mail));
rt_timer_stop (timer);
// 发送消息给
}
if (MQTT_Subscribed() != 1) // 网络链接不成功
{
rt_thread_mdelay (1000);
goto INIT;
}
// 订阅成功
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_MQTT_SUB, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
{
rt_kprintf ("netWork Sub Success\r\n");
// 发送注册报
mail.Type = MAIL_COMM_REGIST;
mail.index = 1;
rt_mb_send (gTCommMail, * ( (uint32_t *) &mail));
for (int i = 0; i < SLUICE_COUTN; i++)
{
rt_timer_start (timer);
g_net_1min_timer[i] = i * 10 + 5;
g_net_5min_timer[i] = i * 10 + 10;
mail.Type = MAIL_VIEW_NET_STE;
mail.index = DIS_STE_SUCCSEE;
rt_mb_send (gViewMail, * ( (uint32_t*) &mail));
}
}
if (rt_mb_recv (gTCommMail, (rt_ubase_t *) &mail, RT_WAITING_NO) == RT_EOK)
{
rt_kprintf ("recv send mail: type:%s,index:%d\n", upinfo[mail.Type], mail.index);
if (g_ifupdate != 1)
{
switch (mail.Type)
{
case MAIL_COMM_HEART:
#ifdef USER_JSON_PACKET
gMqttDrv.tx_size = JsonHeartDatapacket ( (uint8_t *) gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
#else
// 心跳数据
gMqttDrv.tx_size = PacketHeader (0x2F, data, 4, gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
#endif
MQTT_SendData () ;
break;
case MAIL_COMM_REGIST: // 注册报
#ifdef USER_JSON_PACKET // 使用Json格式数据包
gMqttDrv.tx_size = JsonRegistDataPacket ((uint8_t *) gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
#else
// 心跳数据
tx_size = PacketUpRegist (data);
gMqttDrv.tx_size = PacketHeader (0xE4, data, tx_size, gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
#endif
MQTT_SendData () ;
break;
case MAIL_COMM_SLUICE: // 闸门状态自报
tx_size = PacketSluiceUp (mail.index - 1, data);
gMqttDrv.tx_size = PacketHeader (0x4E, data, tx_size, gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
MQTT_SendData () ;
break;
case MAIL_COMM_STAND: // 5分钟标准包上报
#ifdef USER_JSON_PACKET // 使用Json格式数据包
// 判断站点类型
switch (site_type)
{
case SiteSluice: // 闸门站
gMqttDrv.tx_size = Json5MinSluiceDataPacket ( (uint8_t *) gMqttDrv.txbuff);
break;
case SiteFlow:
case SiteSee:
gMqttDrv.tx_size = Json5MinFlowDataPacket ( (uint8_t *) gMqttDrv.txbuff);
break;
case SiteColl:
case SiteServer:
break;
}
gMqttDrv.tx_index = mail.index;
#else
// 心跳数据
tx_size = PakcetTimerUp (mail.index - 1, data);
gMqttDrv.tx_size = PacketHeader (0x31, data, tx_size, gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
#endif
MQTT_SendData () ;
break;
case MAIL_COMM_SLACK: // 提闸的应答
tx_size = PacketSluiceAck (data);
gMqttDrv.tx_size = PacketHeader (0x4E, data, tx_size, gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
MQTT_SendData();
break;
case MAIL_COMM_UPACK: // 升级的应答
#ifdef USER_JSON_PACKET // 使用Json格式数据包
gMqttDrv.tx_size = JsonAckSuccPacket ((uint8_t *) gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
#else
// 心跳数据
tx_size = PacketAnsAck (data);
gMqttDrv.tx_size = PacketHeader (0xE0, data, tx_size, gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
#endif
MQTT_SendData();
break;
case MAIL_COMM_READPARA:
#ifdef USER_JSON_PACKET // 使用Json格式数据包
gMqttDrv.tx_size = JsonConfigReadDataPacket ((uint8_t *) gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
#else
// 心跳数据
tx_size = PacketUpRegist (data);
gMqttDrv.tx_size = PacketHeader (0xE4, data, tx_size, gMqttDrv.txbuff);
gMqttDrv.tx_index = mail.index;
#endif
MQTT_SendData();
break;
default:
break;
}
}
}
// 接受数据
if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_COMM_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
{
#ifdef USER_JSON_PACKET // 使用Json格式数据包
JsonUnPacket(gMqttDrv.rx_index - 1,gMqttDrv.rxbuff); // 第n个通道过来的数据
// 解析数据
#else
rxdata_decode_size = hexstr_to_hexbyte (gMqttDrv.rxbuff, rxdata_decode, gMqttDrv.rx_size);
rt_kprintf ("<<<<<<<<<<<<rx_size:%d\r\n", rxdata_decode_size);
for (int i = 0; i < rxdata_decode_size; i++)
{
rt_kprintf ("%02X ", rxdata_decode[i]);
}
rt_kprintf ("\r\n");
switch ( (int) rxdata_decode[10])
{
case 0x4E: // 控制闸门操作
{
// 远程提闸
datak = rxdata_decode[18];
datak = (datak << 8) + rxdata_decode[19];
rt_kprintf ("open:%u mm/10\r\n", datak);
//SluiceData[gMqttDrv.rx_index].opt = 1; // 执行操作闸门
SluiceData[gMqttDrv.rx_index - 1].sopen = datak / 10;
mail.Type = MAIL_SLUICE_OPT;
mail.index = gMqttDrv.rx_index - 1;
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
// 回复应答
mail.Type = MAIL_COMM_SLACK;
mail.index = gMqttDrv.rx_index;
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
break;
}
case 0xE0:// 远程升级
{
int filenamesize = 0;
rt_memset (SysData.fileName, 0, 32);
filenamesize = rxdata_decode[12] - 2;
rt_memcpy (SysData.fileName, &rxdata_decode[16], filenamesize);
// 启动升级线程
rt_kprintf ("filename:[%s]\r\n", SysData.fileName);
// 回复应答
mail.Type = MAIL_COMM_UPACK;
mail.index = gMqttDrv.rx_index;
rt_mb_send (gTCommMail, * ( (uint32_t*) &mail));
rt_thread_mdelay (2000);
UpgradeThreadStart();
//
// 应答ACK
break;
}
case 0xE1: // 远程停止闸门
{
mail.Type = MAIL_SLUICE_STP; // 停止提
mail.index = gMqttDrv.rx_index - 1;
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
break;
}
case 0xE2: // 读取远程参数
{
break;
}
default:
break;
}
#endif
}
// 网络连接丢失
rt_thread_mdelay (10);
}
}
void NET_APPThreadStart (void)
{
/* 创建线程1,名称是thread1,入口是thread1_entry*/
rt_thread_init(&netapp_thread, "netapp_thread",
thread_entry, RT_NULL,
&thread_stack[0],
sizeof(thread_stack),
NET_APP_THREAD_PRIORITY, NET_APP_THREAD_TIMESLICE);
rt_thread_startup(&netapp_thread);
return ;
rt_thread_init (&netapp_thread, "netapp_thread",
thread_entry, RT_NULL,
&thread_stack[0],
sizeof (thread_stack),
NET_APP_THREAD_PRIORITY, NET_APP_THREAD_TIMESLICE);
rt_thread_startup (&netapp_thread);
return ;
}