193 lines
6.0 KiB
C
193 lines
6.0 KiB
C
#include <stdint.h>
|
||
#include <string.h>
|
||
|
||
#include "lwip/ip_addr.h"
|
||
#include "lwip/tcp.h"
|
||
#include "lwip/err.h"
|
||
#include "lwip/opt.h"
|
||
#include "lwip/sockets.h"
|
||
#include "stm32/ModbusS.h"
|
||
#include "esp_log.h"
|
||
|
||
#define LOG_TAG "[communication_tcp_sr]: "
|
||
|
||
bool tcp_is_connected = false;
|
||
extern bool data_notify_enable; /* 是否允许数据上报 */
|
||
extern void gatts_write_data_cb(uint8_t *data, uint32_t len);
|
||
|
||
static err_t ModBusSlave_recv(void *arg, struct tcp_pcb *newpcb, struct pbuf *p, err_t err) {
|
||
if (p != NULL) {
|
||
uint8_t *rxbuf;
|
||
int rxlen;
|
||
tcp_recved(newpcb, p->tot_len);
|
||
rxbuf = (uint8_t *)p->payload;
|
||
rxlen = p->len;
|
||
ESP_LOGI(LOG_TAG, "recive data %d:", rxlen);
|
||
esp_log_buffer_hex(LOG_TAG, rxbuf, rxlen);
|
||
gatts_write_data_cb(rxbuf, rxlen);
|
||
pbuf_free(p);
|
||
}
|
||
else if (err == ERR_OK)
|
||
{
|
||
ESP_LOGI(LOG_TAG, "gps1 remote end is closing the connection\n");
|
||
for (uint8_t i = 0; i < 1; i++)
|
||
{ // 清空所有客户端
|
||
gps1_acce_newpacb[i] = 0;
|
||
}
|
||
tcp_err(newpcb, NULL);
|
||
tcp_recv(newpcb, NULL);
|
||
tcp_poll(newpcb, NULL, 120);
|
||
err_t err_p = tcp_close(newpcb);
|
||
tcp_is_connected = false;
|
||
if (ERR_OK != err_p)
|
||
{
|
||
ESP_LOGI(LOG_TAG, "gps1 close error. err:%d\n", err_p);
|
||
}
|
||
return err_p;
|
||
}
|
||
return ERR_OK;
|
||
}
|
||
|
||
|
||
static void ModBusSlave_conn_err(void *arg, err_t err) {
|
||
// log_printf(LERROR, LOG_TAG "connection error, err:%d\n", err);
|
||
tcp_is_connected = false;
|
||
}
|
||
static err_t ModBusSlave_poll(void *arg, struct tcp_pcb *newpcb) {
|
||
// if (newpcb) {
|
||
// // log_printf(LERROR, LOG_TAG "close pcb\n");
|
||
// tcp_close(newpcb);
|
||
// newpcb = NULL;
|
||
// }
|
||
ESP_LOGI(LOG_TAG, "poll!");
|
||
return ERR_OK;
|
||
}
|
||
|
||
|
||
static err_t ModBusSlave_accept(void *arg, struct tcp_pcb *pcb, err_t err) {
|
||
tcp_err(pcb, ModBusSlave_conn_err);
|
||
tcp_recv(pcb, ModBusSlave_recv);
|
||
tcp_poll(pcb, ModBusSlave_poll, 120); // 60 second timeout
|
||
/* Send out the first message */
|
||
// tcp_write(pcb, GREETING, strlen(GREETING), 1);
|
||
tcp_is_connected = true;
|
||
return ERR_OK;
|
||
}
|
||
|
||
|
||
static void notify_all_data(void)
|
||
{
|
||
ESP_LOGI(GATTS_TABLE_TAG, "notify_all_data");
|
||
uint8_t buf[1024];
|
||
|
||
buf[0] = 1; /* tag:深度:速度 时间 深度 桩号 */
|
||
buf[1] = 8;
|
||
buf[2] = depth_data->speed & 0xff;
|
||
buf[3] = (depth_data->speed >> 8) & 0xff;
|
||
buf[4] = depth_data->one_pile_work_time & 0xff;
|
||
buf[5] = (depth_data->one_pile_work_time >> 8) & 0xff;
|
||
buf[6] = depth_data->depth & 0xff;
|
||
buf[7] = (depth_data->depth >> 8) & 0xff;
|
||
buf[8] = gWordVar[LAST_PILE_ID_ADDR] & 0xff;
|
||
buf[9] = (gWordVar[LAST_PILE_ID_ADDR] >> 8) & 0xff;
|
||
|
||
|
||
buf[10] = 2; /* tag:1号通道流量:瞬时,每10cm,总 */
|
||
buf[11] = 6;
|
||
buf[12] = pflow[0].flow & 0xff;
|
||
buf[13] = (pflow[0].flow >> 8) & 0xff;
|
||
buf[14] = depth_data->depth_flow[0] & 0xff;
|
||
buf[15] = (depth_data->depth_flow[0] >> 8) & 0xff;
|
||
buf[16] = pflow[0].total_flow & 0xff;
|
||
buf[17] = (pflow[0].total_flow >> 8) & 0xff;
|
||
|
||
buf[18] = 3; /* tag:2号通道流量:瞬时,每10cm,总 */
|
||
buf[19] = 6;
|
||
buf[20] = pflow[1].flow & 0xff;
|
||
buf[21] = (pflow[1].flow >> 8) & 0xff;
|
||
buf[22] = depth_data->depth_flow[1] & 0xff;
|
||
buf[23] = (depth_data->depth_flow[1] >> 8) & 0xff;
|
||
buf[24] = pflow[1].total_flow & 0xff;
|
||
buf[25] = (pflow[1].total_flow >> 8) & 0xff;
|
||
|
||
buf[26] = 4; /* tag:电流:三个*/
|
||
buf[27] = 6;
|
||
buf[28] = gWordVar[AC_CURRENT_REG_ADDR + 0] & 0xff;
|
||
buf[29] = (gWordVar[AC_CURRENT_REG_ADDR + 0] >> 8) & 0xff;
|
||
buf[30] = gWordVar[AC_CURRENT_REG_ADDR + 1] & 0xff;
|
||
buf[31] = (gWordVar[AC_CURRENT_REG_ADDR + 1] >> 8) & 0xff;
|
||
buf[32] = gWordVar[AC_CURRENT_REG_ADDR + 2] & 0xff;
|
||
buf[33] = (gWordVar[AC_CURRENT_REG_ADDR + 2] >> 8) & 0xff;
|
||
|
||
|
||
int64_t x = (int64_t)(gpsMessageP->x * 1000);
|
||
int64_t y = (int64_t)(gpsMessageP->y * 1000);
|
||
uint16_t dir = (uint16_t)(gpsMessageP->dir * 100);
|
||
uint16_t pitch = (uint16_t)(gpsMessageP->pitch * 100);
|
||
uint8_t gps_status = gpsMessageP->gps_status;
|
||
uint32_t utc_time = gpsMessageP->utc;
|
||
// ESP_LOGI(GATTS_TABLE_TAG, "x:%f, %f, %lld", gpsMessageP->x, gpsMessageP->x * 1000, (long long int)(gpsMessageP->x * 1000));
|
||
// ESP_LOGI(GATTS_TABLE_TAG, "gps message x:%lld, y:%lld, dir:%ud, pitch:%ud, gps_status:%d, utc_time:%ud", (long long)x, (long long)y, (unsigned int)dir, (unsigned int)pitch, (int)gps_status, (unsigned int)utc_time);
|
||
buf[34] = 5; /* tag:CPS信息1:x, y(int64)*/
|
||
buf[35] = 16;
|
||
buf[36] = x & 0xff;
|
||
buf[37] = (x >> 8) & 0xff;
|
||
buf[38] = (x >> 16) & 0xff;
|
||
buf[39] = (x >> 24) & 0xff;
|
||
buf[40] = (x >> 32) & 0xff;
|
||
buf[41] = (x >> 40) & 0xff;
|
||
buf[42] = (x >> 48) & 0xff;
|
||
buf[43] = (x >> 56) & 0xff;
|
||
buf[44] = y & 0xff;
|
||
buf[45] = (y >> 8) & 0xff;
|
||
buf[56] = (y >> 16) & 0xff;
|
||
buf[47] = (y >> 24) & 0xff;
|
||
buf[48] = (y >> 32) & 0xff;
|
||
buf[49] = (y >> 40) & 0xff;
|
||
buf[50] = (y >> 48) & 0xff;
|
||
buf[51] = (y >> 56) & 0xff;
|
||
|
||
buf[52] = 6; /* tag:CPS信息2:方向,俯仰(uint16), gps定位状态(uint8), UTC时间(uint32)*/
|
||
buf[53] = 9;
|
||
buf[54] = dir & 0xff;
|
||
buf[55] = (dir >> 8) & 0xff;
|
||
buf[56] = pitch & 0xff;
|
||
buf[57] = (pitch >> 8) & 0xff;
|
||
buf[58] = utc_time & 0xff;
|
||
buf[59] = (utc_time >> 8) & 0xff;
|
||
buf[60] = (utc_time >> 16) & 0xff;
|
||
buf[61] = (utc_time >> 24) & 0xff;
|
||
buf[62] = gps_status & 0xff;
|
||
/* 需要上报什么数据在此处添加 */
|
||
|
||
// tcp_write(pcb, GREETING, strlen(GREETING), 1);
|
||
}
|
||
|
||
|
||
void notify_tcp_task(void *pvParameters)
|
||
{
|
||
ESP_LOGI(GATTS_TABLE_TAG, "notify_tcp_task");
|
||
while (1)
|
||
{
|
||
if (data_notify_enable && tcp_is_connected)
|
||
{
|
||
notify_all_data();
|
||
}
|
||
vTaskDelay(pdMS_TO_TICKS(100));
|
||
}
|
||
|
||
vTaskDelete(NULL);
|
||
}
|
||
|
||
|
||
void communication_tcp_init(void) {
|
||
struct tcp_pcb *pcb;
|
||
pcb = tcp_new();
|
||
tcp_bind(pcb, IP_ADDR_ANY, 6061);
|
||
pcb = tcp_listen(pcb);
|
||
tcp_accept(pcb, ModBusSlave_accept);
|
||
|
||
xTaskCreate(notify_tcp_task, "notify_tcp_Task", 4096, NULL, 8, NULL);
|
||
}
|
||
|