Compare commits
5 Commits
build/esp-
...
0f5e2a9664
Author | SHA1 | Date | |
---|---|---|---|
0f5e2a9664 | |||
05660afc54 | |||
101103de03 | |||
7bff8e2c17 | |||
2da0f224a1 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@ build/
|
|||||||
sdkconfig
|
sdkconfig
|
||||||
sdkconfig.old
|
sdkconfig.old
|
||||||
.vscode/
|
.vscode/
|
||||||
|
managed_components/
|
@@ -1,9 +1,15 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
|
espressif/mdns:
|
||||||
|
component_hash: 3f3bf8ff67ec99dde4e935637af087ebc899b9fee396ffa1c9138d3775f1aca4
|
||||||
|
source:
|
||||||
|
service_url: https://api.components.espressif.com/
|
||||||
|
type: service
|
||||||
|
version: 1.0.9
|
||||||
idf:
|
idf:
|
||||||
component_hash: null
|
component_hash: null
|
||||||
source:
|
source:
|
||||||
type: idf
|
type: idf
|
||||||
version: 4.4.4
|
version: 5.0.1
|
||||||
manifest_hash: dcf4d39b94252de130019eadceb989d72b0dbc26b552cfdcbb50f6da531d2b92
|
manifest_hash: d23f3b15e8b95dfe5da6cf83768d24158a3a0222f95694b1fa09c3ca8602f79f
|
||||||
target: esp32c3
|
target: esp32c3
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
|
17
docs/udp.md
Normal file
17
docs/udp.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# 基于 UDP 的上、下位机通讯规则
|
||||||
|
|
||||||
|
## 报文格式
|
||||||
|
|
||||||
|
开始的一个字节是命令,剩余字节是数据。缓冲区长度设为 1024 字节,所以单个 UDP 报文的数据最多为 1023 字节。
|
||||||
|
|
||||||
|
## 命令
|
||||||
|
|
||||||
|
### 上位机在线 `1`
|
||||||
|
|
||||||
|
### 更新灯带颜色 `2`
|
||||||
|
|
||||||
|
| 数据 | 长度(字节) | 说明 |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 起始位置 | 2 | 0~65535 |
|
||||||
|
| 长度 | 2 | 0~65535 |
|
||||||
|
| 颜色 | 3 | RGB 顺序,$2^3 * 2^3 * 2^3 = 65535$ 真彩色 |
|
@@ -1,2 +1,2 @@
|
|||||||
idf_component_register(SRCS "hw-ms03.c" "app_nvs.c" "apds_9960.c" "pca9555.c" "i2c.c" "asr_pro.c" "ci_03t.c" "ui_input.c" "ambient_light.c" "temperature.c" "embedded_display.c" "mqtt.c" "main.c" "wifi.c" "light.c" "mqtt.c" "led_strip_encoder/led_strip_encoder.c"
|
idf_component_register(SRCS "udp_server.c" "service_discovery.c" "app_nvs.c" "apds_9960.c" "pca9555.c" "i2c.c" "asr_pro.c" "ci_03t.c" "ui_input.c" "ambient_light.c" "temperature.c" "embedded_display.c" "mqtt.c" "main.c" "wifi.c" "light.c" "mqtt.c" "led_strip_encoder/led_strip_encoder.c"
|
||||||
INCLUDE_DIRS ".")
|
INCLUDE_DIRS ".")
|
@@ -1,27 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "driver/gpio.h"
|
|
||||||
#include "freeRTOS/FreeRTOS.h"
|
|
||||||
|
|
||||||
#define HW_MS03_INT_GPIO 6
|
|
||||||
#define BEEP_GPIO 7
|
|
||||||
|
|
||||||
void hw_ms03_int_handler(void *arg) {
|
|
||||||
gpio_set_level(BEEP_GPIO, gpio_get_level(HW_MS03_INT_GPIO));
|
|
||||||
}
|
|
||||||
|
|
||||||
void hw_ms03_init() {
|
|
||||||
gpio_config_t io_conf = {};
|
|
||||||
|
|
||||||
io_conf.mode = GPIO_MODE_INPUT;
|
|
||||||
io_conf.pull_up_en = 0;
|
|
||||||
io_conf.pull_down_en = 1;
|
|
||||||
io_conf.intr_type = GPIO_INTR_ANYEDGE;
|
|
||||||
io_conf.pin_bit_mask = 1ULL << HW_MS03_INT_GPIO;
|
|
||||||
gpio_config(&io_conf);
|
|
||||||
io_conf.mode = GPIO_MODE_OUTPUT;
|
|
||||||
io_conf.pin_bit_mask = 1ULL << BEEP_GPIO;
|
|
||||||
io_conf.pull_down_en = 0;
|
|
||||||
gpio_config(&io_conf);
|
|
||||||
|
|
||||||
gpio_isr_handler_add(HW_MS03_INT_GPIO, hw_ms03_int_handler, NULL);
|
|
||||||
}
|
|
17
main/idf_component.yml
Normal file
17
main/idf_component.yml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
## IDF Component Manager Manifest File
|
||||||
|
dependencies:
|
||||||
|
espressif/mdns: "^1.0.9"
|
||||||
|
## Required IDF version
|
||||||
|
idf:
|
||||||
|
version: ">=5.0.1"
|
||||||
|
# # Put list of dependencies here
|
||||||
|
# # For components maintained by Espressif:
|
||||||
|
# component: "~1.0.0"
|
||||||
|
# # For 3rd party components:
|
||||||
|
# username/component: ">=1.0.0,<2.0.0"
|
||||||
|
# username2/component2:
|
||||||
|
# version: "~1.0.0"
|
||||||
|
# # For transient dependencies `public` flag can be set.
|
||||||
|
# # `public` flag doesn't have an effect dependencies of the `main` component.
|
||||||
|
# # All dependencies of `main` are public by default.
|
||||||
|
# public: true
|
144
main/light.c
144
main/light.c
@@ -85,6 +85,8 @@ void led_strip_set_color_calibration(float red, float green, float blue) {
|
|||||||
led_strip_green_calibration = green;
|
led_strip_green_calibration = green;
|
||||||
led_strip_blue_calibration = blue;
|
led_strip_blue_calibration = blue;
|
||||||
|
|
||||||
|
ESP_LOGI(LIGHT_TAG, "Calibration: %f %f %f", red, green, blue);
|
||||||
|
|
||||||
nvs_handle_t local_nvs_handle;
|
nvs_handle_t local_nvs_handle;
|
||||||
|
|
||||||
esp_err_t err = nvs_open("storage", NVS_READWRITE, &local_nvs_handle);
|
esp_err_t err = nvs_open("storage", NVS_READWRITE, &local_nvs_handle);
|
||||||
@@ -126,6 +128,14 @@ void led_strip_set_color_calibration(float red, float green, float blue) {
|
|||||||
nvs_close(local_nvs_handle);
|
nvs_close(local_nvs_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void light_strip_transmit_task(void *pvParameter) {
|
||||||
|
while (1) {
|
||||||
|
ESP_ERROR_CHECK(rmt_transmit(led_chan, led_encoder, led_strip_pixels,
|
||||||
|
sizeof(led_strip_pixels), &tx_config));
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Simple helper function, converting HSV color space to RGB color
|
* @brief Simple helper function, converting HSV color space to RGB color
|
||||||
* space
|
* space
|
||||||
@@ -224,8 +234,6 @@ void light_for_init() {
|
|||||||
ESP_LOGI(LIGHT_TAG, "light_for_init");
|
ESP_LOGI(LIGHT_TAG, "light_for_init");
|
||||||
|
|
||||||
memset(led_strip_pixels, 0, sizeof(led_strip_pixels));
|
memset(led_strip_pixels, 0, sizeof(led_strip_pixels));
|
||||||
ESP_ERROR_CHECK(rmt_transmit(led_chan, led_encoder, led_strip_pixels,
|
|
||||||
sizeof(led_strip_pixels), &tx_config));
|
|
||||||
|
|
||||||
nvs_handle local_nvs_handle;
|
nvs_handle local_nvs_handle;
|
||||||
esp_err_t err = nvs_open("storage", NVS_READWRITE, &local_nvs_handle);
|
esp_err_t err = nvs_open("storage", NVS_READWRITE, &local_nvs_handle);
|
||||||
@@ -268,7 +276,7 @@ void light_for_init() {
|
|||||||
uint8_t init_r, init_g, init_b;
|
uint8_t init_r, init_g, init_b;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
for (uint8_t i = 0; i < 50; i++) {
|
for (uint8_t i = 0; i < 200; i++) {
|
||||||
init_r = (uint8_t)(r_f * (float)i);
|
init_r = (uint8_t)(r_f * (float)i);
|
||||||
init_g = (uint8_t)(g_f * (float)i);
|
init_g = (uint8_t)(g_f * (float)i);
|
||||||
init_b = (uint8_t)(b_f * (float)i);
|
init_b = (uint8_t)(b_f * (float)i);
|
||||||
@@ -279,8 +287,6 @@ void light_for_init() {
|
|||||||
led_strip_pixels[j * 3 + 2] = init_b;
|
led_strip_pixels[j * 3 + 2] = init_b;
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP_ERROR_CHECK(rmt_transmit(led_chan, led_encoder, led_strip_pixels,
|
|
||||||
sizeof(led_strip_pixels), &tx_config));
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(20));
|
vTaskDelay(pdMS_TO_TICKS(20));
|
||||||
}
|
}
|
||||||
vTaskDelay(pdMS_TO_TICKS(100));
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
@@ -312,8 +318,6 @@ void light_for_connecting_wifi() {
|
|||||||
led_strip_pixels[5] = 0;
|
led_strip_pixels[5] = 0;
|
||||||
}
|
}
|
||||||
tick_tock = !tick_tock;
|
tick_tock = !tick_tock;
|
||||||
ESP_ERROR_CHECK(rmt_transmit(led_chan, led_encoder, led_strip_pixels,
|
|
||||||
sizeof(led_strip_pixels), &tx_config));
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(200));
|
vTaskDelay(pdMS_TO_TICKS(200));
|
||||||
} while (light_mode == light_mode_connection_wifi);
|
} while (light_mode == light_mode_connection_wifi);
|
||||||
}
|
}
|
||||||
@@ -345,8 +349,6 @@ void light_for_idle() {
|
|||||||
blue * display_ambient_light_brightness * led_strip_blue_calibration;
|
blue * display_ambient_light_brightness * led_strip_blue_calibration;
|
||||||
}
|
}
|
||||||
// update_desktop_connection_state();
|
// update_desktop_connection_state();
|
||||||
ESP_ERROR_CHECK(rmt_transmit(led_chan, led_encoder, led_strip_pixels,
|
|
||||||
sizeof(led_strip_pixels), &tx_config));
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(10));
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -404,49 +406,49 @@ void light_init_strip() {
|
|||||||
|
|
||||||
xTaskCreate(light_strip_running_task, "LIGHT_STRIP_RUNNING_TASK", 4096, NULL,
|
xTaskCreate(light_strip_running_task, "LIGHT_STRIP_RUNNING_TASK", 4096, NULL,
|
||||||
1, NULL);
|
1, NULL);
|
||||||
|
|
||||||
|
xTaskCreate(light_strip_transmit_task, "LIGHT_STRIP_TRANSMIT_TASK", 4096,
|
||||||
|
NULL, 1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void light_play_colors(uint16_t len, uint8_t *buffer) {
|
void light_play_colors(uint16_t len, uint8_t *buffer) {
|
||||||
light_mode = light_mode_desktop_sending_colors;
|
// light_mode = light_mode_desktop_sending_colors;
|
||||||
|
|
||||||
uint16_t black_count = 0; // count of black pixels. r/g/b <= 10
|
// uint16_t black_count = 0; // count of black pixels. r/g/b <= 10
|
||||||
|
|
||||||
for (uint16_t led_index = 0, buffer_cursor = 0;
|
// for (uint16_t led_index = 0, buffer_cursor = 0;
|
||||||
led_index < STRIP_LED_NUMBER && buffer_cursor < len;
|
// led_index < STRIP_LED_NUMBER && buffer_cursor < len;
|
||||||
led_index++, buffer_cursor += 3) {
|
// led_index++, buffer_cursor += 3) {
|
||||||
uint8_t r = (uint8_t)((float)buffer[buffer_cursor] *
|
// uint8_t r = (uint8_t)((float)buffer[buffer_cursor] *
|
||||||
display_ambient_light_brightness *
|
// display_ambient_light_brightness *
|
||||||
led_strip_red_calibration),
|
// led_strip_red_calibration),
|
||||||
g = (uint8_t)((float)buffer[buffer_cursor + 1] *
|
// g = (uint8_t)((float)buffer[buffer_cursor + 1] *
|
||||||
display_ambient_light_brightness *
|
// display_ambient_light_brightness *
|
||||||
led_strip_green_calibration),
|
// led_strip_green_calibration),
|
||||||
b = (uint8_t)((float)buffer[buffer_cursor + 2] *
|
// b = (uint8_t)((float)buffer[buffer_cursor + 2] *
|
||||||
display_ambient_light_brightness *
|
// display_ambient_light_brightness *
|
||||||
led_strip_blue_calibration);
|
// led_strip_blue_calibration);
|
||||||
if (r <= 7 && g <= 7 && b <= 7) {
|
// if (r <= 7 && g <= 7 && b <= 7) {
|
||||||
black_count++;
|
// black_count++;
|
||||||
}
|
// }
|
||||||
led_strip_pixels[led_index * 3 + 0] = g;
|
// led_strip_pixels[led_index * 3 + 0] = g;
|
||||||
led_strip_pixels[led_index * 3 + 1] = r;
|
// led_strip_pixels[led_index * 3 + 1] = r;
|
||||||
led_strip_pixels[led_index * 3 + 2] = b;
|
// led_strip_pixels[led_index * 3 + 2] = b;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (black_count > STRIP_LED_NUMBER / 5 * 4) {
|
// if (black_count > STRIP_LED_NUMBER / 5 * 4) {
|
||||||
uint8_t r = (uint8_t)((float)50 * display_ambient_light_brightness *
|
// uint8_t r = (uint8_t)((float)50 * display_ambient_light_brightness *
|
||||||
led_strip_red_calibration),
|
// led_strip_red_calibration),
|
||||||
g = (uint8_t)((float)40 * display_ambient_light_brightness *
|
// g = (uint8_t)((float)40 * display_ambient_light_brightness *
|
||||||
led_strip_green_calibration),
|
// led_strip_green_calibration),
|
||||||
b = (uint8_t)((float)20 * display_ambient_light_brightness *
|
// b = (uint8_t)((float)20 * display_ambient_light_brightness *
|
||||||
led_strip_blue_calibration);
|
// led_strip_blue_calibration);
|
||||||
for (uint16_t led_index = 0; led_index < STRIP_LED_NUMBER; led_index++) {
|
// for (uint16_t led_index = 0; led_index < STRIP_LED_NUMBER; led_index++) {
|
||||||
led_strip_pixels[led_index * 3 + 0] = g;
|
// led_strip_pixels[led_index * 3 + 0] = g;
|
||||||
led_strip_pixels[led_index * 3 + 1] = r;
|
// led_strip_pixels[led_index * 3 + 1] = r;
|
||||||
led_strip_pixels[led_index * 3 + 2] = b;
|
// led_strip_pixels[led_index * 3 + 2] = b;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
ESP_ERROR_CHECK(rmt_transmit(led_chan, led_encoder, led_strip_pixels,
|
|
||||||
sizeof(led_strip_pixels), &tx_config));
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(10));
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -454,3 +456,53 @@ void light_play(light_mode_t mode) {
|
|||||||
ESP_LOGI(LIGHT_TAG, "light_play: %d", mode);
|
ESP_LOGI(LIGHT_TAG, "light_play: %d", mode);
|
||||||
light_mode = mode;
|
light_mode = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_display_ambient_light_colors(uint16_t offset, uint8_t *sub_pixels,
|
||||||
|
uint16_t len) {
|
||||||
|
// ESP_LOGI(LIGHT_TAG, "set_display_ambient_light_colors: offset: %d\t len:
|
||||||
|
// %d",
|
||||||
|
// offset, len);
|
||||||
|
light_mode = light_mode_desktop_sending_colors;
|
||||||
|
|
||||||
|
uint16_t black_count = 0; // count of black pixels. r/g/b <= 7
|
||||||
|
|
||||||
|
uint16_t global_end = len + offset * 3;
|
||||||
|
|
||||||
|
if (global_end > STRIP_LED_NUMBER * 3) {
|
||||||
|
global_end = STRIP_LED_NUMBER * 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint16_t global_index = offset * 3, local_index = 0;
|
||||||
|
global_index < global_end; global_index += 3, local_index += 3) {
|
||||||
|
uint8_t r = (uint8_t)((float)sub_pixels[local_index + 0] *
|
||||||
|
display_ambient_light_brightness *
|
||||||
|
led_strip_red_calibration),
|
||||||
|
g = (uint8_t)((float)sub_pixels[local_index + 1] *
|
||||||
|
display_ambient_light_brightness *
|
||||||
|
led_strip_green_calibration),
|
||||||
|
b = (uint8_t)((float)sub_pixels[local_index + 2] *
|
||||||
|
display_ambient_light_brightness *
|
||||||
|
led_strip_blue_calibration);
|
||||||
|
if (r <= 7 && g <= 7 && b <= 7) {
|
||||||
|
black_count++;
|
||||||
|
}
|
||||||
|
led_strip_pixels[global_index + 0] = g;
|
||||||
|
led_strip_pixels[global_index + 1] = r;
|
||||||
|
led_strip_pixels[global_index + 2] = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (black_count == len / 3) {
|
||||||
|
uint8_t r = (uint8_t)((float)10 * display_ambient_light_brightness *
|
||||||
|
led_strip_red_calibration),
|
||||||
|
g = (uint8_t)((float)7 * display_ambient_light_brightness *
|
||||||
|
led_strip_green_calibration),
|
||||||
|
b = (uint8_t)((float)7 * display_ambient_light_brightness *
|
||||||
|
led_strip_blue_calibration);
|
||||||
|
for (uint16_t global_index = offset * 3; global_index < global_end;
|
||||||
|
global_index += 3) {
|
||||||
|
led_strip_pixels[global_index + 0] = g;
|
||||||
|
led_strip_pixels[global_index + 1] = r;
|
||||||
|
led_strip_pixels[global_index + 2] = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
21
main/main.c
21
main/main.c
@@ -5,17 +5,18 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "hw-ms03.c"
|
|
||||||
#include "i2c.c"
|
#include "i2c.c"
|
||||||
#include "light.c"
|
#include "light.c"
|
||||||
#include "mqtt.c"
|
#include "mqtt.c"
|
||||||
#include "pca9555.c"
|
#include "pca9555.c"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
|
#include "service_discovery.c"
|
||||||
#include "temperature.c"
|
#include "temperature.c"
|
||||||
|
#include "udp_server.c"
|
||||||
#include "ui_input.c"
|
#include "ui_input.c"
|
||||||
#include "wifi.c"
|
#include "wifi.c"
|
||||||
|
|
||||||
static const char *TAG = "DisplayAmbientLight";
|
static const char *APP_TAG = "DisplayAmbientLight";
|
||||||
|
|
||||||
void app_main(void) {
|
void app_main(void) {
|
||||||
app_nvs_init();
|
app_nvs_init();
|
||||||
@@ -27,7 +28,7 @@ void app_main(void) {
|
|||||||
|
|
||||||
init_display();
|
init_display();
|
||||||
display_print8_str(0, 0, "Ambient Light");
|
display_print8_str(0, 0, "Ambient Light");
|
||||||
// hw_ms03_init();
|
|
||||||
ci_03t_init();
|
ci_03t_init();
|
||||||
apds_9960_init();
|
apds_9960_init();
|
||||||
apds_9960_auto_fetch();
|
apds_9960_auto_fetch();
|
||||||
@@ -41,14 +42,16 @@ void app_main(void) {
|
|||||||
if (connect_wifi()) {
|
if (connect_wifi()) {
|
||||||
light_play(light_mode_idle);
|
light_play(light_mode_idle);
|
||||||
}
|
}
|
||||||
|
udp_server_init();
|
||||||
|
service_discovery_init();
|
||||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
mqtt_app_start();
|
mqtt_app_start();
|
||||||
if (waiting_for_mqtt_connected()) {
|
// if (waiting_for_mqtt_connected()) {
|
||||||
light_play(light_mode_mqtt_connected);
|
// light_play(light_mode_mqtt_connected);
|
||||||
}
|
// }
|
||||||
if (waiting_for_desktop_online()) {
|
// if (waiting_for_desktop_online()) {
|
||||||
light_play(light_mode_desktop_online);
|
// light_play(light_mode_desktop_online);
|
||||||
}
|
// }
|
||||||
while (waiting_and_get_colors()) {
|
while (waiting_and_get_colors()) {
|
||||||
light_play_colors(NUMBER_OF_LEDS * 3, mqtt_colors_buffer);
|
light_play_colors(NUMBER_OF_LEDS * 3, mqtt_colors_buffer);
|
||||||
}
|
}
|
||||||
|
28
main/service_discovery.c
Normal file
28
main/service_discovery.c
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "esp_err.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "mdns.h"
|
||||||
|
|
||||||
|
static const char *SERVICE_DISCOVERY_TAG = "SERVICE_DISCOVERY_TAG";
|
||||||
|
|
||||||
|
static void service_discovery_init() { // 初始化 mDNS 服务
|
||||||
|
esp_err_t err = mdns_init();
|
||||||
|
if (err) {
|
||||||
|
ESP_LOGE(SERVICE_DISCOVERY_TAG, "MDNS Init failed: %d\n", err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置 hostname
|
||||||
|
mdns_hostname_set("ambient-light-board");
|
||||||
|
// 设置默认实例
|
||||||
|
mdns_instance_name_set("ivan");
|
||||||
|
// 添加服务
|
||||||
|
mdns_service_add(NULL, "_ambient_light", "_udp", 23042, NULL, 0);
|
||||||
|
mdns_service_add(NULL, "_http", "_tcp", 80, NULL, 0);
|
||||||
|
|
||||||
|
// 注意:必须先添加服务,然后才能设置其属性
|
||||||
|
// web 服务器使用自定义的实例名
|
||||||
|
mdns_service_instance_name_set("_ambientlight_web", "_tcp",
|
||||||
|
"Ambient Light Board Web Server");
|
||||||
|
}
|
134
main/udp_server.c
Normal file
134
main/udp_server.c
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
#include <lwip/netdb.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
#include "esp_err.h"
|
||||||
|
#include "esp_event.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "esp_netif.h"
|
||||||
|
#include "esp_system.h"
|
||||||
|
#include "esp_wifi.h"
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "light.c"
|
||||||
|
#include "lwip/err.h"
|
||||||
|
#include "lwip/sockets.h"
|
||||||
|
#include "lwip/sys.h"
|
||||||
|
#include "nvs_flash.h"
|
||||||
|
|
||||||
|
#define UDP_PORT 23042
|
||||||
|
|
||||||
|
static const char *UDP_SERVER_TAG = "UDP_SERVER";
|
||||||
|
|
||||||
|
static void udp_server_task(void *pvParameters) {
|
||||||
|
char rx_buffer[1024];
|
||||||
|
char addr_str[128];
|
||||||
|
int addr_family = (int)pvParameters;
|
||||||
|
int ip_protocol = 0;
|
||||||
|
struct sockaddr_in6 dest_addr;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
if (addr_family == AF_INET) {
|
||||||
|
struct sockaddr_in *dest_addr_ip4 = (struct sockaddr_in *)&dest_addr;
|
||||||
|
dest_addr_ip4->sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
dest_addr_ip4->sin_family = AF_INET;
|
||||||
|
dest_addr_ip4->sin_port = htons(UDP_PORT);
|
||||||
|
ip_protocol = IPPROTO_IP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sock = socket(addr_family, SOCK_DGRAM, ip_protocol);
|
||||||
|
if (sock < 0) {
|
||||||
|
ESP_LOGE(UDP_SERVER_TAG, "Unable to create socket: errno %d. sock: %d",
|
||||||
|
errno, sock);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ESP_LOGI(UDP_SERVER_TAG, "Socket created");
|
||||||
|
|
||||||
|
// Set timeout
|
||||||
|
struct timeval timeout;
|
||||||
|
timeout.tv_sec = 10;
|
||||||
|
timeout.tv_usec = 0;
|
||||||
|
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof timeout);
|
||||||
|
|
||||||
|
int err = bind(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
|
||||||
|
if (err < 0) {
|
||||||
|
ESP_LOGE(UDP_SERVER_TAG, "Socket unable to bind: errno %d. sock: %d",
|
||||||
|
errno, sock);
|
||||||
|
}
|
||||||
|
ESP_LOGI(UDP_SERVER_TAG, "Socket bound, port %d", UDP_PORT);
|
||||||
|
|
||||||
|
struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6
|
||||||
|
socklen_t socklen = sizeof(source_addr);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
// ESP_LOGI(UDP_SERVER_TAG, "Waiting for data");
|
||||||
|
int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0,
|
||||||
|
(struct sockaddr *)&source_addr, &socklen);
|
||||||
|
// Error occurred during receiving
|
||||||
|
if (len < 0) {
|
||||||
|
if (errno == EAGAIN) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ESP_LOGE(UDP_SERVER_TAG, "recvfrom failed: errno %d. len: %d", errno,
|
||||||
|
len);
|
||||||
|
}
|
||||||
|
// Data received
|
||||||
|
else {
|
||||||
|
// Get the sender's ip address as string
|
||||||
|
if (source_addr.ss_family == PF_INET) {
|
||||||
|
inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr, addr_str,
|
||||||
|
sizeof(addr_str) - 1);
|
||||||
|
|
||||||
|
rx_buffer[len] = 0; // Null-terminate whatever we received and treat
|
||||||
|
// like a string...
|
||||||
|
|
||||||
|
switch (rx_buffer[0]) {
|
||||||
|
case 1:
|
||||||
|
sendto(sock, rx_buffer, 1, 0, (struct sockaddr *)&source_addr,
|
||||||
|
sizeof(source_addr));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
set_display_ambient_light_colors(
|
||||||
|
((uint16_t)rx_buffer[1] << 8 | (uint16_t)rx_buffer[2]),
|
||||||
|
(uint8_t *)&(rx_buffer[3]), len - 3);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
ESP_LOGI(UDP_SERVER_TAG, "%s", rx_buffer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int err =
|
||||||
|
sendto(sock, rx_buffer, len, 0, (struct sockaddr *)&source_addr,
|
||||||
|
sizeof(source_addr));
|
||||||
|
if (err < 0) {
|
||||||
|
ESP_LOGI(UDP_SERVER_TAG, "Received %d bytes from %s:", len,
|
||||||
|
addr_str);
|
||||||
|
ESP_LOGE(UDP_SERVER_TAG,
|
||||||
|
"Error occurred during sending: errno %d. sock: %d", errno,
|
||||||
|
sock);
|
||||||
|
shutdown(sock, 0);
|
||||||
|
close(sock);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sock != -1 && len < 0) {
|
||||||
|
ESP_LOGE(UDP_SERVER_TAG, "Shutting down socket and restarting...");
|
||||||
|
shutdown(sock, 0);
|
||||||
|
close(sock);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void udp_server_init(void) {
|
||||||
|
ESP_ERROR_CHECK(nvs_flash_init());
|
||||||
|
ESP_ERROR_CHECK(esp_netif_init());
|
||||||
|
xTaskCreate(udp_server_task, "udp_server", 4096, (void *)AF_INET, 5, NULL);
|
||||||
|
}
|
Reference in New Issue
Block a user