目的:更廉价的物联网仪器解决方案。
当前方案:配置串口安卓平板。
-优势:开发简单,安卓一大把人,好维护。操作人员熟悉操作方式。学习成本低。
-劣势:成本巨高,推广困难。仪器必须预留平板位置。
ESP方案:Bluff配网+Mqtt+tcp/IP+uart
-优势:真便宜啊。占地更小,尤其小仪器。
-劣势:找人很费劲,尤其小团队。用的还不是stm。
实现方式:糅合和官方各种案例,包括,blufi,uart publish,mqtt,socks等样例。(码农原来是这个样子,抄过来整合一下。。)
以下代码是老板亲自糅合的,自己现学现用。代码规范啥的,大家多多给指点以下。一定及时修改更新。以下代码方案完全给大家贡献出来。
PASS:我这边传递的都是stm直接使用的串口指令。所以都是十六进制的BYTE字符串。所以如果有用到传递其他字符串的。需要各位手动修改。代码太多了,就贴重点了。具体代码大家私信我要。人多的话,我再考虑上传git,毕竟有点献丑。。
1.首先:串口接收。
static void uart_event_task(void *pvParameters)
...
uart_event_t event;
size_t buffered_size;
uint8_t* dtmp = (uint8_t*) malloc(RD_BUF_SIZE);
char *hexstr_data = malloc(RX_BUF_SIZE);
BLUFI_INFO("for uart event loop begin:");
for(;;)
{
//Waiting for UART event.
if(xQueueReceive(uart_queue, (void * )&event, (portTickType)portMAX_DELAY))
{
bzero(dtmp, RD_BUF_SIZE);
ESP_LOGI(TAG, "uart[%d] event:", EX_UART_NUM);
switch(event.type) {
//Event of UART receving data
/*We'd better handler data event fast, there would be much more data events than
other types of events. If we take too much time on data event, the queue might
be full.*/
case UART_DATA:
ESP_LOGI(TAG, "[UART DATA]: %d", event.size);
const int rxBytes = uart_read_bytes(EX_UART_NUM, dtmp, event.size, portMAX_DELAY);
//send to mqtt server
if (rxBytes > 0 && mqtt_is_connected ) {
dtmp[rxBytes] = 0;
ESP_LOGW(TAG, "Read %d bytes: '%s'", rxBytes, dtmp);
esp_log_buffer_hex("Receive Data", dtmp, rxBytes);
int cir_len= sizeof(*dtmp) / sizeof(dtmp[0]);
ESP_LOGI(TAG, "recv data lenth is:%d\n",cir_len);
if ( cir_len > 1 ){
byte_str_hex(dtmp,hexstr_data,cir_len);
// BLUFI_INFO("event publish data is:%s\n",hexstr_data);
if(tcp_socked){
tcp_tx_data = hexstr_data;
}else{
int msg_id = mqtt_send_data(TOPIC_UART,hexstr_data);
ESP_LOGI(TAG, "sent publish successful, msg_id=%d\n", msg_id);
}
}
}
ESP_LOGI(TAG, "[DATA EVT]:");
uart_write_bytes(EX_UART_NUM, (const char*) dtmp, event.size);
break;
//Event of HW FIFO overflow detected
case UART_FIFO_OVF:
ESP_LOGI(TAG, "hw fifo overflow");
// If fifo overflow happened, you should consider adding flow control for your application.
// The ISR has already reset the rx FIFO,
// As an example, we directly flush the rx buffer here in order to read more data.
uart_flush_input(EX_UART_NUM);
xQueueReset(uart_queue);
break;
//Event of UART ring buffer full
case UART_BUFFER_FULL:
ESP_LOGI(TAG, "ring buffer full");
// If buffer full happened, you should consider encreasing your buffer size
// As an example, we directly flush the rx buffer here in order to read more data.
uart_flush_input(EX_UART_NUM);
xQueueReset(uart_queue);
break;
//Event of UART RX break detected
case UART_BREAK:
ESP_LOGI(TAG, "uart rx break");
break;
//Event of UART parity check error
case UART_PARITY_ERR:
ESP_LOGI(TAG, "uart parity error");
break;
//Event of UART frame error
case UART_FRAME_ERR:
ESP_LOGI(TAG, "uart frame error");
break;
//UART_PATTERN_DET
case UART_PATTERN_DET:
uart_get_buffered_data_len(EX_UART_NUM, &buffered_size);
int pos = uart_pattern_pop_pos(EX_UART_NUM);
ESP_LOGI(TAG, "[UART PATTERN DETECTED] pos: %d, buffered size: %d", pos, buffered_size);
if (pos == -1) {